Хабрахабр

[Перевод] Raspberry Pi Zero внутри брайлевского дисплея Handy Tech Active Star 40

Встроенный USB-порт обеспечивает питание. Автор поместил Raspberry Pi Zero, Bluetooth-«свисток» и кабель внутрь своего нового брайлевского дисплея Handy Tech Active Star 40. Можно заряжать/питать его через USB, в т.ч. Получился самодостаточный безмониторный компьютер на ARM с операционной системой Linux, оборудованный клавиатурой и брайлевским дисплеем. Поэтому он может обходиться без электросети не несколько часов, а несколько дней. от пауэрбанка или солнечного зарядного устройства.

Прежде всего, они различаются длиной строки. Устройства на 60 и более знакомест хороши при работе с настольным компьютером, на 40 — удобны для переноски вместе с ноутбуком. Сейчас существуют и брайлевские дисплеи, подключаемые к смартфонам и планшетам, с длиной строки в 14 или 18 знакомест.

40-знакоместный, например, имел размеры и вес как у 13-дюймового ноутбука. В прошлом брайлевские дисплеи были довольно массивными. Теперь они при том же количестве знакомест достаточно миниатюрны, чтобы можно было поставить дисплей перед ноутбуком, а не ноутбук на дисплей.

Когда работаешь за столом, претензий нет, но стоит вспомнить, что ноутбук по-другому называется лэптопом, и попробовать оправдать это его название, как оказывается, что миниатюрный 40-знакоместный дисплей даже менее удобен. Это, конечно, лучше, но всё равно не очень удобно держать на коленях два отдельных устройства.

Ещё в 2002 году была выпущена предыдущая модель Handy Tech Braille Star 40, где площади корпуса достаточно, чтобы поставить сверху ноутбук. Так что автор дождался выхода давно обещанной новой модели в серии Handy Tech Star. Сейчас эта модель заменена на Active Star 40, это практически то же самое, но с модернизированной электроникой. А если он не помещается — предусмотрена выдвижная подставка.

И выдвижная подставка осталась:

КДПВ). Но самое удобное в новинке — это углубление размерами приблизительно со смартфон (см. Держать там смартфон оказалось неудобно, но надо же как-то задействовать пустой отсек, внутри которого даже выход питания предусмотрен. Открывается оно при сдвиге площадки назад.

Вот если бы плата была всего на 3 мм тоньше… Первое, что придумал автор — поместить туда Raspberry Pi, но когда дисплей был приобретён, оказалось, что с «малинкой» не задвигается подставка, закрывающая отсек.

Он был тут же заказан вместе с картой памяти на 64 ГБ, Bluetooth,«свистком» и кабелем Micro USB. Но коллега рассказал о выходе Raspberry Pi Zero, который оказался настолько миниатюрным, что в отсек их поместилось бы два… или, пожалуй, даже три. Всё сразу заработало как надо. Через несколько дней всё это приехало, а зрячие друзья помогли автору подготовить карту.

На задней стенке 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 сразу после установки соединения с сервером. С его помощью можно настроить как сервер, так и клиент. В серверном режиме BlueZ требует указания названия устройства-моста, к которому он может добавить по ведомому устройству для подключения каждого из клиентов. Обычно для назначения IP-адреса этому интерфейсу используется DHCP. Сконфигурировать адрес для устройства-моста и запустить 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.

Серверу она нужна, чтобы принять соединение по профилю NAP без ручного подтверждения пользователем. Со стороны клиента надо проделать то же самое, но команда trust не понадобится точно.

Возможно, всё, что нужно — это сопряжение клиента с сервером и выполнение команды 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 сообщает, что оно составляет 656x416 пикселей (монитор, конечно, не подключён). При консольной шрифте 8x16 получилось 82 символа в строке и 26 строк.

Также автору хотелось бы, чтобы на дисплей выводились в брайлевском виде знаки Unicode. Работать с брайлевским дисплеем на 40 знакомест в таком режиме неудобно. С помощью console-setup можно использовать два 256-символьных шрифта совместно. К счастью, Linux поддерживает 512 символов, а в большинстве консольных шрифтов их 256. Автор добавил к файлу /etc/default/console-setup такие строки:

SCREEN_WIDTH=80
SCREEN_HEIGHT=25
FONT="Lat15-Terminus16.psf.gz brl-16x8.psf"

Примечание: чтобы стал доступен шрифт brl-16x8.psf, нужно установить console-braille.
На брайлевском дисплее есть 3,5-миллиметровый «джек», но автору неизвестны переходники для снятия аудиосигнала с Mini-HDMI. Автору не удалось задействовать встроенную в «малинку» звуковую карту (странно, переводчик был уверен, что в Zero таковой нет, но есть способы вывода звука ШИМом на GPIO). Он планирует применить USB-OTG-хаб и подключить внешнюю карту и вывести звук на встроенную в брайлевский дисплей колонку. Две внешние карты почему-то не заработали, сейчас он ищет аналогичное устройство на другом чипсете.

А всё потому что он при отключении снимает питание с разъёма в отсеке. Ещё неудобно вручную отключать «малинку», ждать несколько секунд и отключать брайлевский дисплей. Такой вот ИБП в миниатюре. Автор планирует поместить в отсек небольшой буферный аккумулятор и через GPIO сообщать «малинке» об отключении дисплея, чтобы та приступила к завершению работы.

Если у вас есть такой же брайлевский дисплей, и вы желаете проделать с ним то же самое, автор готов предоставить готовый образ системы (на основе Raspbian Stretch). Напишите ему об этом по адресу, указанному выше. Если желающих наберётся достаточно много, возможен даже выпуск наборов, включающих в себя всё необходимое для такой переделки.
Спасибо Dave Mielke за вычитку текста.

Спасибо Simon Kainz за фотоиллюстрации.

Спасибо коллегам по Грацкому техническому университету за быстрое приобщение автора к миру Raspberry Pi.

S. P. Кстати, финальный вариант текста автор отредактировал с изготовленного им «самодостаточного брайлевского дисплея», подключив его по SSH к домашнему компьютеру. Первый твит автора на данную тему (не открывается — переводчик) был сделан всего за пять дней до публикации оригинала этой статьи, и можно считать, что за исключением проблем со звуком, поставленная задача практически решена.

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть