Мне всегда нравились портативные вычислительные устройства, которые имели при себе полноценную qwerty-клавиатуру, а не какой-либо обрубок в виде телефонных клавиш. Это была настоящая мечта — заиметь в своё распоряжение какой-нибудь КПК или хотя бы мобильник с qwerty. Годы шли и индустрия пересела на сенсорные экраны, удобные в производстве девайсы заполонили прилавки. Теперь делать физические клавиатуры немодно и дорого. В какой-то момент мне на глаза попалась очередная поделка от китайцев на базе ESP32 и с маленькой прищелкивающейся клавиатурой. Она позиционировалась как MicroPython доска, обучать, программировать, хороший, молодец. И тут в голове моей щелкнуло — я ж могу и сам такую штуку сделать! Идея пошла дальше и зачем мне ESP32? Возьму сразу SBC, будет полноценный ПК. Форм-фактор «старенький тетрис» мне пришелся по вкусу и решено было на нём и остановиться. Держать двумя руками удобно и пользоваться стоя — только в путь! Итак, мысль сделать своё устройство есть, теперь перейдём к реализации. Осторожно, внутри много картинок.
![Вычислительный кирпич - 1 Вычислительный кирпич - 1](https://habrastorage.org/getpro/habr/upload_files/397/d7b/a57/397d7ba57f8523920eb8eac358903e7d.jpg)
Дисплей и одноплатный компьютер
В продаже имеется бешеное количество одноплатных компьютеров, но большинство из них имеет просто ужасную поддержку производителем и только на комьюнити можно положиться в каких-то специфических вопросах. Поэтому мой выбор остановился на Raspberry Pi как на одном из лидеров недорогих одноплатников.
У четвертой малинки есть два microHDMI порта и один DSI (Display Serial Interface) порт. Меня очень привлекла возможность подключать дисплей через DSI и я отправился на поиск по маркетплейсам. К своей радости я нашел 5-ти дюймовый сенсорный дисплей от WaveShare. Прелесть в том, что сигнальная часть и питание идут по одному шлейфу, есть крепления под Raspberry Pi сзади дислпея и всё работает из коробки.
![5 inch DSI display. Ёмкостной, сенсорный, твой. 5 inch DSI display. Ёмкостной, сенсорный, твой.](https://habrastorage.org/getpro/habr/upload_files/e98/b82/f86/e98b82f869e78d72c7495f7ea0f50a3a.jpg)
Печатная плата
С дисплеем определился и значит надо приступать к печатной плате. Логично, что её надо делать примерно такого же размера, как и дисплей. Кнопки взял обычные тактовые, 6х6х5 мм с упреждением на то, чтобы в будущем сделать на них колпачки.
Разводил плату в KiCAD, печатка двухслойная без всяких изысков. Основная дилемма заключалась в следующем: сделать хардварное определение нажатой кнопки с помощью диодов или сделать софтварный детект кнопки с помощью логики контроллера. Было две версии платы как раз с этими двумя вариантами.
Первая версия содержала в себе также пару тактовых джойстиков, которые планировал использовать как манипулятор для указателя. Однако плата получилась очень трудоемкой в монтаже и достаточно широкой из-за того, что сначала решил реализовать num-блок цифр. После сбора тестового образца стало понятно, что это никуда не годится. Я просто не мог двумя руками обхватить плату, чтобы было удобно печатать двумя большими пальцами.
![Первая версия клавиатуры Первая версия клавиатуры](https://habrastorage.org/getpro/habr/upload_files/fe7/ed4/b38/fe7ed4b38891ccca675bf509e0ffb2a8.jpg)
![Куча диодов Куча диодов](https://habrastorage.org/getpro/habr/upload_files/378/8f9/c15/3788f9c158d3c322e472c065ff982054.jpg)
Во второй версии учел недостатки и решил отказаться от тактовых джойстиков. Заменил их одним джойстиком от PSP. Также уменьшил количество кнопок на будущей клавиатуре, что позволило уменьшить её размеры. Ещё отказался от диодов, настоящий ужас при ручной пайке.
В процессе монтажа компонентов оторвал контакты для джойстика, лень распаивать вторую плату.
![Скрин с 3д-модельки, верх Скрин с 3д-модельки, верх](https://habrastorage.org/getpro/habr/upload_files/53f/728/eb5/53f728eb5ccbc76cd89b19e2dba2c015.jpg)
![Скрин с 3д-модельки, низ Скрин с 3д-модельки, низ](https://habrastorage.org/getpro/habr/upload_files/b73/de7/c2b/b73de7c2bc670ff1594acf5a1f76cb27.jpg)
Микроконтроллер
Выбор пал на STM32G071CBT6, потому что он был в наличии на тот момент. Количество ног по моим прикидкам должно было быть не меньше 40, поэтому выбрал контроллер с 48 ножками.
Шина I2C показалась мне хорошим выбором для соединения малинки и моей клавиатуры. В интернете наткнулся на стандарт HID over I2C от Microsoft. Оказалось, что драйвер этого стандарта уже реализован в ядре Linux и достаточно легко настроить в оригинальном образе RaspberrypiOS работу этого драйвера.
Для управления контроллером взял FreeRTOS — популярное решение для микроконтроллеров, достаточно простое для использования и встраивания в проекты. Драйвера от ST для контроллера, конфигурацию делал в CubeMX. Код лежит в репо, все ссылки будут ниже.
АКБ
Для питания всей этой конструкции удобно использовать аккумуляторы, которые можно будет поменять в процессе использования. Аккумуляторная батарея формата 18650 оказалась идеальным кандидатом. Модуль для преобразования в 5 вольт сначала хотел сделать сам, но на алике нашел уже готовую плату под 4 АКБ 18650, способную выдать 5В 3А. Собственно, её и решил использовать.
![Вот такая приблуда для аккумуляторов. Даже заряжать их умеет! Вот такая приблуда для аккумуляторов. Даже заряжать их умеет!](https://habrastorage.org/getpro/habr/upload_files/4ff/b54/bed/4ffb54bedd6d6a53fefce33173f1856a.jpg)
Корпус
С покупкой 3д-принтера вопрос с корпусом решился мгновенно! Проектировал в FreeCAD, печать пластиком PET-G. Очень нравится красный цвет, соответственно взял пластик красного цвета. Превосходно смотрится! Черный тоже ничего, но не так эффектно, как красный.
Было две версии корпуса. Первая версия устройства в сборе весила почти 800 грамм, вторую удалось уменьшить до 657 грамм. Размеры текущего корпуса 179 х 133 х 36 мм.
![Скриншот из редактора FreeCAD Скриншот из редактора FreeCAD](https://habrastorage.org/getpro/habr/upload_files/20d/02a/24c/20d02a24c06fe01e7c2d38bc8ad3a4b4.jpg)
Фото
Несколько штук фотокарточек
![Первый корпус как первый блин Первый корпус как первый блин](https://habrastorage.org/getpro/habr/upload_files/33e/fcb/700/33efcb700831d856fc2286b7aa0beb2d.jpg)
![Выпуклая задняя крышка оказалась неудобной Выпуклая задняя крышка оказалась неудобной](https://habrastorage.org/getpro/habr/upload_files/23b/bc1/48e/23bbc148e436ce5c828e86afa5301e4f.jpg)
![Внутренняя компоновка с проводами Внутренняя компоновка с проводами](https://habrastorage.org/getpro/habr/upload_files/59d/1d8/ffd/59d1d8ffd2dc1df353475252cbfca8b3.jpg)
![Задняя крышка без изысков Задняя крышка без изысков](https://habrastorage.org/getpro/habr/upload_files/a1e/313/ecb/a1e313ecb17be4ed3c74f9748fd131e1.jpg)
![Доступ к USB и Ethernet имеется Доступ к USB и Ethernet имеется](https://habrastorage.org/getpro/habr/upload_files/d4a/776/e90/d4a776e9088147b7e99040d2ad8a9587.jpg)
![](https://habrastorage.org/getpro/habr/upload_files/5c4/848/06e/5c484806efe03ed64e8cd2be973b8aa3.gif)
Ссылки на репозитории: