bitКонтейнер (для еды) — самодельная Яндекс.Станция
Вчера в чате на работе предложили скидки на Яндекс станцию. Посмотрел обычную цену — 9900.
В общем, она мне не нужна.

А так как без дела лежала плата Orange PI PC, купленная за 700 рублей на Алиэкспресс, решил собрать свою Станцию, а точнее «bitКонтейнер для еды».
Купил в обед флешку 10 класса за 399 рублей.
Залил прям в обед на флешку ПО Zidoo X1 v1.0.21 — скачал образ отсюда piboard.io.

Дома собрал все вместе — флешку в Orange PI PC (сама плата раньше использовалась — поэтому уже были приспособлены корпус — контейнер для еды, и кулер)
Для того что бы Яндекс Контейнер был мобильным — подключил Orange Pi PC к роутеру проводом, а сам роутер к домашнему wifi.
Для вывода изображения и звука используются либо HD монитор, либо дешевый китайский проектор. Их подключаем Hdmi кабелем.

Как видно 4 провода подключено к плате — питание, hdmi, эзернет, мышка.
Включаем, устанавливаем приложение Яндекс из Гугл плэй. Настраиваем в параметрах Google ассистента.
Начинается все с того что что голосом запускаем Ассистента гугл — Окей гугл, Затем кодовой, секретной фразой Включи Яндекс запускается Яндекс с Алисой. И дальше даем команды Алисе.
В чем различия — цена 1000 рублей против 10000.
- Звук есть — Video/audio output так что можно подключить колонки или аудиосистему (не знаю не пробовал), в Яндекс станции встроены динамики, вуфер и т.д..
- Видео — и там и там HDMI, но в Контейнере есть еще и Video out — так что тюльпанами можно подключить бабушкин телевизор(не пробовал) — а это плюс.
- Интернет — кабель против wifi в станции. Естественно мы за кабель. (Есть платы расширения и может быть добавлен Wifi, но это не эстетично)
- 3! USB входа — значит — мышка, мышка(для второй руки), флешка с фильмами — Яндекс Станция не имеет USB.
- Железо Контейнера: 4-ядерный процессор Allwinner H3, 1Gb RAM и GPU Mali-400MP2 600MHz, по Станции не подскажу — слышал, что там тоже 1Gb RAM.
- В Контейнере полноценный Android — надоело? можно все сломать и установить другую ОС.
- 6 микрофонов в Станции против жалкого 1го в Контейнере, надо в упор кричать — режим Алисе 70+ лет.
- Видео кстати не тормозит — ни iptv, ни сериалы в Яндексе. По станции не знаю.
- На Контейнере можно майнить Крипту, качать торренты (поэтому bit)… естественно Станция так не может.
P.S.: осталось примотать синей изолентой Контейнер к колонкам Sven — на одну Проектор, на другую Контейнер — получится мега-гипер-ультра Аппарат.
Так как микрофон не чувствительный — посоветую приклеить отрезанное горлышко от баклажки к корпусу и отдавать команды в баклажку (а-ля рупор).

Либо на саморез к монитору сзади — он хотя бы скроет весь этот ужас.
- яндекс.станция
- изолентотехнологии
- очумелые ручки
- голосовой помощник
Как сделать умный дом своими руками на Arduino и Яндекс.Алиса — пошаговая инструкция
Рассказываем, как поэтапно можно создать умный дом на Arduino, которым можно будет управлять через Яндекс.Алису. В частости, создадим умную лампочку.
Уже больше года Яндекс развивает систему управления умным домом через Алису. Благодаря ей вы сможете включать свет, переключать каналы телевизора, заваривать кофе, изменять цвет подсветки, будить умные пылесосы и контролировать температуру в помещении.
Чтобы создать такую продвинутую экосистему умных устройств, совсем не обязательно штурмовать магазины электроники. Яндекс предоставляет API для интеграции ваших собственных решений через платформу навыков.
В этой статье расскажем, как с помощью микроконтроллера и обычного реле сделать умную лампочку и управлять ей с помощью Алисы.
Как работает такой умный дом?
Чтобы создать умный дом своими руками, потребуется навык Домовёнок Кузя. Через него можно не только контролировать умный дом, но и интегрировать виртуальные устройства напрямую в Яндекс.Алису. Это значит, что вам не придётся постоянно открывать навык, чтобы просто выключить лампочку. С микроконтроллером навык будет связываться через веб-хуки.
Для веб-хуков отлично подходит платформа Blynk — панель управления устройствами на Arduino и Raspberry Pi. Там вы сможете без труда создать графический интерфейс, через который можно будет управлять устройством по Wi-Fi (а ещё по Ethernet, USB, GSM и Bluetooth).
Какие устройства можно интегрировать в умный дом?
Через навык можно взаимодействовать с обширным количеством устройств: лампочки, розетки, шторы, замки, роботы-пылесосы, термостаты, очистители воздуха, кондиционеры и чайники. Кроме этого, можно переключать каналы на телевизоре (через универсальный пульт) и менять цвета RGB-ламп.
Все устройства имеют базовую пару функций: включение и выключение (открытие и закрытие для штор и замков). Некоторые из устройств могут работать с диапазоном значений (яркость лампы, температура поддержки тепла для чайника).
Аппаратная и программная часть
Для того, чтобы собрать умный дом своими руками, мы будет использовать Wi-Fi модуль ESP8266. Процесс разработки на нём почти не отличается от традиционной разработки на Arduino.
Знакомство с недорогим и функциональным микроконтроллером ESP8266: прошивка и пример использования
Для начала нужно скачать приложение Blynk из GooglePlay или AppStore и зарегистрироваться в нём. После этого нужно создать новый проект и выбрать соответствующий микроконтроллер. Перед вами появится пустая панель, на которой можно размещать элементы управления. Это могут быть кнопки, иконки, слайдеры, индикаторы, выпадающие списки и многое другое.
После создания проекта на вашу почту придёт токен доступа. Его нужно будет указать в скетче и веб-хуках.
К элементам управления можно подвязать физический пин микроконтроллера или же виртуальный порт. При взаимодействии с каким-либо элементом, его новое значение будет сразу отправляться на микроконтроллер.
Примечание Виртуальные порты в Blynk можно представить как переменные, которые синхронизируются между устройством и сервером.
На этом сайте можно найти много примеров кода для Blynk под разные платформы микроконтроллеров. Ниже приведён скетч, который будет управлять пином. Тот, в свою очередь, будет управлять реле, к которому будет подключена лампа:
#define BLYNK_PRINT Serial #include #include char auth[] = "*****"; // Ваш токен Blynk char ssid[] = "*****"; // Название вашей точки доступа char pass[] = "*****"; // Пароль к точке доступа int RelayPin = 13; // Пин, на который подключено реле BLYNK_WRITE(V0) // Вызовется при обновлении виртуального порта V0 < int pinValue = param.asInt(); // Считываем новое значение порта digitalWrite(RelayPin, pinValue); // Устанавливаем значение на пин >void setup() < Serial.begin(9600); pinMode(RelayPin, OUTPUT); // Настройка порта RelayPin на выход Blynk.begin(auth, ssid, pass); // Инициализация и подключение к Blynk >void loop() < Blynk.run(); // Вызов в цикле необходим для работы Blynk >
Для этого скетча в панели управления Blynk нужно добавить элемент «Button». В его настройках OUTPUT выставить V0, а режим работы переключить в Switch.
Теперь к указанному порту можно подключать реле. Если всё правильно, то при нажатии на кнопку в панели управления реле будет открываться и закрываться.
Голосовое управление светом не мешает управлению им аппаратно. К микроконтроллеру можно подключить физическую кнопку или выключатель, которые тоже будут включать и выключать свет. Если это необходимо, то изменять состояние виртуального порта можно методом Blynk.virtualWrite(port, value) . Тогда изменения будут отображаться и на панели управления.
Примечание При работе с механическими кнопками и выключателями не забывайте про дребезг контактов.
Всё работает? Тогда можете переходить к следующему этапу.
Получение веб-хуков
От Blynk вам потребуется не панель управления, а контроль виртуальных портов через GET-запросы. Вот так выглядит веб-хук на изменение состояния порта:
Чтобы включить виртуальный порт, нужно указать как 1, чтобы выключить — как 0.
Помимо этого, значение с порта можно получить таким запросом:
Настройка навыка «Домовёнок Кузя»
Перейдите на сайт навыка и авторизуйтесь там через Яндекс. Далее жмите на Добавить правило HTTP (GET). Перед вами откроется форма настройки правила.
Активационная фраза — название запроса, которое будет отображаться в списке (например «свет на кухне, включение»). Если вы не планируете контролировать умный дом конкретно изнутри навыка, то больше фраза нигде не понадобится. Поле Ответ Кузи тоже оставляйте пустым. В поле URL вставляете соответствующий веб-хук на включение света (виртуального порта). Остальные параметры можно не изменять. После этого нужно сделать идентичное правило на выключение света.
Дальше нужно перейти во вкладку виртуальных устройств и добавить устройство «Лампа». Тут нужно дать название устройству, по которому его будет идентифицировать Алиса. Например: свет, бра, подсветка, лампа или торшер. Место расположения — комната, в которой будет установлено устройство. Это нужно на тот случай, если в нескольких комнатах будут одинаковые по названию элементы. К тому же, одной голосовой командой можно включать и выключать все устройства в определённой комнате.
В Правило на включение/выключение из списка выбираете соответствующие запросы. В лампе имеется возможность управления яркостью. Для этого нужно создать ещё одно правило, но значение параметра value установить как . Тогда в запрос будет подставляться число от 0 до 100, которое будет обозначать требуемую яркость. Вам лишь остаётся обработать это значение в скетче.
Примечание Если вы планируете изменять яркость, то параметр value в веб-хуке на включение нужно изменить с 1 на 100.
Современные гаджеты, которые можно сделать своими руками
Настройка Алисы
В приложении Яндекс перейдите в раздел Устройства→Управление устройствами. Нажмите на кнопку «Добавить»→«Другое устройство». В открывшемся списке найдите навык «Домовёнок Кузя».
Авторизуйтесь в нём. Возможно, нужно будет ввести код объединения устройств, указанный в панели управления умным домом. Потом нажмите на Обновить список устройств.
На этом этом этапе вы уже создали умный дом своими руками. Теперь система полностью готова к голосовому контролю. К ней имеет доступ лишь ваш аккаунт. В настройках виртуальных устройств можно расширить доступ на другие аккаунты.
— Алиса, включи свет.
Можно ли сделать умную колонку из обычной, подключив ее к Android-смартфону
Я скептически отношусь к умным колонкам. И главная моя претензия не столько в самой концепцией общения с воображаемым другом, сколько в цене подобных устройств. Самая дешевая Яндекс Станция Лайт с 5-ваттным динамиком стоит 4 990 ₽, в то время как за эти же деньги можно купить 10 китайских Bluetooth-колонок с аналогичным качеством звука. Спрашивается, зачем платить больше, если можно сделать умную колонку, подключив дешевый спикер к своему смартфону?

