08.05.2009

Arduino-программатор

Как сделать из Arduino программатор?

Наверное, у многих подобная мысль связана с желанием найти как-нибудь время, чтобы реализовать, например, скетч с набором команд AVR-910. Расслабьтесь, все гораздо проще, если в вашем распоряжении Arduino Diecimila, Duemilanove или Mega. Подойдет и любой другой USB-аналог, если у него рядом с USB-чипом FT232RL есть посадочное место для 4-х контактного разьема X3:


Японец Mr.Suz Обратил внимание, что чипы FT245R/FT232R (последний является мостом USB-TTL и установлен на Arduino), имеют помимо всего прочего прямое управление выводами, или т.н. BitBang режим. Появилась идея добавить его в avrdude в качестве дополнительного программатора, и таким образом появился на свет avrdude-serjtag.

А другой японец - Kimio Kosaka - создал подробное руководство о том, как получить из Arduino простой программатор. Итак...

1. Добавим гребенку X3 (PLS4) на ваш Arduino

Как правило, посадочные дырочки залиты припоем, который придется удалить. Если под рукой не оказалось оловоотсоса, подойдет деревянная зубочистка или заостренная спичка.


Устанавливаем PLS4, аккуратно паяем.



2. Делаем кабель X3-ICSP

В минимальном варианте необходимо одно гнездо PLS4 и одно PBS6. Наглядная диаграмма соединений:


Я использовал то, что нашел под рукой (плоский кабель):


Как видите, ничего сложного. Вместо PLS/PLD можно использовать также обжимные гнезда BLS4 и BLD6, получается более симпатично, да и паять не надо.

3. Скачиваем и конфигурируем serjtag

Архив оригинальной программы для Windows можно скачать у меня или у автора, затем распаковать. Также скачайте avrdude.conf, в него добавлены чипы ATmega328P и ATmega88, а плюс новый программатор "diecimila". Перепишите его поверх avrdude-serjtag\binary\avrdude.conf.

4. Меняем родной МК на свежий

Отключите Arduino от USB и источника питания, аккуратно извлеките родной МК из панельки (тут спешить не надо, потихоньку - поддевать тонкой отверткой то с одного края, то с другого):


Установите новый МК на место старого, подключите кабель, изготовленный на шаге 2, и только после этого подключите USB и запитайте Arduino.

5. Зашиваем свежий МК

Зашивание состоит из трех основных этапов: фьюз-биты, микропрограмма (он же бутлоадер), лок-биты. Разберем последовательность на примере ATmega8-16PU:

5.1 Фьюз-биты

Если ATmega только-только с завода, то он будет использовать свой внутренний RC-резонатор, откалиброванный на частоту 1МГц. Поэтому, чтобы не шить бутлоадер на черепашьей скорости, сначала зашьем правильные фьюзы - "внешний кварц > 8МГц". Вот так будет выглядеть командная строка:

avrdude -c diecimila -P ft0 -p m8 -B 4800 -U hfuse:w:0xca:m -U lfuse:w:0xdf:m

Назначение ключей:

-с diecimila

Выбор типа программатора из конфигурации. "diecimila" будет соответствовать такой секции в avrdude.conf:



programmer
id = "diecimila";
desc = "FT232R Synchronous BitBang";
type = ft245r;
miso = 3; # CTS X3(1)
sck = 5; # DSR X3(2)
mosi = 6; # DCD X3(3)
reset = 7; # RI X3(4)
;


-P ft0

выбор порта операционной системы - в данном случае имя устройства USB

-p m8

тип микроконтроллера, соответствует ATmega8

-B 4800

скорость передачи данных, специально понижена до 4800

-U hfuse:w:0xca:m

команда программирования: записать в HIGH fuse байт со значением 0xca

5.2 Микропрограмма

Зашиваем микропрограмму на нормальной скорости:

avrdude -c diecimila -P ft0 -p m8 -U flash:w:ATmegaBOOT.hex

5.3 Lock-биты

