Впервые за 6.5 лет, что я здесь решил сделать хоть сколько-то серьёзный пост, да и авторский контент точно не помешает. Сразу предупреждаю: телегу не рекламирую, реферальных ссылкок не будет, фоткал на тапок, чукча не писатель, маска моя - тег моё хуё-моё.
Тут есть мат, дилетантство, шизофренические текстовые конструкции и огромное количество моментов, в которых захочется сказать "Автор, ты совсем еблан?"
Погнали!
Дело началось в августе 2023 года, когда я впервые для себя открыл такой тип досуга как косплей-фестивали, а в частности Томскую Con.Версию. Тогда же у меня с товарищем возникла идея сделать косплей на персонажей из нашей общей любимой игры - Watch Dogs 2 - Ренча и Маркуса.
И если с образом Маркуса (негр, справа) проблем не возникло никаких - в косплейном обществе такие костюмы называют "шкаф" (в плане, одеться в персонажа можно просто достав обычные шмотки из шкафа), то с Ренчем (чудик слева в маске) дела уже обстоят интереснее.
Как минимум, потребуется маска, о создании которой я сегодня и хочу написать.
Изначальной идеей было купить уже готовый вариант маски (как на изображении ниже), но почесав репу и прикинув писю к носу мы поняли, что вариант это такой себе, ибо дорого и плохо (на тот момент подобные маски стоили около 7-10 т.р. и не имели анимации) , и надо бы запариться и скрафтить маску самим.
вот такую маску хотели купить изначально
Идея то появилась, а как реализовать – неясно. Хотелось видеть анимации, полную поддержку эмотиконов и качество чуть лучше, чем подвал в Шэньчжэне.
Пошёл гуглить. Нагуглил уже известный всем вариант маски с очками Chemion, еще какую-то фигню и чего-то загрустил.
От грусти полез шерстить гитхаб и тут меня ждал успех. Мы смогли найти опенсорсный проект маски от TomMakesThings построенный на базе светодиодных матриц MAX7219, Arduino и базовой простой как три копейки пластиковой маски с того же али. Мало того, этот проект соответствовал всем нашим требованиям, управлялся по блютузу и имел кайфовое приложение.
Долго не думая, мы почти сразу начали закупаться компонентами.
С алиэкспресса были заказаны: шасси маски, паяльные расходники, а Arduino Uno я решил заменить на ESP32 (из-за дешевизны и уже встроенного блютуза).
Трудности возникли уже на этапе покупки матрицы. Оказалось, что в наличии ни в нашем, ни в ближайших городах не бывает таких матриц в нужном нам цвете (белый) а брать синий или красный как-то фу, но зато есть куча адресных матриц WS2812b. Естественно, библиотеки для управления тем и этим типом матриц отличаются чуть более, чем полностью, поскольку матрицы на MAX7219 – аналоговые, WS2812 же – цифровые.
“Придется переписывать код” – подумал я, заказал матрицы и ушел в запой на 4 дня.
Во время этого самого запоя я при помощи рук, ChatGPT и такой-то матери таки смог понять реализацию оригинального кода, пару тысяч раз чертыхнуться и переписать почти весь код (кроме некоторых на мой взгляд бесполезных анимаций) на библиотеке FastLED, которая и будет управлять адресными светодиодами.
Процесс ардуинокода, костылей, а также самоненависти (вот до чего доводят с++, особенно если твой максимум - "Hello, World!")
На симуляторе ардуино все заработало просто идеально, и оставалось только протестировать на реальном железе и посмотреть, как всё работает в жизни. На этом этапе я ещё не знал, насколько бесполезными были мои страдания.
Забрал посылку с маской. Как оказалось, матрицы на базе WS2812 слишком большие, что в корне губило нашу идею с использованием адресных светодиодов вместо “аналоговых” матриц MAX7219.
Ушел в тильт на пару дней и чуть было не решил забить нафиг на весь косплей, но вдруг случилось неожиданное – великий и ужасный @AlexGyver, выкатывает проект (радио-голова Бендера) ровно на тех же MAX7129, которые использовались в маске от TomMakesThings и реализует в нем почти то же самое, что надо нам.
Наглядно видно насколько матрицы большие для использования в этом проекте
После просмотра видоса выяснилось, что моя догадка о том, что матриц такого типа с белыми светодиодами нет в продаже, но умные китайцы придумали вот такие белые сторонние светодиодные модули, совместимые с, собственно, контроллером:
Заказал, оплатил, получил. Заказал так же и сами модули MAX7219.
Так-то лучше! Теперь и матрицы чётко по размеру, и через "визор" маски можно видеть окружающий мир.
Наступило время сборки. Подключил все по схеме, но матрицы вели себя чрезвычайно странно: то не отображали ничего вовсе, то показывали какую-то белиберду; в общем, было очень неприятно. В итоге спустя полдня мучений и один убитый логический конвертер я решил забросить это дело на неопределенный срок.
схема подключения матриц к есп32 (да, для такого дилетанта как я требуется схема даже для очень простых вещей)
Неопределенный срок оказался длинной в два дня. Мне стало скучно и одним осенним утром я скупил ВООБЩЕ ВСЕ логические конвертеры, какие я смог найти в наличии и сел собирать по новой, теперь уже не на коленке и под банку пива, а на трезвую голову и с моральной поддержкой.
Снова какая-то хрень. Ничего не могу понять, есп вроде живая, конвертеры – новые. Подумал-подумал и решил поменять матрицу на стоковую красную. Собрал, запустил, заработало.
Куда же без косяков… белые дисплеи, купленные на замену стоковым красным, подключаются по схеме “общий анод”, а модули max7219 работают только с дисплеями “общий катод”.
Где-то тут были тщетные попытки переписать библиотеку под работу с общеанодными дисплеями, но почти сразу было понятно, что дело гиблое и надо бы покупать дисплеи и матрицы заново...
Новый день – новые траты!
Ну теперь-то всё точно должно получиться! Жду посылку.
Посылки пришли довольно быстро, матрицы были подкинуты на скорую руку к еспшке ииии.. да! Всё взлетело, заработало и красиво начало моргать светодиодами.
Ура, товарищи, победа! Теперь дело оставалось за малым, ещё раз переписать (а вернее, откатить) код к моменту, где всё работало, запихнуть железки в маску и проверить как всё это выглядит в деле.
На этот момент проект, который по сути своей можно было бы сделать за месяц (учитывая ожидание посылок с али), растянулся уже на 3 с половиной месяца... Криворуким быть тяжело!
На этом всё. Проект получился хоть не очень масштабным, зато дров наломать получилось знатных. Но, опыт есть опыт.
Наш разраб фигачит вообще адовые проекты.
Ну такой вот примерно рецепт усредненный, потому что вариаций масса.
Берётся готовый проект с гитхаба, он не тестится, тестить — это не про нашего разраба. Он берет этот проект, размазывает его по функциям и начинает рефакторить. Добавляет в него огромное количество костылей, хаков, спизженного кода со StackOverflow для вязкости, немного фиксов сверху. Все это компилится до дыма. Потом снимается с Arduino IDE, и разраб остужается на балконе. Потом он заливает это все на esp32 и, щедро полив анекдотами, отдаёт мадесте. Пишет пост на пикабу, шкрябая по клавиатуре. Пишет и приговаривает полушепотом: "ух, бля".
При этом у него на лбу аж пот выступает. Любезно мне иногда предлагает потестить, но я отказываюсь. Надо ли говорить о том, какой запах потом? Вонища такая, что в косбенде обои от стен отклеиваются.
Осторожно: эта статья точно будет интересной, ведь в ней мы смоделируем, спроектируем и запрограммируем своё видение N-Gage 2! Я очень старался сделать статью интересной даже для тех читателей, кто не разбирается в теме 3D-печати и программирования микроконтроллеров :)
Я очень люблю ретро-игры и игровые консоли. Иногда я люблю позалипать в какую-нибудь классику с NES, Sega Mega Drive или, например, PSP. Однако особое место в моём сердечке занимает игровой телефон Nokia N-Gage, который, к сожалению, не получил продолжения, как и его более современный собрат — Sony Ericsson Xperia Play. Недавно я пересматривал свою коллекцию девайсов и обнаружил на полочке Galaxy S4 Mini. И тут я подумал: а что если...
❯ Предисловие
Думаю многие мои давние читатели заметили, что примерно четверть статей в моем блоге так или иначе касается вопроса игр и портативного гейминга. За почти три года существования блога, мы с вами успели не только поностальгировать и потыкать игровые гаджеты, но и отремонтировать часть из них, узнать как разрабатывались и работали «под капотом» игры и даже попытались спроектировать свою собственную игровую консоль!
Почти два года назад в моей голове уже возникала идея сделать «портативку» из полурабочего гаджета. В то время я хотел рассказать читателям о том, что многие старые девайсы можно использовать в качестве одноплатных компьютеров и HMI-панелей благодаря наличию пятачков с шиной UART на плате, с которой можно легко взаимодействовать в Android-приложениях! В качестве реального примера использования я взял планшет с нерабочим тачскрином, подключил через UART геймпад, разработанный на базе RP2040 и написал программу, которая читает UART и инжектит состояние кнопок напрямую в драйвер ввода:
Именно для того чтобы закончить этот проект я приобрел себе Ender3 V2
С тех пор прошло много времени, в моей коллекции появились некоторые серийные игровые-смартфоны и даже прототипы никогда не выходивших устройств. Однако по своей натуре я прожженный гик, у меня постоянно чешутся руки что-то запрограммировать и собрать самому.
Недавно я осматривал свою коллекцию гаджетов и на полочке с смартфонами Samsung обнаружил легендарный Galaxy S4 Mini, который мне когда-то дарил один из читателей. У смартфона отсутствовала задняя крышка, средняя часть корпуса была немного ободрана, однако несмотря на почтенный возраст в 12 лет, смартфон продолжал нормально работать и даже AMOLED-матрица у него ничуть не выгорела!
И тут в моей голове что-то щёлкнуло: я вспомнил что S4 Mini — смартфон с довольно неплохим железом для эмуляторов и очень крутым даже по современным меркам AMOLED дисплеем. На моей памяти, в мире не выходило ни одного серийного игрового телефона в монолитном корпусе с OLED-матрицей, а тут ещё рядом лежал оригинальный N-Gage, который я недавно купил в утиле и восстановил после воды. Я взвесил все за и против, прикинул схему и конструктив будущего устройства и принялся мастерить...
Всё начинается с кубика...
Перед тем как начать работу, нам необходимо определится с тем что нам нужно будет сделать для реализации такого гаджета на практике:
В первую очередь, нам необходимо продумать как геймпад будет общаться с нашим устройством. За исключением моего хака с UART'ом, у нас есть два варианта: первый — микроконтроллер выполняет роль USB-HID устройства (прикидываясь клавиатурой) и подключается к OTG-хосту гаджета. Среди плюсов этого подхода можно выделить низкую задержку, однако минусов гораздо больше. Например, далеко не все старые устройства поддерживают OTG и могут быть проблемы с реализацией одновременной работы USB-хоста и зарядки (зависит от реализации OTG в каждом конкретном устройстве). А второй вариант — это Bluetooth-HID, который работает почти с любыми Android устройствами, однако потребляет чуть больше энергии и может иметь небольшой инпут-лаг.
После расследования выяснилось, что у S4 Mini OTG нет, а значит остается лишь один вариант — Bluetooth. Среди дешевых микроконтроллеров с BT выделяется лишь ESP32, который стоит буквально три пачки доширака. Его мы с вами и выберем.
Далее нам необходимо придумать внешний вид устройства. Изначально мне хотелось, чтобы гаджет по форм-фактору и эргономике напоминал оригинальный N-Gage. Но поскольку мне не хотелось делать слишком длинную «колбасу» и бюджета по свободному пространству в корпусе откровенно не хватало, пришлось пойти на некоторые ухищрения — например, расположить блок кнопок вертикально.
Теперь самое сложное — смоделировать более-менее адекватный корпус и подогнать детали так, чтобы их хоть как-то можно было состыковать и закрепить. Я в 3D-печати новичок, а в вопросах проектирования корпусов — вообще неотесанный селюк, поэтому мне оставалось лишь смоделировать в блендере выпуклый меш, импортировать в TinkerCad и затем CSG'шками вырезать в нём дырки отверстия.
И самое легкое — написать прошивку для микроконтроллера и спаять всё вместе, дабы наши кнопочки не просто прикольно щелкали, но и на практике работали в системе!
Звучит как приключение на 5 минут. Но вот как на практике? Давайте посмотрим!
❯ Моделируем корпус
В первую очередь я сел моделировать корпус устройства и прикидывать его размеры. В TinkerCad'е CSG'шками сделать корпус по референсу проблематично (по крайней мере для меня), поэтому я решил смоделировать основу в блендере. Я взял рендеры N-Gage с фронтальной части, установил камеру в ортографическую проекцию и принялся повторять контур корпуса оригинального телефона. После этого я создал грани на одной половинке корпуса, продублировал все вершины и отзеркалил их с другой стороны. Таким образом, корпус получился одинаковым (кривым) с обеих сторон.
Далее я убрал лишние рёбра посередине и вытянул корпус по оси Z с помощью инструмента Extrude. Теперь это напоминает поделку семикласника на уроке обращения с рубанком:
Внимательные читатели могли заметить косяк, который из-за затенения я не замечал вплоть до первой печати
Дальше я использовал инструмент Inset faces, дабы создать новые грани на плоскости и вытянуть из них фронтальную часть корпуса. Таким образом, мы получаем ровные и мягкие стенки, которые затем можно смягчить ещё больше с помощью модификатора Bevel:
Однако сейчас геометрия нашего корпуса полая, внутри неё ничего нет. Чтобы добавить внутренние стенки, мы воспользуемся модификатором Boolean (CSG) в блендере: дублируем геометрию нашего корпуса, немного уменьшаем её по оси X и Y (чем меньше дубль, тем толще будут стенки), и затем сдвигаем немного вниз, а затем на основном объекте корпуса добавляем модификатор Boolean, устанавливаем режим Difference, ставим дубль в качестве второго объекта и жмём Apply. Теперь у нашего корпуса внутри отнюдь не пустота!
Далее экспортируем модель в STL, импортируем её в TinkerCad и берём линейку в зубы. Пора замерять габариты нашего устройства и размер дисплея.
Поскольку S4 Mini уж очень скругленный, я аппроксимировал его размеры до прямоугольника (ни слово про мыло!). Над этим прямоугольником я расположил прямоугольник размером с дисплей, который и вырежет нам пространство для этого самого дисплея:
На этом подготовка болванки корпуса закончена, переходим к реализации геймпада.
❯ Геймпад
Изначально я решил распаять все кнопки геймпада на двух макетных платах — первая с «стрелками» будет установлена слева, вторая с кнопками действий — справа. Поскольку место в корпусе сильно ограничено, текстолит я решил распилить: для этого я сделал насечки канцелярским ножом и затем руками отломал ненужные части.
В качестве кнопок я решил использовать обычные DIP-микрики, поскольку в моем городе не было ни плоских SMD-кнопок, ни тем более мягких мембранных. А ещё они прикольно щёлкают. Я, как пользователь механической клавиатуры, гарантирую это!
Ошметки текстолита можно счистить надфилем или просто подровнять канцелярским ножом
Для реализации обработки кнопок есть несколько подходов:
«В лоб»: самый простой и самый подходящий для геймпадов. На один входной GPIO микроконтроллера вешается подтягивающий резистор и кнопка, которая коммутирует массу. Главный плюс такого подхода — возможность зажимать сколько угодно кнопок одновременно, а если ножек на микроконтроллере не хватает, то всегда можно использовать сдвиговый регистр!
На резисторах: требует наличия ADC в микроконтроллере. Принцип работы заключается в том, что на выходе каждой кнопки установлен резистор определенного номинала. В прошивке микроконтроллера опытным путем задается диапазон значений ADC, который соответствует нажатой кнопке. Такой подход иногда используется в планшетах для обработки кнопок по типу включения, громкости и т.п.
Матричный: используется в клавиатурах, в том числе и в телефонах. Позволяет реализовать 16-кнопочную клавиатуру всего с 8-ю сигнальными линиями, однако с таким подходом нельзя нажимать сразу несколько кнопок кнопок в одной «линии» одновременно. Этим и страдали некоторые китайские игровые консоли, на которых нельзя было одновременно зажать вверх и влево или A и B!
Поскольку у нас всего 10 кнопок, мы выберем первый подход. Для этого мы подведем общую массу к нашей макетке, от которой пустим перемычки (дорожки) к каждой кнопке, а с другой стороны подпаяем провода, которые пойдут на входы в наш микроконтроллер.
После этого я наконец-то напечатал первую примерочную болванку, в которой всё помещалось идеально! Время от раздумий до первой болванки — ~5-6 часов:
❯ Стыкуем корпус
Если с моделированием корпуса у меня проблем не возникло, то стыковка деталей — вопрос совершенно другой, особенно для человека без опыта проектирования корпусов. В какой-то момент времени я даже впал в депрессию и сломал парочку болванок, хотя планировал их оставить в коллекции на память. Что-ж, будет памятью о моей вспыльчивости:
Сначала я решил сделать толкатели кнопок. Для «стрелок» я решил сделать классическую крестовину в духе GBA, а кнопки действий решил сделать цилиндрическими. Здесь в целом ничего сложного: подгоняем размеры толкателей к размерам кнопок, делаем у них небольшую выемку снизу, которая будет «шляпкой» для самих кнопок, а также добавляем «юбку» по бокам как ограничитель, дабы они не выпадали из корпуса:
А она ей как раз!
С крестовиной всё чуточку сложнее: сначала я сделал монолитную в стиле GameBoy, однако из-за того что расстояние между кнопками относительно маленькое, при нажатии на стрелку иногда нажималась и вторая кнопка. Поэтому я решил её разделить на несколько частей, оставив характерный рельеф посередине для лучшей тактильности. Я печатал много разных вариантов: подгонял зазоры для уменьшения люфта и добавлял тактильные выемки, однако остановился на классическом варианте. Далее встал вопрос как закрепить плату с геймпадом с обратной части корпуса. Я долго думал и прикидывал варианты: хотел и саморезы вкручивать, и гайки вплавлять, но потом придумал что самым лучшим и надежным решением будут салазки приклеенные на дихлорэтан, которые при желании можно снять не ломая корпус, но которые будут хорошо выдерживать постоянное усилие со стороны игрока!
Мне кажется что это невероятный говнокод и костыль от мира инженеров. Напишите своё мнение на этот счёт в комментариях.
Когда зазоры были подогнаны, я принялся моделировать заднюю крышку. Дабы она не выбивалась из общего стиля, я сделал её из фронтальной части корпуса: продублировал, отменил все CSG-операции характерные для основного корпуса и обрезал стенки одним большим кубиком.
Нарезаем модель в слайсере и печатаем! Как по мне, получилось очень даже стильно. Да, кто-то скажет, мол, видно, что это колхоз, не Industrial-grade, но как по мне для самоделки вполне на уровне!
На этом разработка корпуса наконец-то закончена!
❯ Пишем прошивку
Теперь, когда корпус нашего устройства готов и элементы в нём более-менее стыкуются, можно перейти к написанию прошивки. Как я уже говорил ранее, в качестве микроконтроллера я решил выбрать ESP32 благодаря копеечной цене и наличию неплохого BT-стека:
В качестве основы я взял официальный сэмпл BT HID-устройства с гитхаба Espressif. Собрав прошивку и протестировав что всё работает нормально, я принялся адаптировать её под свои задачи. Сначала я написал код для опроса кнопок: устанавливаем GPIO в режим входа с подтяжкой к высокому уровню, затем по запросу итерируемся по массиву с GPIO и заносим состояние кнопок в отдельный массив:
void input_initialize_hw() { for(int i = 0; i < INPUT_KEYS_COUNT; i++) { gpio_reset_pin(input_gpio_mapping[i]); gpio_set_direction(input_gpio_mapping[i], GPIO_MODE_INPUT); gpio_set_pull_mode(input_gpio_mapping[i], GPIO_PULLUP_ONLY); } }
void input_update_key_state() { for(int i = 0; i < INPUT_KEYS_COUNT; i++) input_key_states[i] = !gpio_get_level(input_gpio_mapping[i]); // TODO: Implement timestamp-based debouncing }
У любых механических кнопок есть особенность, которая называется дребезг. Случается она в момент когда мы отпускаем кнопку, но при этом размыкатель ещё не полностью поднялся в крайнее верхнее положение. Бороться с этим можно по разному, самый простой способ — программный, когда мы обновляем состояние кнопки только когда прошло определенное время (измеряемое в миллисекундах) с момента прошлого апдейта.
Все HID-устройства описываются специальным дескриптором, однако формат пакетов с репортами о состоянии устройства у них очень сильно отличается: мышки передают ускорение по осям X и Y, а также состояние кнопок, клавиатуры передают до 8-нажатых клавиш одновременно (наследие PS/2), а у геймпадов целый ворох стандартов (DirectInput, XInput... чего только нет. Кстати именно поэтому внешние геймпады обычно имеют несколько режимов). Алгоритм отправки репортов очень прост: 60 раз в секунду проверяем состояние кнопок, если какие-то нажаты — заполняем буфер с нажатыми клавишами и затем отправляем репорт хост-устройству.
Мы уже почти дошли до финала, осталось лишь чуть-чуть доработать прошивку смартфона! Для этого, его сначала необходимо рутировать: ставим CWM через Odin и устанавливаем SuperSU!
Поскольку кнопку включения я не предусмотрел в корпусе, было решено реализовать автостарт устройства от зарядки — прямо как на айфоне! Большинство смартфонов при отображении анимации зарядки на самом деле загружают ядро Linux и запускают специальную программу. Если эту программу подменить на перезагрузку в обычный режим — мы получим автостарт устройства!
На смартфонах Samsung за это отвечает бинарник /system/bin/lpm или же /system/bin/playlpm. Изначально я хотел сделать жёсткую ссылку на программу reboot, которая не работала пока не были запущены какие-то Samsung'овские службы. Затем я узнал что есть возможность напрямую направить ядру запрос о перезагрузке устройства с помощью sysrq.
Далее был написан простенький скрипт:
#!/system/bin/sh echo 1 > /proc/sys/kernel/sysrq echo b > /proc/sysrq-trigger
Который тоже не работал. И я понял что lpm нужно подменять другой самопальной программой. Так была написана и собрана с помощью NDK вот такая мелкая утилита, с которой уже всё заработало:
int main(int argc, char** argv) { system("echo 1 > /proc/sys/kernel/sysrq"); system("echo b > /proc/sysrq-trigger"); }
Далее необходимо было решить вопрос с виртуальными кнопками: поскольку в корпусе консоли виден только дисплей смартфона без кнопки Home, нам нужен был способ как-то управлять системой. Для этого было достаточно лишь пропатчить build.prop и добавить qemu.hw.mainkeys=0. В S4 Mini программные кнопки работают немного кривовато (только в портретной ориентации - т.е в нашем случае в режиме смартфона), но в целом пойдет. Я ещё немного поигрался в build.prop ради фана и добавил упоминания N-Gage :)
❯ Аппаратные доработки
Далее необходимо было решить вопрос с зарядкой. Как я уже говорил выше, было решено использовать Type-C. Я заказал разъём на плате, разобрал смартфон и кинул перемычки с цепи питания и сигнальных линий на разъем.
У Samsung'ов в те годы были не совсем стандартные разъемы с кучей пластика и к VBus'у аккуратно подпаяться немного проблематично
Теперь нужно решить задачу запитывания микроконтроллера. ESP32 в режиме BLE кушает целые 130мА (что очень много, телефоны нулевых кушали меньше с учетом параллельно работающего GSM-тракта!) в режиме активной передачи данных. Поскольку на самой плате с ESP32 используется LDO AMS1117 с высоким dropout-напряжением в 1.2В, для использования с обычным литий-ионным аккумулятором необходимо было использовать ULDO с дропаутом в ~0.3В...
...но зачем, если контроллер питания смартфона — буквально и есть многоканальный DC-DC преобразователь, который выдаёт сразу несколько различных напряжений:
0.8В-1.2В - VCore, это шина питания ядер процессора. Именно на ней работает вся или почти вся внутренняя логика системы на кристалле.
1.2V-1.8V VRef - обычно это референсное напряжение для работы процессора с внешней логикой. Впрочем, с таким напряжением может быть и одна из шин питания для каких-то модулей (например камеры), это зависит от платформы.
3.3V - Ну, здесь всё очевидно. 3.3В — одно из самых распространенных напряжений в микроэлектронике и может использоваться в широком спектре модулей. Например оно может использоваться для запитки модуля камеры, различных датчиков, контроллера тачскрина, усилителя и т.п. Именно эта шина питания в идеале нам и нужна.
Однако 3v3 уровни могут быть и логическими. Крайне не рекомендую вешать нагрузку аж в целых 130мАч на какую-нибудь цифровую линию, есть неиллюзорный риск спалить процессор или контролер питания. Лучше всего брать эту шину питания с здоровых decoupling-конденсаторов, однако имейте ввиду что шина может быть нагружена другими устройствами и вы со своей нагрузкой в сотню миллиампер можете увести КП в защиту!
В случае с S4 Mini у меня был сервис-мануал с схемой, где я принялся искать нужное напряжение. Изначально у меня была возможность взять 3.3В с питания eMMC, однако по ходу изучения схемы я заметил ещё одну подходящую шину питания — 3P0 (т.е 3В ровно), которая питает Wi-Fi, ИК-порт и тачскрин.
Я решил заглянуть в даташит на микроконтроллер и убедился, что он умеет работать в том числе и при 3В на входе, однако это пороговое напряжение при котором может работать чип. Если питание нестабильное и проседает, то МК либо зависнет, либо упадет в ресет. Однако я был уверен что на выходе DC-DC с КП смартфона точно должно быть всё нормальным. Я быстренько вывел перемычку и запитал МК буквально «в воздухе», проверил что всё работает стабильно, а затем припаял несколько жилок с LVDS-кабеля и закрепил УФ-маской.
Ну что ж, пришло время собрать всё воедино! Не без помощи дихлоэретана салазки были установлены, платы геймпада вставлены, все питания припаяны, а резьба в задней крышке была нарезана.
На МК ничего не слиплось — просто на момент фотографии мне всё ещё не пришёл флюкс-офф)
И вот, наконец-то моё детище собрано! Давайте же посмотрим что я там насобирал!
❯ Тестируем
Одним из основных критериев будущего игрового смартфона была конечно-же возможность сохранить функционал телефона. Иными словами, мне очень хотелось чтобы девайс повторял концепцию N-Gage и действительно в себе совмещал возможность звонить и удобно играть в игры!
В целом, я считаю что у меня это вполне получилось. Помимо функций самой звонилки, Android 4.4 всё ещё вполне может порадовать владельца базовым серфингом сети (большинство сайтов не откроется... ну нам и опеннета хватит!) и мессенджерами - здесь пока ещё работают и Telegram, и ВК в лице в Kate Mobile. Однако есть определенный нюанс... я взял GT-I9190 - т.е односимочную 3G-версию S4 Mini. А как известно, 3G в России уже практически не используется, поэтому вне Wi-Fi придется ограничится EDGE :)
Вчера я сделал анонс статьи на Пикабу и несколько читателей задали резонный вопрос: это же буквально смартфон 2013 года, он же, на первый взгляд, ничего не умеет в современных реалиях. Однако спешу вас заверить что под капотом всё не так уж и плохо! 400'ого Snapdragon'а хватает для большинства мобильных игр тех лет, не говоря уже об эмуляторах. При этом в отличии от старших 600'ых снапов (тогда 800'ый ещё не вышел), он не слишком сильно греется и более лоялен к и без того не самому объёмному аккумулятору!
Однако про опыт использования смартфонов прошлых лет в современных реалиях я уже не раз рассказывал в других своих статьях, поэтому предлагаю перейти к тесту игр. И начнем мы с вами с эмулятора NES.
Когда запускаешь любимый Super Mario Bros на офигенной AMOLED-матрице, то сразу понимаешь что весь проект был затеян точно не зря. После отключения линейного фильтра и растягивания картинки на весь экран, то диву даешься какие тут сочные цвета - не как на ЭЛТ-телевизоре, но тоже очень годно! Эмулятор работает очень шустро!
Ещё раз ноапомню что справа не рамка, а забагованные софт-кнопки. А вот сверху - рукопопие :)
Давайте же перейдем к чему-то ещё более пестрому и "графонистому" - а именно к Sega Mega Drive с оригинальным Соником! Здесь игра точно также летает, звук не хрипит, а картинка выглядят максимально приятной. Когда-то AMOLED-матрицы Samsung ругали за PenTile и немного не естественную цветовую схему... но в эмуляторах она как-будто какой-то шарм придает.
Далее предлагаю опробовать DOS'овскую классику - Wolfenstein 3D. Помимо "вольфа", я хотел добавить в тесты также и Quake... но порты попались кривые и не запускались. Очевидно что игра, которая шла даже на 286'ом, будет отлично летать на S4 Mini:
Ну и нативные игрушки здесь тоже работают неплохо. В какие-нибудь аркады типа Angry Brids, Fruit Ninja или Asphalt можно поиграть с большим удовольствием!
❯ Заключение
Вот такой незамысловатый и полезный девайс у нас с вами сегодня получился. Вы можете собрать такой и сами, схему, код прошивки и исходные файлы моделей я выкладываю на своём Github. Корпус можно "пощупать" в TinkerCad.
Сама разработка заняла всего 7 дней, большая часть времени ушла на подгонку деталей. Да, эту неделю я определенно точно почти не спал и даже один раз попсиховал. Однако все время разработки мне было дико весело и интересно. Ну, а что ещё пареньку в 23 года то нужно, кроме как писать код, копаться в девайсах и ТАЗах!?
Жду ваше мнение о моей самоделке в комментариях! А если вам интересна тематика ремонта, моддинга и программирования для гаджетов прошлых лет, подписывайтесь на мой Telegram-канал «Клуб фанатов балдежа», куда я публикую бэкстейджи статей, иногда полезные посты ну и немножечко щитпоста! Если вам интересны мои видео той же тематики — предлагаю подписаться на мой YouTube-канал.
Как вам статья?
Как вам девайс?
Важно
Друзья! Для подготовки статей с разработкой самопальных игрушек под необычные устройства, объявляется розыск телефонов и консолей! В 2000-х годах, китайцы часто делали дешевые телефоны с игровым уклоном — обычно у них было подобие геймпада (джойстика) или хотя бы две кнопки с верхней части устройства, выполняющие функцию A/B, а также предустановлены эмуляторы NES/Sega. Фишка в том, что на таких телефонах можно выполнять нативный код и портировать на них новые эмуляторы, чем я и хочу заняться и написать об этом подробную статью и записать видео! Если у вас есть телефон подобного формата и вы готовы его задонатить или продать, пожалуйста напишите мне в Telegram (@monobogdan) или в комментарии. Также интересуют смартфоны-консоли на Android (на рынке РФ точно была Func Much-01), там будет контент чуточку другого формата :)
А также я ищу старые (2010-2014) подделки на брендовые смартфоны Samsung, Apple и т. п. Они зачастую работают на весьма интересных чипсетах и поддаются хорошему моддингу, парочку статей уже вышло, но у меня ещё есть идеи по их моддингу! Также может у кого-то остались самые первые смартфоны Xiaomi (серии Mi), Meizu (ещё на Exynos) или телефоны Motorola на Linux (например, EM30, RAZR V8, ROKR Z6, ROKR E2, ROKR E5, ZINE ZN5 и т.п, о них я хотел бы подготовить специальную статью и видео т. к. на самом деле они работали на очень мощных для своих лет процессорах, поддавались серьезному моддингу и были способны запустить даже Quake!). Всем большое спасибо за донаты!
Статья подготовлена при поддержке TimeWeb Cloud. Подписывайтесь на меня и @Timeweb.Cloud чтобы не пропускать новые статьи каждую неделю!
На Ютубе выкладывал давно уже, а сюда забыл выложить. Исправляюсь.
Линейный актуатор необходим мне для имитации нагрузок и наклонов во время движения на игровом автомобиле в автосимуляторах.
Существуют готовые системы, но стоят каких-то заоблачных денег.
В основном цена это серво мотор, механика и главное софт.
Мне удалось снизить стоимость до 85 тыс рублей приблизительно, заменив сервопривод на шаговый мотор с замкнутым контуром. Этот мотор оснащён энкодером, который позволяет определить относительное положение вала.
А так же корпус не из литого алюминия, а напечатанный на 3д принтере. Что-то сделал на домашнем станке с чпу (алюминиевую пластину и печатную плату)
Я серьёзно модернизировал китайский станок. В результате от оригинального станка осталась только рама. О процессе модернизации я могу рассказать в другом сообщении, если вам будет интересно.
В качестве контроллера я выбрал STM32F103C8T6. Одна плата предназначена для связи с компьютером, остальные управляют положением линейного актуатора. Обмен данными между ними и главной платой осуществляется по протоколу i2c.
Прошивку писал на уровне своих знаний, вероятно можно сделать в разы лучше. Работает - не трогай 😄.
Управление мотором осуществляется при помощи драйвера HBS86H. Питание обеспечивается от источника постоянного тока напряжением 60 В. Все компоненты размещены в компактном корпусе, который изготовлен из МДФ, листов ABS и стоек, созданных с помощью 3D-принтера.
Винт имеет тип SFU 1610, то есть он совершает 10 мм хода за один оборот. Поскольку шаговые двигатели не обладают такой высокой скоростью, как сервоприводы (800-1000 оборотов в минуту против 3000 оборотов у сервоприводов), то шаг винта играет важную роль. Сначала я приобрёл винт 1605, но затем решил его заменить.
В итоге удалось добиться скорости 120 мм/с, в то время как зарубежные аналоги работают со скоростью 400 мм/с. Максимальное перемещение составляет 85 мм, тогда как у аналога этот показатель равен 60 мм.
Вот такие вот углы можно получить:
Это фотографии первой версии с тремя "ногами".
Софт собственной разработки. Написан преимущественно на C#. Интерфейс программы на английском, т.к. основная масса подписчиков на Ютубе иностранцы.
Поддерживаются практически все известные автосимуляторы:
Как известно, к Новому году всегда надо готовиться заранее. Вот и мне подумалось, что надо расчехлять паяльник и начинать делать праздничную иллюминацию в квартире. На данный момент готовы два устройства из трёх, для последней гирлянды едут адресные светодиоды. Но идея обкатана и показала себя вполне рабочей.
Этап первый. Теоретический.
Любое мало-мальски инженерное устройство должно начинаться с 1) Составления ТЗ 2) Подбора железа 3) Подбора ПО Второй третий пункт взаимосвязаны, что логично.
Итак, техническое задание.
У меня работали две гирлянды, собранные на WS2812b под управлением маленькой платки Arduino Nano (родом из Китая) с микроконтроллером ATmega328p. Как это водится в Китае - маркировка чипа была почти нечитаемой, прошивка заливалась раза с третьего-четвёртого. Но система работала, и даже не тормозила.
Гирлянд было две: одна висела на ёлке и состояла из 126 последовательно соединённых светодиода, оконная гирлянда состояла из 74 светодиодов и представляла собой 9 линий светодиодов переменной длины, соединённых последовательно.
В старой гирлянде было крайне неудобно включать/выключать подсветку и переключать режимы. Это же необходимо встать с дивана, подойти к устройству, нажать кнопку. Соответственно, в новой системе необходимо реализовать управление через мобильный телефон. Так же, стоит учесть, что в моём доме ёлка стоит около окна, и будет видно сразу две гирлянды. Соответственно, стоит предусмотреть возможность обмена данными между этими гирляндами для возможности синхронизации режимов. Причём, синхронизация должна быть не "приколоченной намертво", а вполне себе опциональной.
Подбор железа
Исходя из ТЗ становится очевидно, что достаточно просто поменять контроллер с старой-доброй атмеги на что-то из семейства ESP. Эта система на кристалле (да, именно так её называет производитель, SoC) из коробки имеет на борту достаточно шустрое ядро, WiFi и приличный объём памяти. Но, имеет место быть небольшой конфликт: рабочее напряжение пинов ESP 3.3В. А напряжение питания WS2812b составляет от 3.5 до 5.3В, исходя из даташита. Причём, "протокол" передачи данных для светодиодов подразумевает формирование прямоугольных испульсов, кодирующих 24 бита цвета для каждого светодиода. Уровень "0" в этой последовательности должен быть <0.3VDD (напряжение питания), уровень "1" >0.7VDD.
Я покопался в своих закромах и обнаружил две платы Wemos D1 mini (на базе ESP8266) и одну плату LOLIN S2 mini (на базе ESP32-S2). Обе платы имеют всю необходимую обвязку для подключения внешнего питания 5В и подтягивающие резисторы для запуска МК. Там же, в закромах родины нашёл весьма удобные макетные платы под форм-фактор этих устройств.
Макетная плата для Wemos D1. К LOLIN S2 mini тоже подходит, но маркировака пинов не совпадёт
Это снимает проблему согласования напряжения питания ESP и WS2812b. Но возникает опасение, что уровень логической "1" от контроллера будет недостаточным для формирования управляющего сигнала. Ведь, согласно даташиту, уровень "1" >0.7VDD. А питание светодиодов у нас 5В, соответственно, требуемый уровень логической единицы равен 0,7 * 5 = 3,5В. Тут я пошёл по пути экспериментов, быстренько набросал схемку на бредборде и проверил, а как оно, заведётся, или нет. Ведь, исходя из моего опыта общения с контроллерами семейства STM32, уровня 3.3В должно быть вполне достаточно. И оно завелось!
Подбор ПО
Очевидно, что прошивка будет самописная. Надеяться, что вот сейчас я зайду в гугл, забью "прошивка ESP8266 с моими требованиями" и все найдётся и заработает достаточно наивно. Да и неспортивно это. В случае с ESP есть два основных фреймворка для написания прошивки. Профессиональный ESP-IDF с его ориентированностью на чистый С и Arduino IDE с ядром ESP. Причём второе - это, по сути своей, обёртка вокруг ESP-IDF. Так как у меня была хоть и ущёрбная, но рабочая прошивка для Arduino Nano, написанная в Arduino IDE, я остановился на втором варианте.
Этап второй. Практическая реализация в железе.
Схема в общем виде выглядит так:
Ничего сложного и интересного. Единственное, для одной из систем одна из кнопок была заменена на устройство bme280, работающее по протоколу I2C. Интересно отслеживать влажность в помещении и уровень давления. Показания температуры врут безбожно: датчик находится слишком близко к ESP, которая имеет привычку сильно нагреваться. Спаять устройство по этой схеме не представляет ничего сложного. Но ведь хочется сделать всё красиво. А значит нужен корпус для устройства и система крепления гирлянды. С корпусом всё довольно просто. Минут 30 в Компас3D, час работы 3D принтера и в руках корпус, подогнанный под конкретное спаянное устройство. Магия термоклея, и на выходе получается вполне себе симпатичный прибор:
Безусловным плюсом будет возможность заменить плату в случае необходимости
С системой крепления всё чуточку интереснее. Если на ёлку крепить гирлянду не требуется (просто берём и обматываем гирлянду вокруг дерева), то на окно требуется крепёж. Тут возможно реализовать два варианта: установить гирлянду непосредственно перед окном, но за шторой. Тогда праздничное настроение будет создано людям, гуляющим на улице и смотрящим на мой седьмой этаж. Либо размещать гирлянду перед шторой. Тогда праздничное настроение будет у всех, находящихся в комнате. Я пошёл по второму пути. Штора крепится на гардину с Т-образными пазами. И вновь на помощь приходит компас и 3D-принтер. В каждой точке, из которой спускается светодиодная гирлянда была изготовлена вот такая сборка из двух деталей:
Бонусом, такая конструкция хорошо фиксирует сборки проводов, и конструкция получается довольно добротной. Следующей "железной" проблемой стало то, что провод со светодиодами достаточно лёгкий, и гирлянда отказывалась висеть вертикально. И вновь 3D принтер спасает положение. Я напечатал несколько тематических грузиков, и привязал их на тоненькие верёвочки. Получилось весьма достойно:
Этап третий. Программное обеспечение aka прошивка
А вот прошивку не скину в чистом виде. Только если кто-то хочет повторить - могу ему слить данное поделие. Ибо в коде есть ряд проблем, которые пока не решены.
Принцип работы системы прост до ужаса. Намертво зашиты константы с SSID/PASS моей локальной WiFi сети и IP адреса всех гирлянд, участвующих во взаимодействии. Arduino IDE хорош, в первую очередь, невероятным количеством библиотек. Итак, что есть сейчас, и для чего используется.
Разумеется, WiFi, для подключения к локальной сети. SSID и пароль забиты в дефайны, что есть хардкод, и вообще моветон
FastLED для управления WS2812b. Реализован простейший алгоритм отслеживания потребляемого гирляндой тока и ограничение оного к возможностям источника питания. Работает, на мой взгляд, лучше встроенного в библиотеку.
WebServer для поднятия странички управления гирляндой, если сильно лень подходить и нажимать кнопку. Я не сильно дизайнер, но страничка получилась довольно простой и информативной.
UDP для общения между гирляндами. Да, я знаю, что есть ненулевой шанс потери данных, поэтому пришлось реализовать достаточно простой алгоритм проверки корректности пришедших данных. Битые пакеты отбрасываются. Вроде бы это не очень хорошо, но я тут не космический корабль запускаю, и не ядерным реактором управляю. Если синхронизация произойдёт на 100мс позже, то ничего страшного. Хардкод в данном случае - IP-адреса гирлянд, участвующих в обмене информацией, жестко прописанные в роутере.
ArduinoOTA. Лень каждый раз подключать ESP напрямую к компу, когда хочется что-то поменять в прошивке. А так всё выходит просто: обновились по воздуху, и радуемся.
Web-страничка для управления гирляндой
В качестве гирлянды-мастера выбрана ёлочная. На её страничке можно поставить галочку с требованиями синхронизации остальных гирлянд, и её режим будет транслироваться всем остальным.
Примеры гирлянды, которую мне лень снимать сейчас :)
Примеры гирлянды, которую мне лень снимать сейчас :)
Примеры гирлянды, которую мне лень снимать сейчас :)
В сухом остатке получилось несколько устройств, на которые не стыдно посмотреть, которые не стыдно показать и которые работают и радуют глаз. Возможно, когда разберусь с текущими проектами - вернусь к доработке гирлянд. Избавиться от хардкода, что не очень сложно и чуть улучшить синхронизацию (заставить гирлянду-мастера передавать не только свой текущий режим, но и конкретный тик из millis() для более эффектного внешнего вида) и всё, пожалуй. Сделать полноценное Android-приложение, управляющее гирляндами. Возможно, имеет смысл сделать отдельный сервер на полновесной ESP32, который собирал бы данные с гирлянд, и синхронизировал их при необходимости. Но это уже вопрос полноценного самописного умного дома, т.к. к такому серверу можно подключить любое устройство на базе ESP. Для работы с MQTT так же есть полноценные библиотеки. В общем, проект получился достаточно простым, но интересным с точки зрения возможности масштабирования.
На этом всё, спасибо, что дочитали. Ссылок на телегу не будет, это всё от лукавого :)
Привет всем) И неожиданно моим 25 подписчикам, не думал что кому то моё рукоблудие интересно, но приятно. И сегодня будет простая самоделка. Но в целом полезная. И так, начинаю потихоньку утеплять балкон и появилась идея понимать сколько у меня на балконе температура и влажность заодно) Ну и плюс когда выхожу с утра курить даже не заглядываю в телефон что бы посмотреть погоду на улице, а тут вышел и прям перед глазами, не ну удобно же. Идея есть, осталось реализация. И так, для этой идеи как всегда начнём со схемы. Всё максимально просто. Берем arduino nano, DHT22 две штуки и LCD1602
Далее всё собираем на макетной плате и проверяем
Отлично, работает. Теперь всё это дело надо собрать в корпус и спаять. Берем значит пластиковую коробочку для корпуса купленную на радиорынке(100Х60Х25), для экрана и ардуино, и распред коробку для того что бы вывести датчик на улицу.Для начала вырезаем отверстие под экран и красим. Как всегда, грунт, краска, лак матовый.
Получилось не идеально но пойдёт, окнтовка вокруг экрана нужна для того что бы скрыть неровности вырезки))))А всё почему, потому что нету у меня чпу фрезера, ну и плюс я рукожоп))))
Теперь приступим к распред коробке которая будет на улице, в ней достаточно высверлить отверстия. Красить не вижу смысла так как она будет на улице.
Теперь вставляем датчик и крепим всё на спермоклей, господи как же я его обожаю ммммммммм. Ну и закрываем им же лишние отверстия в которые может затечь вода
Датчик на улице будем крепить именно в положении как на фото выше. Теперь приступим к основному блоку. Ну тут всё просто, клеим как всегда на наш любимый спермоклей экран и ардуино и припаиваем всё согласно схеме
Получилось не очень красиво, ну оно нам и не нужно. Господи как же я ненавижу навесной монтаж, в следующий раз буду делать печатную плату.Провода датчиков и питания я приделал что бы не вырвать на всякий случай)
Ну и получаем такую картину в собранном виде
у и теперь крепим на балкон, и смотрим что у нас тут получается. Провода я пока спрятать в кабель канал не успел =(
Код можно найти по ссылке. В целом данная самоделка еще проходит тестирование но получилось вроде как не плохо а главное работает и мне нравится. Да и надпись видно из комнаты. Если появятся какие либо обновления в корпусе иили коде, дам знать. По цене не подскажу, так как в прошлых постах всем не понравилось что я не учитваю свой труд, инстурмент, электричество и так далее))))) Как всегда готов для новых идей, предложений, и критики. Я помню про другие проекты просто пока времени вообще нет, но обязательно сделаю. До новых встреч =)
Закончился мой хобби-проект часов, вот как это было.
Летом провожу много времени на стадионе, катаюсь на роликах, пока сын занимается футболом, и очень мне не хватает там часов. На телефоне неудобно смотреть время, фитнес-браслет или часы не прижились. Я смотрел на новое здание стадиона и представлял на нем часы, вот прямо просились они туда.
Здание центра единоборств, город Усть-Лабинск, фото из интернета.
Появилось желание сделать светодиодные часы. Предоставленный эскиз руководитель стадиона утвердил, только попросил изменить цвет на белый.
Эскиз, фото из интернета.
Был закуплен материал, запчасти и начата сборка. Основа - аллюминиевый уголок, на нем лента 240 светодиодов на метр, четыре платы с управлением на сдвиговых регистрах и основная плата с ардуиной. Время берётся с GPS-модуля, также есть датчик света для регулирования яркости, модуль часов реального времени, но программно он не задействован, и другие детали.
Всем добра! Сосед у меня заядлый танкист. Близился у него юбилей, придумал чем порадовать человека.
Из ESP8266, светодиодной матрицы, кнопки и гнезда получились вот такие часы. Матрица была 8*32, мне показалась маловата. К ней прицепил еще одну 8*8. Корпус из пластика, обклеен плёнкой. С декоративными уголками пришлось повозиться, подгонять углы. Дисплей - бутерброд из прозрачного пластика, плёнки для тонировки авто и бумажной кальки чтоб рассеивать немного точки светодиодов.
Шрифт и стрелки сам рисовал в каком-то редакторе, найденном на просторах интернета. Главная для меня заморочка была с JSON, так как никогда до этого с ним не сталкивался. Немного помог сын программист.
Алгоритм работы такой: 1. подключаемся к Wi-Fi. 2. Тянем время с NTP сервера. 3. Через API танкового сервера берём статистику, если она отличается от сохранённой, перезаписываем. 4. Выводим текущее время. 5. Раз в 15 минут или по нажатию кнопки выводим бегущую строку со статой.