28.09.2010

Arduino IDE 0020

Как и предполагалось, вслед за анонсом плат Aruino Uno и Mega2560 появился и очередной релиз ArduinoIDE 0020. Прямо сейчас уже можно качать дистрибутив ArduinoIDE для Windows и Mac OS X, надеюсь чуть позже можно будет и для Linux. Никаких изменений в синтаксисе нет, лишь десяток мелких исправлений, большинство - в примерах. Ну и новая иконка, конечно же ;)


Одновременно стали проясняться новые подробности о платах Uno и Mega2560.

ATmega8U2

Прошивка этого чипа изображает из себя CDC-устройство (подобно AVR-Doper), поэтому никаких проблем с драйверами не будет - используются те, что уже есть в операционной системе по умолчанию. Правда, установить inf-файл все-таки придется, но дальше - все по-старому.

Замену FT232RL на ATmega8U2 объясняют грядущей универсальностью. Если FT232RL умела работать исключительно мостом USB-TTL, то новый чип может быть перепрограммирован и таким образом превращен в устройство типа "клавиатура", "мышь", MIDI или даже Mass Storage. Для смены прошивки надо замкнуть специальный джампер:


и после этого будет активизирован специальный DFU-бутлоадер, позволяющий менять прошивку через USB.

Регулятор +3.3В

Я уже упоминал о том, что с исчезновением FT232RL авторам пришлось добавить регулятор +3.3В, дабы не потерять совместимость с существующими Shield-платами. Так вот, мало того, что этот регулятор в три раза мощнее - 150 мА, он еще и весьма стабилен - 1%. А это значит, что его можно использовать в качестве источника опорного напряжения для АЦП и повысить таким образом точность измерений (о подобном решении, но с применением внешнего ИОН-а LM385 см. в статье Простое повышение точности АЦП Arduino ).


Optioboot

Теперь проект Arduino использует новый бутлоадер - Optioboot. Во-первых, он умещается в минимальном предопределенном объеме для бутлоадера ATmega - ему нужно всего 512 байт! Иными словами, старинное решение +1К памяти уже не является рекордом. Попутно увеличена в два раза скорость загрузки - 115200. Пока это работает только с ATmega168 и ATmega328, но на подходе и ATmega8 - вот уж для него-то действительно актуально полтора килобайта свободной памяти (+25%).

Кстати, существующие платы Decimila/Duemilanova и совместимые клоны также можно проапгрейдить новым бутлоадером - однако, для этого понадобится ISP-программатор. И после этого надо обязательно выбрать в ArduinoIDE 0020 тип платы "Arduino Uno", иначе из-за разницы в скоростях у вашего open hardware и software не получится консенсуса ;)

Серийный номер

По слухам, он располагается теперь в последних шести байтах EEPROM. Вместе с сообщением о том, что в настоящий момент проходит регистрация бренда "Arduino" по всему земному шару, этот факт наводит на мысли о попытке серьезного отрыва от китайских подделок. Искренне желаю ребятам успехов...

Резонатор

Честно говоря,  я думал, что на плате два кварца, но оказывается - это не так. У ATmega8u2 действительно кварц 20 ppm (вероятно, это диктуется стабильностью работы по USB), а вот у основной ATmega - керамический резонатор, у которого точность в пять раз хуже - 100 ppm! Объясняется это тем, что, типа, никому такая точность не нужна. Спорное утверждение.

Прошивка по умолчанию

Вводится понятие "прошивка из коробки". Теперь сразу зашивается Firmata, так что Arduino можно без лишних сентенций сразу стыковать с Processing, главное об этом вообще хоть что-то знать. Я немного описал этот процесс в статье Processing vs Arduino. С другой стороны - зачем такая спешка?

Больше дырок

И действительно, теперь в плате на одно отверстие больше - это удобно, когда надо закрепить плату на какой-то конструкции. Редко такие вещи продумываются заранее, поэтому в основном имеем импровизацию и лишняя дырка может оказаться вовсе и нелишней ;)

Что дальше?

А дальше нас ждет какой-то вариант Arduino Ethernet, долгожданный Arduino IDE 1.0, а также некий TinkerKit - эдакий наборчик с печатными платками и транзисторами, светодиодами, джойстиком, реле, MOSFET-ами и прочей "ерундой" (ожидается 18 Октября, вместе с запуском мультиязычного Arduino Store - на смену текущему Smart Projects).

Источники:

25.09.2010

Arduino Uno

Интрига с загадочной фразой "we are cooking something new for you" благополучно разрешилась. Встречайте - новая плата Arduino Uno:


Авторы специально указывают, что Uno (итал. единица) перекликается с готовящейся выйти "в свет" версией ArduinoIDE 1.0.

По большому счету, сменился дизайн и микросхема моста USB-TTL. Место хорошо всем известного чипа FT232RL занял МК ATmega8U2-MU в корпусе QFN32. Преимуществом этого чипа является встроенный интерфейс USB 2.0 со способностью к передаче на скоростях до 12 Мбит/с (зато можете не искать у него АЦП и I2C). Для Arduino его программируют таким образом, чтобы он выполнял функции USB-TTL конвертера (в непосредственной близости от него на плате можно увидеть посадочное место второй гребенки ISP6).

Соответственно, мы возвращаемся к древним временам, когда на одной плате Arduino Extreme2 было два кварцевых резонатора (из-за микросхемы FT232BM, которая требовала солидной обвязки). Неудивительно, что это потребовало миниатюризации элементов - теперь все они сплошь типоразмера 0603, и есть даже резисторные SMD-сборки. Кварцевые резонаторы имеют двойное посадочное место - при желании можно поставить как миниатюрный кварц с интегрированными конденсаторами, так и стандартный кварц в корпусе HC-49S. Экономить и использовать один кварцевый резонатор для двух МК авторы тоже не посчитали нужным.

Миниатюризация резисторов, в свою очередь, повлекла за собой проблему предельного тока. Ибо чем меньше SMD-резистор, тем меньше его максимальная мощность: 0603 обеспечивать постоянную работу обычного светодиода уже не в состоянии. Но и это не беда - они объединяются по две штуки в параллель.

В схеме питания вместо полевого транзистора NDT2955 строго используется более миниатюрный FDN304, имеющий меньшее на порядок сопротивление. Подачей питания +3,3В  за отсутствием FT232RL приходится заниматься отдельному low-drop регулятору LP2985-33

Что-то подобное итальянцы сотворили и с Arduino Mega, теперь туда устанавливается чип ATmega2560:


Поскольку ATmega1280 и ATmega2560 аппаратно полностью идентичны, подобные платы уже существовали в виде китайских поделок, продающихся на Ebay. Все портил только один малюсенький нюанс: код бутлоадера Arduino не был рассчитан на работу с ATmega2560 из-за ограничений в обмене по протоколу STK500v1: можно было заставить стандартный бутлоадер работать только с первыми 128 Кб флэш-памяти. Впрочем, энтузиасты адаптировали STK500v2 и даже бутлоадер от AVR Butterfly.

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

Да, и чуть не забыл! МК на верхней картинке с Uno вставлен неправильно (наоборот) - так, на всякий случай предупреждаю ;)

10.09.2010

ArduinoIDE 0019

Пока лучшие итальянские умы работают над версией 1.0, нас посетила очередная ArduinoIDE 0019. По традиции, я устраиваю разбор ReleaseNotes, тем более, что изменения весьма существенные. Начнем, как всегда, с ядра arduino и прочих важных моментов, оказывающих влияние на совместимость.

Класс String

Наверное, многие знатоки C/C++ с недоумением взирали на скетчи с пачками строк типа:

Serial.print("Current values: s1 =");
Serial.print(s1);
Serial.print(", s2 =");
Serial.print(s2);
Serial.print(", s3 =");
Serial.println(s3);

и тому подобное, которые тут же хотелось заменить на
sprintf("Current values: s1=%d, s2=%d, s3=%d\n",s1,s2,s3)

Да собственно, так и делали, добавляя #include<stdio.h> и расходуя на такую роскошь определенное количество progmem.

С точки зрения C++ и его класса String все выглядело еще хуже - надо было подключать библиотеку стандартных шаблонов C++, а уж виртуальные темплейты точно выходят за пределы здравого смысла. Поэтому, обычно использовали string.h.

Только одно плохо - все эти #include со стандартными библиотеками отдаляли Wiring от его первооснов (простоты, интуитивности и доступности для НЕпрограммистов) и приближали к банальному C/С++.

Зато теперь - другое дело, в ядро arduino официально добавлен класс String. Благодаря ему вы можете запросто писать так:

String S1 = "millis() value: " + millis();
Serial.println(S1);

или

String stringOne = "Content-Type: text/html";
if (stringOne.substring(19) == "html") {
Serial.println("It's an html file");
}

Память под строку распределяется при помощи C-шного API malloc() и free(), чего в arduino отродясь не практиковалось (готовьте ~1000 байт памяти программ). Это также стоит учитывать при планировании расхода памяти данных, с ней-то вообще в ATmega напряженно (1K в ATmega8/168 и 2K в ATmega328P). Класс устроен таким образом, что при увеличении строки пытается перераспределить больший фрагмент памяти.

И советую поизучать на досуге примеры в каталоге examples - там аж 12 разных скетчей на тему String.

Новый оператор shiftIn

То, чего мне так не хватало в статье Размножение входов или shiftIn. Функция полностью комплементарна оператору shiftOut, только не выводит, а считывает восемь бит и возвращает их в виде байта.

