30.03.2014

А все-таки она вертится!

Мельком прочитав проскочившую в октябре прошлого года новость по поводу выхода очередной Arduino-совместимой платы Intel Galileo, я почему-то не особенно и удивился. Но когда узнал, что она получила официальную поддержку от Arduino, не смог удержаться и заказал.



Прежде всего, надо осознать, что перед нами плата с Linux внутри, при этом ее программирование осуществляется самым привычным способом, через ArduinoIDE 1.5.3. Можно сказать, что мы получили продвинутый Arduino UNO R3 - на плате расположены колодки в формате Arduino pinout 1.0, к ней можно подключать стандартные шилды.

* * *

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


Сбоку, однако, мы видим, что внутри продукт Galileo1, сделан в Китае:


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


Устав вертеть коробочку в руках, разрезаем две прозрачные пломбы-липучки и снимаем крышку:


Сама плата хоть и ненамного, но превышает размеры Arduino Uno - получается где-то 7 на 10 см. Это навязчивое "What will you make?" уже наводит на мысль, что с этим надо было давным-давно определиться, ещё до вскрытия коробки. На внутренней стороне крышки опять схема:


Стало быть, без блока питания она не заведется...


Ах, какой приятный сюрприз: блок питания в комплекте! Наверное, стоило бы и шнурок microUSB вложить... Ну или хотя бы кабель microUSB OTG. Из всех насадок выбираем европейскую, зачитываем Safety Instruction на русском:


Из этой инструкции мы узнаем, что на плату можно прикрепить батарейку часов реального времени, а также, что блок питания Phihong одобрен уважаемой фирмой Intel как сертифицированный аксессуар.

Теперь самое время присмотреться к компонентам:


1. Эта зелененькая BGA-микруха и есть ЦП, Intel® Quark SoC X1000, работающая на тактовой частоте 400 МГц. Мы получили почти Pentium ;) (строго говоря - Intel Pentium Instruction set Architecture):
  • 32-битный;
  • L1 кэш 16 Кбайт; 
  • внутренняя память 512 Кбайт;
  • одно ядро, один тред, постоянная скорость выполнения;
  • поддержка ACPI-состояний для засыпания;
  • часы RTC, сохраняют данные при питании от внешней литиевой батарейки 3В.
Стоит он 13..16 USD, но приобретать его вам навряд ли придется - BGA-корпус не располагает к DIY-творчеству.

2. Внешняя память, в сумме имеем 256 Мбайт DDR3. В нем хранятся и данные, и программы - после выключения питания они, разумеется, теряются.

3. Флешка. Загрузка Linux идет прямо оттуда, остальная память может быть использована для хранения каких-то данных, суммарный объем 8 Мегабайт.  

4. Это не звук! Это разъем последовательного порта RS232 (микросхема MAX3232 находится справа). Через этот порт можно  получить доступ к консоли Linux, параметры 115200-8-N-1

5. Сетевой порт Ethernet 10/100. Можно использовать в скетчах.

6. Разъем USB device. Сюда подключается компьютер, через этот порт загружаются скетчи. Разработчики почему-то советуют сначала подключить к плате источник питания, а уже потом этот порт - к компьютеру.

7. Разъем USB host. К нему можно подключать разнообразную периферию - флешки, камеры, аудио-карты и тому подобное.

8. microSD, поддерживаются SDHC до 32 Гиговые. С карточки придется загрузиться, если требуется работа с WiFi - драйвера не смогли уместиться 8 Мб флешки (3). С другой стороны, она тоже доступна для скетчей.

9. Внешнее питание +5VDC. Разъем такой же в точности, как на платах Arduino. Блок питания в комплекте на 2А, в документации нашел упоминания и про 3А. Конечно, для шилд-плат +5В не может быть полноценным VIN-ом, и Galileo позволяет соединять их по желанию.

10. Розетки для подключения шилд-плат, всё как на UNO R3. Есть пара моментов, о которых стоит помнить:
  • цифровой пин в режиме выхода способен на ток до 10 мА, в режиме входа - принять ток до 25 мА. Не вздумайте подключать обычный светодиод напрямую, без токоограничительного резистора 330 Ом;
  • суммарный ток, который могут отдать цифровые пины не должен превышать 80 мА;
  • пин AREF на Galileo - декоративный, изменить опорное напряжение АЦП нельзя - не только с помощью этого входа, но и с помощью analogReference();
  • аналоговые пины можно при желании переключить на разрешающую способность 12 бит (0..4095), измерение по умолчанию идет в диапазоне 0..+5В и по стандартной 10-битной шкале;
  • питающий пин +3,3V способен на ток до 800 мА;
  • значение напряжения на пине VIN зависит от установленного рядом джампера.