Разберемся, может ли обычная колонка, подключенная к смартфону с голосовым ассистентом, считаться умной
Ведь что собой представляет умная колонка? По сути, это самое обычное аудиоустройство, только с голосовым ассистентом, для работы которого требуется подключение к интернету. А раз виртуальный помощник есть на Android, то у нас без труда получится сделать умную колонку из обычной, настроек ее сопряжение с телефоном. Но так ли это на самом деле, и может ли простой китайский ширпотреб заменить Яндекс Станцию или VK Капсулу?
⚡ Подпишись на AndroidInsider в Дзене, чтобы получать новости из мира Андроид первым
Как сделать умную колонку из блютуз-колонки
Прежде всего нам нужно настроить голосовой помощник на телефоне. На устройствах с операционной системой Android в качестве такового по умолчанию выступает Google Ассистент. Если при первом включении смартфона вы не настроили команду «ОК, Google», то сделайте следующее:
- Запустите приложение Google.
- Нажмите на иконку своей учетной записи и откройте настройки.
- Перейдите в раздел «Google Ассистент», а затем — «Voice Match».
- Активируйте функцию «Hey Google».

После включения этой опции ассистент будет откликаться по команде «ОК, Google»
Также в настройках приложения Google надо убедиться, что включена работа ассистента на заблокированном экране. Она позволит нам не прикасаться к смартфону для вызова голосового ассистента. Что еще осталось? Правильно, нужно подключить колонку к телефону:
- Включаем блютуз-колонку.
- Открываем настройки Bluetooth на смартфоне.
- Включаем блютуз и жмем на название своей колонки.
- Подтверждаем сопряжение.

Неужели колонка поумнела?
Ну все: умная колонка готова. Теперь через ассистента Google можно узнать погоду и даже позвонить кому-нибудь из своей телефонной книги. При этом Android-устройство должно находиться в непосредственной близости, ведь именно оно оснащено железом, способным обрабатывать запросы.
❗ Поделись своим мнением или задай вопрос в нашем телеграм-чате
Аудиоустройство лучше подключить к источнику питания. А если в вашем доме завалялся старый смартфон, его тоже можно поставить на вечную зарядку, чтобы умная колонка своими руками всегда была готова общаться с пользователем. Круто же?
Как сделать умную колонку с Алисой из обычной
Если вы решите сделать умную колонку с Алисой, то столкнетесь с одной неприятной особенностью этого голосового ассистента. Настройки Android не позволят ему работать на заблокированном экране, то есть без прикосновения к смартфону.

