Энтузиаст электроники, разработчик и инженер Эндрю МакКалип представил мобильный гаджет под названием Doomscroller, который создан только для одной задачи — быстрого проматывания контента в лентах соцсетей с помощью пальца пользователя.
«Работает только с Android/ПК по Bluetooth. Извините, пользователи iOS. Почти уверен, что аккумулятор не взорвётся», — уточнил МакКалип.
МакКалип разработал все электронные и механические части, а также прошивку для ПО проекта Doomscroller.
Это определенно мой любимый полноценный проект. Чистое программирование никогда не приносит такого удовлетворения, как то, что касается физического мира. Когда система начинает взаимодействовать с людьми, возникают всевозможные проблемы, которые необходимо решить.
Как только я начал его использовать, я понял, что необходимы всевозможные программные функции. Например, гаджету необходимо иметь тайм-аут простоя и пробуждение ISR, чтобы экономить заряд батареи и не прокручиваться, находясь в кармане. Я запрограммировал чип энкодера на повышение флага при повороте на XXX градусов за Y секунд временного окна и использовал это решение для запуска прерывания, выводящего микроконтроллер из спящего режима.
Ещё одной забавной возникшей проблемой были вихревые токи. Бесконтактные магнитные энкодеры MPS используют диаметральный магнит для определения абсолютной ориентации поля относительно чипа. Первоначально я использовал довольно большой неодимовый кольцевой магнит, встроенный в колёсико, так как боялся поддерживать минимальную напряженность поля. В результате это вызвало значительное сопротивление колесика, поскольку оно вращалось над фланцем алюминиевого корпуса. Мне пришлось немного уменьшить размер магнита до приемлемого размера для нормальной работы гаджета.
Подшипники оказались самой привередливой механической частью всей этой системы. Я хотел, чтобы ощущение было очень свободным, как у мыши Logitech MX. Две уникальные проблемы заключаются в том, что моя конструкция имеет консольное колесо и глухое отверстие в колесе, вместо того, чтобы иметь две точки крепления как у Rabbit или традиционной мыши.
В идеале следует использовать двухрядный опорный роликоподшипник COTS. К сожалению, ничто не соответствует потребностям свободного хода, все на рынке рассчитано на определенную нагрузку и, следовательно, имеет высокий предварительный натяг и сопротивление.
Первая концепция: двойные радиальные стальные подшипники на болте с буртиком. В результате это решение оказалось неудачным из-за чрезмерного сопротивления при запрессовке.
Вторая концепция. Аналогично, но используется высокопрочный заполнитель зазоров Loctite со скользящей посадкой. Помогло уменьшение размера подшипника до минимально возможного размера шарика. Результат = умеренно лучше, но сопротивление всё еще высокое.
Третья концепция. Это была обнадеживающая идея, но я знал, что она, скорее всего, не сработает. Вместо двух подшипников на болте с буртиком я попытался использовать один большой керамический подшипник ABEC9 диаметром 22 мм. В результате сопротивление было очень низким, но одиночный подшипник оказался недостаточно жестким при моментной нагрузке. Типично даже для высококачественного радиального подшипника.
Четвертая концепция. Полностью циркониевые керамические подшипники, расположенные в двойной конфигурации с предварительным натягом на внешних кольцах. Результат — 30 секунд плавного вращения. Единственным недостатком является то, что эти подшипники немного дороже.
Почему я не мог просто эмулировать стандартную мышь и плавно прокручивать? Звучит легко. К сожалению, в способе записи драйверов мыши на USB сохранились пережитки двухдесятилетней давности. Поскольку мыши раньше использовали энкодеры с низким разрешением, одиночный «фиксатор» составлял около 22,5 градусов. На уровне ядра Android и Windows жестко закодирована инструкция по прерыванию этого единственного фиксатора при прокрутке на 40 пикселей для обычных устройств. Именно это приводит к грубой прокрутке на ПК.
Лишь недавно специальные устройства, такие как мыши Logitech, использовали специальные драйверы, чтобы обойти это и предложить инструкции по прокрутке одного пикселя в высоком разрешении. К сожалению, эти драйверы не были включены в ядро Android, поэтому даже когда я прослушивал трафик BLE с помощью Wireshark и выдавал себя за устройство Logitech, я не получал такой плавной прокрутки на своём мобильном устройстве.
Немного хакерский обходной путь заключался в том, чтобы пойти на один уровень глубже, чем стандартные библиотеки Arduino.
Краткое описание того, как работают USB-устройства. HID означает «Human Interface Device» и представляет собой протокол, реализованный через протокол USB. Устройства HID объявляют о своих возможностях через дескриптор отчета HID, фиксированный набор байтов, описывающий, какие именно отчеты HID могут отправляться между устройством и хостом, а также значение каждого отдельного бита в этих отчетах. Например, дескриптор отчета HID может указывать, что «в отчете с идентификатором 3 биты от 8 до 15 представляют собой координату дельта x мыши». Сам отчет HID затем просто содержит фактические значения данных без какой-либо дополнительной метаинформации.
Моей целью было использовать настроенный дескриптор для отправки байтового пакета сенсорной панели одним пальцем с абсолютной системой координат и одной кнопкой на хост. Таким образом, я мог выполнить цифровую эмуляцию контакта пальца с экраном, выполнения движения по оси Y, оставаясь в контакте, а затем отрывания экрана, не дойдя до верха. Это движение пришлось бы повторять сотни раз, чтобы обеспечить иллюзию плавной прокрутки.
Дополнительные сложности возникли из-за того, что Bluetooth с низким энергопотреблением имеет минимальную задержку 8 миллисекунд, при этом большинство хостов согласовывают еще более медленную скорость, например 20 миллисекунд. Просто подавать команды на частоте в несколько сотен герц не получится.
Интернет наполнен оставшимися без ответа вопросами о том, как все это сделать. Я думаю, что я, вероятно, первый, кто добился рабочей реализации этого конкретного решения для плавной прокрутки. Эта единственная проблема заняла больше времени, чем весь остальной проект вместе взятый. Нет сомнений, что Logitech или Apply могли бы найти более элегантное решение. Я надеюсь, что какая-нибудь крупная компания заинтересуется Doomscroller и заберет его из моих рук.
Я сделал несколько вещей, которые можно было бы назвать умеренно умными, а также одну очень глупую ошибку, которая стоила пересмотра концепции при финальной разработке печатной платы.
В крупномасштабном потребительском производстве корпус обычно изготавливается из пластика, отлитого под давлением. Поскольку корпус моего прототипа выполнен из алюминия, мне нужна прозрачная радиочастотная крышка на задней стороне. Я мог бы убить двух зайцев одновременно, используя печатную плату в качестве крышки. Это также позволило бы мне использовать крутой трюк: сделать фирменный логотип в виде золотой площадки для пайки ENIG на нижней стороне печатной платы.
Я успешно проложил все трассы питания и SPI на одном слое, избегая необходимости в каких-либо косметически отвлекающих переходах. Я очень доволен результатом, а стоимость составляет меньше $1 доллар за плату.
Магнитный энкодер, который я использую, имеет крошечный корпус QFN толщиной 3 мм. Если вы еще не видели эту технологию, это невероятно круто. MPS производит чип, который не нужно устанавливать точным образом, а это означает, что вы можете разместить его со смещением от центральной оси и скомпенсировать нелинейную вращательную реакцию электронным способом.
Еще одним нестандартным решением стала кнопка сброса. На плате разработчика NRF имеется физическая кнопка сброса, которую необходимо нажимать во время процесса перепрошивки. Мне не нравилась идея иметь в корпусе одно из этих вездесущих маленьких отверстий, как у многих устройств. В итоге я использовал одноосный переключатель с эффектом Холла на печатной плате для переключения контакта сброса, таким образом я могу помахать магнитом над крышкой, и всё останется закрытым.
Большой проблемой первой версии Doomscroller были прерывистые и ошибочные данные угла на линии SPI. Проверив линии MISO на осциллографе, я увидел, что мои сигналы были неправильные. Первоначально я объяснил это своей неидеальной стратегией однослойной маршрутизации и тем фактом, что я проигнорировал рекомендацию производителей использовать фильтр нижних частот. Я ленив и не люблю рассыпать повсюду колпачки-декапуляторы, так что подавайте на меня в суд.
После тройной проверки таблицы данных энкодера я понял, что должен был предоставить оба источника питания Vdd и VIO. Я неправильно прочитал описание и подумал, что мне нужен только VDD, поскольку чип автоматически понижает его до 3,3 В. Неа. Коварство в том, что чип продолжал передавать данные вроде бы правильные, но шумные и с дрянной формой сигнала, отбирая у VDD ровно столько энергии, сколько необходимо для питания схемы SPI. После того, как я подал питание 3,3 В на оба контакта, форма сигнала стала абсолютно идеальной на частоте 5 МГц.
Источник: habr.com