15.08.2012

RiP

С прискорбием вынужден сообщить, что ушел из жизни мой соавтор Юрий Соловьев - инженер-практик с огромным опытом, специалист в области промышленной автоматики и климатических камер, наконец - просто очень хороший человек.


Мы познакомились на почве совместного увлечения Ардуино и периодически пытались привести к общему знаменателю наши взгляды. Он верил, что на основе Ардуино можно построить открытый PLC (программируемый логический контроллер),  и даже завел на эту тему блог, в который я успел написать пару статей. В ответ он нашел время написать для этого блога статью Сеть 1-Wire в "полевых условиях", что было для него непросто - учитывая невероятную занятость на основной работе.

Юрий Геннадьевич всегда был приверженцем движения Open Source, смело использовал открытые разработки и, самое главное, умел вдохновлять и заражать своим оптимизмом, целеустремленностью. Именно благодаря ему я поверил и осознал, насколько важно делиться своим опытом и знаниями с другими, как это может повлиять на окружающий нас мир. 

16.07.2012

Launchpad и ArdhuinoIDE

Вчера из сообщения в блоге Hack-a-Day с интересом узнал о проекте Energia - ArduinoIDE для работы... с Launchpad!



Конечно, не все пока там гладко - на текущий момент насчитывается как минимум 18 проблем, в основном народ просит прикрутить библиотеки и починить Linux-дистро (его, кстати, можно временно скачать по ссылке в описании проблемы).

Тем не менее, с дистрибутивом под Windows все ОК, и его вполне можно опробовать в работе.


Технически, Energia - это форк на github-е от ArduinoIDE 1.0, поэтому выглядит всё более, чем привычно, разве что в красных тонах.


Как видите - в качестве типов плат сразу перечисляются совместимые с LaunchPad MSP, а в качестве программатора - единственный rf2500.

Все примеры на месте, но из библиотек адаптировано всего три:

  • SPI;
  • Wire;
  • TimerSerial
Последняя, впрочем - это вариант HardwareSerial, которая и так уже входит в ядро Arduino для ATMEL.

Скетчи, разумеется, пишутся по-прежнему на Wiring. Синтаксис за пределами Wiring тоже остался вполне похож - используется msp430-gcc 4.6.3, с самыми последними патчами. Карту распределения пинов можно найти в единственном файле-варианте: 

                      +-\/-+
               VCC   1|    |20  GND
         (A0)  P1.0  2|    |19  XIN
         (A1)  P1.1  3|    |18  XOUT
         (A2)  P1.2  4|    |17  TEST
         (A3)  P1.3  5|    |16  RST#
         (A4)  P1.4  6|    |15  P1.7  (A7) (SCL) (MISO) depends on chip
         (A5)  P1.5  7|    |14  P1.6  (A6) (SDA) (MOSI)
               P2.0  8|    |13  P2.5
               P2.1  9|    |12  P2.4
               P2.2 10|    |11  P2.3
                      +----+

Таким образом, чтобы, например, установить высокий уровень на пине P1.1, можно написать digitalWrite(P1_1, HIGH). Можно обращаться к пинам и по номерам, в следующем соответствии с символическими:


Символическое имяНомер пина
P1_0, RED_LED2
P1_13
P1_24
P1_3, PUSH25
P1_46
P1_57
P2_08
P2_19
P2_2, TEMPSENSOR10
P2_311
P2_412
P2_513
P1_6, GREEN_LED14
P1_515

Тут стоит сразу учесть, что P2_X доступны только для контроллеров в 20-контактном исполнении, и для 14-контактных они будут отсутствовать, создавая разрыв в нумерации. С другой стороны, позиционность будет сохранена - т.е. при замене 14-контактного на 20-контактный в скетче не понадобится менять ровным счетом ничего. 

Для избранных пинов доступен аппаратный ШИМ. Пины 3, 4, 14 доступны всегда, для МК в 20-контактном корпусе добавляются все пины P2_X. Есть и аналоговые пины, так что если на кристалле есть АЦП, будет работать analogRead().

Интересно? ;) Если да, то изучите wiki, закажите себе LaunchPad и дерзайте!

Я практически сразу обратил внимание на то, что реальная задержка, создаваемая delay() оказывается в два раза короче, чем указано. Возможно, это как-то связано с тактовой частотой - судя по boards.txt скетчи компилируются в расчете на 16МГц.

Так или иначе, уверен - Роберт Весселс (автор проекта) будет признателен за любую помощь. Если вы находите LaunchPad более привлекательным - помогите ему с адаптацией ArduinoIDE: уверен, что тогда число вовлеченного народа должно значительно возрасти ;) 

04.07.2012

ATmegaU R2


Плата ATmegaU,  выпущенная в свое время исключительно ради эксперимента и разошедшаяся почти сразу, возвращается во второй ревизии R2

  1. Теперь она поставляется только с MCU ATmega16u2 - для тех, кто пишет собственные прошивки это очень существенно - в предыдущем варианте ATmega8u2 свободной памяти было мало, и комбинировать прошивку USB-TTL еще с чем-то было тяжело :(
  2. Добавлен отключаемый резистор 10К на линии DTR, притягивающий ее к GND. Сделано по аналогии с Freeduino ONE / Arduino Uno R3: освобождает от необходимости сначала замыкать DTR на землю, и, не отпуская, нажимать сброс. Теперь сразу переходим в режим DFU единственным нажатием на сброс. При желании резистор отключается (solder-джампер с противоположной стороны).
См. также описание ATmegaU в магазине.




02.07.2012

ADK 2012

Недавно в официальном блоге Arduino появилось сообщение о том, что на очередной конференции Google IO была представлена новая плата ADK 2012, уже базирующаяся на Arduino Due:


Официальный выход собственно Arduino Due запланирован на этот год, вместе с новой  ArduinoIDE, которая будет способна генерировать код под ARM. Пока что можно полюбоваться на фото ограниченного выпуска для разработчиков:

Фото в этом посте лицензированы под CC BY-NC-SA.

26.06.2012

Leonardo официальный

Вместе с выходом ArduinoIDE 1.0.1 нас посетила и "новая" плата Leonardo, выпуск которой был настолько основательно задержан, что она уже успела обзавестись массой клонов:



В официальном магазине Arduino ее можно приобрести за 18 EUR со всеми разъемами  или же, немного сэкономив, за 16 EUR, но уже без них:

Изучая схему, можно найти испытанный не одним поколением плат Arduino узел автоматического выбора питания на основе LM358 и полевого транзистора. Цепь питания +3.3В выполнена на отдельном регуляторе LP2985A-33, как и во всех платах, в которых нет USB-TTL моста FTDI232RL.

Есть и некоторые нововведения - впервые в этой серии видим разъем microUSB. Колодки выводов расположены согласно последнему стандарту arduino pinoout 1.0 - с фиксированной позицией SCL, SDA и IOREF. Скопированы и спорные с моей точки зрения "усовершенствования" в виде резистора 1М между ножками кварца, диода в цепи сброса и включенного в параллель внешнему источнику питания диода, лихо закорачивающего источник с неверной полярностью.

Таким образом, никаких сюрпризов в схеме нет - всё самое интересное происходит в программной части (напоминаю, что до момента выхода ArduinoIDE 1.0.1 код ATmega32u4 был практически неработоспособен из коробки - например, чтобы работать с Freeduino 32u4 надо было установить пропатченное ядро).

Бутлоадер

Изменен полностью - ранее он основывался на коде Peter Barrett-а и назывался DiskLoader, теперь же мы имеем модифицированный вариант CDC-бутлоадера из LUFA, под кодовым названием Caterina. Единственное предположение по поводу цели такого перехода - новый код лучше поддерживается - других внятных объяснений я пока не подыскал, особенно в свете удвоившегося размера bootloader-а. Звучит особенно грустно, если вспомнить, что поддержка USB неявно подключается к каждому компилируемому под Leonardo скетчу, для поддержания возможности программного сброса через USB. И вот уже blink занимает 4850 байт (против 1084 при компиляции под UNO!). Невольно вспоминается teensy с его закрытым от общественного взора кодом, но зато и с впечатляющим 512-байтным размером...

Как и раньше, процедура заливки скетча начинается со сброса, и сигналом к этому служит закрытие виртуального COM-порта Leonardo, до этого открытого на скорости 1200. Изменился, впрочем, сам подход к запуску бутлоадера - если раньше управление ему передавалось немедленно, то теперь это происходит через 120 мс, путем установки watchdog-а. Полагаю, авторы стремились дать корректно завершиться собственно процедуре закрытия порта, чтобы она не провоцировала ситуацию с таймаутом на хосте.

Таймаут ожидания заливки скетча в бутлоадере увеличили до 8 секунд! Практика показала, что это действительно правильно: время от времени получаю письма от пользователей Freeduino 32u4, что их плата перестала принимать скетчи по USB. Добиться этого нетрудно - достаточно залить в плату скетч, который ее полностью завешивает, и ArduinoIDE сбросить ее программно уже не сможет. Но когда пользователь нажимает кнопку сброса на плате, и лишь затем - Ctr+U в ArduinoIDE, процесс компиляции и ликновки не успевает уложиться в заданные 6 секунд, и плата вновь зависает. Я всегда рекомендую изменить последовательность - сначала нажимать Ctrl+U и только потом - сброс на плате (ну, или нажать и удерживать сброс, а потом отпустить его - надо просто прицелиться поточнее, и это всегда помогает :) 

Если раньше и бутлоадер, и ядро имели один и тот же PID комбинированного USB-устройства, новый бутлоадер представляется только CDC-устройством, зато имеющим свой собственный PID. Таким образом, Windows попросит установить драйвера дважды - сначала для бутлоадера, затем для скетча.

Ну и последнее изменение - протокол общения с бутлоадером сменился с  'arduino' на 'avr109'. В этом тоже не стоит искать скрытого смысла, поскольку именно avr109 поддерживает CDC-бутлоадер из LUFA.

Ядро

Arduino Leonardo по-прежнему уверенно изображает из себя комбинированное USB-устройство (CDC-модем, мышь и клавиатура - три в одном). 

С точки зрения API все осталось прежним - использовать это многообразие функциональности вы можете  через соответствующие классы Serial, Mouse, Keyboard. Причем интерфейс общения с клавиатурой обогатился функциями-членами press() и release(), которые великолепно понимают "непечатные" символы, и поэтому редактировать исходники ядра, чтобы сделать sendReport публичным (как это, например, потребовалось здесь) отныне не нужно.

Наконец-то пофикшена инициализация таймеров - аппаратный ШИМ одинаково корректно работает на всех выходах.

К сожалению, в ядре по-прежнему есть и недоделки:
  • попытка использовать встроенную функцию tone, скорее всего, вызовет повисание скетча, запущенного на ATmega32u4;
  • не работают назначаемые пользователем прерывания - через attachInterrupt, это Issue714. Справедливости ради стоит заметить, что работа в этом направлении все-таки ведется, но пока - увы, прерывания в для ATmega32u4 реализованы.

Freeduino 32u4 в ArduinoIDE 1.0.1

Для того, чтобы Freeduino32u4 можно было использовать с ArduinoIDE 1.0.1, потребуется замена бутлоадера - увы, подружить с ней старый вариант на базе DiskLoader мне пока не удалось.

С другой стороны, новый бутлоадер основан на Caterina и позволяет добиться максимальной совместимости с оригинальным Leonardo - изменения касаются только VID/PID и мигания встроенным светодиодом L. Ядро в этом случае тоже остается неизменным - добавляется лишь variant-файл для правильной трансляции номеров пинов.

Расплачиваемся за все это двумя килобайтами памяти программ... если решились - скачайте и распакуйте в каталог с ArduinoIDE 1.0.1 архив, в котором вы найдете:
  • готовый hex, для заливания в плату при помощи программатора;
  • файл-вариант Arduino-нумерации пинов Freeduino 32u4;
  • .inf-файл для Windows (новому бутлоадеру - новы PID :);
  • boards.txt.add: секция для добавления к boards.txt;
  • Makefile.freeduino32u4 для сборки hex-файла с правильными VID/PID.
Прошивать можно либо из ArduinoIDE, либо из командной строки (например, если у вас AVRDoper):

avrdude -c stk500v2 -P avrdoper -B 3 -p atmega32u4 -F -e -u -U lock:w:0x3f:m -U efuse:w:0xcb:m -U hfuse:w:0xd8:m -U lfuse:w:0xff:m
avrdude -c stk500v2 -P avrdoper -B 1.1 -p atmega32u4 -F -U flash:w:Caterina-Freeduino32u4.hex -U lock:w:0x2f:m


Саму плату можно купить здесь.