31.12.2010

C НГ-2011!

Пользуясь случаем, хочу поздравить всех своих читателей с наступающим (а может уже и с наступившим?) 2011 годом и пожелать в этом "кошачье-кроличьем" году море креатива, положительных эмоций и приятных неожиданностей!

К новогодним каникулам у меня скопилось некоторое количество статей, которые уж теперь-то я смогу наконец здесь опубликовать. Тем, кто недоумевает и справедливо возмущается длительным перерывом, в качестве оправдания: готовил цикл статей, где неким причудливым образом пересекается тема ПЛК (программируемых логических контроллеров) и Arduino, но поскольку тематика весьма специфична, выкладываю их здесь.

Кстати, вышла новая ArduinoIDE 0022! Подробный анализ изменений - в новом году ;)

13.12.2010

09.12.2010

Опечатка

Благодаря пользователю FlyDN, я обнаружил опечатку в исходной версии руководства по Seeeduino. Ошибка, естественно, давно исправлена авторами, но на момент опубликования моей статьи - присутствовала. 

Это касается вилки bitbang программирования  - точнее, правильного её соединения с  разъемом ICSP. Изначально было так:


Но на самом деле, здесь были перепутаны сигналы RI и CTS - правильно будет так:

Свою статью я сразу же исправил. Приношу извинения всем, кого я неумышленно ввел в заблуждение и буду признателен всем, кто сообщит мне о подобных ляпах в дальнейшем!

02.12.2010

Getting Started With Processing на русском

Не так давно я коротко упоминал о выходе книги Getting Started with Processing в издательстве O'Relly при содействии Make. С некоторой надеждой я периодически навещал страничку на сайте Озон.ру, но увы - нашему российскому монстру книжной интернет-торговли эта позиция  настолько неинтересна, что остается до сих пор недоступной для заказа.

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

Листая электронную книгу, я честно старался к чему-то придраться, но не смог. Четко соблюдена терминология, при этом сбалансировано употребление английских слов - ровно столько, чтобы читатель не был окончательно введен в ступор очередным русскоязычным термином (который на самом деле и не стоило переводить). Текст легко читается, и местами создается устойчивое ощущение, что язык оригинала - именно русский. Даже комментарии в скетчах переведены, хотя именно этим переводчики обычно пренебрегают.

В настоящий момент книга готовится к выходу в одном из питерских издательств. Автор перевода любезно согласился опубликовать для читателей mk90.blogspot.com отрывок из книги (содержание, предисловие и первая вводная глава):


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

20.11.2010

Arduino Uno Unboxing


Глядя на многочисленные обзоры в формате "а вот так мы это достаем из коробки", я тоже решил попробовать - тем более, что новенький Arduino Uno и впрямь неожиданно приехал в коробке. Надо ли говорить, что коробка выглядит намного таинственнее и загадочнее, чем пакетик-гриппер (пусть даже и антистатический):

10.11.2010

V-USB module

Идея проекта посетила меня после двух-трех успешных реализаций на библиотеке V-USB (для тех, кто не в курсе - это специальная библиотека для avr gcc, позволяющая почти любому МК из семейства AVR программно эмулировать USB в режиме low speed transfer).

Как известно, уже давно успешно существует проект Metaboard - плата, совместимая на 90% с Arduino и bootloader-ом на основе V-USB. Но у нее есть две чувствительных особенности - для загрузки скетча надо сначала замкнуть специальный джампер, а затем - нажать сброс. Второй недостаток - по понятным причинам (панелька) для экспериментов подходит только МК в 28-выводном корпусе. Вот что у меня получилось в поисках более универсального решения:



Девайс получил гордое название V-USB module for solderless breadboard и предназначен, как это следует из названия, для работы с беспаечной макеткой. Для этого в него впаяны вертикальные контактные штырьки:



Они позволяют "усадить" модуль поверх центрального желобка (туда обычно ставят микросхемы):



Одновременно они служат для подключения модуля к схеме - на них выведены D+, D-, +5V, и GND, согласно схеме:



Естественно, при наличии всех деталей в выводном исполнении, схема собирается на  макетке и без специального модуля. С другой стороны, его преимущества очевидны - во-первых, это экономия времени (как на втыкание самих деталей, так и на поиск ошибочно воткнутых), во-вторых - простая установка разъема, ибо никогда не видел разъем USB, который бы состыковался с макетной платой без паяльника и дополнительных проводков и вилочек; В-третьих, далеко не всегда под рукой оказывается выводной самовосстанавливающийся предохранитель: часто им вообще пренебрегают, а здесь он всегда в наличии.

И, конечно же - занимаемое место на самой беспаечной макетке. Плата довольно компактна - 33 х 18 мм, причем ее можно установить так, чтобы она частично выходила за пределы breadboard-а.

После установки остается только подключить микроконтроллер, согласно конфигурации. Сначала надо выяснить, где у МК будут расположены входы D+ и D-, по содержимому usbconfig.h:



...после чего подключить их к соответствующим контактам микроконтроллера по маркировке на модуле:



(на этом фото проект ребутера внешних модемов на ATtiny2313-20PU, использован внешний кварц 12МГц, пара конденсаторов 22пФ).

Своей цели я добился - с таким модулем можно довольно быстро собрать схему для V-USB на беспаечной макетке. Плата выполнена односторонним способом, не содержит перемычек и минимально требует сверления лишь четырех отверстий диаметром 1 мм для установочных штырьков.



Скачать файл проекта V-USB moule for solderless breadboard (лицензия CC-SA).

03.11.2010

Seeeduino 2.2

Как-то незаметно прошел очередной релиз Arduino-совместимой платы Seeeduino v2.2:



Как видите, плата наследует все улучшения, введенные еще в версии 1.1 (более подробно написано в статье о Seeeduino).

Но если внимательно присмотреться, в версии 2.2 произошли следующие изменения:
  • убран переключатель питания, теперь оно автоматическое, как на Duemilanova;
  • керамический резонатор заменен на "настоящий" кварц (выше точность);
  • фильтры по питанию - ранее электролиты - теперь в чип-танталовом исполнении;
  • защитный диод цепи внешнего питания заменен на более мощный 1N4004 - как на Seeeduino Mega.
На всякий случай напоминаю, что это плата уникальна максимальным количеством улучшений при сохранении полной совместимости с Arduino. Дизайн Seeeduino одобряет даже один из отцов-основателей проекта Arduino - Джанлука Мартино. По моему личному опыту, Seeeduino покупают те, кто управляется со схемами с TLL-уровнями 3.3В.

02.11.2010

Arduino Uno и 3.3В


Блог проекта Hifiduino обращает внимание на ошибки в конструкции Uno, относящиеся к подаче питания 3.3В.

Как известно, в Arduino Uno отказались от использования чипа FT232RL, поэтому для поддержки совместимости с использующими пин 3,3В Shield-платами, был добавлен регулятор LP2985.

Являясь низкошумящим регулятором с малым падением напряжения (по-английски говоря, low noise и low-drop :), он еще и обеспечивает ток в три раза больше - но в спецификациях Arduino Uno почему-то по-прежнему значится 50 мА.

К сожалению, ошибкой спецификацией дело не ограничивается. При изучении схемы Uno было замечено, что и включен LP2985 не совсем так, как рекомендуется в даташите - выходной конденсатор меньше, чем требуется для низкошумящих приложений (можно достичь 30 мкВ), а шунтирующий вообще отсутствует:


С одной стороны выглядит как придирки, но в целом вписывается в общую картину разработки Arduino Uno. Если говорит одним словом, то "спешили".

29.10.2010

SMPReaderUSB - frontend?

Очередной экземпляр SMPReaderUSB благополучно завелся у нового владельца со штатными СМП от МК-90, так что теперь уже точно понятно, что он 100%-но работоспособен не только с моими СМП. 

Снова возник вопрос написания графического UI, хотя бы даже и в виде frontend-а к CLI-утилите, которая сейчас выполняет чтение, запись и замер напряжения батареи. Размышляю про Java - чтобы получилось кроссплатформенно. Все-таки опыт работы с ArduinoIDE и PDE оказал существенное влияние на мое неокрепшее сознание ;) 

Также зреет идея по превращению этого устройства в имитатор СМП, то бишь интерфейс между МК-90 и "большим братом". Страшно подумать, сколько может образов влезть на HDD ;) Впрочем, это самый туманный вопрос - неясно, будет ли успевать low-speed bulk transfer и libusb за тактовой МК-90 - протокол обмена построен так, что картридж в принципе не может попросить притормозить обмен :(  

28.10.2010

Жанлюка в LinuxFormat-е

Нашел в июльском номере LinuxFormat интервью с Джанлука Мартино - одного из пятерых членов команды Arduino. Я привожу сокращенный текст интервью, полный - читайте в LXF.



LXF: Пожалуйста, расскажите немного о своей команде.
Джанлука Мартино: Команда Arduino насчитывает примерно пять человек. Среди них два итальянца - Массимо Банци (Massimo Banzi) и я, два американца - Дэвид Меллис (David Mellis) и Том Айго (Tom Igoe), и Давид Картьеллес (David Caurtelles), испанец, живущий в Швеции. Банци отвечает за взаимодействие с внешним миром, я - за производство и за компанию, изготваливающую Arduino и занимающуюся его коммерциализацией, на Томе лежит все, что касается документации и пользовательского опыта, Меллис - это ПО, он сопровождает нашу IDE, а Картьеллес отвечает за сайт. Впрочем, наши роли не очень жесткие: мы - команда и обычно принимаем решения вместе.

LXF: А какие компании или проекты вы считаете конкурентами Arduino?
ДМ: Хороший вопрос... Я не могу назвать вам их поименно; например, нельзя сказать, что мы конкурируем с Parallax. Да, они делают что-то на том же рынке, что и мы, но мы делаем это по-другому. Что мы (ну или я) действительно не любим, так это клоны, не добавляющие проекту ничего нового. Нам нравятся инициативы вроде Seeedstudio, которые пытаются сделать что-то новое на нашей основе. Идея ведь в том, чтобы делиться, а не просто пытаться заработать на этом деньги. Например, вот тут у меня есть китайский клон [лезет в коробку]...

LXF: Вы - производитель оборудования, и мы не можем не задать вам любимый вопрос всех Linux-пользователей: должны ли все спецификации на оборудование быть открытыми, и кто все же должен писать драйверы?
ДМ: Я думаю, что наша свобода - не такая уж и свободная. Разумеется, над нами стоят производители чипов, которые регулируют, как именно вы можете общаться с устройством. Может, FPGA и даст вам больше свободы, и мы, в общем, достигли неплохого компромисса, но не надо зарываться в кремний, плодя миллионы различных микроконтроллеров.

LXF: А у вас есть секретные планы по захвату мира... ну или что-то в этом роде?
ДМ: Ну разумеется! Мы готовим плату, которая будет еще проще... и дешевле, но не потеряет при этом в качестве. По мере роста масштаба производства уделять все то же внимание мелочам становится все труднее, но мы стараемся. Наша основная цель, если угодно, продавать такие вещи, которые нам потом не вернут обратно.

LXF: Ну и наконец: что бы вы могли сказать российским пользователям Arduino, которые читают наш журнал?
ДМ: По-моему, Россия - это такой рынок, который еще не показал свой потенциал. У вас много людей, которые могли бы стать частью движения Arduino, конечно, ко всеобщей пользе. Думаю, в будущие годы ваша страна раскроет свой потенциал крупнейшего рынка в мире.

LXF: А пару слов для российских производителей клонов Arduino?
ДМ: Пару? Мы вас любим! [смеется] Видите ли, мы не слишком хорошо представляем себе российский рынок и его динамику. Так что здесь вся надежда на ваших разработчиков - в конце концов, все, что сделали мы, доступно для них свободно и бесплатно. Мы просим их только об одном - будьте осторожны с именем "Arduino". Продавать клоны под тем же самым названием, не добавляя ничего от себя, как я уже говорил - это нехорошо для сообщества.



От себя добавлю - именно из LinuxFormat я узнал о существовании Arduino. Именно там был опубликован цикл статей для начинающих на русском языке. И очень приятно видеть, что журнал снова возвращаются к теме OpenHardware и Arduino (после годового перерыва!). Настоятельно советую подписаться - если успеете до 1 ноября - по льготной цене (да, это - реклама. Наглая и бессовестная реклама моего любимого журнала)! ;)

27.10.2010

Toolduino

Если читая название Toolduino вы первым делом представляете себе Arduino-совместимый клон, спешу огорчить - это не очередной xDuino.

Toolduino - это такой специальный скетч для языка Processing, работающий с платой Arduino через библиотеку Firmata и стандартный Arduino-скетч для Firmata. Собственно, ничего нового - однако автору хватило терпения довести дело до нужной степени реализма. После старта мы должны выбрать порт для общения с Arduino, и, если все правильно, увидим на экране вот такое:


При этом картинка - полностью интерактивная, можно делать следующее:
  • переключать режим работы цифровых пинов правым щелчком (по кругу): OUTPUT, INPUT, INPUT с подтягивающим резистором, ШИМ;
  • левым щелчком менять состояние пина в режиме OUTPUT;
  • в режиме ШИМ появляется текущее значение и слайдер, который можно двигать (имитируя таким образом analogWrite)
  • по левому щелчку считывать и наблюдать значение с аналоговых входов;
  • наблюдать значения на пинах в режимах INPUT и OUTPUT.  
