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

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

-Как начать работу с 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

Выключение/ребут

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

Ввод пароля для WiFi

Запуск своего скрипта

Отмонтирование флешки

Просмотр USB устройств

Перезапуск упавшего сервиса

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

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

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

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

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

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

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

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

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

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

Дисплеи

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

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

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

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

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

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 на Гитхабе, смогу помочь.

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

  • Проект на Hackaday.io — там я описывал процесс разработки, а теперь рассказываю о новых фичах
  • Документация
  • Github

Источник

pylci, python, raspberry pi, ui, ux

Читайте также