И все-таки не Яндекс Станция, правда?
Либо устройство должно постоянно лежать с активным экраном, либо вам придется вызывать ассистента вручную. О том, как включить Алису на телефоне, мы рассказывали в отдельном материале. Это же касается любого другого голосового ассистента.
Что умеет умная колонка
Если все так замечательно, то зачем нужна умная колонка? На самом деле, подключив блютуз-устройство к смартфону, мы не наделили его интеллектом. Мало того, что все запросы обрабатываются средствами операционной системы Android, так еще сам голосовой помощник адаптирован только для работы на телефоне.
Загляни в телеграм-канал Сундук Али-Бабы, где мы собрали лучшие товары с АлиЭкспресс
Вот вам простой пример. Если вы спросите у ассистента, как приготовить борщ, то он введет соответствующий запрос в браузере, а вся поисковая выдача отобразится на экране смартфона и не будет озвучена. Это касается всех обращений. Спросили о погоде или просто поинтересовались, как дела у вашего виртуального друга, — получили ответ не только голосом, но и текстом. А чтобы закрыть диалоговое окно, все равно придется коснуться смартфона.

Ассистент все равно думает, что его вызывают со смартфона
Яндекс Станция Лайт и любая другая умная колонка на просьбу помочь с приготовлением какого-нибудь блюда озвучит заготовленный шаблон или информацию из интернета. При этом вам не придется прикасаться ни к ней, ни к смартфону. Такое управление можно в полной мере называть голосовым.
То есть мы не сделали из обычной колонки умную, а просто заменили динамик смартфона на более мощный спикер. Пользоваться подобной комбинацией устройств неудобно, а потому смысл покупать умные колонки, был, есть и будет. Даже с учетом невысокого качества звука, предлагаемого за такие деньги. Все-таки эти устройства предназначены для взаимодействия с головым ассистентом, а не для прослушивания музыки.

Теги
- Новичкам в Android
- Приложения для Андроид
- Умный дом
- Яндекс Алиса
Умный дисплей — своими руками

Последние пару недель вижу рекламу «умных дисплеев» или чего-то в этом духе. Суть их в том, что это «умная колонка», оснащённая экраном. Ценник по минимуму — что-то от 12000 руб.
Чуть больше года назад я присматривался к подобным девайсам, но только стоили они тогда ещё дороже. И пораскинув мозгами я нашёл гораздо менее затратный вариант сделать такое же «умное» устройство, но с более широкими возможностями. Попользовавшись своей «разработкой» пару месяцев я отчитался о результатах статьёй на helpix.ru , но как вижу, исходя из текущих тенденций, нелишним будет поделиться информацией и с вами, друзья-пикабушники.
«Умные колонки», которые горячо рекламируют Яндекс, Амазон и масса других производителей, может действительно настолько умные, что нам и не снилось, но обладают одним гигантским минусом: кроме звуков от них более ничего не дождёшься. Есть, конечно, прикол в том, чтобы разговаривать с «умной колонкой», получать ответы на вопросы, управлять устройствами «умного дома», но всё это больше похоже на скоропроходящее развлечение. Да и неудобно на слух получать большие объёмы информации. Например, метеопрогноз на неделю.
Примерно год назад появился ещё один класс устройств: «умные экраны/дисплеи». Их не так активно рекламируют (не известно по какой причине), но они, являясь гибридом «умной колонки» и планшета, позволяют получать и визуальную информацию. Среди производителей таких экранов отметились Amazon, Google, Lenovo. Но как отмечают в обзорах, в итоге получается недопланшет и недоколонка. Операционная система с урезанными функциями, «заточенная» под «умные» функции не даёт такой широты возможностей как даже «голый» Android на планшете, да и звук тоже не фонтан. А цены у более-менее приличных моделей начинаются от 200 баксов…
И вот тут меня взяла непонятка: не самые дорогие планшеты стоят вполовину от этих «умных дисплеев». А подержанные — и того дешевле. Почему нужно платить такие безумные деньги, если можно взять простой планшет и установив несколько программ и виджетов установить его на кухне, подключив к розетке?
В интернете нахожу в продаже за 500 (!) рублей 7-дюймовый планшет с полудохлым аккумулятором на 6-м «андроиде». «Ирбисом» зовут. В ломбарде за те же самые 500 рублей купил компактные, но с приличными характеристиками колонки с питанием от USB. И за три сотни докупаю к этой парочке сетевой адаптер с двумя выходами USB — не так много у меня на кухне свободных розеток.

Без прощальных слёз с полочки снимается старый радиоприёмник и отправляется в дальний угол кладовки. И на это место встаёт планшет. Подключаем его к домашнему WiFi и.
Но теперь звук должен быть гораздо лучше. Вопрос — откуда его теперь получать? Можно, конечно, от эфирных радиостанций, но есть вариант и получше: интернет-радио. На телевизор в комнате я установил программу PC-radio, и имею возможность выбирать из почти трёх тысяч радиостанций со всего мира. Устанавливаем её и на планшет. На рабочий стол выводим виджет. Программа имеет бесплатную и платную версии. В платной качество звука лучше.
По правде говоря, всю эту историю с планшетом и колонками инициировал этот самый приёмник «благодаря» отстойному звуку и неудобному управлению. И прожил-то он на этой полочке три года только по причине наличия крупных ярких часов и интересного дизайна.

Первая задача решена. Теперь попробуем превратить планшет в «умный дисплей».
Устанавливаем «Яндекс с Алисой», ярлык «Алисы» выводим на рабочий стол. Ну, здравствуй, «Алиса». Какая у нас там погода на завтра?
Погоду «Алиса» оттарабанивает чётко. Вот только в отличие от «умных» колонок и дисплеев не висит постоянно в памяти, ловя каждое ваше слово, поэтому приходится вызывать её через ярлык с экрана. Также «Алиса», как оказалось, не поддерживает команды типа напомнить о чём-либо когда-либо. Эта возможность присутствует только в «умных» гаджетах. А вот поставить таймер — это пожалуйста.
А вот как-то раз я во время рекламной паузы поскакал на кухню быстренько сделать бутерброды. И не успел уложиться до окончания рекламы! А я так ждал ту информацию, которая должна была прозвучать после неё…
И вот только после этого случая меня озарило: телевизор-то я смотрю через интернет. Так что же мне мешает поставить программу телепрограммы на планшет? И теперь на планшете есть программа ТВ+, позволяющая смотреть эфирные телепередачи через WiFi.

Кстати, ТВ+ на моём телевизоре Xiaomi Mi 4S позволяет смотреть телепередачи в HD качестве, и картинка гораздо лучше чем при приёме через антенну. На дисплее 4К это особенно заметно. Впрочем, на 7 дюймах планшета HD как-то не требуется.
Само собой на планшете можно смотреть ролики с ютьюба. Видеорецепты, например. Можно из браузера смотреть, а можно и отдельную программу поставить.
Хочу предупредить, что планшеты-старички будут тормозить и тупить. Мой планшет меня порой своей медлительностью подбешивает. Так что, чем новее — тем лучше, а минимальной границей я считаю планшеты на 6-м «андроиде». Диагонали 7 дюймов вполне достаточно, Но если захотите поболее — кто ж протестовать-то будет?
Теоретически, можно ещё транслировать на планшет слайд-шоу из фотографий. Можно в качестве заставки какие-нибудь релаксирующие видео крутить. На второй рабочий стол поставить виджет календаря. Нужны напоминания, которые «Алиса» отказывается делать? Поставьте программу «Запоминатор» — и ввод голосом напоминаний вам будет доступен. А, да! Если «умные» лампочки или розетки работают в экосистеме с передачей данных через WiFi, то можно будет установить на планшет общую управляющую программу. На смартфонах же такое прокатывает.
Но мне пока хватает «живых обоев» с аквариумом и часов на рабочем столе: поскольку питается планшет от сети, экран можно не гасить и пользоваться этим преимуществом.
В общем — вот вам поле для экспериментов, и будьте умными, не ведитесь сразу на «умные» гаджеты.
И по прошествии полутора лет эксплуатации такой сборки дополню: весь функционал, описанный выше, работает. Критичных сбоев в работе не обнаружено. Электропитание подаётся на планшет 24/7 — батарея до сих пор не вспучилась, перегрев на корпусе не ощущается.
Но версию андроида однозначно надо брать поновее. На планшет тоже не стоит слишком скупиться. Я-то брал самую дешёвку только потому, что не знал — выйдет ли что-то из этой затеи толковое. По моему мнению — вышло.
Поддержать


124 поста 2.2K подписчик
Подписаться Добавить пост
2 года назад
Судя по результу, никакой умной колонкой там не пахнет. Стоит говенный старый планшет, на который установили пару приложений, а рассказа на простыню. Умные гаджеты на то и умные, что не из говна и палок, а заточены под конкретный функционал и нет необходимости ни с чем ебаться при их использовании. Для души, так сказать.
раскрыть ветку
2 года назад
Резюмируя, ТС обнаружил, что на планшет можно установить нужные приложения и подключить колонки? Или я что-то упускаю?
раскрыть ветку
2 года назад
Умной колонки так и не получилось, а получился планшет с программами. Без поддержки постоянного управления голосом смысла в этом крайне мало.
раскрыть ветку
2 года назад
ярлык «Алисы» выводим на рабочий стол
Что-то не ясно — требуется ли нажимать на ярлык Алисы
Сейчас ТВ на андроиде многие и от планшета в теории вовсе можно отказаться.
Пост потенциально полезный но ИМХО сумбурный.
Проще развернуть HASIO, в нем автоматизации больше и Алиса интегрируется
раскрыть ветку
2 года назад
Почему-то возникла ассоциация — Парень он неплохой, только ссытся и глухой.
раскрыть ветку
Похожие посты
8 месяцев назад

Сам себе игровая консоль: превращаем планшет с нерабочим тачскрином в игровой девайс из 8 кнопок и микроконтроллера

К сожалению, в наше время многие старые, но весьма неплохие по характеристикам гаджеты отправляются напрямую в помойку, и их владельцы не подозревают, что им можно найти применение. Сервер, мультимедийная-станция, да даже просто как TV-приставка — люди в упор не замечают сфер, где старенький планшет мог бы быть полезен. Но как быть, если посвящаешь жизнь портативным гаджетам, кодингу и копанию в железе? Правильно: сделать довольно мощную игровую консоль из старого планшета самому! Сегодня вам расскажу, как я сделал свою портативную приставку из планшета с нерабочим тачскрином, Raspberry Pi Pico и 8 кнопок! За рабочим результатом прячется несколько дней работы: поиск UART на плате, разработка контроллера геймпада на базе RPi Pico, написание приложения-сервиса, которое слушает события и отправляет их в подсистему ввода Linux в обход Android. Интересно? Тогда жду вас под катом!
❯ Мотивация
Прошло уже практически 10 лет с того момента, как у меня появилась моя первая портативная консоль. Несмотря на то, что я был заядлым ПК-игроком, я уже успел посмотреть на PS3 и PSP, но денег на их покупку у меня особо не было, да и к тому времени уже был в наличии Android-планшет. Но к моему 13-летию в 2014 году, когда я ходил и выбирал себе будущий девайс на день рождения, отец и мама решили подарить мне мою первую портативную консоль. Изначально, я уговаривал её купить мне целых два девайса, но бюджет был ограничен 4.000 рублей, а я хотел взять смартфон Fly IQ239 и консоль JXD S601 одновременно:

Однако, увидев здоровую 7-дюймовую консоль в магазине TREC (думаю, жители южной части РФ помнят такой), мама уговорила меня взять именно её, мотивируя это «ну и чего ты будешь тыкаться в этот мелкий экран? Возьми большую». После покупки гаджета, я был доволен: играл какие-то игрушки с ретро-платформ, устанавливал игры на Android, сидел в ВК через Kate Mobile. Что еще нужно было школяру? Однако, планшет прожил у меня недолго: с очередного лага я психанул и ударил по нему кулачком, унеся на тот свет и дисплей и тачскрин. Так консолька и пролежала в подвале около 8 лет. Впрочем, мне продолжали импонировать подобные устройства и в прошлом году я купил и написал про несколько подобных девайсов.

Несколько месяцев назад, мой читатель Кирилл Севостьянов с Хабра прислал мне HTC HD2 в качестве донора и планшет Prestigio PMP7170B3G, который был рабочим, но… у него отказал тачскрин. Я всё думал, чего бы с ним сделать и решил реализовать игровую консольку своими руками из подручных средств. Идея крутилась в голове довольно давно, но реализовал я её только сейчас.
❯ Что нам нужно сделать?
Итак, что должно быть у портативной консоли? Чипсет, дисплей, звук, ОС — это всё нам уже предоставляет планшет. Нам остаётся лишь сделать свой геймпад. Давайте подумаем, что нам будет нужно для того, чтобы его сделать и передавать от него события на планшет:
- Контроллер для геймпада: тут нам подойдет практически любой микроконтроллер, который работает от 3.3в. Выбор большой: Arduino Pro Mini 3.3v, ESP32, RPi Pico. Я остановился на последнем: недавно я взял себе две штучки «пощупать» их — и они мне очень понравились!
- Физический интерфейс: с планшетом нужно как-то общаться. У нас есть три варианта: USB (не факт, что поддержка преобразователей включена в ядре), UART и SPI/I2C на пятачках тачскрина (потребуют написания драйвера т. к. в android-устройствах нет прямого доступа к SPI/I2C из userland’а). Я остановился на UART: его легко найти на большинстве китайских планшетов, а если не получилось — то на помощь может прийти схема платы.
- Программная реализация: как это будет работать? Я решил реализовать геймпад в виде сервиса на Android, который слушает состояния кнопок с UART и «инжектит» события напрямую в драйвер ввода. Таким образом, поддержка нашего геймпада появляется даже в самой системе — можно управлять менюшкой или приложениями как с клавиатуры!
С планом определились, пора начать с программной части: сначала нам обязательно понадобится ROOT-доступ. Его получение на разных девайсах отличается — на prestigio уже был порт CWM и я просто поставил SuperSU. Без ROOT доступа мы не сможем использовать UART!

Теперь нам нужно найти пятачки UART на плате. Разведен он не везде, но в случае устройств на MediaTek — почти всегда, ещё и пятачки подписаны. На моём планшете он нашёлся сразу: был между двух металлических экранов и соответствовал 4-ому каналу UART. Получить к нему доступ можно в /dev/ttyMT3. Я использую ESP32 в качестве UART преобразователя: подпаиваемся к RX/TX, запускаем putty и заходим в adb shell. Определяем бодрейт (скорость) нашего UART порта — на MediaTek он обычно равен 921600, на других чипсетах — 115200. Пытаемся что-то вывести и хоба — мы уже можем «поболтать» с планшетом!

❯ Приложение-сервис
Итак, у нас уже есть доступ к UART и мы можем общаться с планшетом из внешнего мира. Но получить события с кнопок пол дела, нужно их ещё и послать в систему. Для этого есть целых три способа:
- InputManager.injectInputEvent — именно этим методом пользуется команда input, которую вы можете использовать через adb. Но увы, он работает только при наличие разрешения INJECT_EVENTS, который доступен только системным приложениям — находятся они в /system/app и подписаны тем же сертификатом, что и остальная прошивка.
- Модуль uinput дает возможность создать виртуальное устройство ввода и посылать события из userland’а — т. е. из прикладного приложения. У моего планшета было устройство /dev/uinput, но lsmod показывал, что сам модуль не загружен. Так что отметаем — он есть не везде.
- Прямой инжект событий в character устройство — весьма грязный хак, который позволяет инжектить события, не притворяясь системным приложением, но имеет некоторые ограничения. Именно его я и выбрал и о ограничениях ниже.
Сначала нам нужно узнать, какие кнопки поддерживают загруженные устройства ввода в системе. Для этого используем команду getevent -li. Там есть разные устройства ввода, в том числе и тачскрин (если вам нужно симулировать нажатия на экран), мне же подошёл драйвер физических кнопок mtk-kpd. Он занимается обработкой кнопок громкости, включения и т. п. Тут важно обратить внимание на то, что если попытаться послать кнопку, которое устройство не реализует (например пробел), то ничего не произойдет:

Инжект событий я писал на C, т. к. это требовало прямой записи input_event, а в Java прокинул его через Jni. Концепция простая: открываем устройство /dev/input/event2 и посылаем в него события ввода и синхронизации (это обязательно!), которые затем Android читает и обрабатывает:
#include
#include
#include
#include
#include
#include
#include
int uinput;
extern «C» JNIEXPORT void JNICALL Java_com_monobogdan_inputservicebridge_InputNative_init(JNIEnv *env, jclass clazz)
uinput = open(«/dev/input/event2», O_WRONLY);
__android_log_print(ANDROID_LOG_DEBUG , «Test», uinput >= 0 ? «Open event OK» : «Failed to open event»); >
void emit(int fd, int type, int code, int val)
struct input_event ie; ie.type = type;
ie.code = code; ie.value = val;
ie.time.tv _sec = 0;
ie.time.tv _usec = 0;
write(fd, &ie, sizeof(ie)); >
extern «C» JNIEXPORT void JNICALL Java_com_monobogdan_inputservicebridge_InputNative_sendKeyEvent(JNIEnv *env, jclass clazz, jint key_code, jboolean pressed)
__android_log_print(ANDROID_LOG_DEBUG , «Test», «Send»);
emit(uinput, EV_KEY, key_code, (bool)pressed ? 1 : 0);
emit(uinput, EV_SYN, SYN_REPORT, 0);
>
Основной обработкой занимается сервис, который я реализовал в отдельном потоке: он слушает события с UART и посылает соответствующие изменения состояния через sendKeyEvent. На вход приходят простые сообщения вида:
U L где U/D — нажато, не нажато, а L — однобайтовый идентификатор кнопки. В случае L — это влево, R — вправо и т. п. Вся доступная раскладка хранится в словаре. Причём само чтение из UART реализовано костылем с чтением «чужого» stdout, т. к. android-приложения не умеют сами по себе работать с root правами. В теории, это могло дать неприятный оверхед, но на практике никакого серьезного инпут лага это не создает. Не забываем сделать устройство event записываемым — ставим ему права 777:
package com.monobogdan.inputservicebridge;
public class InputListener extends Service
private static final int tty = 3;
private InputManager iManager;
private Map keyMap;
private Method injectMethod;
private Process runAsRoot(String cmd)
try
return Runtime.getRuntime().exec(new String[] < "su", "-c", cmd >);
>
catch (IOException e)
e.printStackTrace();
return null;
>
>
@override
public void onCreate()
super.onCreate();
// According to linux key map (input-event-codes.h)
keyMap = new HashMap<>();
keyMap.put(‘U’, 103);
keyMap.put(‘D’, 108);
keyMap.put(‘L’, 105);
keyMap.put(‘R’, 106);
keyMap.put(‘E’, 115);
keyMap.put(‘B’, 158);
keyMap.put(‘A’, 232);
keyMap.put(‘C’, 212);
InputNative.init();
try
runAsRoot(«chmod 777 /dev/input/event2»).waitFor();
> catch (InterruptedException e)
throw new RuntimeException(e);
>
Executors.newSingleThreadExecutor().execute(new Runnable()
@override
public void run()
Process proc = runAsRoot(«cat /dev/ttyMT» + tty);
BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
while(true)
try
String line = reader.readLine();
if(line != null && line.length() > 0)
Log.i(«Hi», «run: » + line);
boolean pressing = line.charAt(0) == ‘D’;
int keyCode = keyMap.get(line.charAt(2));
Log.i(«TAG», «run: » + keyCode);
InputNative.sendKeyEvent(keyCode, pressing);
>
>
catch(IOException e)
e.printStackTrace();
>
/*try
Thread.sleep(1000 / 30);
> catch (InterruptedException e)
e.printStackTrace();
>*/
>
>
>);
>
@override
public IBinder onBind(Intent intent)
return null;
>
>
Таким образом, если мы отправляем с ПК «D L» — система считает, что мы зажали стрелку влево, а U L — считает что мы отпустили. Но если mtk-kpd поддерживает стрелки и еще некоторые действия без каких либо проблем, то enter в список обрабатываемых кнопок не входит: придется мудрить! И тут нам приходит на помощь механизм трансляции кодов кнопок в действия: они хранятся в специальных файлах .kl в /system/usr/keylayout/. Я назначил DPAD_CENTER на… кнопку регулировки громкости звука! Ну, а почему бы и нет. 🙂 Таким образом можно переназначить уже имеющиеся кнопки громкости на, например, start/select.

❯ Геймпад
После того, как сервис был готов и отлажен, нужно было реализовать хардварную часть проекта — сам геймпад. В качестве контроллера я, как уже говорил, выбрал Raspberry Pi Pico на базе МК RP2040 — бодреньком контроллере с двумя ARM Cortex-M0 ядрами. Стоит копейки, а в отличии от ESP’шек, его SDK не такое перегруженное и выглядит более приближенным к bare-metal.

На данный момент, я решил развести все кнопки на бредборде — макетной плате без пайки, т. к. макеток для пайки у меня под рукой не было. Сделал примитивный геймпад:

Развел на соответствующие GPIO:

И написал примитивную прошивку, которая отслеживает состояние кнопок. В прошивке точно так же есть словарь, задающий ассоциацию между физическими пинами и «виртуальными» кнопками. При нажатии или отжатии кнопки, программа изменяет стейт и отсылает новое состояние планшету.
Собираем всё вместе и тестируем. Хоба, всё работает, мы можем перемещаться по менюшке используя наш геймпад!

А почему бы не попробовать поиграть в какую-нибудь игру? Ну мы же консоль вроде делаем: берём эмулятор NES, биндим кнопки в настройках и наслаждаемся игрой в Марио!
❯ Заключение
Реализация этого проекта заняла у меня не так уж и много времени: всего около 3-х дней работы по вечерам. Вероятно кто-то спросит: «а чего ты просто Bluetooth геймпад не купил?». Так это не прикольно ведь. Гораздо приятнее играть в девайс, к которому ты приложил руку сам. Более того, не у всех старых планшетов есть BT. Обошёлся на данной стадии проект недорого: планшет мне подарили бесплатно (точно также у вас дома может лежать подобный), RPi Pico — 350 рублей, кнопки по 10 рублей/штучка.
В целом, я сам по себе обожаю копаться в различных железках и их софтварной части (вспомнить хотя-бы статью про перекомпиляциюu-boot из вендорских исходников для нонейм консоли), а созидать что-то свое вообще вызывает какие-то нереальные всплески эндорфина — оно и понятно! 🙂
Однако несмотря на то, что мы уже имеем рабочий «прототип», проект далёк от завершения: я намерен довести его до конца и окончательно перевоплотить старый планшет в автономную игровую консоль (и рассказать об этом во второй части статьи). Для этого мне понадобится распечатать корпус и кнопки на 3D-принтере. К сожалению, у меня в городе ни у кого особо нет 3D-принтеров, поэтому начну копить на Ender 3, а от вас, читателей, с удовольствием почитаю мнение в комментариях и советы касательно выбора принтера!
Статья подготовлена при поддержке TimeWeb Cloud. Подписывайтесь на меня и @Timeweb.Cloud, чтобы не пропускать еженедельные статьи про моддинг различных гаджетов!