Компания
236,14
рейтинг
28 января 2015 в 16:16

Разное → Практикум «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 — Первое знакомство.
Автор: @avstepanov
Intel
рейтинг 236,14

Комментарии (16)

  • +2
    в процессе dd в терминале можно нажать CTRL-T, тогда покажет текущий прогресс
    • 0
      Спасибо! Не знал — в следующий раз обязательно попробую.
      • +3
        Примечание — это стандартный сигнал SIGINFO, помимо dd его ещё куча других программ обрабатывают. Например ping на SIGINFO выдаёт:
        load: 1.82 cmd: ping 29881 running 0.00u 0.00s
        11/11 packets received (100.0%) 24.811 min / 28.947 avg / 49.559 max
        • +1
          Так ведь вроде dd текущий прогресс выводит не по SIGINFO, а по SIGUSR1.
          По крайней мере, у меня это так, и Ctrl-T не срабатывает.
          • 0
            man dd:
            If dd receives a SIGINFO (see the status argument for stty(1)) signal, the current input and output block counts will be written to the standard error output in the same format as the standard completion message. If dd receives a SIGINT
            signal, the current input and output block counts will be written to the standard error output in the same format as the standard completion message and dd will exit.
            • +1
              man dd:
              Sending a USR1 signal to a running 'dd' process makes it print I/O statistics to standard error and then resume copying.

              Видимо, у Вас MacOS, а в Linux именно так.
              • 0
                Всё верно, прошу прощения:) Всю жизнь думал что стандартные *nix тулзы должны работать везде одинаково. Ошибся:)
  • 0
    3.8.7 это свежак.Особенно учитывая, что в крайнем yocto входят и 3.10 и 3.14 которые LTS.
    • 0
      Да там стоковое можно запустить, только сегодня статью запилил на эту тему.
  • +1
    Я срезался на втором шаге. У меня винда. Как файл с расширением .direct залить на флешку? На Мак пока не заработал.)))
    • 0
      Под Win все еще проще: software.intel.com/en-us/node/530353
      • 0
        Огромное спасибо. Буду писать на своем сайте инструкцию, обязательно использую
        • 0
          Ребята из Intel много чего хорошего написали… про IoT можно начать отсюда: software.intel.com/en-us/iot/getting-started — масса полезной информации.
          • +1
            Я не очень дружу с англоязычными ресурсами, наверное поэтому мне и сложно было найти быстро ответы на вопросы. Но потихоньку буду изучать. Хотя моя основная задача не создание интернета вещей, а создание инструмента который позволит заниматься этой работой большему количеству людей.
      • 0
        Большое спасибо за статью. К сожалению, я тоже виндузятник и срезался на втором шаге. Приведённая вами ссылка уже даёт 404-отлуп. Пришлось качать VM-образ Mac OS и делать всё по вашей инструкции. У меня получилось! Правда, не всё, что хотелось :(

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Самое читаемое Разное