-Как начать работу с 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 в работе.
Где можно использовать pyLCI?
- На личной/домашней Raspberry Pi для более простого подключения к ней и выполнения каких-то рутинных задач.
- При использовании Raspberry Pi для обучения (к примеру, значительно сократив бюджет на периферию и время на "подключение к Raspberry Pi" в начале урока)
- При разработке решений на Raspberry Pi (поднять упавший контроллер escape-room и перезапустить сервис, не доставая компьютер — бесценно)
- Для своего переносного компьютера на Pi (что толку от Pi, работающей 10 часов от батареи, если её нельзя подключить к WiFi)
- На своей рабочей Pi как вспомогательный интерфейс (переключать музыку/менять громкость, пока смотришь что-то в интернете)
Какое железо нужно для интерфейса?
Простой ответ — берите такой шилд с Китая:
Стоит около 5 долларов, а работает безотказно.
Тогда можно взять шилд от Adafruit:
Дороже, но качественнее выполнен и ждать доставки не придётся (шилд из Китая — почти полная копия этого).
Дисплеи
Нужен простой дисплей, совместимый с командами HD44780, минимальный размер — 16x2, поддерживаются дисплеи разных размеров. Вот такого типа:
Дисплей можно подключить через 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
Разработка проекта телефона на Pi Zero, используя pyLCI для изменения настроек системы без подключения по SSH
Автор: CRImier