Как я существенно облегчил работу с Raspberry Pi («всё новое — хорошо забытое старое»)

4b9758259e7c4eb7934dccac54fc046c.jpg

-Как начать работу с Raspberry Pi?
-Залить на SD-карту образ, подключить к питанию и пойти в магазин докупить всё, чего не хватает.

Raspberry Pi в стандартной поставке — не подарок. По крайней мере, если вы собрались подарить Pi кому-то на этот Новый Год, удостоверьтесь, что счастливому получателю будет доступен комплект клавиатура-монитор-мышь, или хотя бы USB-UART адаптер.

Что же делать, если хочется заняться своим проектом, но есть только плата и к ней проблематично подключить хоть что-либо? Я мучался с такого рода проблемами 3 года, пока не разработал pyLCI. О том, как начать использовать pyLCI и что оно даёт, я и расскажу сегодня.


О каких проблемах я говорю?

Начнём с подключения к Pi. Есть много способов, и у каждого свои недостатки.

USB-UART
    Требует наличия USB-UART (ещё и на 3.3V)
    Требует компьютера с совместимыми драйверами (FTDI, я смотрю на вас)
Монитор(composite/HDMI)+мышь+клавиатура
    Требует наличия всего этого добра (монитор ещё и с HDMI), да ещё и питания 220
    Компактные варианты либо дороги, либо неудобны
    Часто избыточно - подключать кучу всего, чтобы узнать IP?
    Монитор должен быть подключен при старте
Ethernet
    Требует роутер или DHCP-сервер на компе или Pi
    Нужно искать IP, что не всегда легко (они ещё и меняются!)
    Нужно Ethernet-подключение к сети ()
WiFi и wpa_supplicant.conf на boot разделе
    Плохо документирован
    Нужно искать IP (опять!)
    Трудно дебажить (ой, WiFi переопределился как wlan2 и не подрубается...)

Как сделать интерфейс для своего умного дома/медиацентра/робота?

GUI
    Требуется монитор или VNC
        Для VNC требуется отдельный компьютер
    Для совсем урезанного GUI нужно ещё и добавлять стандартные функции (Shutdown/Reboot/WiFi/IP/shell commands)
SSH+CLI
    Требуется отдельный компьютер
    Требуется сетевое подключение
    Хорошее знание команд крайне желательно
WEB
    Требуется отдельное устройство и сетевой доступ к нему
    Нужно добавлять стандартные функции либо дополнительно устанавливать Webmin/Ajenti/whatever

За три года, что я работаю с Raspberry Pi, я обучился Linux, программированию на Python и использованию всего этого для создания различных интересных устройств. Всё это время я натыкался на одни и те же проблемы, корень которых в том, что у Raspberry Pi нету простых встроенных методов взаимодействия с ОС — к примеру, встроенных монитора/клавиатуры. В результате подключить к WiFi какой-нибудь ноутбук с Linux просто, а для Raspberry Pi нужно использовать дополнительное железо, копаться с командами или таскать мониторы. Этого, как по мне, пока не избежать, но можно решить минимальным количеством усилий.

Чем больше я разрабатывал различных проектов, тем больше различных решений пробовал. За это время я использовал:


  • UART через Bluetooth (HC-05)
  • Просто UART
  • SSH
  • Полноразмерный монитор
  • Кнопки на GPIO
  • Аудио оповещения
  • Дисплей, показывающий IP

Всё не то. Получающиеся решения в какой-то момент ясно показывали свои ограничения, да и со всем тем железом, что я использовал, можно было достичь куда большего. Во что в итоге сформировались мои требования?


  • Интерфейс должен быть дешёвым. Покупать дополнительное железо всегда проблематично, поэтому чем меньше цена, тем легче оборудовать интерфейсом проект.
  • Интерфейс должен быть универсальным. Самое дешёвое железо — то, что уже куплено или можно откуда-то выпаять.
  • Интерфейс должен быть простым. Чем проще он для использования, тем большего можно достичь.


В итоге — в прошлом (2015) году я начал проект, использующий дешёвые дисплеи и кнопки и дающий мне возможность задействовать базовые функции Raspberry Pi. Казалось бы, идея очень простая — такие интерфейсы были довольно долгое время популярны в различных устройствах —, но при поиске готовых решений под Linux был виден только LCDProc, который больше всё-таки status monitor. Большая часть людей, которые хотели использовать такой интерфейс, колхозили что-то на Питоне с готовыми либами для дисплеев и как-то работающим кодом навигации, порой даже не вынесенным в классы для повторного ипользования.

В апреле этого года, кучу проектов и множество ошибок спустя, я допилил проект до версии 1.0, назвал pyLCI и выложил на ГТ на всеобщее обозрение. С того момента многое изменилось — pyLCI использовался в каждом моём Raspberry Pi-проекте, добавлялись фичи, пропадали баги, а изредка я получал письма с вопросами о каких-то нюансах pyLCI. Теперь моя цель — рассказать об этом проекте всем, кому он может оказаться полезен.


Что из себя представляет pyLCI?

pyLCI — это простой интерфейс для настройки и управления функциями Raspberry Pi, использующий 2×16 экраны, кнопки и Python. Он простой, дешёвый и удобный в использовании.
Установить pyLCI легко — ставишь shield за 5$ на Pi, скачиваешь pyLCI на Pi и ставишь в автозагрузку прилагающимся скриптом.


Примеры использования

Под спойлерами — красивые гифки pyLCI в работе.


Получение IP
bad3754efeba44329607a616f6e592fc.gif


Выключение/ребут
28369a0e58364afcbc9e21a6adc44b74.gif


Подключение к WiFi в McDonalds
d2fff933798f47c38fc2ce30258a458a.gif


Ввод пароля для WiFi
d4898d5965cf4007b940ef4add6fbc09.gif


Запуск своего скрипта
39812b889f624b1e8b218330debc02b4.gif


Отмонтирование флешки
25116b6f689d4e5187fc88bbb9725da1.gif


Просмотр USB устройств
41583f8aaec446e4b43af741c51f3a2a.gif


Перезапуск упавшего сервиса
135cf0443bd745fca80859d10555e9a0.gif


Своё приложение (Pomodoro таймер)
879faed35f8646e0b031c5c90e578d95.gif


Где можно использовать pyLCI?


  1. На личной/домашней Raspberry Pi для более простого подключения к ней и выполнения каких-то рутинных задач.
  2. При использовании Raspberry Pi для обучения (к примеру, значительно сократив бюджет на периферию и время на «подключение к Raspberry Pi» в начале урока)
  3. При разработке решений на Raspberry Pi (поднять упавший контроллер escape-room и перезапустить сервис, не доставая компьютер — бесценно)
  4. Для своего переносного компьютера на Pi (что толку от Pi, работающей 10 часов от батареи, если её нельзя подключить к WiFi)
  5. На своей рабочей Pi как вспомогательный интерфейс (переключать музыку/менять громкость, пока смотришь что-то в интернете)


Какое железо нужно для интерфейса?

Простой ответ — берите такой шилд с Китая:


db84ed068146411faaac302868baee0e.jpg

Стоит около 5 долларов, а работает безотказно.


Хочется чего-то качественного или же нужно срочно?

Тогда можно взять шилд от Adafruit:


bc09e41b0c714efc9a8409dc006adfeb.jpg

Дороже, но качественнее выполнен и ждать доставки не придётся (шилд из Китая — почти полная копия этого).


Хочется собрать что-то из того, что есть на месте!

Дисплеи

Нужен простой дисплей, совместимый с командами HD44780, минимальный размер — 16×2, поддерживаются дисплеи разных размеров. Вот такого типа:


7279164742624b35b46f956a825fbf1f.jpg

Дисплей можно подключить через GPIO (займёт 6 контактов на Raspberry Pi) или I2C. Такие дисплеи часто попадаются во всяких Starter Kits, доступны в каждом мало-мальски себя уважающем магазине/рынке электроники и стоят 2$ с бесплатной доставкой из Китая.


Кнопки/клавиатуры

Нужно как минимум 5 кнопок. Их можно подключать через GPIO, I2C-GPIO экспандеры или же использовать USB HID устройства — типа таких numpad-ов:


89f81557f8094cffa758036b30b22710.jpg


Разработка своих приложений

pyLCI — это UI-фреймворк, который предоставляет различные UI-элементы для ускорения разработки и даже позволяет полностью встроить своё приложение в pyLCI. Для сложных приложений, которые нужно запускать отдельно, есть отработанный подход — внедрить в него какой-либо RPC-интерфейс и написать pyLCI-приложение, предоставляющее UI и дёргающее RPC-функции.


Hello World:

menu_name = "Hello world"

from ui import Printer

#Callback global for pyLCI
callback = None
#Some globals for us
i = None
o = None

def init_app(input, output):
    global callback, i, o
    i = input; o = output
    callback = lambda: Printer("Hello world!", i, o)

Что для чего:


  • menu_name — Название приложения в главном меню
  • i — устройство ввода, ловит нажатия кнопок и вызывает заданные на них callbacks.
  • o — устройство вывода, оперирует дисплеем.
  • Printer — функция простого вывода данных на дисплей. Использует i и o, имеет разные полезные параметры и способы вызова.
  • init_app — функция приложения, вызываемая при старте pyLCI. Передаёт приложению i и o, в ней обычно создаются главные UI-элементы приложения.
  • callback — функция, вызываемая при активации приложения. Обычно активирует главное меню приложения, в нашем случае просто вызывает Printer с нашим сообщением.

Документация на различные доступные UI элементы есть на ReadTheDocs, к тому же много примеров использования можно увидеть в уже написанных приложениях.


Добавление фич

В последнее время я часто добавляю различные возможности и чиню баги. Документ с планами на будущее доступен здесь, но если вам сильно не хватает какой-либо функции или приложения, пишите мне на почту (crimier yandex ru) или в issues на Гитхабе, смогу помочь.


Полезные ссылки


a8a0872015d5421eb51715c26df534e7.jpg

Разработка проекта телефона на Pi Zero, используя pyLCI для изменения настроек системы без подключения по SSH

© Geektimes