Компания Intel выпускает несколько устройств для разработчиков: Galileo, Galileo Gen2 и Edison — продукты, совместимые с платформой Arduino, основное назначение которых – создание решений в сфере интернета вещей (IoT). Знакомимся с с Intel Galileo Gen2 — «Intel IoT».
Комплектация
Intel Galileo Gen2 позиционируется как отладочная плата для изучения ключевых возможностей и особенностей Intel-платформы и не предназначена для встраивания в конечные устройства. Для применения в готовых устройствах предназначен Intel Edison (декларируется простая миграция Gilileo -> Edison).
Galileo Gen2 поставляется в красивой (не только снаружи, но и внутри) упаковке, однако, перечень содержимого достаточно скромный:
Собственно, внутри только сама плата Intel Galileo Gen2, источник питания (12В 1.5А, в комплекте 5 различных адаптеров под разнообразные розетки) и один листочек с важной информацией о безопасности (отпечатан ультрамелким шрифтом, записи на всех возможных языках, кроме русского).
Кстати, в этой бумажке написано, что во время работы Intel Quark SoC может нагреваться и трогать его не рекомендуется.
Странно, что в комплекте нет microUSB-кабеля, который требуется для работы с платой, ну да ладно – такого добра в хозяйстве любого гика достаточно.
Внешний вид
Размер платы Intel Galileo Gen2 составляет 124х72 мм (разъёмы чуть выступают за пределы платы):
Основные разъемы на плате (начиная с левого нижнего угла и далее по часовой стрелке):
- Слот для microSD-карты
- Разъем питания (от 7 до 15В)
- Ethernet-порт (10/100)
- UART (6-пиновый разъем)
- USBclient
- USBhost
- Разъем DEDIPROG (белый, может понадобиться, например, для восстановления после «окирпичивания»)
- ICSP (6-пиновый разъем)
В правой части платы также видны характерные «гребенки» для Arduino-шилдов (полностью соответствуют Arduino Uno R3). Все пины заботливо подписаны в лучших традициях Arduino-плат.
Чуть ниже UART-разъема находится единственный джампер (IOREF) на два положения (5В и 3.3В) – он позволяет выбрать планку логических уровней, с которым будут работать подключенные шилды. Неправильный выбор напряжения может повредить как шилд, так и порты ввода/вывода Intel Galileo.
Левее и чуть ниже SoC находится двухпиновый разъём для подключения резервной батарейки (3В) для RTC (подписан «COIN»). RTC интегрирован в процессор.
На верхней стороне платы также находятся две кнопки: RESET (перезагрузка ардуино-составляющей) и REBOOT (перезагрузка всей системы).
Для индикации активности на Intel Galileo Gen2 находятся 5 светодиодов (все расположены рядом с разъёмом USBhost):
- OC (красный) – для индикации перегрузки по питанию
- USB (зелёный) – готовность к подключению через USB
- L (зелёный) – пользовательский светодиод (подключен к D13)
- ON (зелёный) – питание
- SD (зелёный) – индикация доступа к SD-карте
Посмотрим на плату с нижней стороны:
Первое, что бросилось в глаза – остатки флюса почти на всей нижней поверхности платы. Странно видеть подобное у именитого производителя (да ещё и с такой привлекательной упаковкой). Ну да ладно, «на скорость не влияет».
Зато на нижней стороне платы размещён полноценный mini-PCI Express слот для возможных расширений (модули WiFi, модемы и т.п.). Рядом с ним находится 10-пиновый разъем JTAG для отладки. Там же предполагается подключать и опциональный модуль PoE (соответствующие контакты подписаны «POWER OVER ETHERNET»).
Ключевые особенности платы приводить не буду, поскольку это уже многократно делали. Кому интересно, можно ознакомиться, например, с информацией на самом сайте компании.
Let’s go!
Плата подобного класса для меня – большая новинка. До этого я довольно плотно работал сначала с различными ардуино-платами, а потом и просто с устройствами на базе МК atmega.
Intel Galileo позиционируется (по крайней мере, как это декларируется в маркетинговых материалах Intel) как плата с большими возможностями linux-систем и простым прототипированием Arduino, а так же с возможностью организации взаимодействия двух этих «подсистем». Посмотрим, как обстоят дела на самом деле.
Изучение я начну с той части, которая для меня является хорошо знакомой: Arduino. Все действия буду описывать под Mac.
Плата в заводском состоянии (без какой-либо подготовки) уже пригодна для работы в среде Arduino (в 8Mb встроенного флеш-хранилища находится облегченная версия linux, которая обеспечивает этот функционал).
Но «хватит откладывать – пора высиживать»: жахнем из главного калибра по воробьям (поморгаем светодиодом). Первое, что требуется – скачать и установить специальную версию Arduino IDE (доступна в Galileo Software Downloads) для своей ОС.
Теперь, наконец-то, можно подключить саму плату. Тут есть небольшой нюанс – после подключения питание необходимо немного подождать (несколько секунд), пока система загрузится. При этом на плате последовательно загорятся два зелёных светодиода (по разные стороны от USBhost-разъёма) – только после этого можно подключать microUSB-кабель.
В Arduino IDE необходимо выбрать свою плату (в этой среде доступны варианты Intel Galileo, Intel Galileo Gen2 и Intel Edison) и появившийся после подключения платы порт. Для Mac адрес порта имеет вид: /dev/cu.usbmodemXXXXX, где XXXXX выглядит как fd121.
В первый раз рекомендуется сделать проверку версии прошивки и обновление, если оно требуется, конечно. Моя плата такое обновление получила:
Теперь плата полностью готова к работе. В качестве первого эксперимента загружаем «Hello World!» для МК – пример Blink. Привычно нажимаем кнопку «загрузить» и через несколько мгновений на плате начинает задорно моргать зелёный светодиод у USB-разъёма.
Готово! Первый скетч уже работает. После перезагрузки системы – начнёт работать заново. Таким образом, можно сразу использовать Arduino-возможности платы. В Arduino IDE находятся все основные примеры и включены базовые библиотеки (со своими примерами), позволяющие быстро ознакомиться с возможностями платы и её программирования. Собственно, ничего необычного в этом пока не обнаружено – всё работает, как ожидалось (пусть и «поморгать светиком» это слишком уж просто и банально).
Интересно, что через ардуино-составляющую можно работать с Ethernet-портом (через штатную адаптированную одноимённую библиотеку) и SD-картой. При этом не задействуются никакие пины для подключения шилдов.
Intel заявляет, что обеспечивается совместимость практически с любым ардуино-шилдом.
Все шилды я, конечно, проверять не буду (тем более, что есть вот такой документ) – под руку попался EM Shield. Этот модуль содержит популярный жк-дисплей (аналогичный Nokia 5510), две кнопки (подключенные к одному аналоговому пину), три разъёма для подключения токовых датчиков (тоже заведены на аналоговые пины) и интерфейс для подключения популярного трансивера nRF24l01+ (на ардуино используется аппаратный SPI). Цель экспресс-проверки – попробовать запустить какие-нибудь примеры из готовых библиотек, не входящих в состав «подготовленной» IDE.
Для наглядности начал с дисплея. И библиотека LCD5110_Graph (ожидаемо) не «завелась»… Основные ошибки при компиляции: работа с регистрами напрямую. А вот если переписать соответствующие куски кода на digitalWrite() и т.п. – дисплей «оживает». Собственно, КДПВ сделана именно при этих экспериментах.
Аналогичные проблемы (не компилируется, не работает) появились при работе с таймерами. Обнаружились проблемы и при работе с прерываниями – они (прерывания) обрабатываются, но только «при изменении» (напомню, в обычной Arduino можно настраивать прерывания «по фронту», «по спаду» и «при изменении»).
Вероятно, есть какие-то еще особенности – проявятся в дальнейшем изучении. Пока писал этот пост, нашёл вот такой документ – в нём описаны соответствующие ограничения. Лучше их предварительно изучить, чтобы не ходить по уже известным «граблям». Особо следует обратить внимание на существенно меньшие токи с каждого пина: 16мА@5В или 8мА@3.3В (на обычной Arduino – 50мА@5В). То есть в случае чего можно запросто выжечь пин – будьте внимательны.
Также было очень интересно, насколько быстрее Intel Galileo выполняет «стандартные» функции – например, digitalWrite(). Для этого я взял скетч blink, убрал задержки из цикла loop() и залил один скетч в ардуино (atmega328p), и аналогичный – в Galileo. Подключил осциллограф и увидел следующее:
Получается, что плата от Intel работает примерно в четыре раза быстрее (385кГц, против 116кГц у Arduino).
Несмотря на предупреждение, я все-таки потрогал SoC во время проведения последнего эксперимента… и практически обжег палец.
Можно смело сказать, что плата от Intel (если рассматривать исключительно Arduino-составляющую) – обеспечивает такой же низкий уровень входа, как и Arduino (правда, при существенно большей стоимости платы). Но ведь это даже не половина возможностей!
На Intel Galileo можно запустить вполне функциональную версию linux – Yocto, при этом можно использовать плату как обычный linux-компьютер. А организовав взаимодействие «linux-компьютера» и «arduino-устройства» – реализовывать гораздо более функционально-продвинутые вещи.