Практикум «Intel IoT». Galileo Gen2 — Linux & Arduino
В этой части «практикума», я превращу Intel Galileo Gen2 в полноценный linux-компьютер и покажу простой способ взаимодействия Arduino- и linux-составляющих.Потребуется карта microSD (рекомендуется от 8Гб и 10 класса быстродействия), я использовал карту на 16Гб. Все шаги буду делать на Mac, для Windows и *nix-платформ всё аналогично (естественно, с соответствующими «поправками» на операционную систему).Подготовка SD-карты Для Galileo команда разработчиков выпускает специальный образ linux: Yocto1. Сначала необходимо скачать самую актуальную версию образа. Сделать это можно, например, по этой ссылке.
2. Разархивируем скачаный файл:
Mac: Downloads user$ bunzip2 iot-devkit-latest-mmcblkp0.direct.bz2 3. Подключаем microSD к компьютеру и идентифицируем её (привожу вывод данных для своего ноутбука): Mac: Downloads user$ diskutil list /dev/disk0 #: TYPE NAME SIZE IDENTIFIER 0: GUID_partition_scheme *121.3 GB disk0 1: EFI EFI 209.7 MB disk0s1 2: Apple_CoreStorage 120.5 GB disk0s2 3: Apple_Boot Recovery HD 650.0 MB disk0s3 /dev/disk1 #: TYPE NAME SIZE IDENTIFIER 0: Apple_HFS Macintosh HD *120.1 GB disk1 Logical Volume on disk0s2 9735977A-C01B-4DDC-8167–7F1238330E9D Unencrypted /dev/disk2 #: TYPE NAME SIZE IDENTIFIER 0: FDisk_partition_scheme *15.9 GB disk2 1: Windows_FAT_32 NO NAME 15.9 GB disk2s1 В моём случае карта — /dev/disk2 (у вас может быть иначе).4. Размонтируем этот диск
Mac: Downloads user$ diskutil unmountDisk /dev/disk2 Unmount of all volumes on disk2 was successful 5. Теперь можно использовать команду 'dd' для копирования образа на карту microSD: Mac: Downloads user$ sudo dd if=iot-devkit-latest-mmcblkp0.direct of=/dev/disk2 bs=8m 131+1 records in 131+1 records out 1103102976 bytes transferred in 345.586518 secs (3191973 bytes/sec) Mac: Downloads user$ sync Копирование образа на карту заняло почти 6 минут — наберитесь терпения (в это время в терминале ход процесса никак не отображается).После этих нехитрых шагов карточка microSD готова.
Первый запуск и настройка linux на Intel Galileo Gen2 В ходе этих действий покажу, что Intel Galileo Gen2 — практически обычный linux-компьютер.Собственно, вставляем карточку в слот Intel Galileo, подключаем LAN-кабель и подключаем блок питания. Наш linux-компьютер загружается. Для большей наглядности очень рекомендуется подключиться к UART-разъёму для получения различных диагностических сообщений, контролировать ход загрузки и организовать дополнительную «консоль». Я использую «программатор» Foca v2.2 (построен на базе FT232RL).
В Mac-системах удобно использовать приложение goSerial. Параметры соединения следующие (порт выбираете свой):
После загрузки системы появится приглашение: нужно ввести имя пользователя (root). После этого в терминал можно отправлять любые linux-команды.Определим IP-адрес системы:
Посмотрим версию linux: root@quark01979b:~# cat /proc/version Linux version 3.8.7-yocto-standard (brendan@thorium) (gcc version 4.8.2 (GCC)) #1 Wed Sep 3 10:41:56 BST 2014 Теперь можно немного настроить систему: установим «дружественный» текстовый редактор nano, поменяем имя компьютера, зададим пароль root, установим правильный временной пояс и время, актуализируем RTC. Настройку буду делать через SSH (хотя кое-что можно делать и через терминал, с помощью которого мы IP-адрес определяли).В ходе этих настроек я хочу показать, что на Intel Galileo Gen2 работает практически обычный linux (со всеми его замечательными возможностями).Устанавливаем nano 1. Подключаемся к Intel Galileo Gen2 через SSH под пользователем root (по умолчанию пароль — пустой).2. Создаём папку nano-src:
Mac: Downloads user$ mkdir nano-src 3. Перейдём в эту папку: Mac: Downloads user$ cd nano-src 4. Загрузим архив с исходниками nano: Mac: Downloads user$ curl http://www.nano-editor.org/dist/v2.2/nano-2.2.6.tar.gz >nano-2.2.6.tar.gz 5. Распакуем архив в соответствующую папку: Mac: Downloads user$ tar zxvf nano-2.2.6.tar.gz 6. Перейдём в эту новую папку (nano-2.2.6): Mac: Downloads user$ cd nano-2.2.6 7. Выполним следующие команды для компилирования и установки nano: ./configure make make install 8. Можно удалить каталог с исходниками: cd … cd … rm nano-src -r После этих несложных действий на Intel Galileo Gen2 появился «дружественный» редактор nano.Изменим имя компьютера Благодаря только что установленному редактору это сделать предельно просто: nano /etc/hostname Я исправил имя на «galileo» (дальше: выход через «Ctrl+X» и «Enter» для подтверждения сохранения). Можно сразу перезагрузить Intel Galileo, но мы не будем торопиться, а…Зададим пароль root Тут всё просто, делается как в самом обычном linux: passwd После этого система предложит ввести новый пароль и подтвердить его (внимание, никакие вводимые символы не отображаются). Если всё хорошо, то система подтвердит смену пароля сообщением: passwd: password changed. Устанавливаем правильный временной пояс и время Для проверки текущей даты/времени воспользуемся командой: date Выведется информация типа: Mon Jan 26 23:51:15 UTC 2015 Дополнительно можно посмотреть, что выведет команда: timedatectl status Сменим текущий временной пояс на актуальный (в моём случае — для Москвы): timedatectl set-timezone Europe/Moscow Список «доступных» часовых поясов можно подсмотреть в каталоге /usr/share/zoneinfoСнова посмотрим, что вернёт эта команда: timedatectl status Собственно, уже похоже на правду, но только «похоже» (временной сдвиг сейчас для Москвы составляет +3 часа). В этом образе linux не актуальная информация в базе данных временных поясов. Поправим эту ситуацию:1. Создадим папку для текущих действий:
mkdir tz 2. Перейдём в новую папку: cd tz 3. Скачаем актуальную версию базы данных временных поясов: wget http://www.iana.org/time-zones/repository/releases/tzdata2014j.tar.gz 4. Распакуем полученный файл: tar xzf tzdata2014j.tar.gz 5. Скомпилируем файл временных поясов Europe: zic europe Снова проверим: timedatectl status Отлично, временную зону поправили (видно, что теперь сдвиг +3 часа, т.е. информация о часовом поясе — актуальная). Установим часы по NTP. Для этого исполним команду: rdate wwv.nist.gov Теперь у нас временной пояс в порядке и время соответствует действительности.Папка tz больше не нужна — её можно удалить.
cd … rm tz -r Актуализируем RTC Чуть отвлечёмся и вспомним, что в составе SoC на Intel Galileo есть RTC (и соотвествующие пины на плате для подключения резервной батарейки). Я в домашнем хозяйстве нашёл батарейку CR2032 и держатель под неё. Сделал примитивный кабель с разъёмчиком и подключил эту батарейку к соответствующему разъёму. Теперь модуль часов обеспечен резервным питанием. Осталось только их настроить на правильную работу.Для этого запишем текущее время системы в модуль RTC, для этого исполним команду:
hwclock -w Прочитать время из RTC можно командой: hwclock -r Вот теперь уже можно и reboot Таким образом, ничего необычного не проявилось для тех, кто немного знаком с linux: Intel Galileo с Yocto — вполне «обычный» linux-компьютер. Но это не совсем так…Конечно, можно установить и другой дистрибутив linux (например, Debian), но тогда «из коробки» не будет такой тесной интеграции:
Arduino & linux Для взаимодействия Arduino- и linux-составляющих Intel Galileo в скетчах можно использовать функцию system (const char * command). Это стандартная функция C, которая передаёт запросы на командный процессор операционной системы. С помощью этой функции, скетч Arudino «общается» с Linux, так же, как мы только что это делали через терминал из командной строки.Для теста я написал простой скетчик, который выводит в монитор порта следующую информацию:
Имя хоста (из файла /etc/hostname). Текущую дату-время (команда date). IP-адрес (grep’нутый результат команды ifconfig). Температуру SoC (обработанные данные из «файла» /sys/class/thermal/thermal_zone0/temp). Результат вывода команды uptime. Помимо функции system (), использовал функции работы с файловой системой: fopen (), fclose (). Для того, чтобы не расходовать понапрасну ресурсы microSD-карты, будем работать с файлами в папке /tmp (эта папка находится в оперативной памяти).Полный код скетча char buf[128];
void setup () { Serial.begin (115200); FILE *hostname; hostname = fopen (»/etc/hostname», «r»); fgets (buf, 128, hostname); fclose (hostname); Serial.print («HOST:»); Serial.println (buf); }
void loop () { /* --- дата-время --- */ system («date > /tmp/my.txt»); //получим текущую дату/время //и сохраним полученные данные в файл my.txt расположенном в /tmp FILE *fp; fp = fopen (»/tmp/my.txt», «r»); fgets (buf, 128, fp); fclose (fp);
Serial.print («Now:»); Serial.print (buf); /* --- IP-адрес --- */ system («ifconfig | grep inet | grep -v inet6 | grep -v 127.0.0.1 | cut -d: -f2 | awk '{printf $1»\n»}' > /tmp/my.txt»);
fp = fopen (»/tmp/my.txt», «r»); fgets (buf, 128, fp); fclose (fp);
Serial.print («Current IP:»); Serial.println (buf); /* --- температура SoC --- */ int temp; temp = getQuarkTemp (); Serial.print («The temperature of the Quark SoC is »); Serial.print (temp); Serial.println (» degrees celcius.»); /* --- uptime --- */ system («uptime > /tmp/my.txt»);
fp = fopen (»/tmp/my.txt», «r»); fgets (buf, 128, fp); fclose (fp);
//Serial.print («Current IP:»); Serial.println (buf); Serial.println (); delay (30000); }
int getQuarkTemp (){ char temp_raw[6]; FILE *fp; fp = fopen (»/sys/class/thermal/thermal_zone0/temp», «r»); fgets (temp_raw, 5, fp); fclose (fp); int temp = atoi (temp_raw); temp /= 100; return temp; } Результат работы можно наблюдать в мониторе порта: В ходе работы скетча я подключился ещё одним пользователем, потом отключил сетевой кабель и через некоторое время вернул кабель на место. Похожий скетч использовался для подготовки КДПВ
Т.е. наша система из разрозненных составляющих, отлично работающих по отдельности (Arduino и linux) уже начинает превращаться в нечто монолитное, открывающее дополнительные возможности для разработки.Можно, например, из скетча Arduino создать скрипт на python, сделать его исполняемым и запустить. Похожим образом можно организовать и обратное взаимодействие, когда какой-либо процесс из linux влияет на то, что делает скетч Arduino (более подробно расскажу об этом в третьей части «практикума»).
Но ведь и это ещё не всё — в следующей публикации я расскажу про то, как можно программировать Intel Galileo с помощью Eclipse и mraa, так что продолжение следует, не переключайте!
» Первая часть «практикума»: Galileo Gen2 — Первое знакомство.