11. Гребенка ICSP. Загружать через нее бутлоадер не придется, скорее подключаться к шилд-платам с поддержкой аппаратного SPI.

12. Кнопка сброса скетча. Скетч сбрасывается, остальная система продолжает работать.

13. Кнопка сброса SoC. По ее нажатию происходит перезагрузка всей системы, и скетча за компанию.

14. Вилочка для подключения внешней батарейки RTC. Полезно, если Galileo должен вспоминать время при включении питания.

Кроме всего прочего, есть несколько джамперов, довольно важных:



IOREF: выбирает напряжение логической единицы - +5В или +3,3В. Переключением напряжений сейчас никого не удивишь, хотя для клонов классических плат Arduino существует извечная проблема - ATmega упорно запитывают от +3,3В, но в даташите тактовая частота 16 МГц на таком питании внятно не гарантируется. Здесь, конечно же, с напряжением питания SoC это никак не связано ;)

VIN: этот джампер соединяет пин VIN с питанием +5В. Если шилд такое питание не устраивает, можно разомкнуть этот джампер и подать на шилд +9В. Только будьте аккуратней - не замкните этот джампер при поданном напряжении >5В, иначе с вашим Galileo произойдет то, что в свое время грозила с ним сделать святая католическая церковь.

I2C: Служит для изменения адресов устройств I2C на плате. Поскольку на двухпроводной шине I2C все устройства обязаны иметь собственный адрес, то теоретически имеется ситуация, когда адреса двух устройств, оказавшихся волей судеб на одной шине, совпадут. На Galileo таковыми являются флешка 8 Мб и расширитель GPIO (именно через него реализован PWM для пинов Arduino). По умолчанию это адреса 0100000  и 1010000, но если переставить этот джампер на первый пин (помечен белым треугольничком), то к адресам добавится единица - будет 0100001  и 1010001.

Наконец, с обратной стороны платы есть разъем Full PCI Express, который поддерживает PCIe 2.0. Можно подключать платы половинного размера через специальный переходник, а на коннекторе есть USB 2.0 хост.

Подводя итог по поводу начинки, полезно закрепить, помедитировав на блок-схему (кликабельно):


На плате есть светодиоды "USB", "SD", "ON" и "GP".  Последний соответствует светодиоду L, подключенному к D13 на платах Arduino. Чтобы исполнить Blink (убедиться, что плата работает), идем на страничку Galileo и качаем оттуда версию ArduinoIDE 1.5.3. Файл находится в разделе загрузок и начинается с "Intel_Galileo_Arduino_SW_on". После распаковки и запуска выберите порт подключения (в Windows подключенная плата представится как "Gadget Serial V2.4", для нее потребуется "обновить драйвера"; в Linux - как /dev/ttyACMXXX и никаких драйверов не понадобится), выберите из примеров Blink, нажмите Ctrl-U и подождите, пока закончится загрузка.

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

void setup() { 
  system("telnetd -l /bin/sh");
}
void loop() {
  system ( "ifconfig eth0 > /dev/ttyGS0" ); // 
  delay ( 5000 ); 
} 

Никаких хитростей - system делает тоже самое, что и команда с тем же названием на UNIX-подобных системах: запускает какую-либо команду во внешнем shell. В данном случае она в setup запускает сервер Telnet, а далее в цикле выводит текущую информацию о сетевом интерфейсе в порт Serial Monitor. Если адрес выдан, мы должны увидеть что-то типа:

eth0     Link encap:Ethernet  HWaddr 00:23:14:09:15:24  
          inet addr:192.168.100.20  Bcast:192.168.100.255  Mask:255.255.255.0
          inet6 addr: fe80::223:14ff:fe09:1524/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:31852 errors:0 dropped:0 overruns:0 frame:0
          TX packets:23743 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:28794897 (28.7 MB)  TX bytes:4941927 (4.9 MB)

Берем из второй строки ip-адрес, запускаем telnet, передавая его в качестве аргумента, получаем приглашение от рута:

Poky 9.0.2 (Yocto Project 1.4 Reference Distro) 1.4.2 clanton

sh-4.2# 

Если по каким-то причинам плата не получает адрес (например, просто нет сервера dhcp), можно изменить setup таким образом, чтобы перед запуском telnet нужный адрес присваивался вручную:

void setup() { 
  system("ifconfig eth0 192.168.100.101");
  system("telnetd -l /bin/sh");
}

Что можно делать в командной строке? Да всё, что угодно - с рутовыми-то привилегиями ;) Однако будьте предельно осторожны, доступ к файловой системе идет в режиме rw и необдуманные действия могут повлечь необходимость ее восстановления.

В качестве примера, обратимся к портам ввода-вывода, для этого:

/ # login root
root@clanton:~# cd /sys/class/gpio/
root@clanton:/sys/class/gpio# ls
export      gpio20      gpio29      gpio4       gpio48      gpiochip16
gpio0       gpio21      gpio3       gpio40      gpio49      gpiochip2
gpio1       gpio22      gpio30      gpio41      gpio50      gpiochip8
gpio14      gpio23      gpio31      gpio42      gpio51      unexport
gpio15      gpio24      gpio32      gpio43      gpio52
gpio16      gpio25      gpio36      gpio44      gpio53
gpio17      gpio26      gpio37      gpio45      gpio54
gpio18      gpio27      gpio38      gpio46      gpio55
gpio19      gpio28      gpio39      gpio47      gpiochip0

Первый строкой мы логинимся (правильно устанавливаются переменные окружения, тот же prompt), второй переходим в каталог в sysfs, где представлены все GPIO нашей платы - в виде набора каталогов с управляющими файлами.

Как связаны номера GPIO и пинов Arduino в Galileo? А вот так:

Пин ArduinoGPIO Linux 
050
151
214
315
428
517
624
727
826
919
1016
1125
1238
1339
1444
1545
1646
1747
1848
1949

Таким образом, например, чтобы изменить состояние пина D13, мы должны манипулировать файлами в каталоге gpio39. Но допустим, нам надо просто поморгать светодиодом GP. Он подключен к аппаратно независимому пину gpio3 (звучит странно, но это правда - для скетча это один пин, аппаратно - два). Проделаем следующее:

root@clanton:/sys/class/gpio# cd gpio3
root@clanton:/sys/devices/pci0000:00/0000:00:1f.0/sch_gpio.2398/gpio/gpio3# ls

active_low  device   direction   drive   power   subsystem   uevent      value

Первой командой мы переходим в каталог с управляюще-информационными файлами для пина, второй - распечатываем их список. Файл direction отвечает за направление пина - ввод или вывод. А файл value - за значение. Такая последовательность команд включает светодиод:

# echo out > direction
# echo 1 > value

А такая - гасит:

# echo 0 > value

Снова переходя к аппаратной части, хочу обратить внимание на один важный момент.

На плате есть некоторое количество периферии, которое доступно скетчам Arduino в режиме совместимости. Это, например, означает, что у вас есть виртуальный Ethernet Shield, для использования которого надо всего-то подключить стандартную библиотеку Ethernet.

Таким же образом можно получить и виртуальный WiFi Shield, но для этого надо не только подключить стандартную библиотеку WiFi, но и установить сам модуль WiFi в разъем Mini PCIe, загрузиться с SD-карточки и убедиться, что драйвер распознал карточку.

И к самой SD-карточке тоже можно получить доступ через стандартную библиотеку SD. 

Во всех перечисленных случаях явное преимущество состоит в возможности использования ранее написанных скетчей - с минимальными модификациями.

Подводя промежуточный итог, скажу что не обошлось и без косяков:

  • я долго не мог понять, как сбрасывать скетч - нажатие на кнопку reset, казалось, не давало эффекта. Это оказалось наполовину правдой - сброс производится по отпусканию кнопки, а до этого момента скетч продолжал работать (на обычном Arduino он на время нажатия останавливается).
  • сетевой карте не выдавался ip-адрес через dhcp. Пришлось обновить firmware - ура, помогло! Но при этом перестала нормально работать кнопка reboot :(
  • при загрузке с SD-карты, старая карточка WiFi, оставшаяся на память от погибшего лаптопа, работать не захотела. То ли драйвера в сборке нет, то ли она тоже приказала долго жить, надо разбираться :(
Поскольку ядро Arduino эмулируется аппаратно, то новые косяки должны всплывать постоянно, и вопрос только в том, насколько оперативно их будут фиксить. И тут есть некоторые сомнения - хотя разработка Intel действительно полностью открыта (как всегда - схемы, чертежи и софт с исходниками доступны для изучения), сколько еще она будет уделять ей времени? Год или два, а потом что-то новенькое выпустят, например Edison? Очень похоже, это devboard для Intel Quark X1000, который раскручивают при помощи Arduino. 

С другой стороны, за 80 USD вы получаете аналоги Arduino UNO R3 и Ethernet Shield, оригиналы которых стоят 30 и 40 USD соответственно, но с более широкими возможностями внутреннего Linux. Правда, однажды такое уже cделали - выпустив Arduino Yún.

Так или иначе, Galileo с нами. Будет время - попробую покопаться в его внутреннем устройстве чуть глубже.

Комментариев нет:

Отправить комментарий