Автор неуклонно трудится над расширением "ассортимента" поддерживаемых плат и просит присылать фото высокого качества для добавления. А пока в очередной версии 1.1 он добавил Arduino Uno:


На мой взгляд, очень удобно для обучения, ну и вообще - красиво ;)

Скачать файлы проекта можно с его страницы: http://nootropicdesign.com/toolduino/

26.10.2010

Замена прошивки 8u2

Собственно, вот и первая попытка видоизменить прошивку ATmega8u2 на плате Arduino Uno - с картинками, подробно и по шагам:

http://arduino.cc/en/Hacking/DFUProgramming8U2

Добавить, пожалуй, даже и нечего - просто хочется обратить внимание, что Arduino превратили в джойстик при помощи проекта LUFA (Lightweight USB Framework for AVRs). Если внимательно присмотреться к списку демонстрационных приложений, то там есть практически всё - мышь, клавиатура, Mass Storgae, Ethernet Device/Host.

И только в списке демо-плат нет Arduino - но вот как раз этот пробел, надеюсь, вскоре будет восполнен в полной мере.

Optiboot только для Uno

В предыдущей статье я немного поторопился с выводами - родной для Arduino Uno optiboot ведет себя на Duemilanova не совсем так, как надо. Точнее - совсем не так :(

Если загрузить скетч - он вполне нормально стартует. Но стоит отключить и снова включить питание, как optiboot зацикливается, реальных шансов снова увидеть работающий скетч - крайне мало. Кроме всего прочего, некоторые жалуются на проблемы при заливке больших скетчей. Собственно, после просмотра исходника optiboot возникает масса вопросов - например, как автор выбирал задержку для watchdog-а, или правильно ли используются улучшения от ladyada. У меня разборки неожиданно осложнились трапом линковщика при попытке пересобрать optiboot из исходников. 

Поэтому - пока что откатился обратно, 1К-bootloader - с ним я подобных проблем не замечал.

05.10.2010

Optiboot в действии

Пока народ возмущается по поводу ахового качества первой партии плат Arduino Uno, а отцы-основатели оправдываются в своем блоге, что "ложка дегтя никак не портит бочку меда", я решил опробовать новый 512-байтный optiboot. По причине отсутствия под рукой оригинального Arduino Uno, все эксперименты проводил на Duemilanove.

Итак, придется скачать ArduinoIDE 0020 под Windows - даже если у вас, как и у меня - Linux (примечание: на момент написания статьи версии 0020 под Linux еще не было, но теперь уже можно качать 0021). В качестве альтернативы подойдет архив со страницы optiboot на google code. В обоих вариантах вы получаете готовые откомпилированные .hex-файлы для всех плат Arduino и совместимых с ней клонов, но учтите - по умолчанию ArduinoIDE 0020/0021 поддерживает только Arduino Uno с МК ATmega328P и тактовой частотой 16 МГц.

Понадобится также и ISP-программатор - подойдет любой, хотя бы даже и на резисторах и LPT-порту.

Простейший способ апгрейда: подключите программатор к разъему ISP6 вашего Arduino, запустите ArduinoIDE (0020 и выше), в меню Tools|Board выберите Arduino Uno, затем шейте через Tools|Ваш программатор.

Если вы не нашли программатор в списке, хотя точно знаете, что он поддерживается avrdude, попробуйте добавить его описание в файл hardware/arduino/programmers.txt. Например, если у вас USBasp, допишите строчки:

usbasp.name=USBasp
usbasp.communication=usb
usbasp.protocol=usbasp

Если у вас все еще нет возможности пользоваться ArduinoIDE 0020/0021, не беда - копируйте каталог hardware/arduino/bootloaders/optiboot из нее в свою "старушку" версии 0019 и добавьте в файл hardware/arduino/boards.txt:

uno.name=Arduino Uno
uno.upload.protocol=stk500
uno.upload.maximum_size=32256
uno.upload.speed=115200
uno.bootloader.low_fuses=0xff
uno.bootloader.high_fuses=0xde
uno.bootloader.extended_fuses=0x05
uno.bootloader.path=optiboot
uno.bootloader.file=optiboot_atmega328.hex
uno.bootloader.unlock_bits=0x3F
uno.bootloader.lock_bits=0x0F
uno.build.mcu=atmega328p
uno.build.f_cpu=16000000L
uno.build.core=arduino

Наконец, для истинных поклонников кристалльной ясности (командной строки :), можно предложить все сделать парой команд (на примере AVRDoper):

avrdoper -c stk500v2 -P avrdoper -p m328p -e -u -U lock:w:0x3f:m -U efuse:w:0x05:m -U hfuse:w:0xde:m -U lfuse:w:0xff:m
avrdoper -c stk500v2 -P avrdoper -p m328p -U flash:w:optiboot_atmega328.hex -U lock:w:0x0f:m

Собственно, вот и всё - теперь у вас плата, программно совместимая по бутлоадеру с Arduino Uno, свободно 31,5 Кбайт памяти программ, скетчи заливаются со скоростью 115200.

Если же у вас плата с МК ATmega168 или не на тактовую частоту 16 МГц, но очень хочется задействовать optiboot - скачайте архив optiboot с google code, там вы найдете boards.txt с описаниями большей части существующих плат. Скопируйте нужную секцию в свою ArduinoIDE и прошивайте по вышеописанному методу.

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:


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

24.08.2010

Термоконтроллер на Arduino

Уважаемые читатели!

Эта статья написана не мной, посему - прошу любить и жаловать: сегодня Vergellan поделится с вами опытом создания умного регулятора вращения вентиляторов, с участием термодатчика, LCD-дисплея и, конечно же, Arduino.

Несколько месяцев назад я прочел ряд статей об Arduino и весьма заинтересовался данным девайсом, а вскоре решил приобрести. Надо отметить, что я далек от микроэлектроники, поэтому плата расположила к себе прежде всего относительной простотой в освоении. Набаловавшись с LED-ами и «Hello world»-ами, захотелось сделать что-нибудь практичное, заодно более детально ознакомиться с возможностями Arduino. Памятуя об аномально жарком лете 2010 года, возникла идея собрать регулятор оборотов кулера в зависимости от температуры с выводом всех сопутствующих характеристик на LCD. Надеюсь, что кому-нибудь данная схема или ее вариации смогут пригодиться, поэтому решил выложить свои наброски.


Для данной схемы нам понадобится:
  • Собственно сама плата Arduino или аналог;
  • Макетная плата для сборки компонентов схемы;
  • Дисплей WH1601A-NGG-CT с подстроечным резистором на 20 кОм или аналогичный;
  • Резисторы – 220 Ом, 10 кОм, 4.7 кОм;
  • Биполярный транзистор SS8050D или аналогичный ему;
  • Цифровой температурный датчик DS18B20;
  • Диод 1N4148 или аналог;
  • Вентилятор осевой трехпроводной (на 12В), например - компьютерный;
  • Разъем гнезда питания 2,1/5,5 мм.
Компьютерный кулер имеет три провода, два из которых - красный (+12V) и черный (GND) используются для питания, а третий  (желтый) связан с таходатчиком, построенном на элементе Холла. К сожалению,  5V с платы нам явно недостаточно, но 6 цифровых выходов Arduino могут работать в режиме ШИМ (они отмечены на самой плате белыми квадратиками, либо буквами PWM), поэтому мы можем регулировать подачу сигнала с платы на реле, которое будет отвечать за изменение напряжения, подаваемого на вентилятор.


Получать информацию об оборотах мы будем с третьего провода от таходатчика, воспользовавшись модифицированным способом, основанным на реализации прерываний, которые у большинства Arduino могут приходить на цифровые pin 2 (прерывание 0) и 3 (прерывание  1). Кстати, у Arduino Mega наличествует еще 4 дополнительных пина с возможностью получения прерываний.

Теперь необходимо расположить цифровой датчик температуры, данные которого мы будем использовать для регулирования напряжения, подаваемого на цифровой выход с ШИМ, а следовательно для «открытия» канала напряжения  вентилятора. Для датчиков фирмы Dallas существует собственная библиотека Arduino – DallasTemperature, которую впоследствии мы и будем подключать в скетче. Библиотеку необходимо распаковать в каталог arduino-0018/libraries/.

Осталось последнее – подключить LCD, где у нас будет отображаться вся текущая информация о температуре и скорости вентилятора. Поскольку я использовал для сборки экран WH1601A, могут иметь место известные проблемы с отображением строк. Для их устранения мы воспользуемся библиотекой LiquidCrystalRus, которую необходимо также распаковать  в каталог arduino-0018/libraries/.

//Подключаем библиотеку для термодатчика 
#include <dallastemperature.h>
//Подключаем библиотеку для LCD
#include <LiquidCrystalRus.h> 

#define PowerPin 9    // pin для контроля питания вентилятора
#define HallSensor 2  // pin для датчика оборотов вентилятора (прерывание)
#define TempPin 7 // pin для датчика температуры

LiquidCrystalRus lcd(12, 11, 10, 6, 5, 4, 3); //Подключение LCD
DallasTemperature tempSensor;                            

int NbTopsFan, Calc, fadeValue;  //целочисленные переменные для расчетов
float temper;  //вещественная переменная для хранения температуры

typedef struct{ // Вводим новый тип переменных для вентиляторов 
  char fantype;
  unsigned int fandiv;
}fanspec;

//Массив переменных нового типа
fanspec fanspace[3]={{0,1},{1,2},{2,8}};

//Переменная, отвечающая за выбор типа датчика вентилятора (1 – униполярный датчик Холла, 2 –биполярный датчик Холла)
char fan = 2;   

//Эта функция у нас будет вызываться при каждом прерывании
void rpm () 
{
  NbTopsFan++; 
}

// Функция расчета подаваемого напряжения на цифровой pin с ШИМ
void temp ()   
{
  fadeValue = min(int(temper*7),255);  // Умножаем температуру на коэффициент, 
                                       // берем от произведения целое число
}  // Т.к. максимальное значение ШИМ составляет 255, то подавать больше не имеет смысла – берем минимум из двух

void setup()
{
    tempSensor.begin(TempPin);  //Запускаем температурный датчик
    lcd.begin(16, 2); //Задаем характеристики LCD
    lcd.setDRAMModel(LCD_DRAM_WH1601); //И тип дисплея
    pinMode(HallSensor, INPUT);  // Настраиваем pin на получение прерываний
    attachInterrupt(0, rpm, RISING);  //Привязываем прерывание по номеру 0 к нашей функции, причем высчитываться она будет каждый раз при смене сигнала
}

void loop ()
{
   temper = tempSensor.getTemperature(); // Получаем температуру
   temp(); // Высчитываем подаваемое напряжение на ШИМ
   analogWrite(PowerPin, fadeValue); // Подаем его
   NbTopsFan = 0; // Обнуляем переменную, содержащую обороты
   delay (1000); //Ждем 1 секунду
   Calc = ((NbTopsFan * 60)/fanspace[fan].fandiv);   //Рассчитываем величину оборотов за 60 секунд, поделенную на множитель вентилятора
   lcd.print (Calc, DEC); //Выводим рассчитанную величину в десятичном виде
   lcd.print (" rpm - "); 
   lcd.print(temper); //Выводим температуру
   lcd.home(); 
}


У меня финальная схемка выглядит так (часть компонентов перенес с макетки на дополнительную плату, т.к. планирую сделать уже готовый регулятор в нормальном корпусе):


В завершение хотел бы выразить огромную благодарность Илье Данилову (idanilov) за «привитый» интерес к Arduino и за помощь в освоении данной платформы.

UPD: Последняя версия LiquidCrystalRus доступна на github.

19.08.2010

Уроки Wiring (6)

Урок 6. Что за ШИМ?

(продолжение, начало см. Урок 5. Нажми на кнопку!)

Пожалуй, самая загадочная для новичка надпись на плате Arduino - PWM. На самом деле, это сокращение от Pulse Width Modulation, по-русски "Широтно Импульсная Модуляция" или ШИМ.

Что такое PWM?

На секунду вернемся к картинке из предыдущего урока:



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

Собственно, именно эту ширину и предполагается модулировать - то есть изменять определенным образом. Зачем все это может понадобиться? Да вот - хотя бы для изменения яркости свечения светодиодов.

Так выглядит график зависимости свечения от тока для самого ординарного светодиода:


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

Возьмем для примера  светодиод L, присутствующий на всех современных Arduino-совместимых платах:


Светодиод загорится только в том случае, когда к его выводам будет приложена достаточная разность потенциалов. В данном случае одна ножка подключена к земле, а к другой - через токоограничительный резистор 1 кОм - вывод digital13. Следовательно, светодиод будет загораться по команде digitalWrite(13, HIGH).

Резистор включен последовательно со светодиодом с единственной целью - ограничить ток, протекающий в цепи. Обычно его значение прикидывают следующим образом: берут напряжение во всей цепи (для Arduino это 5 Вольт) и вычитают из него рабочее падение напряжения на светодиоде (указано в технических характеристиках светодиода, в простейшем случае зависит от цвета - для красного около 2 Вольт), получая падение напряжение на резисторе (в данном случае 5-2=3В). И далее, по закону Ома: R = U/I, где вместо I подставляется ток в цепи - который мы и хотим ограничить, скажем 3 мА. Получаем R = 3В/0.003А = 1000 Ом. При таком раскладе светодиод будет светиться, хоть и немного тускло, но вполне приемлемо. Чтобы добиться максимума яркости, можно увеличить ток до 30 мА - изменив номинал резистора R2 на 100 Ом.

Что же получается? Если мы хотим изменить яркость свечения светодиода, надо менять значение токоограничительного резистора. В принципе, нет ничего невозможного - существуют специальные резисторы с цифровым управлением, которые управляются через шину SPI или I2C, получают от микроконтроллера значение и меняют свое сопротивление в соответствии с ним. Но едва ли это оправдано с точки зрения стоимости и удобства (пойди еще найди и купи такой компонент, не пользующийся широким спросом). Другой вариант - это простейший ЦАП на основе R-2R цепочки, но он требует использования дополнительных выходов Arduino и тоже выглядит чересчур внушительным решением для такой простой задачи. Вот тут-то, как вы уже догадались, и приходит на помощь ШИМ.

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


Вот так выглядит скетч, который плавно гасит и зажигает светодиод L:

void setup() {
  pinMode(13, OUTPUT);
}

word cycle = 300;
byte stepdelay = 20;
byte zazor = 5;

void loop() {
  for (word intensity=zazor;intensity<(cycle-zazor);intensity++) {
    for (byte k=0;k<stepdelay;k++) {
      digitalWrite(13,HIGH);
      delayMicroseconds(intensity);
      digitalWrite(13,LOW);
      delayMicroseconds(cycle-intensity);
    }
  }
  for (word intensity=(cycle-zazor);intensity>zazor;intensity--) {
    for (word k=0;k<stepdelay;k++) {
      digitalWrite(13,HIGH);
      delayMicroseconds(intensity);
      digitalWrite(13,LOW);
      delayMicroseconds(cycle-intensity);
    }
  }
}

В этом скетче длительность импульса - чуть более 300 микросекунд. При этом в цикле мы постепенно уменьшаем и увеличиваем относительную ширину импульса, добиваясь эффекта циклического плавного изменения яркости. При этом надо избегать "крайних" значений ширины импульса около 0 и 300, иначе никакого эффекта плавного мерцания не будет (этим управляет константа "zazor").

Ура, мы изобрели диммер! (именно этот скетч я заливаю готовые платы перед отправкой, в качестве одного из элементов ОТК ;)

Торжество разума омрачает только одно - наш Ардуино оказался загруженным исключительно одной задачей. А если надо заставить скетч выполнять и другие операции? Как сделать генерацию PWM-сигнала фоновой и незаметной задачей?

Вот именно в этом случае нужно воспользоваться функцией аппаратного ШИМ в Arduino. Правда, работает она лишь на избранных пинах (они помечены звездочкой или надписью pwm), зато можно один раз выполнить analogWrite(pin, value), и спокойно заниматься другими делами. Вот так можно переписать скетч с использованием новой функции:

/*
 Fading
 
 This example shows how to fade an LED using the analogWrite() function.
 
 The circuit:
 * LED attached from digital pin 9 to ground.
 
 Created 1 Nov 2008
 By David A. Mellis
 Modified 17 June 2009
 By Tom Igoe
 
 http://arduino.cc/en/Tutorial/Fading
 
 */


int ledPin = 9;    // LED connected to digital pin 9

void setup()  { 
  // nothing happens in setup void loop()  { 
  // fade in from min to max in increments of 5 points:
  for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) { 
    // sets the value (range from 0 to 255):
    analogWrite(ledPin, fadeValue);         
    // wait for 30 milliseconds to see the dimming effect    
    delay(30);                            
  } 

  // fade out from max to min in increments of 5 points:
  for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) { 
    // sets the value (range from 0 to 255):
    analogWrite(ledPin, fadeValue);         
    // wait for 30 milliseconds to see the dimming effect    
    delay(30);                            
  } 
}

