Пользователь
0,0
рейтинг
27 мая 2012 в 00:59

Использование 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
Александр Попов @Alex2ndr
карма
19,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое

Комментарии (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 режиме. Ну а насчет входа — я точно знаю что у моего счетчика — геркон(в паспорте написано).
  • 0

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