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

в 8:28, , рубрики: diy или сделай сам, linux, pylci, python, Raspberry Pi, UI, UX, Железо, метки:

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

-Как начать работу с 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, использующий 2x16 экраны, кнопки и Python. Он простой, дешёвый и удобный в использовании.
Установить pyLCI легко — ставишь shield за 5$ на Pi, скачиваешь pyLCI на Pi и ставишь в автозагрузку прилагающимся скриптом.

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

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

Получение IP

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Дисплеи

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

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

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

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

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

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

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

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

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

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

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

Автор: CRImier

Источник

Поделиться

* - обязательные к заполнению поля