- PVSM.RU - https://www.pvsm.ru -

Несколько лет я искал такой проект, в котором мог бы сполна реализовать свою креативность. Собственный проект, который бы стал испытанием моих навыков и принёс внутреннее удовлетворение.
Карманные ПК всегда занимали в моём сердце особое место. Первым был Palm III, а чуть позже я стал обладателем Sharp HC-4500. Меня заинтересовали проекты Yarh.io [1], и в начале этого года я задумал купить uConsole [2]. Предполагалось, что этот девайс будет отправлен в марте, но заказ всё ещё находится на стадии подготовки. Так что, вооружившись множеством идей и сильной мотивацией, я приступил к реализации собственного проекта по сборке карманного ПК: Decktility.
Я хотел испытать свои силы и расширить границы возможностей самодельных решений. Модель Micro 2 от проекта Yarn.io лично мне показалась грубоватой. На момент разработки она была явно ограничена аппаратными возможностями.
Почитав документацию Yarn.io, я понял, к чему хочу прийти. Мне хотелось собрать устройство, которое бы выглядело более тщательно проработанным. Я также хотел, чтобы оно оказалось достаточно лёгким и держало батарею хотя бы пару часов.
На тот момент я уже рассматривал в качестве основы BigTreeTech Pad 5, поскольку он представлял самую тонкую комбинацию сенсорного экрана и Pi, какую мне удалось найти. Также вполне логичным выглядело решение отказаться от сборки складного устройства, поскольку такой вариант предполагал ряд сложностей:
Так что решение было принято: форма корпуса моего устройства будет аналогична Micro 2 от Yarn.io и uConsole от ClockworkPi.
Прежде, чем приступать к 3D-проектированию, я купил в сети некоторые базовые компоненты. Когда они прибыли, я эти компоненты измерил, чтобы понимать, сколько каждый из них займёт места. Это также позволило мне начать собирать прототип:

Следуя руководству подключения компонентов, я начал со сборки схемы питания, а именно USB-системы управления батареей (BMS, Battery Management System), способной заряжать два литиевых аккумулятора 18650, в паре с понижающим преобразователем 5 В, поскольку Pi, клавиатура и кулер требовали именно 5 В. Для проверки подачи питания во время зарядки я использовал тестер USB-C PD (Power Delivery).
Когда всё заработало, я с помощью соединительных проводов подключил Pi:

В итоге я обнаружил, что BMS при зарядке прилично греется. Эта система повышала получаемые от USB 5 В до примерно 8,4 В, необходимых батареям. Повышение напряжения происходит значительно менее эффективно, чем его понижение, поэтому здесь нагрев больше. Это говорило о необходимости добавления системы охлаждения. В открытом виде нагрев платы до 45° – это ещё не так плохо, но в корпусе, где Pi будет генерировать дополнительное тепло, такая температура уже нежелательна.

В теории из батареи, переключателя и Pi должен получиться рабочий продукт, но что, если батарея окажется близка к разряду? Если переключатель питания останется активен, он будет высасывать батарею и в итоге повредит её.
Для решения этой проблемы, я добавил Arduino Nano. Этот микроконтроллер будет решать много задач, но для начала я реализовал с его помощью считывание напряжения батареи. Для этого я добавил два резистора с высоким сопротивлением, поскольку они всегда будут подключены к батарее, а значит будут забирать энергию. В случае резисторов MR на 2,2 Ом и 3,9 Ом утечка составит всего 0,82 мкA (5/(2200000 + 3900000)). Это где-то 4,1 мкВт – иными словами, для высасывания батареи на 20 Вт/ч потребуется 203252 дня. В таком случае это уже не проблема.

Теперь, понимая, когда можно безопасно включать оборудование, нужно было реализовать возможность фактического включения. Для этого я использовал особый вид транзистора – силовой MOSFET (или «силовой FET»). Цепь этого FET находится на зелёной печатной плате, виднеющейся за кучей проводов:

Примерно в это же время я начал проектировать прототипы CAD в OnShape. Немало часов пришлось провести за измерением и зарисовкой различных компонентов для Decktility. Мне требовалось их 3D-изображение, чтобы можно было подогнать размер и форму корпуса.

На раннем этапе мне пришлось решать дилемму с расположением батарей. Изначально предполагалось, что они будут выступать противовесом экрану. Важно, чтобы в руках устройство ощущалось сбалансированным – экран и батареи являются довольно тяжёлыми элементами, поэтому их нельзя располагать на одной стороне.
Я рассматривал два варианта расположения батарей: по сторонам, чтобы создать своеобразные выступы для удержания устройства, либо в нижней части корпуса по центру. Размещение их по сторонам потребовало бы два отдельных держателя, и минимальная длина нижней половины устройства оказалась бы 7,5 см. Мне реально понравилась эта идея с выступами, но её недостатки подтолкнули к альтернативному варианту.
После проработки базового дизайна корпуса настало время печатать его первую версию. Первую из многих…

Массивная плата с FET быстро привлекает взгляд. Фото с ней я показал просто, чтобы продемонстрировать, насколько она выбивается из общей схемы. В итоге я заменил её на более компактную и уже потом продолжил.
Поменять эту плату оказалось труднее, чем я предполагал. Есть много доступных готовых модулей, но большинство из них собраны на N-FET, а не P-FET. Платы с N-FET дешевле и проще в сборке, в результате чего мы получаем переключение питания на линии GND. Позднее я выяснил, что мне нужен именно вариант с P-FET ввиду потребности в постоянно подключенной общей земле, необходимой для совместной работы логики Arduino и Pi (для коммуникации по I2C).
В итоге я не смог найти достаточно компактную плату с FET, поэтому прибёг к реверс-инжинирингу уже имеющейся в своём первом проекте KiCad:

После чего пересобрал её на экспериментальной плате:

Возможно, я соберу кастомную плату в будущем. Это позволит мне добавить разъёмы для различных компонентов, упростив тем самым сборку.
В отсутствии кастомной платы с FET мне удалось заставить работать большинство базовых компонентов до этапа добавления Pi. Тогда я быстро выяснил, что взял для основного питания провод неподходящей толщины. У меня под рукой был 20 AWG, который я обычно использую для дронов, потребляющих намного бо́льшую мощность. Позднее я заменил этот провод на 24 AWG.

Работая над прошивкой для Arduino, я столкнулся с проблемой: при каждой загрузке её новой версии микроконтроллер перезапускался. Это приводило к отключению электронного выключателя и, как следствие, перезапуску Pi. Чтобы решить эту проблему, я вместо использования Arduino внутри устройства подключил его второй экземпляр к I2C. На более позднем этапе я также добавил разъём JST-SH, чтобы легко отключать внутренний Arduino.

Неплохим дополнением стали бы светодиоды, отражающие состояние зарядки, но добавление 1 или 2 таких в корпус потребовало бы приличных усилий. И тут меня осенило: можно же использовать оптоволокно! Проволока для протягивания кабелей (или гибкая проволока для браслетов) может проводить свет от светодиодов BMS до края корпуса. Для этого лишь потребуется проложить и приклеить такой провод. Заказав срочную доставку и проведя простой эксперимент, я подтвердил эту идею:

После множества опробованных вариантов аппаратная часть была закончена:

На тот момент кастомная реализация устройства с I2C позволяла Pi и Arduino взаимодействовать. Pi мог спросить у Arduino состояние заряда или напряжение батарей, и тот эти данные исправно сообщал. Я начал изучать возможность вывести эту информацию на рабочий стол Linux, в ходе чего прочитал о dbus и upower. Поначалу, я хотел написать собственный драйвер ядра, но затем до меня дошло: «Что, если изменить прошивку Arduino так, чтобы он действовал как уже поддерживаемое в Linux устройство?» Поизучав различные варианты, я остановился на реализации «индикатора расхода батареи» LTC294x. Это оказался один из немногих связанных с питанием драйверов ядра Linux, которые были доступны в Raspberry Pi OS.
Теперь Arduino действует так, будто является устройством Linux, поэтому полностью в этой системе поддерживается.
Я испытал восторг, когда впервые увидел на экране значок батареи:

Ниже я привёл краткую сводку некоторых полезных уроков, которые выше не затронуты:
ssh me@cyberdeck 'python' < powermanager.pyВсе детали проекта освещены в репозитории Decktility [4].
Автор: Дмитрий Брайт
Источник [5]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/diy/385288
Ссылки в тексте:
[1] Yarh.io: https://yarh.io/
[2] uConsole: https://www.clockworkpi.com/uconsole
[3] для создания дополнительных портов I2C: https://medium.com/cemac/creating-multiple-i2c-ports-on-a-raspberry-pi-e31ce72a3eb2
[4] репозитории Decktility: https://github.com/ByteWelder/Decktility
[5] Источник: https://habr.com/ru/companies/ruvds/articles/740472/?utm_source=habrahabr&utm_medium=rss&utm_campaign=740472
Нажмите здесь для печати.