Использование Arduino UNO в качестве программатора

    Появилась у меня идея сделать внешний интерфейс для счетчика воды, чтобы не лазать в подвал для снятия показаний. После некоторых размышлений я остановился на ATTiny2313A(стоит ~80р, а ставить для этого Arduino ценой в ~1000р. мне жаба не дает) + несколько резисторов, кнопок и 7-ми сегментный индикатор. Но остановился перед проблемой — в отличии от Arduino здесь нужен программатор. Поскольку я не сильно увлекаюсь МК, то программаторов у меня как-то не водится. Arduino теоретически можно использовать в этом качестве, но реально я этого никогда не делал.


    В интернетах на эту тему есть много статей. Но, на текущий момент, они способны запутать неподготовленного человека. Проблема в следующем — на предыдущих версиях Arduino (Duemilanove, Diecimila) стоял чип FT232RL, который является преобразователем USB -> UART. На Uno этот чип убрали, заменив на Atmega8U2(МК запрограммированный на преобразование USB -> Serial). Соответственно большинство инструкций нам не подходят. Я уже думал что эта идея неосуществима, но неожиданно встретил подходящий вариант. С ним я вас и ознакомлю. Приступим:

    1. Открываем Arduino IDE( у меня это v1.0) и заливаем на нашу Arduino Uno sketch называющийся ArduinoISP (File -> Examples -> Arduino ISP). Прошу обратить внимание на первые строчки файла — там содержится важная подсказка как подключать наш программатор к МК:
    // this sketch turns the Arduino into a AVRISP
    // using the following pins:
    // 10: slave reset
    // 11: MOSI
    // 12: MISO
    // 13: SCK
    
    // Put an LED (with resistor) on the following pins:
    // 9: Heartbeat - shows the programmer is running
    // 8: Error - Lights up if something goes wrong (use red if that makes sense)
    // 7: Programming - In communication with the slave
    

    Собственно, после этого этапа мы уже имеем программатор типа avrisp, но нужно еще подключить к нему наш МК.

    2. Смотрим в datasheet к нужному МК(у меня это ATTiny2313A) и ищем pinout. На следующей картинке я отметил интересующие нас ноги.


    3. Теперь пришел самый интересный этап — подключаем наш программатор к МК. Собственно схема подключения не представляет из себя ничего сложного, но есть одна хитрость — нужно подключить конденсатор в 10мкФ(uF) между выходами RESET и GND у Arduino. Причем выход "-" (отмечен белой полосой) должен быть подключен к GND. Данный трюк предотвратит перезагрузку Arduino при заливке прошивки в МК.

    Соединяем ноги МК и пины Arduino в соответствии с функционалом из pinout и sketch (Pin10 с ногой PA2, Pin11 с ногой PB5 и тд). Помним что VCC это питание, а в нашем случае — +5V. Для индикации я выбрал следующие светодиоды:
    9: Heartbeat — Зеленый. Показывает что программатор работает. В процессе простоя постоянно мигает.
    8: Error — Красный. Теоретически загорается при ошибках, но еще ни разу не видел.
    7: Programming — Синий. Мигает аналогично Arduino'вским RX/TX при заливке прошивки в МК.
    Повесил их через резисторы 220 Ом.
    Собранная схема будет выглядеть примерно вот так:


    4. Подготавливаем прошивку для нашего МК. Для тестирования я решил использовать обычное мигание светодиодом:
    #define F_CPU 1000000UL
    #include <avr/io.h>
    #include <util/delay.h>
    
    void init_io(void);
    
    void init_io(void)
    {
      DDRB = (1<< PB0);
    }
    
    int main(void)
    {
      init_io();
      for (;;)
      {
          PORTB |= (1 << 0);
          _delay_ms(100);
          PORTB = 0;
          _delay_ms(100);
      }
    }
    

    Компилируем в hex (выдрал команды из какого-то Makefile от WinAVR):
    avr-gcc -c -mmcu=attiny2313 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=blink_led.lst  -std=gnu99 blink_led.c -o blink_led.o
    
    avr-gcc -mmcu=attiny2313 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=blink_led.o  -std=gnu99 blink_led.o   --output blink_led.elf -Wl,-Map=blink_led.map,--cref -lm
    
    avr-objcopy -O ihex -R .eeprom blink_led.elf blink_led.hex

    И заливаем на MK:
    avrdude -p t2313 -P /dev/ttyACM0 -c avrisp -b 19200 -U flash:w:blink_led.hex
    

    Хочу обратить внимание на ограничение скорости заливки в 19200. Без этого параметра я долго пытался что-то залить, но avrdude мне упорно возвращал ошибки типа «programmer is not responding» или «not in sync».

    После этого можно подключить светодиод к ноге PB0 МК(через резистор конечно) и посмотреть как он мигает.

    Исходный материал для статьи:
    hlt.media.mit.edu/?p=1229
    hlt.media.mit.edu/?p=1695
    arduino.cc/en/Tutorial/ArduinoToBreadboard
    iamsuhasm.wordpress.com/tutsproj/avr-gcc-tutorial
    www.instructables.com/id/ATtiny-programmer-using-Arduino-ISP
    Метки:
    Поделиться публикацией
    Похожие публикации
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 15
    • +3
      Так же интересна сама реализация съема данных и подсчета кубов или литров.
      • +1
        Ожидаю подключение к выводам счетчика, и счет замыканий/импульсов с него… Вроде они на каждый литр дают импульс. А далее — пишем в память и передаем по проводам/bluetooth/щелкаем реле, которое открывает клетку с голубем
        • 0
          Примерно так и есть. В счетчик встроен геркон, который щелкает каждые 10 литров. Считаем эти импульсы, складываем в EEPROM, а по нажатии кнопочки вычитываем их оттуда и выводим последовательно на индикатор. Ничего особо сложного. Если встречу какие-то грабли, то набросаю соответствующую статью.
          • 0
            там тонкостей много, у разных счётчиков — по-разному. я с одним пробовал, нечто типа такого получилось. извиняйте, ардуина :-)
          • 0
            cati.net :)
          • +12
            UART(специальный протокол применяемый в основном для программирования МК).

            Плакал кровью.
            • 0
              Ну звиняйте. Насколько себе это представляю настолько и написал. Я понимаю что это что-то более широкое, но встречал только в программаторах. Если можете сказать лучше, применительно к данному контексту — скажите. Поправлю.
              • +1
                RS-232, в народе обычно COM-портом кличут
                • 0
                  Аааааа!!! Это всего лишь RS-232(или там RS-485)?! Честно говоря не подозревал что все так просто… Спасибо! Сча поправлю. Я пока не очень близок к нижнему уровню, поэтому не знаком с такими интимными подробностями.
                  • +1
                    Нет, UART, RS-232 и RS-485 — это разные вещи, FT232RL это USB -> UART, но к RS-232 и RS-485 особого отношения не имеют, хотя часто используются в преобразователях USB -> RS-232 и USB ->RS-485. Лучше просто уберите эту скобку.
                    • 0
                      Да, Вы правы. Поторопился и не разобрался до конца. Думал что понял правильно… Убрал.
                • +1
                  UART = Universal Asynchronous Receiver-Transmitter, в контроллерах еще USART (Synchronous&Asynchronous) встречается — это устройство, преобразующее поток данных в последовательность битов (и разных управляющих символов) и, соответственно, обратно.
                  RS-232, RS-485, RS-422 и пр. — это стандартизированные физические интерфейсы, которые полученную от UART последовательность приводят к необходимым уровням и передают по физическим каналам.
              • –2
                А еще можно было купить готовый счетчик импульсов. И еще устройство которое по радиоканалу снимает с него показания и архив почасовых показаний за последние три месяца. Это дороже, но зато там предусмотрено программирование цены импульса (1,10,100,1000л/имп с множителями 1, 0.5,0.25) и предусмотрена работа с разными типами импульсных выходов (там далеко не всегда геркон). Работает от литиевой батарейки, срок службы — 4-5 лет.
                • 0
                  И зачем мне такая «тумба»? Тем более за такую цену… У меня как минимум раз в 10 дешевле получится. Это скорее ЖЭКу надо такое иметь, нежели мне… Цену испульса я тоже могу запрограммировать, и можно еще посмотреть кто дольше проживет от батарейки — этот счетчик или ATTiny в Power-down режиме. Ну а насчет входа — я точно знаю что у моего счетчика — геркон(в паспорте написано).

                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.