Несколько лет я искал такой проект, в котором мог бы сполна реализовать свою креативность. Собственный проект, который бы стал испытанием моих навыков и принёс внутреннее удовлетворение.

Карманные ПК всегда занимали в моём сердце особое место. Первым был Palm III, а чуть позже я стал обладателем Sharp HC-4500. Меня заинтересовали проекты Yarh.io, и в начале этого года я задумал купить uConsole. Предполагалось, что этот девайс будет отправлен в марте, но заказ всё ещё находится на стадии подготовки. Так что, вооружившись множеством идей и сильной мотивацией, я приступил к реализации собственного проекта по сборке карманного ПК: Decktility.

▍ Основные критерии проекта


Я хотел испытать свои силы и расширить границы возможностей самодельных решений. Модель Micro 2 от проекта Yarn.io лично мне показалась грубоватой. На момент разработки она была явно ограничена аппаратными возможностями.

Почитав документацию Yarn.io, я понял, к чему хочу прийти. Мне хотелось собрать устройство, которое бы выглядело более тщательно проработанным. Я также хотел, чтобы оно оказалось достаточно лёгким и держало батарею хотя бы пару часов.

На тот момент я уже рассматривал в качестве основы BigTreeTech Pad 5, поскольку он представлял самую тонкую комбинацию сенсорного экрана и Pi, какую мне удалось найти. Также вполне логичным выглядело решение отказаться от сборки складного устройства, поскольку такой вариант предполагал ряд сложностей:

  • Если отталкиваться от Pad 5, то одна половина будет иметь толщину около 15 мм, а толщина половины с клавиатурой, если учесть 18 мм батареи 18650 и корпус, окажется не менее 20 мм. Общие 35 мм – это уже слишком. Я подумал об использовании стандартного плоского LiPo-аккумулятора, но мне не нравится их опасность в случае короткого замыкания.
  • Трудно собрать качественные петли. Элемент корпуса с экраном будет довольно увесистый, а нам не нужно, чтобы в процессе печати он шатался.

Так что решение было принято: форма корпуса моего устройства будет аналогична 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, поэтому полностью в этой системе поддерживается.

Я испытал восторг, когда впервые увидел на экране значок батареи:



▍ Полученные уроки


Ниже я привёл краткую сводку некоторых полезных уроков, которые выше не затронуты:
  • Как уже говорилось, важной частью стало воздушное охлаждение. Мне пришлось охлаждать плату BMS, а также Pi. Нескольких отверстий для потока воздуха будет недостаточно. В итоге я расположил компоненты под прямым обдувом со стороны кулера. Это также несколько ограничило возможности расположения остальной электроники, поскольку я уже не мог свободно перемещать плату BMS.
  • Минимум крепёжных деталей: самый лучший крепёж – это тот, без которого можно обойтись. Если вы придумаете механизм с пазом и защёлкой, чтобы сэкономить детали, то такое решение вполне может себя оправдать. Для меня соответствующие затраты вылились в дополнительное усложнение дизайна.
  • Проектиррвание для … 3D-принтеров? Или ЧПУ-станков? Изначально я планировал сделать 3D-печатный корпус, а позднее попробовал изготовить его алюминиевую версию с помощью ЧПУ-станка. Проектирование для 3D-принтеров сильно отличается, так что для обработки на 3-осевом фрезерном станке потребовалось вносить изменения.
  • Размещать электронику трудно: помимо продумывания воздушного охлаждения, вам также нужно учитывать объём проводов, необходимых для подключения всех компонентов. Я также стремился сделать девайс максимально компактным, и поиск оптимальных компромиссов оказался нелёгкой задачей. Кроме того, есть проблемы с юзабилити: ваша SD-карта может входить в слот, но будет ли она легко извлекаться? Сможете подцепить её ногтем?
  • 3D-печать – фаски: я делал фаски на выступах, чтобы исключить необходимость использовать поддержку при их 3D-печати. Помимо этого, я делал фаски по краям в области разъёмов (например Ethernet и линий ввода-вывода), чтобы облегчить подключение штекеров.
  • 3D печать – указание поддержек вручную с помощью закрашивания (painted-on supports): этот инструмент очень удобен, если у ваших деталей множество выступов, но поддержка требуется лишь некоторым (присутствует в SuperSlicer/PrusaSlicer).
  • 3D печать – детали могут деформироваться: при сборке батарейной кассеты нужно учитывать, что создаваемое батареями давление может выдавливать её стенки наружу, в результате чего кассета не будет входить в корпус при вставленных батареях. Здесь важно измерить деформацию и оценить, не слишком ли выгибаются стенки наружу, так как вы явно не захотите столкнуться с критическим сбоем литиевых батарей.
  • Активное использование SSH: я расширил свой цикл разработки за счёт удалённых команд. Я мог выполнять локальный код Python удалённо с помощью ssh me@cyberdeck 'python' < powermanager.py
  • В Raspberry Pi 4 есть более двух шин I2C: если вы спалите свою шину CM4 I2C, то можете использовать другие контакты ввода-вывода для создания дополнительных портов I2C.
  • Название проекта важно: несмотря на то, что «Decktility» является, пожалуй, не лучшим названием, оно хорошо своей запоминаемостью, а также уникальностью, благодаря которой онлайн-поиск с лёгкостью выдаст нужные результаты. С выбором хорошего названия вам может посодействовать ChatGPT.

▍ Напоследок


Все детали проекта освещены в репозитории Decktility.

Комментарии (20)


  1. Tamul
    10.06.2023 18:46
    +9

    И от батареи все эти карманные проекты на Raspberry Pi (обычно на самой последней на момент разработки девайса) живут обычно часа два. Ни разу ещё не видел устройства, которого хватило бы на рабочий день даже при самом бережливом использовании.

    Псионы конца 90-х всё ещё вне конкуренции? Или есть относительно недорогие DIY или серийные альтернативы, пусть не на столь распространённом и мощном железе?

    Upd: написал коммент и тут же нашёл на Хабре этот кирпичик:

    https://habr.com/ru/articles/597669/


    1. masyaman
      10.06.2023 18:46

      Лично меня psion 5mx как-то не сильно впечатлил по времени работы. 2 года назад заимел почти новым, но личные ощущения спорны почти по всем параметрам.

      Сейчас играюсь с HP 320lx, по ощущениям быатарею держит не хуже. Но могу ошибаться, не могу сравнить эти девайсы объективно.

      Из старых девайсов с цветным дисплеем 4сть HP Jornada 720, у него до сих пор с батареей всё хорошо, часов 6 точно держит.

      Вообще не очень понимаю желания иметь компьютер в форме кирпича при наличии возможности купить какой-нибудь gpd win.


      1. leonidy85
        10.06.2023 18:46

        У меня был psion 5mx в середине нулевых в качестве печатной машинки для набора лекций в институте, в нем батареек хватало в среднем часов на 25 работы, по факту акб я в нем заряжал раз в две-три недели столько у меня никто больше не держал, с другой стороны камень на 30мгц +- и монохромный жк экран с постоянно выключенной подсветкой, это не современный macbook на m1 который держит в два раза меньше но имеет не сопоставимую производительность и экран в несколько раз больше и совсем другого качества.


      1. Tamul
        10.06.2023 18:46

        В виде кирпича и не хочется, ссылку на кирпичик скинул как пример желаемой автономности, а не формфактора.

        GPD Win дороговат для своих "до 8 часов" автономности, хоть и мощная штука. Хотелось бы выбирать устройство по критерию "часы работы за рубль", а не "мегафлопсы за рубль". И без костылей вроде "пфф, да возите с собой powerbank на 100 Вт*ч и будет вам автономность до суток"


        1. PuerteMuerte
          10.06.2023 18:46

          Хотелось бы выбирать устройство по критерию "часы работы за рубль",

          Тогда это должна быть не малина, с её 5-7 ватт потреблением, не считая дисплея и обвязки.


  1. vasyaa747
    10.06.2023 18:46
    +4

    В случае резисторов MR на 2,2 Ом и 3,9 Ом утечка ...

    Номинал резисторов должен быть МОм. Ниже в формуле всё правильно (количество ноликов).


  1. alexhott
    10.06.2023 18:46

    Плюс однозначно в карму!


  1. vvzvlad
    10.06.2023 18:46
    +7

    Да почему опять все так мерзко из отдельных плат, соединенных проводками? Почему "самодельщики" не могут сделать плату? Нафиг эта штука вообще нужна кому-то кроме автора в таком виде?


    1. vinny496
      10.06.2023 18:46
      +6

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


      1. Popadanec
        10.06.2023 18:46

        Для этого и существуют платы расширения. Если главный модуль и плата расширения(базовая) создавались вместе и продуманно, то это даже на размеры практически не влияет.


      1. Arhammon
        10.06.2023 18:46

        Собственно так и делается, если надо, конечно... дома валяются кастомные девборды из распаянных китайских ардуин или позднее из касс. Как раз чтобы не было мотни проводов, пачки ДС-ДС итп. Правда есть и минус, сегодня, например, microusb уже не совсем в тему... а уж какое суперуниверсальное питание можно теперь с TypeC сделать, эх!


    1. spc
      10.06.2023 18:46

      Если отталкиваться от личного опыта - потому что иначе это вообще никогда не будет сделано. Что касается потребности, то прежде всего это (а также похвастаться) нужно автору. Остальным ничего не мешает взять исходники и сделать лучше.


      1. vvzvlad
        10.06.2023 18:46
        -2

        Да мне бы хвастаться таким стыдно было. Время, когда родители хвалили за то что покакал в горшочек, прошли вместе с ранним детством.

        А "Остальным ничего не мешает взять исходники и сделать лучше" — это аргумент уровня "— смотрите, я вылепил из грязи слоника — но ведь он не похож на слоника! — тебе ничего не мешает взять грязь и сделать лучше!!".

        И исходников-то как таковых нет, нечего делать лучше, можно только взять и все переделать. Смысл ЭТО выкладывать-то.


    1. DvoiNic
      10.06.2023 18:46

      потому, что как правило, придумывают такое либо "узкие специалисты", (например, хорошие программисты и админы, не знающие электронику, и делающие железо по советам с ардуино-форумов), либо "слишком широкие" (которые знают всё настолько "по верхам", что сделать плату — это сильно специальный навык).


  1. PavelBelyaev
    10.06.2023 18:46

    Мне вот интересно, а бывает ли полноценный десктопный браузер под андроид?
    Чтобы были инструменты разработчика, возможность глянуть исходный код и чтобы можно было плагины ставить, ну и еще чтобы постоянно не открывались мобильные версии сайтов?
    А то есть допустим планшет 10 дюймовый, клавиатуру к нему можно подключить, можно даже vscode сервер поднять свой и открывать в браузере редактор кода запущенный на домашнем сервере (где всё окружение есть и докер и консоль...), но на harmony os F11 не работает для включения полноэкранного режима, вместо него скриншот и в браузере нет в настройках полноэкранного режима.


    1. alex1478
      10.06.2023 18:46
      +2

      Десять лет назад делал так: через Linux Deploy запускал на телефоне контейнер с дебианом и vnc, подключался по vnc и пользовался полноценным firefox. Смысла в этом не было, но это работало


    1. ZhymabekRoman
      10.06.2023 18:46
      +1

      Kiwi browser. Есть Devtool и поддержка расширении. Open-source.


  1. Gudd-Head
    10.06.2023 18:46
    +2

    Повышение напряжения происходит значительно менее эффективно, чем его понижение

    На чём основано это утверждение?

    нагрев платы до 45°

    Таки до 45 °С

    батареи на 20 Вт/ч

    Таки 20 Вт•ч


  1. E_I_P
    10.06.2023 18:46
    +2

    ...  В случае резисторов MR на 2,2 Ом и 3,9 Ом  ...

    Опечатка, должно быть МОм


    1. Bright_Translate Автор
      10.06.2023 18:46

      Спасибо