Содержание статьи
Arduino — крохотная плата с большими возможностями, типичный представитель Open Hardware и одно из первых устройств, завоевавших широкую популярность у аппаратных хакеров. Не мудрено: удобный электронный конструктор позволяет даже новичкам быстро разобраться и начать с нуля разрабатывать собственные устройства.
Как быстро начать?
Для быстрого начала новичку проще всего купить готовую плату — стоит она примерно $30. На плате будет всего два чипа — микроконтроллер ATMEL и микросхема USB-интерфейса, к которой он подключен. Все остальные элементы добавляются самостоятельно по мере необходимости.
Программы для Arduino (называемые на сленге «скетчами») пишутся на языке Wiring. По сути, это обычный C++, расширенный специальными процедурами типа «digitalWrite» (записать значение в порт) или «analogRead» (прочитать значение из АЦП). Осваивается все это в один-два присеста, особенно если у тебя уже есть опыт программирования на C++. Написанные скетчи компилируются и загружаются в Arduino через USB с помощью среды ArduinoIDE (arduino.cc/en/Main/Software). Чтобы собрать простейший проект требуются какие-то минут тридцать, без необходимости глубокого погружения в даташиты ATMEL и конструкции ассемблера. Язык интуитивно понятен, а разобраться с нюансами поможет неплохой онлайн-хелп. Да и паять, кстати, тоже необязательно, если есть беспаечная макетка и набор проводков.
Все выводы микроконтроллера выведены на два аккуратных ряда колодок, к которым можно подключать датчики, кнопки, дисплеи и тому подобное. Однако, чем сложнее обвязка, тем больше с ней может быть геморроя. Если речь идет про пару светодиодов и кнопок, то никаких сложностей. Но вот если требуется управлять моторами или обмениваться данными через радиоинтерфейс, возникает ряд сложностей. Для борьбы с этим пороком и придумали шилд-платы — готовые платы для расширения функциональности.
Что такое Shield-плата?
Shield-плата — это готовое решение для реализации частых задач, встающих перед разработчиками железа. Примерами таких задач могут быть и передача данных через радиоинтерфейс, и работа с Ethernet, и управление электронными двигателями. Платы расширения легко устанавливаются на Arduino, стыкуясь с колодками пинов и образуя весьма жесткую бутербродообразную конструкцию.
Можно устанавливать несколько плат одновременно, главное, чтобы устройства не конфликтовали за одни и те же пины Arduino. Немного покопавшись в сети, можно найти таблицы со списком популярных шилдов и занятых ими пинов (shieldlist.org).
Дальше остается лишь подцепить соответствующую библиотеку к основному скетчу и опробовать работу схемы с помощью прилагаемого к библиотеке скетча-примера. При таком подходе время экономится дважды: сначала на разработку и отладку аппаратной части, а затем — программной. Однако по-настоящему удачных и популярных шилд-плат существует всего пара десятков. Чем хороший шилд отличается от плохого?
В первую очередь, на нем обязана быть кнопка сброса. Оценить это может любой, кто отлаживал Arduino с одетым шилдом — штатная кнопка сброса становится недоступной и упражнения по ее нажиманию при помощи подручных продолговатых предметов порядком раздражают. Хороший шилд также должен быть совместим с Arduino Mega — если у тебя расширенная версия Arduino на ATmega1280 или ATmega2560, еще не факт, что с ней заработает шилд, созданный для привычной Uno или Duemilanova. А все из-за того, что в Mega отвечающие за аппаратный SPI пины перенесли в другое место! Так что если шилд общается с Arduino по шине SPI, обязательно изучи его «брюхо» — надеяться на совместимость с Mega можно, если ты увидишь там не только штырьки, но и черный квадратный разъем-розетку 2х3. Ниже я подготовил обзор лучших готовых Shield-плат для решения частых задач.
Управление моторами
Если необходимо управлять моторами, смело используй шилд Motorshield, созданный талантливым американским инженером Лимором Фридом aka ladyada (ladyada.net/make/mshield/).
Главное преимущество шилда заключается в его универсальности, поскольку он поддерживает до четырех моторов прямого тока, до двух шаговых двигателей и двух серво-приводов. Можно комбинировать: например, один шаговый и два двигателя постоянного тока. Основу шилда обеспечивают две микросхемы счетверенного H-моста L293D, способные выдавать ток до 600 мА на канал и работать напряжениями от 4,5 до 36 В. Запараллелив входы одной микросхемы, можно отодвинуть ограничение по току до 1,2 А.
С помощью этого шилда можно, например, управлять одновременно моторами и рулевой тягой модели гоночного автомобиля, шаговыми двигателями координатного стола. Для более мощных нагрузок можно использовать Ardumoto с чипом L298 от фирмы Sparkfun (два канала с токами нагрузки до 2 А) или ее более продвинутую версию Monster Moto Shield (sparkfun.com/products/10182) на двух чипах VNH2SP30, способную отдавать уже до 30 А с предельным напряжением 41 В. Если дело дойдет до последнего варианта, не забудь посоветоваться со знающими спецами: все-таки нагрузки довольно приличные, возможно придется обзавестись дополнительным радиатором, чтобы не обжечься.
Работа с Ethernet
Существуют два основных варианта шилдов для работы с Ethernet — на основе старого доброго чипа ENC28J60 от Microchip и более совершенного W5100 от Wiznet. Оба решения используют для обмена шину SPI, отнимая всего четыре пина Arduino. Но ENC28J60 появился много раньше и явно проигрывает продвинутому W5100: только 10 Мбит/с, нет аппаратной поддержки IP, UDP, TCP. Кроме того, W5100 позволяет работать с четырьмя сокетами (что означает поддержку до четырех одновременных соединений).
В общем, настоятельно рекомендую использовать именно W5100, потому что он существенно экономит ключевой ресурс микроконтроллера — оперативную память (SRAM), которую приходится экономить (у Atmega328 — всего один килобайт). Ну и все остальные преимущества предобработки налицо: пока W5100 сам переспрашивает пакеты по протоколу TCP и считает контрольные суммы заголовков, Atmegа может спокойно заниматься более важными вещами.
Другим образцовым примером является шилд Arduino Ethernet Shield (arduino.cc/en/Main/ArduinoEthernetShield) от команды Arduino. С его помощью можно создать скетч, который будет способен:
- получать динамический IP-адрес по DHCP;
- устанавливать время по протоколу NTP;
- резолвить имена через DNS;
- проходить авторизацию через RADIUS;
- выполнять функции несложного Web-сервера или выступать в качестве Web-клиента, формируя запросы и осуществляя парсинг ответов.
Из схожих плат можно отметить разработку Freetronics — EthernetShield with PoE (freetronics.com/products/ethernet-shieldwithpoe). Идея питания Ethernet-устройства от той же линии Ethernet, к которой оно и подключено, родилась в 2001 году, а два года спустя стала официальным промышленным стандартом IEEE 802.3af. По собственному опыту замечу, что нет ничего удобнее для питания автономных коробочек, которые общаются по Ethernet и разбросаны по зданию в радиусе 100 метров от специального питающего коммутатора. Стоит такой шилд чуть дороже, требует приобретения дополнительной микроплатки модуля PoE и вместо SD-разъема имеет макетное поле.
Применение такому шилду — исключительно в неподвижных конструкциях, требующих взаимодействия по сети TCP/ IP. Например, отображение в браузер состояния подключенных датчиков или удаленное управление какими-то механизмами.
Сразу вспоминается проект «твиттер-цветочка», в котором связка Arduino+Ethernet при помощи воткнутого в землю датчика влажности через твиттер жаловалась на сухость и требовала немедленного полива. При всем многообразии применения EthernetShield хочу предупредить о том, что каждая библиотека, безусловно, экономит время, однако и отнимает несколько килобайт флеш-памяти микроконтроллера. Поэтому, если рано или поздно упрешься в предельный размер 30 Кб своей Arduino Duemilanova — подумай о замене на Mega 2560, памяти для скетчей будет раз в восемь с половиной больше.
Использование SD-карт
В проектах, связанных с накоплением какой-либо информации (например, GPS-координат), часто требуется нарастить объем доступной энергонезависимой памяти. Проще всего это сделать, подключив стандартную SD-карту. Для этого есть несколько готовых шилдов. Самый симпатичный из известных мне вариантов — microSD module, разработан испанской фирмой Libellium, специализирующейся на мониторинге окружающей среды (goo.gl/iHCy4).
Шилд занимает всего одну колодку пинов Arduino и позволяет работать с SD и SDHC-картами, предварительно отформатированными на в FAT16 (предпочтительнее) или FAT32. Единовременно можно работать только с одним файлом, длинные имена не поддерживаются.
Беспроводные шилды
Самые простые RF-модули на амплитудной модуляции (ASK), работающие в нелицензируемом диапазоне 433 и 313 МГц хоть и могут использоваться с Arduino через библиотеку VirtualWire, но все равно представляются мне довольно плохим вариантом.
Слишком сильно они подвержены помехам, устойчиво работают только на низких скоростях, не имеют аппаратного разделения на каналы — несколько одновременно работающих передатчиков будут мешать друг другу. Может быть, именно поэтому шилд-плат для них я пока не встречал.
Полярную противоположность представляют платы семейства Xbee, основанные на протоколах Zigbee, идеально подходящие для организации распределенных сенсорных сетей с автономным питанием. Каждая такая плата сама по себе является устройством с микроконтроллером на борту, и от шилда требуется совсем немного — обеспечить согласование с Arduino. Называются такие шилды обычно «Xbee Shield», но не всегда — например, Libellium разработал Communication Shield (goo.gl/OZDxl). Шилд обязательно содержит два ряда колодок, к которым пристыковывается модуль в формате Xbee.
Единственный недостаток, пожалуй, это цена самого модуля Xbee. Взамен получаем скорость до 250 Кбит/с, дальность в пределах прямой видимости до 90 метров (модификация Xbee PRO может добивать до 1,2 км), шифрование, экономное энергопотребление и возможность ретрансляции данных (два модуля прозрачно общаются друг с другом через третий).
Давно замечено, что если в компании заходит речь про беспроводные сети, первым делом почему-то вспоминают про WiFi, гораздо реже — про Bluetooth. В качестве примеров подойдут WiFly Shield от SparkFun (sparkfun.com/products/9954) и Bluetooth module от Libellium (cooking-hacks.com/index.php/arduinobluetoothmodule-89.html). Последний выполнен в формате Xbee и будет работать с любым переходным шилдом для Xbee, а программная настройка из Arduino напоминает диалог с модемом — через последовательный порт и AT-команды. Кстати, в свое время была выпущена оригинальная плата Arduino BT (arduino.cc/en/Main/ArduinoBoardBluetooth), которая не имела USB-интерфейса, но программировалась и подключалась к компьютеру именно через Bluetooth. Большого распространения она не получила — может быть, в силу увеличения цены.
Для обмена данными через GSM обычно используется мобильник, способный работать по последовательному порту на уровнях TTL.
Но сейчас таких все меньше и меньше — их вытесняет USB, для работы с которым требуется быть хостом (а не девайсом, каковым является Arduino). Но, к счастью, производители уже давно штампуют законченные GSM-модули, к которым остается при крутить внешнюю антенну и разъем симки. За примером далеко ходить не надо — GPRS Quadband module for Arduino от Libellium (goo.gl/KueFH), который базируется на GPRS-модеме от SAGEM.
Особенность именно этой модели — GRPS-модуль съемный, и можно передавать не только данные — разведен выход на внешний спикерфон.
Разные шилды
Подводя краткий итог, можно с уверенностью сказать — решения почти всех типичных задач давно существуют в виде шилдов. Но не стоит думать, что на этом все заканчивается. Вот несколько примеров: Radiation Sensor Board от Libellium (счетчик Гейгера).
И вроде бы идея не нова — но все равно, пока Фукусима не грянула, никому в голову не пришло запустить подобное в серийное производство. Другая интересная идея заложена в основу Seeeduino Stalker — она способна при необходимости быть и Arduino-совместимой платой, и шилдом, что достигается при помощи двух параллельных рядов контактов. В настоящий момент идет активная разработка USB Host Shield — он позволит подключать к Arduino устройства, подключаемые в обычных условиях к компьютеру. Существует также масса шилдов для индикации — начиная с семисегментных дисплеев, заканчивая TFT-экранами с тачскином. Меня больше всего заинтересовал LoL-Shield. Вроде бы простая матрица из светодиодов, но на принципе хекосплексирования. Этот хитрый прием использует возможность пинов Atmega находиться в трех состояниях (0, 1 и высокое сопротивление). В результате усердной пайки 126 светодиодов, получаем полноценную матрицу 9х14, не израсходовав даже всех пинов Arduino, а в качестве примеров к библиотеке предлагаются игры «Жизнь», «Тетрис», «Пинг-понг» и «Space Invaders».
Поэтому, если у тебя есть свободное время и оригинальная идея — обязательно найди время поделиться с сообществом — глядишь, тебе и схему поправят, и с разводкой помогут. Ведь нет ничего более захватывающего, чем коллективное творчество.
Шилд своими руками
В качестве примера создадим свой собственный LCD-шилд. Схема подключения популярного алфавитно-цифрового ЖКИдисплея 1602 на контроллере HD44780 возможна в двух вариантах — восьмибитной шиной или четырехбитной. Самое время открыть стратегию шилдостроения Arduino: пинов много не бывает! Стараемся использовать их по минимуму и поэтому выбираем четырехбитную схему (на наше счастье, поддержка такой схемы входит в дистрибутив ArduinoIDE, в виде библиотеки LiquidCrystal).
Используем для построения нашего шилда специальную заготовку — протошилд, который представляет собой макетную плату с небольшими изысками. Самая главная его ценность — это правильно расставленные отверстия для пинов, для идеальной стыковки с Arduino. Так уж получилось, что все колодки пинов расположены на сетке с шагом 2,54 мм, кроме одной (если бы не этот досадный факт, можно было бы взять любой кусочек «дырчатой макетки» и впаять в него стыковочные вилки PLS). Сделано это было специально, чтобы реципиент по рассеянности не вставил шилд наоборот и не пожег на корню будущий шедевр.
Обрати внимание, что схема предусматривает наличие переменного резистора для регулировки контрастности. Это важно! Если забить на это, при правильной в остальном схеме и скетче ничего видно не будет. Подойдет любой на 10-20 кОм, а конкретно на этом протошилде он уже и так предусмотрен — правда подключен ко входу analog0, поэтому придется припаять лишний проводок.
Возьмем кусочек штыревой гребенки PLS и распаяем сначала на контакты дисплея, а затем — на шилд. После этого надо взять монтажный провод и аккуратно, по очереди, зачистить и напаять проводки от дисплея к пинам Arduino согласно схеме — благо, она несложная. У меня интуитивным образом получилось упрятать большую часть под дисплей.
Оденем полученный результат на Arduino и загрузим первый тестовый скетч-пример из каталога LiquidCrystal. Ничего нет на экране? Или куча черных квадратиков? Не беда, самое время подкрутить переменный резистор — уверен, что-то обязательно появится! В этом случае можешь облегченно вздохнуть — теперь у тебя есть первый шилд собственного изготовления. Ну и раз уж он заработал — можно заодно его русифицировать. В свое время я изменил стандартную библиотеку так, чтобы символы кириллицы корректно транслировались из UTF-8 в знакогенератор дисплея. Ищи последнюю версию библиотеки на github.com/mk90.