(на самом деле это скетч из примеров к ArduinoIDE - Analog|Fading).

Полюбоваться на его работу можно, если воткнуть светодиод длинной плюсовой ножкой в digital9, а короткой минусовой - в GND. Для счастливых владельцев Arduino Mega можно просто исправить значение константы ledPin в самом начале скетча с 9 на 13, поскольку в отличие от Duemilanova, Mega поддерживает аппаратный ШИМ на digital13.

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

13.08.2010

Arduino USB ID

Свежие слухи гласят, что для Arduino будет зарегистрирован собственной уникальный USB Vendor ID.

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

Ну что же - что не делается, все к лучшему! ;)

12.08.2010

MicroSD shield (1)

Попытки интегрировать в Arduino поддержку SD-карт начались достаточно давно, и давно же увенчались успехом. Пусть вас не смущает обилие элементов на новой Ethernet Shield - ничего сложного в этом нет.

Я решил разобрать технологию доступа к SD на примере изделия libellium-а - известной испанской фирмы, занимающейся разработками в области мониторинга состояния окружающей среды. К счастью, одной из побочных ветвей их деятельности является Arduino и все с ним связанное. Их microSD шилд выглядит так:



Как видите, ничего хитроумного в этом шилде - нет. При подключении SD-карты к Arduino надо помнить пару моментов:
  1. Питание карты - 3.3В;
  2. Обмен происходит по шине SPI, требуется согласование сигналов по уровням.
