В этой части «практикума», я превращу 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