Абстрактный класс Stream

Небольшое изменение иерархии классов - теперь Serial не порожден от Print напрямую, а (о, ужас!) через "прослойку" под названием Stream. Дэвид утверждает, что теперь писателям и пользователям библиотек взаимодействия по последовательному протоколу будет легче - можно воспользоваться полиморфизмом: писателю достаточно включить наследование от Stream, а пользователю - использовать методы Stream. Тогда, при определенной организации кода, можно обойтись минимумом изменений, поскольку для работы с любым порожденным от Stream классом всего и нужно-то available(), read() и flush() (многообразные функции вывода организует базовый класс Print).

Serial.peek()

Специальная функция в HardwareSerial, возвращает символ в хвосте приемного буфера или -1, если буфер пуст. Так сказать "try before buy" - можно "подглядеть" первый символ, который вернет read(), не забирая его из буфера.

Поддержка Mega

Тут сплошные улучшения. В ядре реализована возможность выбрать внутренний источник напряжения - в ATmega1280 он может быть 1.1 или 2.56 В. Побочный эффект - константа INTERNAL при компиляции для Arduino Mega перестает существовать и заменяется  на INTERNAL1V1 и INTERNAL2V56, так что в итоге придется просматривать и править существующий код. Улучшена Firmata - вроде бы она и раньше поддерживала ATmega1280, но теперь код явно "причесали" - появился Boards.h с широкой секцией поясняющих комментариев. Видимо, как всегда - в процессе причесывания заметили ошибки ;)

Новая библиотека SPI

Полностью базируется на аппаратной реализации ATmega. Неоспоримое преимущество - возможность работы по прерываниям. С одной стороны, кода там совсем немного, с другой - приходится каждый раз повторно писать его в библиотеку работы с очередным устройством по SPI. И вот теперь - вынесли отдельно, ура!

Библиотека Ethernet

Не прошло и года с момента моей публикации Arduino по UDP, как возможность работать с UDP появилась и в стандартной библиотеке. Из минусов - работу с Wiznet5100 перевели на вышеупомянутую библиотеку SPI, но строчку #include <SPI.h> почему-то требуется писать именно в скетче. Поэтому - быстренько поправьте все ваши скетчи, работающие с Ethernet - иначе они не будут компилироваться.

Общие улучшения ядра

  • Добавлены алиасы для аналоговых пинов - A0, A1, A2... Стало понятнее - вместо pinMode(14,OUTPUT) можно писать pinMode(A0,OUTPUT);
  • Повышена точность delay(). Теперь она использует не millis(), а micros();
  • При обращении к регистрам портав в pinMode() и digitalWrite() запрещаются прерывания. Там внутри стоят операторы типа *out |= bit и *out &= ~bit, которые на самом деле есть сокращенная запись трех операций - считывания, логики и записи. Сами понимаете, что могло бы быть, если в этот момент происходило прерывание (советую обновиться всем, кто использовал attachInterrupt в скетчах);
  • После завершения tone повторно разрешается PWM (если он был активен).

Менее значительные, но не менее важные изменения коснулись и самой IDE. Традиционно, обновлен список плат - туда добавили Arduino FIO.

Наконец-то пофиксили застарелую проблему с неработой автосброса под Linux. Проявлялось это только под Linux и только со специфическими FTDI-кабелями, в которых вместо DTR-а для автосброса был наивно выведен RTS. Видимо под Windows это работало исключительно из-за того, что при открытии порта драйвер "шаловливыми ручками" дергал RTS. Ну что же... бывают неожиданные неприятности и от слишком хорошо написанного кода - теперь ArduinoIDE будет дергать и RTS тоже.

Подтянулись до последней версии Processing, немного улучшили Serial Monitor - добавили отключение автоскроллинга и управление интерпретацией перевода строки:


Но самое интересное, на мой взгляд, коснулось файла boards.txt для разработчиков стороннего оборудования. Как известно, в каталоге sketchbook можно создавать подкаталоги для совместимых с Arduino платформ, где можно описать любую новую плату, у которой будут свои специфичные настройки и даже свое собственное ядро. При старте ArduinoIDE описания стандартных и дополнительных платформ соединяются и все вместе дружно появляются в меню.

Так вот - теперь можно указывать в boards.txt строку вида:
newboard.upload.using=otherplatform:programmer

Такая опция указывает, как загружать результат компиляции - в данном случае, будет использовано описание программатора из otherplatform, например arduino:parallel. По большому счету, эта опция позволяет не создавать собственный programmers.txt и в конечном итоге работать вообще без бутлоадера, если под рукой есть любой поддерживаемый avrdude программатор.

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


Думаю, где-то к октябрю интригу, наконец, раскроют. Может быть, гибкая плата? ;)