Защищаем bootloader от записи со стороны микропрограммы (sketch-а). Мало ли чего может произойти по причине ее ошибочного поведения ;)

avrdude -c diecimila -P ft0 -p m8 -U lock:w:0x0f:m

Чтобы прошить остальные типы процессоров, используйте параметры из файла arduino-00XX\hardware\boards.txt:



diecimila.bootloader.low_fuses=0xff
diecimila.bootloader.high_fuses=0xdd
diecimila.bootloader.extended_fuses=0x00
diecimila.bootloader.path=atmega
diecimila.bootloader.file=ATmegaBOOT_168_diecimila.hex
diecimila.bootloader.unlock_bits=0x3F
diecimila.bootloader.lock_bits=0x0F

atmega328.bootloader.low_fuses=0xFF
atmega328.bootloader.high_fuses=0xDA
atmega328.bootloader.extended_fuses=0x05
atmega328.bootloader.file=ATmegaBOOT_168_atmega328.hex
atmega328.bootloader.unlock_bits=0x3F
atmega328.bootloader.lock_bits=0x0F


Надо только не забыть несколько моментов:
  • взять нужный файл прошивки из hardware\bootloaders;
  • выставить значение ключа -p в соответствующее МК: Atmega168 - m168 или ATmega328P - m328p;
  • прошить расширенные фьюз-биты - добавить еще один параметр -U efuse:w:0xNN:m, где NN - 00 для ATmega168 и 05 для ATmega328

6. Проверка

Отключаем кабель программирования, рисуем тестовый скетч (например помигать digital13) и убеждаемся, что все нормально заливается и запускается на МК.

Усовершенствования

Первым делом, спешу заметить, что простая модификация кабеля дает возможность программировать уже не только то, что находится в панельке PDIP-28 Arduino, но вообще любую схему методом ICSP:


Добавляется шестиконтактная вилка, с которой берется питание (два провода). Она теперь подключается к ICSP Arduino, а колодка, которая подключалась туда раньше, становится выходом нашего программатора:


К ней можно подключать и питать от +5В схему, у которой есть шестиконтактный ICSP-разъем, например другой Arduino:


Не так давно я писал про +1К к памяти программ для Arduino. В этом случае надо использовать значения фьюз- и лок-битов, а также файлы бутлоадеров из той статьи. И будет вам на 1К больше свободного места для скетча ;)

Итог: благодаря торжеству японской инженерной мысли, мы получили простейший программатор ICSP на USB. Вот так выглядит комплект, который понадобится для апгрейда:


05.05.2009

Roboduino

Название: Freeduino Roboduino
Процессор: ATmega168/328
Тактовая частота: 16MHz
Совместимость с Sheild-платами: нет
Совместимость с Arduino IDE: есть

Веб-страница проекта: http://www.curiousinventor.com/kits/roboduino
Форум проекта: http://www.curiousinventor.com/forums/11
Дата первого упоминания: 11.12.2008

В любом проекте всегда можно что-то улучшить, даже в Arduino. Модификация Roboduino ориентирована на работу в составе роботов - в понятии авторов это значит, что потребуется подключать много серво-приводов:



Авторы рассудили, что стоит пожертвовать совместимостью с Shield-платами, заменив стандартные колодки PBS на вилку PLS, да в целых три ряда. Зачем? На самом деле, все очень просто, смотрите, как подключается серво:



А если таких подключений надо делать много, то наличие тройной гребенки значительно облегчает процесс:



Точно так же можно цеплять и требующие питания датчики - потребуется одна колодка, где есть Vcc, GND и сигнальный провод.

Из отличительных особенностей:
  • трехпиновая вилка питания (в дополнении к питанию от USB и 2,1мм штекеру);
  • дополниельная вилка UART (дубль пинов Rx,Tx и GND);
  • джампер выбора питания, как на Diecimila
Вот картинки, наглядно иллюстрирующие назначение многочисленных дополнительных вилок (из них видно, где Vcc - регулируемое 5В, а где Vin - нерегулироемое, прямо от источника):





Ошибиться, втыкая дополнительную вилку питания в плату нельзя: в центре плюс, а по краям - GND.

При всем удобстве, есть некоторые вопросы со стабильностью: насколько хорошо будет себя чувствовать Arduino, когда прямо к его цепи питания подключены четыре серво? Видимо, нормально, но питание от общего источника хорошо до определенного тока потребления.

По цене: в виде kit-а с припаянной FT232RL стоит 40 USD, полностью собранный - 54 USD. Если принять во внимание, что в некоторых случаях это избавляет от покупки дополнительной Shield-платы (даже макетной) - кажется вполне приемлемым.

02.05.2009

Arduino и русский LCD

Ранее я уже писал о том, как подключить популярные ЖКИ-дисплеи Winstar с контроллером Hitachi HD44780U к Arduino. Если честно, особенно и рассказывать-то было не о чем: все элементарно.

Если на дисплей требуется выводить кириллицу, надо решить две проблемы:

1. Arduino IDE по причине своей Java-природы транслирует русские буквы в UTF-8 в процессе компиляции sketch-а (на фазе генерации промежуточного С-исходника), в то время как дисплей понимает только однобайтовые символы и понятие не имеет, что такое схемы кодирования юникода;

2. Китайские товарищи добавили в знакогенератор дисплея только набор дополнительных кириллических символов, никак не позаботившись о соблюдении вообще какой-либо кодировки. То есть, символ "Б" есть, а вот букву "А" надо использовать из английского набора. Зато есть дроби, значок евро, а также украинское "Г". Наверное, они рассуждали так: "напихаем побольше разных символов, а эти славяне со своей письменностью сами разберутся".

Первую проблему, скорее всего, можно решить правкой настроек Arduino IDE, чтобы она транслировала UTF-8 в однобайтное представление. Но даже если это и получится сделать, остается неясность с тем, в какую именно кодировку транслировать этот самый UTF-8 (вторая проблема). То есть, на самом деле - это не две проблемы, а одна ;)

Конечно, дисплей поддерживает загрузку произвольного знакогенератора, НО: его надо сначала сформировать (скачать и подкорректировать или нарисовать свой собственный), и, если только память дисплея не энергонезависимая, загружать каждый раз при подаче питания на дисплей.

Самое простое решение - добавить в библиотеку декодирование UTF-8 и таблицу трансляции, что я и сделал, вот результат: LiquidCrystalRus.zip. Надо распаковать в С:\Program Files\arduino-0015\hardware\libraries\, при создании скетчей импортировать вместо стандартной LiquidCrystal. Внутри есть пара примеров: "Hello, world!" по-русски и вывод всего русского алфавита: сначала проверьте, что дисплей имеет идентичный знакогенератор, прежде чем начинать меня ругать ;)

Несколько слов о том, как все это работает. В памяти программ (а вовсе не в ОЗУ, которого катастрофически мало) создается таблица трансляции. В метод send добавлен код, который при попадании в него старшего и младшего символа кодированного UTF-8 производит необходимые вычисления и посылает нужный байт в дисплей.

Собственно, главная тонкость - это подключить процедуры работы с памятью программ #include avr/pgmspace.h и объявить массив трансляции таким образом:

PROGMEM prog_uchar utf_recode[] = {...};

затем к нему можно обращаться так:

pgm_read_byte_near(utf_recode+index);

Особого распухания кода не происходит, потому что подключается не библиотека, а макросы, которые разворачиваются в ассемблерные вставки.

Пожалуй, теперь уже недостает каких-то мелочей, типа задания количества строк дисплея, но об этом в следующий раз.

30.04.2009

Freeduino MaxSerial

Оригинальный Arduino Serial, печатную плату которого все еще можно купить на сайте авторов проекта, увы, не лишен недостатков.

1) Расположение стабилизатора +5В L7805CV - вертикальное. На практике это означает, что будут проблемы с установкой Shield-плат. Не помогут даже т.н. pin-экстендеры - межплатные соединители, которые могут приподнять подсоединяемый Shield на 5-7 мм. Единственный разумный выход - установить стабилизатор на обратной стороне платы: эксцентрично, но проблема будет хоть как-то решена.





2) Необходимость установки неполярного электролита C8: он стоит в цепи эмиттера Т2, где изменяется полярность сигнала, а значит, обычному электролиту рано или поздно поплохеет. Найти неполярный электролит под выводное исполнение сложно, но можно - я нашел единственный вариант, но он имеет высоту 7 мм и мы снова упираемся в п.1 (проблемы с Shield-платами). Намного проще найти неполярный конденсатор в smd-исполнении и, при должной сноровке, припаять его на посадочное место выводного.



3) Некая ненадежность ключей на транзисторах как таковых: говорят, к ним есть претензии. Я слишком мало работал с приложениями Arduino по последовательному порту, поэтому комментировать эти слухи не буду.

4) Нет функции автосброса, как в Delicima и более старших платах. А ведь так удобно не тянуться к Reset-у при очередном заливании sketch-а.

5) Мелочи и придирки :) На колодку POWER не выведен reset (опять же, актуально для shield-плат) и, тем более, нет источника 3.3В (обычно около 50 мА можно взять с USB-чипа  FT232RL). И даже светодиод - всего один, питания. А хотелось бы видеть хотя бы стандартный, на pin-е digital 13.

В поисках платы для самостоятельного изготовления, лишенной хотя бы некоторых из вышеперечисленных недостатков, я наткнулся на Freeduino MaxSerial:



Автор - небезызвестный Spif, решил все проблемы довольно просто: установил в качестве преобразователя COM-TTL микросхему MAX232. В одном корпусе этой микросхемы четыре конвертора на две приемных и две передающих линии, поэтому хватило не только на Tx/Rx, но и на DTR для автосброса. Из схемы сразу "улетели" резисторы в цепях транзисторов, сами транзисторы, зато добавились коденсаторы (Spif щедро повесил на питание ATmega аж два 100пФ-конденсатора). Мало того, есть возможность установить вместо двух конденсаторов 22пФ и кварца 16МГц трехпиновый керамический резонатор, слегка сэкономив на компонентах и числе паек.

Я заказал печатную плату (версия 2.5), подобрал компоненты, и... Вот результат:



Вполне надежно работает, я доволен. По стоимости получается почти столько же, сколько и "оринигальный" Arduino Serial.

Придраться можно только к одному моменту: расстояние для ножек конденсаторов - 2,5 мм, а хотелось бы 5 мм - такие проще достать. Впрочем, это легко решается аккуратным подгибанием ножек.

Выложил Kit с ATmega328P на "молоток", в ближайшее время опубликую подробное руководство по сборке с картинками.

Да, чуть не забыл:

Название: Freeduino MaxSerial
Процессор: ATmega168/328
Тактовая частота: 16MHz
Совместимость с Sheild-платами: есть
Совместимость с Arduino IDE: есть

Веб-страница проекта: spiffie.org/electronics/archives/microcontrollers/Build%20a%20MaxSerial%20Freeduino.html
Блог автора: spiffie.org/electronics/
Дата первого упоминания: 08.03.2008

Схема:

24.04.2009

Хак Arduino Mega и Ethernet Shield

И действительно, Ethernet Shield не будет работать с Arduino Mega. Всё из-за того, что для общения с чипом W5100 используется аппаратный SPI, а он уехал в Mega на пины 50..53.

Но умные люди в этом разобрались: надо освободить нужные пины Ethernet Shield:



И подключить их в нужное место:



Коряво, конечно, но - работает. Придется еще поправить номера пинов в Ethernet Library, это подробно расписано на страничке автора хака (nkcelectronics):

http://mcukits.com/2009/04/06/arduino-ethernet-shield-mega-hack/