Поддержка SPI в контроллерах ATmega совпадает по пинам с разъемом внутрисхемного программирования, так что можно подключаться к digital 10-12. Теоретически, питание +3.3В можно брать с питающей колодки Arduino Duemilanova, но тут, на мой взгляд, сложилась парадоксальная ситуация - хотя во многих платах и клонах Arduino пин трехвольтового питания присутствует, все шилды в обязательном порядке забивают игнорируют эту возможность и используют свой собственный регулятор +3.3В. 

Для работы надо соединить две линии сигналов данных (MISO/MOSI), тактовые (SCK) и выбор приемника (SS). Правда, тут нас ждет небольшая проблема согласования сигналов по уровням. 

Как известно, в Arduino мы имеем дело с КМОП-логикой, управляемой напряжением - один уровень соответствует логическому нулю, другой - логической единице. Реально же, при определении состояния входа КМОП, логические уровни зависят от напряжения питания, граница проходит по Vcc/2. И действительно, если мы обратимся к документации, то увидим, что логической единицей для ATmega будет напряжение более 2,5 В, а нулем - менее 2,5 В (естественно, при Vcc=5В). И в то же время, при работе в качестве выхода, КМОП будет формировать для логической единицы напряжение близкое к Vcc, а для нуля - к GND.

У работающего в SD-карте трехвольтового КМОП-а на выходе формируется логическая единица с уровнем = Vcc = 3,3В, что больше 2,5В и будет правильно восприниматься пятивольтовым входом. Но пятивольтовая единица на трехвольтовом входе крайне нежелательна, поэтому надо изыскать способ преобразовать ее в диапазон 1,65..3,3 В. Конечно, на эту тему существует обширнейшее семейство чипов, которые "в лучшем виде" организуют такие преобразования, но они в данном случае не потребуются. Для относительно невысоких скоростей обмена, можно прибегнуть к тривиальному делителю напряжения на резисторах

