25.02.2012

ATmegaU breakout

По многочисленным  просьбам телезрителей знакомых, выпустил микроплатку (в народе - "брикаут") с ATmega8U2:


Идея создания была навеяна платами USB-Serial Light Adapter от Arduino и ATmega8U2 Breakout от Sparkfun (в итоге за основу был выбран второй вариант). 

С одной стороны - этот девайс с успехом заменяет FTDI friend, исполняя роль USB-TTL конвертера для связи с целевым MCU через UART или программирования в среде ArduinoIDE. С другой -  вполне себе самостоятельная отладочная плата для ATmega8U2, на которой разведены все его пины, а прошивку можно заливать через ISP6 или вообще по USB через DFU (т.е. без использования программатора). 

Некоторые моменты, на которые хотелось бы обратить внимание:

1. Джампер выбора напряжения питания - по умолчанию установлен в +5В. Если есть желание  поработать на +3.3В, можно перепаять - однако в этом случае предельная тактовая частота по паспорту будет ограничена 8 МГц, в результате может потребоваться переключиться  на внутреннюю калиброванную цепочку (надо менять фьюзы,  программатором);

2. Регулятор +3.3В. Он нужен для питания MCU от +3.3В (см. выше) и дополнительно может выдавать его наружу через соответствующий пин - всего до 150мА. Не путайте его с внутренним регулятором ATmega8U2, который служит для формирования правильного напряжения на линиях D+/D-, когда сам MCU питается от +5В. Кстати, если уж выставили Vсс = +3.3В, этот внутренний регулятор обычно отключают - через регистр REGCR,  экономя таким образом немного на энергопотреблении;

3. Предохранитель 500 мА, выручит вашу схему в случае короткого замыкания по питанию, а специальные диоды - уберегут линии D+/D- ATmega от статического разряда.

4. Гребенка выводов совместима с FTDI friend и вообще с кабелями FTDI. Можно особо не задумываясь использовать, например, с Angelino.

5. Кнопка сброса - с одной стороны - как обычно, замыкает RESET на GND. Однако, если в момент сброса линия DTR (она же пин PD7) была подтянута к земле - активизируется DFU. По крайней мере именно так ведет себя DFU в платах Freeduino ONE и Arduino UNO - но при помощи программатора и собственной прошивки это, конечно же, можно изменить.

6. Светодиод STATUS, в чем-то по функциям похожий на светодиод L в Arduino-совместимых платах Arduino - подключен к линии PB4.

Вот так рекомендуется подключать ATmega8/168/328 к этой плате по первому варианту (в режиме конвертера USB-TTL):



R2 (подтягивает DTR к GND) - необязателен при условии, что вы не прикасаетесь к кнопке сброса на ATmegaU (и действительно - зачем прерывать работу вечного двигателя прошивки конвертера USB-TTL?). Небольшой резистор R3, включенный последовательно в линию TX, защищает пин от перегрузки по току в случае, если его ошибочно посадили на VCC или GND с другой стороны (не забывайте - если на встречной стороне другая ATmega - такое можно сотворить и программно).

Если в MCU уже прошит бутлоадер, схему можно соорудить хоть на беспаечной макетке, например так:



В настройках ArduinoIDE надо выставить правильный порт и тип платы - "Arduino Uno"  (пользователи Windows дополнительно устанавливают .inf-файл от Freeduino ONE).

Программирование через DFU можно осуществлять через FLIP или dfu-profgrammer, указывая тип MCU at90usb82 - именно его и заменил (с более, чем скромными усовершенствованиями) ATmega8U2.

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

Схема:



Репозиторий на github, где можно получить исходники прошивки: https://github.com/a1ronzo/SparkFun-USBtoSerial

19.02.2012

Freeduino Mega 3.0.0

MK90 выпустил новую ревизию Freeduino Mega2560 (соответствует Arduino Mega2560 R3), изменилось следующее:

  1. Разведены четыре дополнительных дырки для bit-bang;
  2. Колодки соответствуют arduino pinout 1.0;
  3. ATmega16u2 в качестве контроллера USB.


Замена ATmega8u2 на ATmega16u2 добавит 8К flash для программ, расширяющих функциональность стандартной прошивки-конвертера последовательного порта - по сути, это просто приглашение к возможности реализаций ваших идей. Кроме дополнительной памяти, предлагаются и дополнительные линии ATmega8u2/16u2 (расположены на Freeduino ONE и Mega2560 одинаково):



В последних версиях Arduino UNO и Freeduino ONE линия DFU уже притянута к GND, поэтому для смены прошивки и входа в режим DFU достаточно кратковременно соединить линию сброса с землей:



После этого, на шине появляется устройство 03eb:2ffa, и можно воспользоваться утилитами FLIP или dfu-programmer (первая больше подойдет владельцам Windows, вторая - Linux). Далее все выглядит аналогично описанию в этой статье, только в качестве типа MCU надо писать at90usb82.  

Всем скептикам, мучающимся вопросом "а зачем менять прошивку в AtmegaU?" посоветую пока этот небольшой блог: http://hunt.net.nz/users/darran. В следующих постах постараюсь осветить тему использования DFU более подробно.

Также, справедливости ради, замечу - в версиях Arduino Uno/Mega2560 R3 применена новая схема сброса:


Авторы окрестили ее термином "более надежная". В принципе - да, если на линии сброса присутствует некоторая емкость - диод D2 помогает быстро ее "обнулить".  Как они набрели на это гениальное усовершенствование, история умалчивает - но копировать его я пока не спешу. 

На всякий случай, еще раз повторюсь, в чем отличие Freeduino от MK90 и Arduino от arduino.cc:
  • оба резонатора Freeduino - кварцевые, у Arduino резонатор основного MCU - керамический, что ухудшает точность вычисления задержек в ваших скетчах;
  • у Freeduino исключены все дополнительные резисторы из схем подключения обоих микроконтроллеров (последовательный 27 Ом и параллельный 1МОм), поскольку они явно лишние (и потенциально вредные);
  • к стабилизатору +3.3В у Freeduino добавлен шунтирующий конденсатор, согласно типовой схеме включения, что положительно сказывается на работе шилдов и любых схем, берущих питание с колодки POWER/3V3;
  • отсутствует диод в схеме сброса основного MCU.
Купить Freeduino Mega2560 v3.0.0 можно здесь: http://mk90.ru/store/ru/microcontrollers/50-freeduino-mega-2560.html

Схема:




14.02.2012

Проблемы Ethernet в ArduinoIDE 1.0

Только что столкнулся с проблемами использования Ethernet Shield на W5100 в рамках ArduinoIDE 1.0. Великолепно до этого работавшие скетчи решительно отказались работать, что меня привело в панику слегка озадачило.

Формально, чтобы перенести скетч со "старых" ArduinoIDE 0022/0023 под 1.0, надо исправить названия классов "Server" и "Client" на "EthernetServer" и "EthernetClient" соответственно. Идеологически, классы Server и Client теперь сделаны полностью абстрактными и перенесены в ядро Arduino. И поскольку они не имеют ни одной реальной функции, библиотека должна  породить от них свой класс, "наполнив" его реальным содержимым. Думаю, делается это с прицелом на будущее, но предсказывать его пока не берусь ;)

К сожалению, даже после успешной компиляции, надо обязательно залить скетч и проверить его работу. Скорее всего, проблемы (если они действительно есть) вскроются сразу же - речь идет о неверном обмене с  Ethernet-чипом Wiznet W5100. Первым делом, открывайте файл arduino-1.0/libraries/Ethernet/utility/w5100.h и ищите в нем строки:

#define __SOCKET_REGISTER16(name, address)                   \
  static void write##name(SOCKET _s, uint16_t _data) {       \
    writeSn(_s, address,   _data >> 8);                      \
    writeSn(_s, address+1, _data & 0xFF);                    \
  }                                                          \
  static uint16_t read##name(SOCKET _s) {                    \
    uint16_t res = readSn(_s, address);                      \
    res = (res << 8) + readSn(_s, address + 1);              \
    return res;                                              \
  }

Вместо них поставьте полностью аналогичные (но, удивительным образом - работающие):

#define __SOCKET_REGISTER16(name, address)                   \
  static void write##name(SOCKET _s, uint16_t _data) {       \
    writeSn(_s, address,   _data >> 8);                      \
    writeSn(_s, address+1, _data & 0xFF);                    \
  }                                                          \
  static uint16_t read##name(SOCKET _s) {                    \
    uint16_t res = readSn(_s, address);                      \
    uint16_t res2 = readSn(_s,address + 1);                     \
    res = res << 8;                                             \
    res2 = res2 & 0xFF;                                         \
    res = res | res2;                                           \
    return res;                                              \
  }

(это исправление взято отсюда: http://code.google.com/p/arduino/issues/detail?id=605)

В большинстве случаев это помогает; мало того - говорят, что некоторые PPA в Ubuntu уже содержат пакет "arduino" с этим патчем, но давать на них ссылки не буду - я не понимаю смысл создания пакета для программы, которая великолепно работает, будучи распакована в одну папку. Гораздо удобнее качать и ставить дистро непосредственно с arduino.cc, не мучаясь вопросами "а чой-то они там наменяли-то?!"

Тем, у кого после вышеописанного патча все равно не заработает - рекомендую посмотреть на версию кросс-компилятора gcc-avr в составе вашего дистрибутива Linux. Если это, например, 4.5.3 - причина может быть в этом, и стоит позаботиться об откате на 4.3.2 или создании собственного окружения. Возможны разные варианты действий, но я пока выбрал наиболее тупой простой - развернул в виртуальную машину под Windows дистрибутив 0023 и временно работаю в нем. И вообще - пользователям Windows в этом плане проще, поскольку хоть их дистрибутив ArduinoIDE и выглядит чрезмерно "пухленьким", в него уже включен порт avrgcc - WinAVR, что драматически повышает стабильность по сравнению с Linux, где пакет gcc-avr "приходит" вместе с дистрибутивом ОС.

Тем, кто уже начал использовать включенные в состав ArduinoIDE библиотеки DHCP, стоит обратить внимание на другой патч: http://code.google.com/p/arduino/issues/detail?id=742

Сейчас при формировании DHCP-запроса, код из библиотеки Ethernet не совсем корректно формирует уникальное имя хоста, генерируя псевдослучайный суффикс в том числе и из "непечатных" символов: это может создавать потенциальные проблемы при работе DNS.


02.02.2012

Angelino R2

Следуя моде, выпущена Angelino R2 - теперь тоже с arduino 1.0 pinout:


Отличия от R1 - только в добавлении колодок SCL/SDA/IOREF и появлении аутентичных русских названий :) К сожалению, неудачно отрезался фрагмент маски, на котором была нанесена полярность и напряжение батарейного питания - пришлось сделать бумажную наклейку. По этой же причине часть пошла в магазин в виде печатных плат, а часть - в виде недорогих китов для самостоятельной сборки с ATmega8.