Инженер 2.0 | Инструкция «Программирование Intel Galileo»

Intel GalileoВ рамках практического курса Инженер 2.0, 10 октября, прошло занятие по программированию плат Intel Edison и Intel Galileo. Эксклюзивным материалом занятия, является данная инструкция, по которой вы можете попробовать использовать Galileo в качестве железки, управляемой по сети.

Если что-то из инструкции непонятно и возникают вопросы, сразу пишите в комментарии.

 


Содержание

  • Готовим инструменты
  • Typical Win-way
  • Canonical way
  • Полезные команды на всякий случай
  • Осваиваемся с Yocto
  • Копируем файлы
  • Мигаем диодом на Python
  • Показываем свою страничку с Galileo
  • Допишем web.py
  • Работу с диодом напишем в worker.py
  • Минуточка SYSTEMD

Готовим инструменты

Для Galileo нам потребуется образ Yocto. В нем предустановленно много полезных вещей.

На комьютере потребуется ssh-клиент и scp-клиент. Если у вас Linux/Unix, то скорее всего уже все есть.

Под Windows Можно воспользоваться putty и winscp, или поставить Cygwin, например в форме Babun, тогда работа почти не будет отличаться от работы под Linux\Unix


Typical Win-way

1. Создаем соединение с нужным сервером(см. например в панеле управления роутера), портом(22) и типом(SSH)

PuTTY2. Подключаемся и осматриваемся

PuTTY

3. Создаем новое соединение в WinSCP, тип SCP, имя root, порт 22

WinSCP4. Подключаемся и осматриваемся, файлы можно таскать мышкой:

WinSCP

 


Canonical way

Linux/Unix/Cygwin/Babun

Более каноничный вариант — консольные работы. Навык работы с консолью все равно понадобится, так что имеет смысл попробовать в тепличных условиях:

image08
Полезные команды на всякий случай

ls — отобразить содержимое директории.

image13

pwd — отобразить текущую директорию

cd — сменить директорию. Для того чтобы подняться по дереву директорий на один уровень используйте две точки ..

image10

Файловая система в Linux/Unix несколько отличается от Windows:

  • все отсчитывается от /, диски подключаются обычно в /mnt, а не корень;
  • регистр букв имеет значение, вложенные директории разделяются только таким слешом /;

rm /path/to/directory/filename — удаляет файл

rm -r /path/to/directory/ — удаляет директорию.

Будьте аккуратны с удалением чего-нибудь, можно легко стереть что-нибудь системное. Если это случилось, быстрее всего перезаписать образ.


Осваиваемся с Yocto

Если зайти на плату через браузер, можно увидеть такое сообщение

image17

Это означает, что на :80 порту висит какая-то программа. С помощью netstat -nlp, видим целый ворох запущенных приложений

image20

 

На 80 порту висит lighttpd — http сервер, используемый наравне с nginx и apache. С помощью ps (список процессов) и grep (фильтрации вывода) можно выяснить с какими параметрами запущен этот сервер:

image16

Открыв файл конфигурации (/etc/lighttpd.conf), находим, что странички отдаются статически из папки /www/pages, именно там лежит index.html, который мы увидели в браузере.

Вопрос настройки сервера мы будем решать отдельно.

Кроме того, мы можем заметить в списке портов node (nodejs), redis (база данных) иmosquitto (http://mosquitto.org/ , в этом гайде не касаемся, но может быть интересным).

С помощью ps и grep можно так же узнать, как они запущены:

image15

Интереса ради стоит посмотреть конфиги. Их можно читать с помощью less или more, а для редактирования можно поставить nano

image11


Копируем файлы

Теперь попробуем скопировать файл с нашего компьютера на плату в папку /home/root/

Это можно сделать множеством разных способов, наиболее простой — команда scp

scp /path/on/local/machine root@galileo:/path/on/remote/machine

image09

Эта команда, будучи запущена в консоли на локальном компьютере, перекидывает файл run.py на плату в нужный файл.

Обязательно попробуйте это сделать. Результат работы очень чувствителен к слешам / в конце путей. Нужно обращать внимание что, файл или директория, копируется и куда.

Попробуем теперь перекинуть сразу несколько файлов, содержимое текущей директории. Для этого воспользуемся флагом -r, он же позволяет перекидывать вложенные директории.

scp -r ./ root@galileo:/path/on/remote/machine/

В консоли слева — сеанс на плате, в консоли справа — локальный компьютер:

image14

Теперь у нас все готово для того чтобы начать работать:

  • мы умеем подключаться к плате
  • ходить по директориям
  • загружать файлы

Мигаем диодом на Python

В прошивке Yocto уже установлен интерпретатор python и библиотека mraa. Она позволяет управлять пинами в программах на C/C++/NodeJS и Python.

Для простоты воспользуемся диодом, имеющимся на самой плате, pin = 13.

Простейшая программа выглядит так:

  1. import mraa
  2. led = mraa.Gpio(13)
  3. led.dir(mraa.DIR_OUT)
  4. led.write(1)

Мы подключаем нужный модуль, инициализируем нужный пин, переключаем его в режим записи и пишем 1:)

Интереса ради это можно проделать пошагово в интерактивном режиме:

image21

Теперь помигаем диодом. Для этого потребуется модуль time и цикл

  1. import mraa
  2. import time
  3.  
  4. led = mraa.Gpio(13)
  5. led.dir(mraa.DIR_OUT)
  6.  
  7. while True:
  8.     led.write(0)
  9.     time.sleep(0.2)
  10.     led.write(1)
  11.     time.sleep(1)

Этот файл пишем в любимом текстовом редакторе на своем компьютере, сохраняем и загружаем на плату с помощью scp. А затем запускаем в терминале на плате.

image18

Прервать выполнение нужно с помощью Ctrl + C или Ctrl + Z, а то у нас бесконечный цикл.

Если во время работы программы закрыть окно терминала, диод перестанет моргать.

При закрытии соединения, программа получила сигнал SIGHUP и завершилась.

В дальнейшем нам надо будет изменить такое поведение, для этого существуют разные способы: nohup, screen, tmux, написание демона, запуск в supervisor.

Показываем свою страничку с Galileo

В системе уже стоит node, вы можете воспользоваться им.

Далее приводится способ сделать свой веб-сервис на python + Flask

Для начала нам потребуется pip — это менеджер установки пакетов python.

Мы ставили его на компьютеры, но в Yocto его нет, зато есть easy_install, который позволяет очень просто поствить pip.

Если все нормально, установка выглядит примерно так:

image01

После установки Flask (pip install flask), загрузим на Galileo знакомый пример

  1. from flask import Flask
  2.  
  3. app = Flask(__name__)
  4.  
  5. @app.route(‘/’)
  6. def hello():
  7.     return «Hello world!»
  8.  
  9. if __name__ == «__main__»:
  10.     app.run(host=‘0.0.0.0’, port=5000, debug=True)

Запустим в терминале на плате. Теперь при заходе в браузере на плату, на 5000 порту мы должны увидеть

image02


Flask —  фреймворк, который позволяет кратко писать содержательные сервисы. По нему есть хорошая документация и гайды на русском.

Чтобы не пересказывать документацию, приведу небольшой пример, как может быть устроена связка торчащего наружу сервиса и работающей с железом программы.

Допишем web.py

  1. from flask import Flask, jsonify
  2. import redis
  3.  
  4. app = Flask(__name__)
  5. red = redis.Redis(‘localhost’, port=6379)
  6.  
  7. @app.route(‘/’)
  8. def hello():
  9.     return «Hello world!»
  10.  
  11. @app.route(‘/led’)
  12. @app.route(‘/led/<status>’, methods=[«POST»])
  13. def led(status=None):
  14.     if status is None:
  15.         return jsonify(led=red.get(‘led’)), 200
  16.     if status == ‘on’:
  17.         red.set(‘led’, 1)
  18.     elif status == ‘off’:
  19.         red.set(‘led’, 0)
  20.     else:
  21.         return jsonify(error=‘wrong status’), 400
  22.     return jsonify(status=‘ok’), 200
  23.  
  24. if __name__ == «__main__»:
  25.     app.run(host=‘0.0.0.0’, port=5000, debug=True)

jsonify возвращает ответ в виде JSON. Числа 200 и 400 — HTTP коды ответов, насчет них есть определенные соглашения, которые не стоит нарушать. В данном случае они выставлены просто для определенности.

Мы добавили новый модуль — redis и подключение к базе. Как вы помните, на этапе подготовки инструментов, мы заметили, что redis в системе уже есть и запущен.


Работу с диодом напишем в worker.py

  1. import mraa
  2. import time
  3. import redis
  4.  
  5. red = redis.Redis(‘localhost’, port=6379)
  6.  
  7. led = mraa.Gpio(13)
  8. led.dir(mraa.DIR_OUT)
  9. led.write(0)
  10.  
  11. red.set(‘led’, 0)
  12. while True:
  13.     status = int(red.get(‘led’))
  14.     if status in [0, 1]:
  15.         led.write(status)
  16.     time.sleep(1)

Теперь остается загрузить эти два файла на плату, запустить web.py и worker.py в разных терминалах и делать запросы со своего комьютера

image12

Веб-сервер будет видеть эти запросы примерно так

image05

Отлично! Почва для дальнейшей работы есть. Остается прояснить вопрос, как это может быть запущено в финале.
Минуточка SYSTEMD

Дано: есть набор взаимодействующих между собой программок, запускаемых вручную.Это обычная ситуация для отладки, но точно не для работающей системы.

Надо получить: запуск наших программ автоматом при включении платки или перезагрузке.

Решение: попробуем запускать обе наши программы в виде сервисов с помощью systemd  (это демон инициализации сервисов в системе).

Для этого в директории /lib/systemd/system/ создадим два файла настроек, cmit-web.service и cmit-worker.service со следующим содержанием:

  1. [Unit]
  2. Description=Our sample web service
  3.  
  4. [Service]
  5. Type=simple
  6. ExecStart=/usr/bin/python /home/root/web.py
  7.  
  8. [Install]
  9. WantedBy=multi-user.target

Важно, чтобы пути были абсолютными, как к файлам, так и к программам. В этот конфиг можно так же добавить порядок загрузки, условия перезапуска и т.д. Есть полезные гайды на русском правда для больших систем.

Затем нужно сделать симлинки из /lib/systemd/system/ в /etc/systemd/system/ этих двух файлов, обновить список сервисов и запустить наши:

image19

Аналогичную операцию надо проделать и с другим сервисом.

Теперь наши сервисы будут стартовать при включении платы и перезагрузке.

Cервисы можно остановить и отключить:image06

На самом деле не стоит запускать наш веб-сервис таким образом.

Команда python web.py запускает наш сайт на отладочном веб-сервере, который не предназначен для нормального использования.

Чтобы правильно запускать приложение на flask(как и на любом другом скриптовом фреймворке на js или php), нам понадобится (uwsgi или fastcgi) + (nginx или lighttpd). Но эти детали обсудим в гайде по веб-сервисам.


Итого, после выполнения основных шагов у вас на руках должна быть плата, подключенная к LAN и отзывающаяся на запросы на :5000 порт, без необходимости ручного запуска программ.

Надеюсь гайд получился понятным.

Итоговый код и краткие инструкции можно найти в репозитории.

Все вопросы задавайте на почту m12sl@yandex.ru или info@academylab.ru


Преподаватель:

Алексей ОзеринПрограммирую на python 8 лет, последние три года на коммерческой основе. Разрабатываю систему распознавания образов.
Пропагандирую Devops.
В свободное время работаю над проектом носимой электроники для контроля здоровья.
Алексей Озерин / VK

 

Если вы хотите попробовать поработать с Intel Edison или Intel Galileo — приходите к нам в лабораторию. Достаточно просто согласовать время и ваши планы по почте info@academylab.ru

 

Одно мнение на “Инженер 2.0 | Инструкция «Программирование Intel Galileo»”:

  • Большое спасибо за пост о программировании платы Intel Galileo, вы мне очень помогли.

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

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