Я взял на себя смелость перерисовать схему устройства, тем более, что там всё просто:



Увы, я не смог идентифицировать чип в корпусе SOT23-5, хотя это явно регулятор напряжения. На нем написано "PHUI", и ни один из справочников по SMD о такой комбинации не знал. Пришлось его заменить на близкий по смыслу и корпусу NCP1400 (чип IC1 по схеме).

Updated: чип этот все-таки удалось идентифицировать - это LP2985-33BVR! Более подробно - здесь.

Делители напряжений на плате представляют пары SMD-резисторов 10K/15K - R3/R4, R5/R6 и R2/R7. Кроме сигналов SPI, слот SD-карты умеет сообщать о наличии в нем карты (сигнал CD), и этот дополнительный сигнал притянут к Vcc через R1, поскольку представляет из себя простой механический контакт, разрываемый во время вставки карты. Конденсаторы C1 и C2 выступают в качестве фильтров по питанию.

Само питание на плату подается двумя разными способами:
  1. С цифрового пина digital8 (не так уж много microSD надо для работы)
  2. C гребенки ICSP



Переключение осуществляется джампером JP4, в позиции 1-2 он подает на вход IC1 напряжение с digital8, в позиции 2-3 - со 2-го контакта разъема IСSP-6:



Дополнительная колодка JP5 (сигналы CD и SS) нужна в двух случаях:
  1. При подключении через ISP-6 (место SS занял необходимый для программирования RESET, а места для сигнала CD уже и вовсе нет);
  2. При подключении к Arduino Mega (там пин SS находится в другом месте).
При этом, линии +5В, +3.3В и GND выводятся на JP2 - просто так, на всякий случай.

Картинки вариантов подключения:





Можно использовать пин-экстендер:



В этом случае можно подключаться игнорируя шилд, у которого не заняты колодки digital 13-8, типичный пример - Arduino Motor Shield: