Для управления приложением я использую плату Arduino Pro Mini с микроконтроллером ATMega328P (5V, 16MHz). Купил на Aliexpress в магазине Consumer Electronics Store Store No.336447.
Удобная диаграмма !ProMini. Datasheet контроллера Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.
Программирование осуществляется при помощи Arduino IDE. Подключение к компьютеру осуществляется через USB порт при помощи USB to TTL UART модуля, например, на микросхеме CP2102 (CP2102 datasheet). Купил на Aliexpress в магазине ModuleFans Store No.612195.
Подключение к USB осуществляется по схеме:
Поскольку предполагается автономная работа в течение длительного времени, необходимо решить задачу перезагрузки контроллера в случае его зависания. Для этого используется watchdog timer. Идея простая: в таймер записывается время (максимально 8 секунд) и таймер начинает его уменьшать. Нужно до достижении 0 сбросить таймер. Если таймер не сброшен, то это означает, что контроллер завис. При достижении 0 контроллер перезагружается. Вот код, реализующий эту функцию:
//* (c) Victor Makarov, 2015 #include <avr/wdt.h> void setup() { wdt_enable(WDTO_8S); // Установка таймера Watchdog на 8 секунд } void loop() { // Какие-либо полезные действия // Сброс таймера Watchdog. Если управление не получено в течение // 8 секунд от предыдущего вызова - будет осуществлена перезагрузка. wdt_reset(); }
Однако существует проблема в стандартном bootloader Arduino. Он неправильно работает с этим таймером. При перезагрузке этот таймер устанавливается на 15мс и загрузчик должен его выключить. Однако загрузчик Arduino этого не делает и контроллер не успев запустить прикладную программу снова уходит в перезагрузку.
Для решения этой проблемы я установил загрузчик Optiboot. Сам загрузчик и инструкции по установке можно скачать здесь. Я использовал одну плату Arduino Pro Mini для установки Optiboot на другую плату. Шаги по установке Optiboot:
1) Скачать загрузчик, скопировать папку optiboot в /Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/avr/bootloaders. Старую папку предварительно переименовать в optiboot.bak (на всякий случай).
2) Отредактировать файл /Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/avr/boards.txt. Предварительно сделать его резервную копию boards.txt.bak. Я удалил из него разделы всех плат, которыми не пользуюсь и добавил новый раздел для Arduino Pro Mini с загрузчиком Optiboot:
pro328o.name=[Optiboot] Arduino Pro Mini (5V, 16 MHz) w/ ATmega328p pro328o.upload.tool=avrdude pro328o.upload.protocol=arduino pro328o.upload.maximum_size=32256 pro328o.upload.speed=115200 pro328o.bootloader.tool=avrdude pro328o.bootloader.low_fuses=0xff pro328o.bootloader.high_fuses=0xd6 pro328o.bootloader.extended_fuses=0x05 pro328o.bootloader.file=optiboot/optiboot_atmega328.hex pro328o.bootloader.unlock_bits=0x3F pro328o.bootloader.lock_bits=0x0F pro328o.build.mcu=atmega328p pro328o.build.f_cpu=16000000L pro328o.build.core=arduino:arduino pro328o.build.variant=arduino:standard
Обращаю внимание на скорость 115200. Стандартно Arduino IDE загружает на меньшей скорости и если не исправить, то загрузка программ в Arduino не получится.
3) Использовать другую Arduino Pro Mini как программатор. Скетч программатора находится в примерах Arduino IDE.