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

в 13:16, , рубрики: arduino, galileo, galileo gen2, intel, IoT, linux, Блог компании Intel, настройка, Настройка Linux, программирование микроконтроллеров, Разработка для интернета вещей

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

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


Потребуется карта 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. Параметры соединения следующие (порт выбираете свой):

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

После загрузки системы появится приглашение: нужно ввести имя пользователя (root). После этого в терминал можно отправлять любые linux-команды.

Определим IP-адрес системы:

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

Посмотрим версию 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

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

Я исправил имя на «galileo» (дальше: выход через «Ctrl+X» и «Enter» для подтверждения сохранения). Можно сразу перезагрузить Intel Galileo, но мы не будем торопиться, а…

Зададим пароль root

Тут всё просто, делается как в самом обычном linux:

passwd

После этого система предложит ввести новый пароль и подтвердить его (внимание, никакие вводимые символы не отображаются). Если всё хорошо, то система подтвердит смену пароля сообщением:

passwd: password changed.

Устанавливаем правильный временной пояс и время

Для проверки текущей даты/времени воспользуемся командой:

date

Выведется информация типа:

Mon Jan 26 23:51:15 UTC 2015

Дополнительно можно посмотреть, что выведет команда:

timedatectl status

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

Сменим текущий временной пояс на актуальный (в моём случае – для Москвы):

timedatectl set-timezone Europe/Moscow  

Список «доступных» часовых поясов можно подсмотреть в каталоге /usr/share/zoneinfo
Снова посмотрим, что вернёт эта команда:

timedatectl status

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

Собственно, уже похоже на правду, но только «похоже» (временной сдвиг сейчас для Москвы составляет +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

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

Отлично, временную зону поправили (видно, что теперь сдвиг +3 часа, т.е. информация о часовом поясе – актуальная). Установим часы по NTP. Для этого исполним команду:

rdate wwv.nist.gov

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

Теперь у нас временной пояс в порядке и время соответствует действительности.

Папка 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;  
}

Результат работы можно наблюдать в мониторе порта:

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

В ходе работы скетча я подключился ещё одним пользователем, потом отключил сетевой кабель и через некоторое время вернул кабель на место.

Похожий скетч использовался для подготовки КДПВ

Т.е. наша система из разрозненных составляющих, отлично работающих по отдельности (Arduino и linux) уже начинает превращаться в нечто монолитное, открывающее дополнительные возможности для разработки.

Можно, например, из скетча Arduino создать скрипт на python, сделать его исполняемым и запустить. Похожим образом можно организовать и обратное взаимодействие, когда какой-либо процесс из linux влияет на то, что делает скетч Arduino (более подробно расскажу об этом в третьей части «практикума»).

Но ведь и это ещё не всё – в следующей публикации я расскажу про то, как можно программировать Intel Galileo с помощью Eclipse и mraa, так что продолжение следует, не переключайте!

» Первая часть «практикума»: Galileo Gen2 — Первое знакомство.

Автор: avstepanov

Источник

Поделиться

* - обязательные к заполнению поля