31.12.2011

HNY 2012

HAPPY NEW YEAR!

Пусть новый 2012 год принесет моим читателям радость новых открытий и побед,  а боль, грусть и досада пережитых неудач останутся в старом 2011, без возможности пересечь epoch  1325361600!

Ну а я постараюсь по мере своих сил развлекать вас через свой блог и далее ;)

30.12.2011

Адаптация библиотек для Arduino 1.0

В последнее время много народу жалуется, что с новой ArduinoIDE не работают их старые любимые библиотеки. На самом деле, иногда заставить их работать очень просто - минимальные телодвижения выглядят следующим образом:

  1. Переходим в каталог с библиотекой
  2. Ищем во всех файлах .cpp и .h, не встречается ли где
    #include "WProgram.h"
  3. Если находим - заменяем на:
#if defined(ARDUINO) && ARDUINO >= 100
  #include "Arduino.h"
#else
  #include "WProgram.h"
#endif 


И, если нам повезло и больше ничего править не надо, библиотека будет одинаково хорошо работать и с IDE 0022/0023, и с 1.0.

21.12.2011

Arduino 1.0: pinout и IDE

В самый последний день ноября нас наконец-то посетил исторический релиз ArduinoIDE 1.0

Конечно, я должен был опубликовать эту статью еще недели две назад. Но я постоянно откладывал этот пост - в основном из-за запаздывания материалов на официальном сайте arduino.cc, без которых оставалось некоторое количество вопросов. 

Итак, в отличие от остальных версий ArduinoIDE выпуск 1.0 происходил не так, как обычно.  Сначала было выпущено два релиз-кандидата, чтобы дать всем привыкнуть к нововведениям, которые были известны заранее: потребуется адаптация библиотек, появится новая плата Arduino Leonardo, изменится стандартная физическая раскладка пинов (должны добавиться четыре). После второго релиз-кандидата вдруг неожиданно вышла ArduinoIDE 0023, в которой главным событием стало использование optiboot 4.4 и переход с ATmega8u2 на ATmega16u2 в платах Uno, Mega2560 и ADK.  

К счастью, на официальном веб-сайте все-таки появились актуальные фото последних ревизий плат и стало видно, что добавлено 3 дополнительных пина:
  • на верхней колодке - SDA, SCL:

  • на нижней колодке - IOREF:

Таким образом, фоторобот новой платы из статьи Великий Леонардо стал выглядеть так:


Четвертый пин (рядом с IOREF) оставили свободным - для будущих расширений. 

Дублирование SCL и SDA выглядит логичным - стараясь сохранить универсальность раскладки, авторы с самого начала зафиксировали положение UART (пины 0 и 1 за RX и TX), затем обожглись на пинах SPI при создании Mega (с тех пор SPI надо брать исключительно с вилки ICSP). Видимо, есть желание или вынужденная необходимость стыковать шилды также и по I2C - а они-то как раз, увы, фиксированного положения пока не имели.

Появление IOREF - прямое наследие Arduino Due. Будущая ARM/Cortex плата была упомянута всего однажды, но похоже, что именно ей мы обязаны появлением Arduino pinout 1.0. Поскольку Due трехвольтовая, то предполагается, что будущие Shield-платы будут способны через этот пин адаптировать уровень логической единицы для обмена с основной платой. Соответственно, на IOREF должно подаваться VCC MCU (+5В, +3,3В или +1,8В). 

В качестве варианта - на шилд-плате IOREF можно подключить к специальному чипу-согласователю уровней сигналов. Но тогда автоматически встает вопрос совместимости - что делать, если такой шилд подключен к "старой" плате, и IOREF попросту повис в воздухе? Городить на шилде специальную схему для такого случая? Оказывается, есть простой подход ;) Вот так, дешево и сердито, при помощи пары диодов Шоттки это реализовано в Arduino MotorShield R3:

Если брать в общем случае комбинацию новая плата+старый шилд, то вроде бы все нормально. В неиспользуемые старыми шилдами колодки ничего не втыкается. Но если старая плата принимает на себя новый шилд, то мне довольно ясно представляется, как эти дополнительные четыре ножки упрямо упираются в элементы, расположенные на месте несуществующих отверстий на старой плате (а они были, особенно в области IOREF!). Возможно, все пропало! придется их подрезать или отогнуть.

А вот c выходом релиза ArduinoIDE 1.0 по поводу Leonardo наступила некоторая неизвестность. Во-первых, определение Leonardo закомментировано в boards.txt, а во-вторых - ошибки в ядре и бутлоадере исправлены не до конца. А пофиксить их было бы довольно просто - достаточно посмотреть в исходники Teensy. Однако, положительный момент тоже присутствует - есть изменения в правильном направлении, а саму поддержку USB из ядра никуда не удалили. И если бы раньше я заключил, что выход Leonardo откладывается до следующего года, то с таким непредсказуемым развитием событий уже завтра может выйти ArduinoIDE 1.1, где оно будет. Собственно, такое бывало и раньше - выпускали новую IDE ради изменений в boards.txt.

Поэтому, для тех, кто хочет поэкспериментировать с Leonardo до его официального выхода -  плата Freeduino 32u4 R2. Основное отличие от версии R1 - это шелкография, на которой теперь нанесены пины Arduino (сама раскладка осталась совместимой) :
Есть, правда, и один недочет - дополнительный аналоговый пин A11, он совмещен с цифровым D6. Напоминаю, что Freeduino 32u4 имеет на борту:

  • микроконтроллер ATmega32u4 со встроенной поддержкой USB;
  • 32K FLASH, 2.5K SRAM, 1K EEPROM;
  • программирование через USB (ArduinoIDE), ISP и JTAG; 
  • 25 универсальных пинов, которые могут быть сконфигурированы в качестве входов или выходов, со встроенными подтягивающими резисторами;
  • для 12 универсальных пинов (из 25) возможна работа в режиме 10-битного АЦП;
  • для 7 пинов возможна работа в режиме аппаратного ШИМ;
  • 1 х UART, 1 x I2C и 1 x SPI.
Владельцам Freeduino 32u4 R1, при переходе на ArduinoIDE 1.0 настоятельно рекомендую обновиться:
  1. freeduino32u4-variant-arduino1.0.tar.gz - только variant, без измененного ядра - гарантирует аутентичность окружения вашей ArduinoIDE 1.0rc2. Правда, не на всех пинах Freeduino32u4 будет ШИМ.
  2. freeduino32u4-core-arduino1.0.tar.gz - variant + core, чтобы всё работало корректно. Именно его я и рекомендую ставить, перетирая существующее core в дистрибутиве.
В обоих вариантах надо распаковать архивный файл в arduino-1.0/hardware/arduino и исправить boards.txt, добавив туда содержимое файла boards.txt.add:

leonardo1.name=Freeduino 32u4
leonardo1.upload.protocol=arduino
leonardo1.upload.maximum_size=30720
leonardo1.upload.speed=1200
leonardo1.bootloader.low_fuses=0xde
leonardo1.bootloader.high_fuses=0xda
leonardo1.bootloader.extended_fuses=0xcb
leonardo1.bootloader.path=diskloader
leonardo1.bootloader.file=DiskLoader-Leonardo.hex
leonardo1.bootloader.unlock_bits=0x3F
leonardo1.bootloader.lock_bits=0x2F
leonardo1.build.mcu=atmega32u4
leonardo1.build.f_cpu=16000000L
leonardo1.build.core=arduino
leonardo1.build.variant=freeduino32u4

На всякий случай, названия портов ATmega32u4 сохранены с противоположной стороны платы:

(хотя, кто будет туда заглядывать, если она уже вставлена в беспаечную макетку? ;)

Купить Freeduino32u4 можно здесь.

13.12.2011

Ёлкадуино

Рискуя превратить свой блог в дайджест журнала Радио, в качестве краткого предисловия хочу поделиться содержимым раздела "Радио - начинающим" декабрьского номера: там схемы сразу двух светодиодных ёлок. Такие, знаете - мигалки - чисто for fun. Первая схема родом из Украины (автор - В.Хмара из Житомира, усовершенствовал схему А. Лечкина, опубликованную в 2007 году во все том же Радио):



Схема выполнена на основе трехфазного мультвибратора, управляющего тремя группами светодиодов (суммарно их 20 штук), создающих эффект "бегущий огонь". Схема довольно ортодоксальная простая, настройка не требуется. Единственное, что можно менять - это скорость переключения, подбирая емкости между транзисторами мультвибратора.

Вторая схема более продвинута, поскольку имеет в своем составе "восьминогий" MCU PIC12F675 (автор - Владимир Баландин), управляющий 28-ю двухцветными светодиодами:



Светодиоды разбиты на две группы, каждый цвет группы управляется отдельно - через четыре полевых транзистора. Эффектов реализовано гораздо больше - "плавное зажигание и погасание" (fading),  мигание, переключение цветов. К сожалению, на двух группах светодиодах "бегущие огни" реализовать можно очень и очень условно, но зато для скачивания доступна микропрограмма с исходниками (и даже вместе с видеороликом, но, к сожалению, автор демонстрирует только один эффект).



К чему это я? Ах да - в качестве иллюстрации: думаю, существует туева куча очень много схем новогодних светодиодных елок, но какая из них самая лучшая для повторения? Та, которая светит ярче или та, которая выдает более затейливый эффект? Не наскучит ли она  через пару дней однообразием эффектов? Думаю, читатель уже догадывается, к чему я клоню - было бы прекрасно, если бы внутри такой елки была Arduino-совместимая плата, дающая реципиенту качественно новый простор для творчества. Это была бы, как любят теперь выражаться наши чиновники,  умная елочка.

Памятуя о изобретении велосипеда, я начал искать Arduino-совместимую елку на просторах Интернета, и нашел практически то, что искал - Blinky Christmas Ornaments.


Автор как раз пишет, что I wanted the board to be easily hacked by family and friends that were so inclined - идея, в точности совпадающая с моей.


Полностью уничтожив немного поработав с неприемлемым для меня контуром-кругляшкой, удалось вписать ребристый елочный профиль в размер для бесплатной версии EagleCAD - 100x80 мм:


Основная идея сохранена - использование пары закаскадированных микросхем 74HC595N для индикации на 16 светодиодах (8 зеленых + 8 красных). В центре есть также четыре дополнительных светодиода, непосредственно подключенных к линиям D2, D3, D4, D5 (здесь и далее - нумерация Arduino). В качестве MCU использован ATmega328P-AU с бутлоадером Duemilanova, но вместо USB-порта только вилка для кабеля FTDI - не думаю, что наличие отдельного USB-чипа в таком устройстве слабо оправдано. "Хакнуть" елку несложно: достаточно подключить USB-TTL переходник и  выставить в ArduinoIDE тип платы "Arduino Duemilanova". Если кому-то больше по душе UNO, можно перешить бутлоадер, запаяв гребенку ISP06 и подключив к ней любой ICSP-программатор с помощью 6-пинового кабеля.


Присутствует также и отверстие для подвешивания девайса за ниточку:


Но мне кажется, подвешивать надо за проводочек, по которому приходит +5В ;)

В нижней части HNYDuino (это официальное название, а мне по душе менее благозвучное "Ёлкадуино") - пины для стыковки с подставкой при помощи вилки PLS-R:



Подставка играет не только декоративную роль, но и несет на себе холдер батарейки типа "крона", стандартный для Arduino разъем питания и защитный диод 1N4007.



Но самое главное - туда выведены некоторые неиспользуемые пины - D6, D7, D9 и A0, A4, A5. Это позволяет читать показания аналоговых датчиков, использовать шину I2C и аппаратный ШИМ.


Расположенный слева DPDT переключает источники питания - либо это +5В с кабеля FTDI, либо BATT, приходящий с подставки (напряжение от БП 9..12В или "крона"). Если подключить что-то одно, то он превращается в выключатель.

Что можно сотворить с такой елочкой? Фантазия подсказывает световой датчик (чтобы она зажигалась только с наступлением темноты) и/или датчик звука, реагирующий на хлопки или традиционное "елочка, зажгись!". Более изощренным можно посоветовать подключить по I2C микросхему RTC DS1307 и ровно в 00:00 01.01.201X "неожиданно" замигать всеми огоньками или сыграть гимн через предусмотрительно подключенный пьезодинамик.

Конечно, проект далек от совершенства - тут есть огромный простор для совершенствования. Поэтому, для ищущих even more fun и готовых поработать самостоятельно - выкладываю схему и разводку в Eagle, а также и тестовый скетч для проверки работы.

Happy new hacking! ;)

07.12.2011

LaunchPad unboxing

И все-таки я решил из принципа заказать LaunchPad у TI - со второй попытки у меня получилось. TI не много ни мало... отправляет их FedEx-ом за свой счет! Так что подержать заветную коробочку в руках можно уже через какие-то четыре-пять дней:


Но, что же внутри? Ниже - фотографии, которых мне так не хватало к статье в Радио для полноты ощущений ;)