Практикум «Intel IoT». Galileo Gen2 — Linux & Arduino

от автора

В этой части «практикума», я превращу Intel Galileo Gen2 в полноценный linux-компьютер и покажу простой способ взаимодействия Arduino- и linux-составляющих.


Потребуется карта microSD (рекомендуется от 8Гб и 10 класса быстродействия), я использовал карту на 16Гб. Все шаги буду делать на Mac, для Windows и *nix-платформ всё аналогично (естественно, с соответствующими «поправками» на операционную систему).

Подготовка SD-карты

Для Galileo команда разработчиков выпускает специальный образ linux: Yocto

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

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 — Первое знакомство.

ссылка на оригинал статьи http://habrahabr.ru/company/intel/blog/248893/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *