[Перевод] Raspberry Pi Zero внутри брайлевского дисплея Handy Tech Active Star 40
Автор поместил Raspberry Pi Zero, Bluetooth-«свисток» и кабель внутрь своего нового брайлевского дисплея Handy Tech Active Star 40. Встроенный USB-порт обеспечивает питание. Получился самодостаточный безмониторный компьютер на ARM с операционной системой Linux, оборудованный клавиатурой и брайлевским дисплеем. Можно заряжать/питать его через USB, в т.ч. от пауэрбанка или солнечного зарядного устройства. Поэтому он может обходиться без электросети не несколько часов, а несколько дней.
Прежде всего, они различаются длиной строки. Устройства на 60 и более знакомест хороши при работе с настольным компьютером, на 40 — удобны для переноски вместе с ноутбуком. Сейчас существуют и брайлевские дисплеи, подключаемые к смартфонам и планшетам, с длиной строки в 14 или 18 знакомест.
В прошлом брайлевские дисплеи были довольно массивными. 40-знакоместный, например, имел размеры и вес как у 13-дюймового ноутбука. Теперь они при том же количестве знакомест достаточно миниатюрны, чтобы можно было поставить дисплей перед ноутбуком, а не ноутбук на дисплей.
Это, конечно, лучше, но всё равно не очень удобно держать на коленях два отдельных устройства. Когда работаешь за столом, претензий нет, но стоит вспомнить, что ноутбук по-другому называется лэптопом, и попробовать оправдать это его название, как оказывается, что миниатюрный 40-знакоместный дисплей даже менее удобен.
Так что автор дождался выхода давно обещанной новой модели в серии Handy Tech Star. Ещё в 2002 году была выпущена предыдущая модель Handy Tech Braille Star 40, где площади корпуса достаточно, чтобы поставить сверху ноутбук. А если он не помещается — предусмотрена выдвижная подставка. Сейчас эта модель заменена на Active Star 40, это практически то же самое, но с модернизированной электроникой.
И выдвижная подставка осталась:
Но самое удобное в новинке — это углубление размерами приблизительно со смартфон (см. КДПВ). Открывается оно при сдвиге площадки назад. Держать там смартфон оказалось неудобно, но надо же как-то задействовать пустой отсек, внутри которого даже выход питания предусмотрен.
Первое, что придумал автор — поместить туда Raspberry Pi, но когда дисплей был приобретён, оказалось, что с «малинкой» не задвигается подставка, закрывающая отсек. Вот если бы плата была всего на 3 мм тоньше…
Но коллега рассказал о выходе Raspberry Pi Zero, который оказался настолько миниатюрным, что в отсек их поместилось бы два… или, пожалуй, даже три. Он был тут же заказан вместе с картой памяти на 64 ГБ, Bluetooth, «свистком» и кабелем Micro USB. Через несколько дней всё это приехало, а зрячие друзья помогли автору подготовить карту. Всё сразу заработало как надо.
На задней стенке Handy Tech Active Star 40 расположены два USB-порта для таких устройств, как клавиатуры. Малогабаритная клавиатура с магнитным креплением прилагается. Когда клавиатура подключена, а сам дисплей работает через Bluetooth, компьютер дополнительно опознаёт его ещё и как Bluetooth-клавиатуру.
Таким образом, если к Raspberry Pi Zero, помещённому в отсек для смартфона, подключить Bluetooth-«свисток», он сможет обмениваться данными с брайлевским дисплеем по Bluetooth при помощи BRLTTY, а если ещё и подключить к дисплею клавиатуру — «малинка» будет работать и с ней.
Но и это ещё не всё. Сама «малинка», в свою очередь, может получать доступ в интернет по Bluetooth PAN с любого поддерживающего его устройства. Автор настроил соответствующим образом свой смартфон и компьютеры дома и на работе, но в дальнейшем планирует приспособить для этого ещё одну «малинку» — классическую, не Zero, подключённую к Ethernet и другому Bluetooth-«свистку».
Способ конфигурации PAN при помощи BlueZ оказался неочевидным. Автор нашёл Pyhton-скрипт bt-pan (см. ниже), позволяющий сконфигурировать PAN без GUI.
С его помощью можно настроить как сервер, так и клиент. Получив соответствующую команду по D-Bus при работе в клиентском режиме, он создаёт новое сетевое устройство bnep0 сразу после установки соединения с сервером. Обычно для назначения IP-адреса этому интерфейсу используется DHCP. В серверном режиме BlueZ требует указания названия устройства-моста, к которому он может добавить по ведомому устройству для подключения каждого из клиентов. Сконфигурировать адрес для устройства-моста и запустить DHCP-сервер плюс IP-маскарадинг на мосту — обычно всё, что требуется.
Для конфигурации моста автор применил systemd-networkd:
Файл /etc/systemd/network/pan.netdev
[NetDev]
Name=pan
Kind=bridge
ForwardDelaySec=0
Файл /etc/systemd/network/pan.network
[Match]
Name=pan
[Network]
Address=0.0.0.0/24
DHCPServer=yes
IPMasquerade=yes
Теперь нужно заставить BlueZ сконфигурировать профиль NAP. Оказалось, штатными утилитами BlueZ 5.36 это сделать нельзя. Если автор ошибается, поправьте его: mlang (умеет двигать ушами) blind (бывает доступа и квантовой) guru
Но он нашёл сообщение в блоге и скрипт на Python для осуществления необходимых вызовов на D-Bus.
Для удобства автор применил службу Systemd для запуска скрипта и проверки разрешённости зависимостей.
Файл /etc/systemd/system/pan.service
[Unit]
Description=Bluetooth Personal Area Network
After=bluetooth.service systemd-networkd.service
Requires=systemd-networkd.service
PartOf=bluetooth.service
[Service]
Type=notify
ExecStart=/usr/local/sbin/pan
[Install]
WantedBy=bluetooth.target
Файл /usr/local/sbin/pan
#!/bin/sh
# Ugly hack to work around #787480
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
exec /usr/local/sbin/bt-pan --systemd --debug server pan
Второй файл не понадобился бы, если бы в Debian была поддержка IPMasquerade= (см. #787480).
После выполнения команд systemctl daemon-reload и systemctl restart systemd-networkd можно запустить Bluetooth PAN командой systemctl start pan
Клиентскую часть также несложно сконфигурировать при помощи Systemd.
Файл /etc/systemd/network/pan-client.network
[Match]
Name=bnep*
[Network]
DHCP=yes
Файл /etc/systemd/system/pan@.service
[Unit]
Description=Bluetooth Personal Area Network client
[Service]
Type=notify
ExecStart=/usr/local/sbin/bt-pan --debug --systemd client %I --wait
Теперь после перезагрузки конфигурации можно подключиться к заданной Bluetooth-точке доступа так:
systemctl start pan@00:11:22:33:44:55
Разумеется, конфигурацию сервера и клиентов необходимо выполнять после сопряжения их по Bluetooth. На сервере нужно запустить bluetoothctl и дать ему команды:
power on
agent on
default-agent
scan on
scan off
pair XX:XX:XX:XX:XX:XX
trust XX:XX:XX:XX:XX:XX
Запустив сканирование, подождите несколько секунд, пока в списке не появится нужное вам устройство. Запишите его адрес и используйте его, подавая команду pair, а при необходимости — и команду trust.
Со стороны клиента надо проделать то же самое, но команда trust не понадобится точно. Серверу она нужна, чтобы принять соединение по профилю NAP без ручного подтверждения пользователем.
Автор не уверен, что это оптимальная последовательность команд. Возможно, всё, что нужно — это сопряжение клиента с сервером и выполнение команды trust на сервере, но так он делать ещё не пробовал.
Требуется, чтобы «малинка» распознала клавиатуру, подключённую к брайлевскому дисплею проводом, и проброшенную уже самим дисплеем по Bluetooth. Делается так же, только вместо agent on надо дать команду agent KeyboardOnly и bluetoothctl найдёт устройство с профилем HID.
Хотя автору удалось всё сконфигурировать, он понимает, что настраивать BlueZ через командную строку неудобно. Сначала он думал, что агенты нужны только для ввода PIN-кодов, но оказалось, например, что для включения профиля HID нужно набирать «agent KeyboardOnly». Удивительно, что для запуска Bluetooth PAN необходимо лазить по репозиториям в поисках нужного скрипта. Он помнит, что в предыдущей версии BlueZ для этого был готовый инструмент pand — куда же он делая в BlueZ 5? Вдруг появилось новое решение, неизвестное автору, но лежащее на поверхности?
Скорость передачи данных составила примерно 120 кбит/с, чего вполне достаточно. 1-гигагерцовый ARM-процессор очень быстр для интерфейса командной строки. Автор всё равно планирует использовать на устройстве в основном ssh и emacs.
Разрешение экрана, используемое фреймбуфером на Raspberry Pi Zero по умолчанию, довольно странное: fbset сообщает, что оно составляет 656×416 пикселей (монитор, конечно, не подключён). При консольной шрифте 8×16 получилось 82 символа в строке и 26 строк.
Работать с брайлевским дисплеем на 40 знакомест в таком режиме неудобно. Также автору хотелось бы, чтобы на дисплей выводились в брайлевском виде знаки Unicode. К счастью, Linux поддерживает 512 символов, а в большинстве консольных шрифтов их 256. С помощью console-setup можно использовать два 256-символьных шрифта совместно. Автор добавил к файлу /etc/default/console-setup такие строки:
SCREEN_WIDTH=80
SCREEN_HEIGHT=25
FONT="Lat15-Terminus16.psf.gz brl-16x8.psf"
Примечание: чтобы стал доступен шрифт brl-16×8.psf, нужно установить console-braille.
На брайлевском дисплее есть 3,5-миллиметровый «джек», но автору неизвестны переходники для снятия аудиосигнала с Mini-HDMI. Автору не удалось задействовать встроенную в «малинку» звуковую карту (странно, переводчик был уверен, что в Zero таковой нет, но есть способы вывода звука ШИМом на GPIO). Он планирует применить USB-OTG-хаб и подключить внешнюю карту и вывести звук на встроенную в брайлевский дисплей колонку. Две внешние карты почему-то не заработали, сейчас он ищет аналогичное устройство на другом чипсете.
Ещё неудобно вручную отключать «малинку», ждать несколько секунд и отключать брайлевский дисплей. А всё потому что он при отключении снимает питание с разъёма в отсеке. Автор планирует поместить в отсек небольшой буферный аккумулятор и через GPIO сообщать «малинке» об отключении дисплея, чтобы та приступила к завершению работы. Такой вот ИБП в миниатюре.
Если у вас есть такой же брайлевский дисплей, и вы желаете проделать с ним то же самое, автор готов предоставить готовый образ системы (на основе Raspbian Stretch). Напишите ему об этом по адресу, указанному выше. Если желающих наберётся достаточно много, возможен даже выпуск наборов, включающих в себя всё необходимое для такой переделки.
Спасибо Dave Mielke за вычитку текста.
Спасибо Simon Kainz за фотоиллюстрации.
Спасибо коллегам по Грацкому техническому университету за быстрое приобщение автора к миру Raspberry Pi.
P.S. Первый твит автора на данную тему (не открывается — переводчик) был сделан всего за пять дней до публикации оригинала этой статьи, и можно считать, что за исключением проблем со звуком, поставленная задача практически решена. Кстати, финальный вариант текста автор отредактировал с изготовленного им «самодостаточного брайлевского дисплея», подключив его по SSH к домашнему компьютеру.