Показаны сообщения с ярлыком Freeduino 32u4. Показать все сообщения
Показаны сообщения с ярлыком Freeduino 32u4. Показать все сообщения

30.01.2014

Freeduino 32u4 R6

Вышла очередная ревизия нашей платы на ATmega32u4, уже шестая по счету.


(слева направо - Freeduino 32u4 R4, Freeduino 324u4 R6, Freeduino Nano)

Основная борьба шла за уменьшение размеров, поскольку плата в первую очередь предназначена для беспаечной макетки. Ура, теперь будет закрыт на один ряд отверстий меньше (и по вертикали, и по горизонтали). Разъем USB тоже уменьшился (mini -> micro).

К сожалению, продолжать уменьшать размеры мешает осознанная необходимость размещать удобочитаемую шелкографию с названиями пинов (без нее придется подглядывать в картинку с обозначениями). Не исключаю, что в будущем перейдем на QFN-корпус и получится что-то наподобие Arduino Micro. Напоминаю, что  сейчас на плате отсутствует вход VIN, и питать её можно только от USB или источника +5В.

Немного модифицирован бутлоадер. Нам пришлась по душе идея SparkFun: одиночное нажатие на сброс теперь перезапускает скетч, а вот для активизации бутлоадера надо нажать на сброс дважды:


Это удобно, если надо быстро перезапустить скетч, не теряя 8 секунд на ожидание завершения бутлоадера. 

Для владельцев предыдущих ревизий платы, желающих прошить новый бутлоадер Freeduino32u4: это можно сделать через ArduinoIDE или через avrdude:

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 3 -B 1.1 -p atmega32u4 -F -U flash:w:file.hex -U lock:w:0x2f:m

Конечно, для этого потребуется программатор (строки программирования приведены для AVRDoper).

21.12.2012

ArduinoIDE 1.0.3

Вышла очередная версия ArduinoIDE 1.0.3. Самым значимым в списке изменений идет новая плата - Arduino Esplora (Leonardo-совместимая, на основе ATmega32u4):


В отличие от предыдущих плат, на этой есть сенсоры: фоторезистор, акселерометр, датчик температуры. Также есть четыре кнопки, аналоговый джойстик, пьезоизлучатель, трехцветный светодиод и линейный потенциометр. Разъемы для стыковки с LCD и несколько входов / выходов тоже присутствуют: 

Рулить всем этим многообразием помогает Esplora Library. Вообще, конечно же - это просто мечта для гаджетоманов-ардуинокопателей, которым не жалко потратить 65 USD. Но перед покупкой все-таки рекомендую пробежаться по Getting Started With Esplora.

Но вернемся к новой версии ArduinoIDE: нас ожидает пара незначительных фиксов, связанных с Leonardo-совместимыми платами. Один касается бутлоадера, другой - массива digital_pin_to_timer_PGM, описанного в variant-файле. 

Первый фикс реализует запуска скетча сразу после подачи питания (точнее, теперь-то это наконец работает). Что до variant-файла, то там банально восстановили кусок массива, пропавший где-то между версиями 1.0.1 и 1.0.2 - потенциально это могло вызывать фатальные неприятности при попытке включить аппаратный ШИМ на тех пинах, которые такой возможности не имели.


Исправления хоть и мелкие, но вполне разумные, поэтому рекомендую владельцам Freeduino 32u4 а) провести обновление поддержки своей платы в ArduinoIDE с помощью нового variant-файла и б) при наличии программатора, прошить новый бутлоадер. Со старым бутлоадером Caterina, естественно, тоже будет работать, но начиная с этого момента во все Leonardo-совместимые контроллеры в нашем магазине по умолчанию будет прошит новый вариант. Так что смело качайте и распаковывайте этот файл в каталог с установленной ArduinoIDE 1.0.3 (не забудьте ее перезапустить, чтобы изменения актуализировались).

В новостях также сообщается и про обновление кода для бутлоадера ATmega8, а также про поддержку скорости 600 бод библиотекой SoftwareSerial.

Словом, типичный релиз под новую плату, в который число случайно вошли несколько изменений.

И, судя по всему, число клонов Leonardo будет расти. Взять, например, новую "женскую" плату от Seeedstudio:



Если присмотреться, то видно несколько моментов:
  • есть колодки пинов и вилка программирования, так что скорее всего предполагается стыковка с шилд-платами;
  • присутствует холдер с батарейкой и переключателем питания - следовательно, возможна автономная работа и трехвольтовое питание платы/схемы;
  • на плате - ATmega328P и FT232RL (авторы утверждают, что в продажу пойдет плата  именно с ATmega32u4);
  • присутствует пара SMD-светодиодов ;)
Плата все еще не имеет названия, и если на языке вертится что-то подходящее - напишите им немедленно! ;)

01.12.2012

ArduinoIDE 1.0.2

В конце октября - начале ноября произошло сразу несколько событий: была официально выпущена в продажу и почти сразу же распродана Arduino Due, вышла ArduinoIDE 1.5 специально для поддержки этой самой Due, затем вышла ArduinoIDE 1.0.2 - не поддерживающая Due, но содержащая много полезных фиксов для платы Leonardo.

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


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

04.04.2012

Freeduino wireless (1)

Однажды мне повезло выкроить время на посещение мероприятия Hard StartUp в рамках нашего провинциального hackspace. Сам я от выступления категорически отказался под предлогом бессистемного расстройства вокабулярия к концу рабочего дня, но послушал выступающих с интересом; явно бросалось в глаза, что докладчики испытывали недостаток в пульте дистанционного управления презентацией: приходилось просить листать слайды сидящего за ноутбуком человека.

Ясно, что радиокружок хакспейс выруливает в основном за счет энтузиазма его активистов и базы ИТМО, и у ребят просто могло отсутствовать нужное оборудование. Уверен, что это было не последнее их мероприятие с проведением презентаций, поэтому предлагаю свой Arduino-вариант аналогичного устройства - надеюсь, оно пригодится не только им.

Ингредиенты

Сначала создадим прототип - из того, что найдется под рукой. Мне всегда несколько проще, потому что у меня под рукой целый mk90.ru/store ;)

1. Плата Freeduino32u4 - содержит единственный чип ATmega32u4, который может изображать из себя клавиатуру, и поэтому именно ее мы будем подключать к компьютеру с презентацией;
2. Плата Freeduino Nano - будет находиться в руке у докладчика, считывая нажатия на кнопки прокрутки и передавая их Freeduino 32u4;
3. Кнопки, проводки и пара беспаечных макеток, чтобы не хвататься за паяльник по пустякам.
4. Комплект модулей беспроводной связи - наверное, самые дешевые устройства для передачи низкоскоростного информационного потока через эфир для небольших расстояний.


Немного теории

Прежде всего, вот заранее мой ответ фанатикам  IEEE 802.11, на вопрос "почему в списке нет wifi?!": не палите из пушки по микробам! В нашей задаче не нужна маршрутизация, одновременная коммуникация между несколькими устройствами и повышенная проникающая способность радиоизлучения. Нас устроят гораздо более простые устройства  - т.н. RF-трансиверы. В основном, они отличаются мощностью, несущей частотой и способом модуляции. Возьмем недорогой маломощный модуль, используемый в самоходных радиоуправляемых игрушках и работающий на нелицензируемой в России частоте 433 МГц, с модуляцией ASK.

"ASK" означает, что частота и фаза сигнала остаются постоянными, а для кодирования единицы и нуля варьируется амплитуда. Подобные приемники и передатчики можно собрать и самостоятельно, подробнее об этом можно прочесть, например у Алексея Кравченко в книге "10 практических устройств на  AVR, книга 2".

Однако, слабые места такого решения тоже выглядят внушительно:
  • два передатчика, работающие на одной несущей частоте, будут конфликтовать, мешая друг другу;
  • приемник не имеет возможности отличить посылку от одного передатчика от посылки другого - надо позаботиться об идентификации программным способом; 
  • сильная подверженность помехам, радиус действия зависит от питающего напряжения; 
  • практически нулевая безопасность, шифрование аппаратно не поддерживается.

Что-то решается программно, что-то - схемотехнически, но самое главное - такие приемопередатчики поддерживаются ArduinoIDE с помощью специальной библиотеки VirtualWire.

Схема

Рисуем схему, которая будет подключаться к USB:


И ту, которая в руке у лектора (с кнопочками):


Предполагаем пока, что обе платы питаются от компьютера, через USB.

Макет

Как бы не ругали беспаечную макетку за надежность контактов, на несложных схемах работать с ней весьма удобно. Я использую сочетание жестких и гибких проводов (вообще, это дело вкуса - гибкими быстрее, но менее наглядно). С платой 32u4:


С платой Freeduino Nano:


Кнопки устанавливать я поленился, выбрав в качестве имитации их нажатия втыкание проводка в дырочку рядом с соответствующим контактом Nano (естественно, другим концом провод воткнут в GND).

Скетчи

Как уже упоминалось, существует библиотека VirtualWire. Она будет делать за нас всю нудную работу - не только управлять приемником и передатчиком, но и кодировать наше сообщение помехоустойчивым кодом, а также считать/проверять контрольную сумму всего сообщения. Выбирая пины Arduino-совместимой платы для подключения приемника и передатчика, я вполне сознательно выбрал те, с которыми библиотека работает по умолчанию (помните об этом, если будете менять схему - не забудьте передать соответствующие параметры библиотеке).

Скетч передатчика:

#include <VirtualWire.h>

#define buttonsCount  3
int bState[buttonsCount];
int bNum[buttonsCount] = {2,3,4};

void setup() {
  // buttons
  for (byte i=0;i<buttonsCount;i++) {
    bState[i] = HIGH;
    pinMode(bNum[i],INPUT); // для ясности, после сброса все пины и так уже входы
    digitalWrite(bNum[i],HIGH); // pullup
  }
  // инициализируем последовательный порт - только для отладки
  Serial.begin(9600);
  // инициализируем библиотеку VirtualWire
  vw_setup(2000);      // скорость обмена в бит/сек
}

void loop() {
   for  (byte i=0;i<buttonsCount;i++) {
     if (digitalRead(bNum[i])!=bState[i]) {
       if (bState[i] == HIGH) {
         char key[2] = {i+1,'\0'}; 
         vw_send((uint8_t *)key, strlen(key));
         vw_wait_tx();
         bState[i] = LOW;
       } else bState[i] = HIGH;
     }
   }
   delay(100);
}

Перед началом использования кнопок, в setup включаем подтягивающие резисторы (зачем нужны подтягивающие резисторы, я уже писал). Далее, сканируем изменение состояния кнопки и, если она перешла из состояния "свободна" в "нажато", генерируем и передаем через беспроводной модуль сообщение с номером кнопки (единственный байт со значением 1, 2 или 3). Задержка в конце - примитивная борьба с дребезгом.

Скетч приемника:

#include <VirtualWire.h>

#define KEY_LEFT 80
#define KEY_RIGHT 79
#define KEY_ESC 41
#define KEY_F5 62


void setup() {
  pinMode(13, OUTPUT); // для индикации приема
  vw_setup(2000); // скорость обмена в бит/сек 
  vw_rx_start();  // инициализация и запуск приемника
}

void loop() {  
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;

  if (vw_get_message(buf, &buflen)) // неблокирующее чтение
  {
     digitalWrite(13, HIGH); // Зажигаем светодиод L - принято сообщение  
     byte key = buf[0];
     
     if (key==1) Keyboard.print(' ');
     else {
      { 
        KeyReport kbd = {0};
        if (key==2) kbd.keys[0] = KEY_LEFT;
         else kbd.keys[0] = KEY_RIGHT;
        Keyboard.sendReport(&kbd);
      }
      {
        KeyReport kbd = {0};
        Keyboard.sendReport(&kbd);
      }                        
     }     
     digitalWrite(13, LOW);
   }
   delay(200); 
}


Этот скетч будет корректно работать (и вообще скомпилируется) только с последним пропатченным ядром ArduinoIDE для Freeduino 32u4 - там функция sendReport сделана публичной, чтобы скетч был способен генерировать нажатия не только на символьные клавиши (буква 'A', цифра '8' или пробел), но и управляющие коды - (стрелки, F-клавиши и т.п.). После вызова sendReport с кодом нажатой клавиши, нужно всегда делать еще один, чтобы сообщить о ее отпускании, в противном случае через некоторое время получим режим повтора.

В данном скетче кнопка №1 транслируется в пробел, кнопка №2 - стрелка влево, кнопка №3 - стрелка вправо. Функция vw_get_message вернет нам полученное сообщение только в том случае, если совпала подсчитанная контрольная сумма - но для нас это полностью прозрачно, просто учитывайте, что она избавляет нас от необходимости проверять достоверность принятой информации с точки зрения эфирных искажений нашего примитивного ASK-сигнала ;)

Roadmap

Итак, макет завелся. Что дальше?

Устройства для реальной жизни можно делать и на основе готовых плат Freeduino, и с помощью ЛУТ-а. Но имейте ввиду, что ATmega32u4 выпускается только в SMD (в отличие от ATmega328P).

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

Наконец, если будут донимать помехи, можно попробовать улучшить помехоустойчивость (повторять сообщение о нажатии в эфир несколько раз или припаять антеннки).

Все это вы уже можете начинать самостоятельно или же подождать моего продолжения, если когда оно появится ;)

25.01.2012

Leonardo в цеху

Пересматривал подборку фотоматериалов Лаймы Фрей (известна также под ником ladyada и своим магазином adafruit.com) с последнего посещения фабрики Smart Projects и наткнулся там на фото Arduino Leonardo:



Это самые крупные фото из всех, что мне пока удалось нарыть, и по ним можно сделать некоторые выводы: 
  • используется раскладка пинов "arduino pinout 1.0";
  • дополнительные аналоговые входы A6-A11 промаркированы на противоположной стороне платы;
  • схема действительно сильно упрощена. Виден регулятор +5В, рядом с ним - регулятор +3,3В, светодиоды RX/TX/L/PWR;
  • прежняя схема автовыбора источника питания на LM-ке в SSOP-корпусе;
  • будет microUSB-разъем.
И (самый главный вывод) - видимо, довольно скоро мы уже получим, наконец, эту плату вместе с ArduinoIDE 1.1 (или как там они теперь их будут нумеровать?!), где ее поддержка включена обратно. Вообще - странно, что итальянцы настолько задерживают выпуск. Уже вовсю появляются клоны:
Скромно замечу, что лишь для последнего варианта есть нормально работающее ядро для ArduinoIDE 1.0, а также в архив добавлены примеры (клавиатура и мышь, изъятые при релизе) - freeduino32u4-1.0.tar.gz


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 можно здесь.

11.11.2011

Freeduino 32u4 в Arduino 1.0rc2

Немного обновил файлы для Freeduino32u4:
  1. В файл с вариантами добавлены константы LED_BUILDIN, SCL, SDA - от последних двух зависит правильная работа встроенной библиотеки TWI, а также они используются в Firmata;
  2. Взято ядро из RC2, затем исправлено под ATmega32u4.
Соответственно, можно скачать:

  1. freeduino32u4-variant-arduino1.0rc2.tar.gz - только variant, без измененного ядра - гарантирует аутентичность окружения вашей ArduinoIDE 1.0rc2. Правда, не на всех пинах Freeduino32u4 будет ШИМ.
  2. freeduino32u4-core-arduino1.0rc2.tar.gz - variant + core, чтобы всё работало корректно. Именно его я и рекомендую ставить, перетирая существующее core в дистрибутиве.
В обоих вариантах надо распаковать архивный файл в arduino-1.0-rc2/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

Раскладка пинов - прежняя (# означает аппаратный ШИМ):

16.10.2011

Великий Leonardo

Как я уже упоминал, вместе с выходом Arduino 1.0 мы получим также и плату Arduino Leonardo:



Доподлинно известно, что на этой плате будет всего один чип ATmega32u4 с кварцем 16МГц. Ранее мы могли наблюдать, как старый добрый мост FT232RL был заменен на ATmega8u2 с нативной поддержкой интерфейса USB и прошивкой конвертера USB-TTL. Делалось это под флагом "преврати свой Arduino Uno во что угодно", но креатив USB-части должен был обязательно уложиться в 8К флеш-памяти. Идею продолжил Leonardo - памяти больше, но чипов меньше. 

Сама идея не так уж и нова - платы на ATmega32u4 в роли единственного и главного чипа существуют уже сейчас  - это и Teensy, и ATmega32u4 breakout, и Freeduino ATmega32u4 made by MK90.RU. Появление поддержки в ArduinoIDE перемещает эти платы на принципиально новый уровень - теперь можно использовать "родное" ядро Arduino, которое отныне включает поддержку ATmega32u4. Схема загрузки скетчей остается прежней - через бутлоадер, который принимает скетч по USB и записывает в основную память, а затем передает ему управление. Откомпилированный скетч по-прежнему содержит внутри библиотеку-"ядро" Arduino, и, в случае компиляции под ATmega32u4, туда добавляется поддержка USB.

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

Бутлоадер гарантированно активируется нажатием на кнопку сброса. Замечу, что в большинстве случаев нажимать  ее не придется, ограничиваясь командой Upload из меню File ArduinoIDE. Перед началом загрузки среда инициирует сброс через USB, но тут есть тонкий момент - чтобы это сработало в плате с единственным MCU, необходима поддержка в функционирующем в данный момент скетче.

В принципе - все логично. Если раньше старт бутлоадера осуществлялся через линию DTR, физически подключенную к линии сброса MCU, то теперь такой возможности нет: если скетч завис намертво (предусмотрительно запретив перед этим прерывания), придется вам все-таки нажать на кнопку сброса руками. Однако, если до этого момента туда был загружен и нормально работал какой угодно скетч - встроенный в ядро Arduino обработчик самосброса "подхватит" запрос по USB и вызовет бутлоадер. В документации на ATmega32u4 сообщается, что передача управления бутлоадеру возможна и при обнаружении сброса шины USB, но Arduino использует создание магической ситуации "открытый на 1200 бод порт был закрыт".

ATmega32u4



Приглядимся повнимательнее к самому MCU (разумеется, при помощи даташита). ATMEL выпустил его только в SMD-исполнении, но зато сразу в корпусе TQFP44, что по сравнению с текущим Arduino UNO SMD на ATmega328P-AU в корпусе TQFP32 дает надежду на некий прирост числа пинов.



Чтобы окончательно расставить точки над ё, я набросал небольшую таблицу:

ПараметрATmega328P-AUATmega32u4-AU
Flash32K32K
SRAM2K2.5K
EEPROM1K1K
Пины
универсальные
2326
JTAGнетесть
USBпрограммный/Low Speedаппаратный 2.0 Full/Low Speed
PLLнет32..96 МГц, таймер 
Таймер 8-битный21
Таймер 16-битный12
ШИМ6 каналов4+4+6
АЦП8 каналов12 каналов
USART11
SPIестьесть

Как видите - и вправду чуть лучше. Массу новых функций привносит USB - в частности, на кристалле поселился PLL. Его можно заставить работать вместе со скоростным таймером или ШИМ-каналом.

Под программным USB для ATmega328 я понимаю V-USB от Objective Development, о которой я неоднократно писал. С одной стороны - нельзя сказать, что программный USB уж такой игрушечный, но и аппаратная поддержка FullSpeed - довольно неплохо, особенно в плане совместимости.

ШИМ-каналы у 32u4 могут быть не только строго 8-битными, но произвольной разрядности от 2 до 16 бит. Запись 4+4+6 символизирует 4 восьмибитных, 4 шестнадцатибитных и шесть высокоскоростных 10-битных каналов. Если рассматривать это с точки зрения Arduino - мы получаем в Leonardo плюс один PWM-пин.

Забегая вперед, обращаю внимание на то, что  USART и USB естественным образом занимают разные пины - в отличие от Duemilanova или UNO, где обмен по USART автоматически означает прием/передачу по USB.

Кстати, все контроллеры прошиваются бутлоадером еще на заводе, что в принципе - удобно, можно запрограммировать когда угодно, не заботясь о вилке для программирования через JTAG или ISP.

Вроде бы основные общие моменты кратко разобраны. В сущности, платы MKBoard / Metaboard - это некие предшественники ATmega32U4-плат, построенные по тому же принципу. Перед тем, как переходить к Leonardo, рассмотрим чуть подробнее существующие платы на ATmega32u4.

Teensy

Сейчас существуют два варианта Teensy, все они строятся на MCU ATMEL с поддержкой USB - Teensy 2.0 на 32u4, а Teensy++ 2.0 - на AT90USB1286:



Teensy поставляется с собственным прошитым bootloader-ом, исходников к которому - нет. Зато есть описание протокола обмена и исходники утилиты командной строки, которая по этому протоколу взаимодействует с бутлоадером. Сам бутлоадер занимает всего 512 байт, так что для скетчей остается 32256 байт свободного места.

Светодиод на этой плате подключен к пину PD6 - он же будет digitalPin6 в режиме совместимости с ArduinoIDE. При этом нумерация пинов для скетчей будет следующей:



Не считая казуса с закрытыми исходниками бутлоадера, это отличная плата - поддерживается работа USB в режиме последовательного порта, мыши, клавиатуры, джойстика, MIDI, MASS STORAGE. Поскольку появилась она раньше остальных, то уже успела приобрести расширения синтаксиса по сравнению со стандартными библиотеками Arduino, например Serial.dtr() или Serial.rts(). Да и поддержка Arduino 1.0 уже есть, а значит проект более чем жив ;)

Freeduino 32u4


По сути - это копия платы ATmega32u4 Breakout board+ от ladyada, немного улучшенная в схеме подключения к USB. Идея - та же, что и у Teensy, но применяется  бутлоадер с открытым исходным кодом. Видимо, по этой же причине он занимает все и требует для активизации обязательного нажатия на кнопку. В бутлоадере реализован протокол avr109 - соответственно, для его программирования можно использовать avrdude. После нажатия, в течение ~10 секунд бутлоадер будет готов к приему скетча, сообщая об этом при помощи светодиода "BOOT", подключенного к PE6 (второй светодиод просто включен в цепь питания).

Положительный момент - загрузка происходит практически моментально, программирование всей свободной памяти занимает около 2 сек. И если 28К все-таки не хватает, авторы предлагают воспользоваться программатором (отлично подойдет, например, USBasp) - благо присутствует вилка программирования ISP6.

Для работы с платой в ArduinoIDE можно инсталлировать окружение Teensy, слегка изменив  boards.txt, переписав avrdude более свежей копией, и заменой для порядка VID/PID и дескриптора USB.  Подробно про это написано здесь. Забегая вперед, замечу, что процесс добавления платы в окружение ArduinoIDE 1.0 значительно проще.

Leonardo

На всеобщее обозрение в блоге Arduino была вывешена эта картинка:


Вот так выглядит увеличенный Леонардо:



Стандартный форм-фактор Arduino, но присмотритесь внимательнее: число пинов на верхней левой колодке увеличилась с 8 до 10, а на  нижней левой - с 6 до 8.  То есть - и сверху, и снизу добавлено по два пина. Да и в ширину плата добавила пару-тройку миллиметров...



Попытки расширить нижнюю левую колодку уже предпринималась командной Seeedstudio - они поместили туда два дополнительных входа АЦП, которые присутствуют в SMD-корпусе ATmega328:



Не думаю, что Arduino-вцы скопируют это решение, поскольку заявленное число аналоговых пинов - по-прежнему шесть (см. последнее число на картинке, однако на той же картинке написана откровенная ерунда - например, что в 32u4 SRAM размером 3.3К).

Бутлоадер Arduino Leonardo занимает 2К.

С точки зрения ArduinoIDE, Leonardo имеет 18 цифровых универсальных пинов и 6 аналоговых. Пины с аппаратной поддержкой I2C переехали - теперь это digital3 (SCL) и digital2 (SDA). Пины с поддержкой SPI - с 14 по 17, логично что они и должны попасть на колодку ISP6, за исключением пина №14 - (PB0 или SS), к которому подключен светодиод. Светодиодов у Leonardo более чем достаточно: RX, TX, L - расположенные на портах B0, D5 и C7 соответственно. L по-прежнему подключен на digital13, RX - к digital14, а вот TX почему-то не имеет соответствия в таблице пинов. Неясно, связано ли это как-то с присутствием пинов на внешних колодках; но быть может что-то прояснится после оглашения "изменений в стандартной раскладке колодок Arduino" - найти текущее расположение на официальном сайте не удалось, а все существующие знания приходилось черпать напрямую из board layout-ов официально выпущенных плат.

С точки зрения программирования, для обмена через USB по-прежнему используется Serial. Но USART в этом участия уже не принимает - чтобы обмениваться именно через пины RX/TX, надо использовать Serial1. Разделение USB и USART  - одно из существенных преимуществ платы, по сравнению с Duemilanova и Uno.

При обмене через USB постоянно помаргивают светодиоды RX/TX, но сам факт того, что RX одновременно закреплен за SS, никак не влияет на работу SPI - поддержка этой шины в ArduinoIDE просто инициализирует пин SS в OUTPUT/HIGH и больше "не трогает" - если необходимо организовывать обмен с несколькими slave-устройствами, роль SS может исполнить любой цифровой пин. 

Leonardизация Freeduino 32u4

А что, вообщем-то, мешает превратить Freeduino 32u4 (или любую другую плату с одним 32u4 "на борту") в Leonardo? По большому счету - ничего. Гораздо удобнее не нажимать на сброс всякий раз при загрузке скетча и иметь в запасе два лишних килобайта памяти программ. 

Теоретически, для этого надо всего лишь создать правильную раскладку-соответствие пинов Freeduino 32u4 и Leonardo:
Свой выбор именно такой раскладки я объясняю двумя моментами: цифровые пины 0 и 1 всегда закреплялись за последоватльным портом, а пин 13 - за светодиодом L. Поскльку нет светодиодов RX и TX, можно задействовать PD5 и а) получить дополнительно еще один цифровой пин 18 б) сохранить функции и нумерацию пинов SPI как в Leonardo в) сохранить последовательную нумерацию пинов с 13 по 18. Взамен приходится "жертвовать" пином 12, который неожиданно занял место между последним (digital18) и первым (digital0). Тем не менее, если кому-то захочется все исправить и нарисовать более удобное расположение - милости прошу в форум ;)

Вот, что получилось: freeduino32u4-variant-arduino1.0rc1.tar.gz

Нужно распаковать файл в 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 не будет работать на трех пинах из заявленных семи. Причина - ошибки в ядре, которые, видимо, будут исправлены синхронно с выпуском новой платы. Чтобы решить задачу в рамках текущей ArduinoIDE, надо загрузить исправленное core: freeduino32u4-core-arduino1.0rc1.tar.gz и распаковать его в arduino-1.0rc1/hardware/arduino/, заменив существующее cores/arduino на новое.

Все, готово! Мы получили возможность поработать с Leonardo еще до выхода оригинальной платы. Если бы не публикация ArduinoIDE RC1, это было бы невозможно, за что моя отдельная признательность авторам ;)