Сообщество - TECHNO BROTHER

TECHNO BROTHER

2 021 пост 13 454 подписчика

Популярные теги в сообществе:

Технари, помогите найти Aerocool Dead Silence Cube

Ищу неистово этот корпус в подарок. Он снят с производства и давно не продается в магазинах, осталась надежда на то, что кто-то имеет и пожелает продать б/у. Но на данный момент перерыт весь гугл, просмотрены все площадки с объявлениями, нигде пока актуальных предложений нет.

Собственно, суть просьбы: если Вы имеет в собственности Aerocool Dead Silence Cube и не против его продать, то напишите, пожалуйста) В ТГ @i_am_vsd

Технари, помогите найти Aerocool Dead Silence Cube Aerocool, Помощь, Помогите найти, Поиск, Компьютерная помощь, Сила Пикабу, Корпус ПК
Показать полностью 1
649

Ретропонедельник №98. Синяя лампа

Начинаем неделю с нового экспоната в моем виртуальном музее советской бытовой техники. Сегодня это медицинский прибор который был практически в каждой семье. Рефлектор Минина, он же "синяя лампа".

Ретропонедельник №98. Синяя лампа Сделано в СССР, Техника, Синяя лампочка, Бытовая техника, Виртуальный музей, Медтехника, Длиннопост

Предназначался для прогрева чего угодно при каком угодно заболевании. Такой чудо девайс с целительным светом. Без изменений выпускался практически весь период существования СССР.

Ретропонедельник №98. Синяя лампа Сделано в СССР, Техника, Синяя лампочка, Бытовая техника, Виртуальный музей, Медтехника, Длиннопост

И что удивительно - помогал! Правда это уже в 21 веке мы узнали что такое доказательная медицина и эффект плацебо.

Ретропонедельник №98. Синяя лампа Сделано в СССР, Техника, Синяя лампочка, Бытовая техника, Виртуальный музей, Медтехника, Длиннопост

Рефлектор, а в фокусе - лампа с синей колбой. За счет цвета она отсекает большую часть видимого излучения лампы и при прогреве она не так слепит. Тоесть можно прогревать и обычной лампочкой без цвета, просто это будет не так комфортно.

Ретропонедельник №98. Синяя лампа Сделано в СССР, Техника, Синяя лампочка, Бытовая техника, Виртуальный музей, Медтехника, Длиннопост

Написано:

РЕФ. МЕД

220В 60 ВТ

2Р38к ТУ205

РСФСР

07.581-83

Ретропонедельник №98. Синяя лампа Сделано в СССР, Техника, Синяя лампочка, Бытовая техника, Виртуальный музей, Медтехника, Длиннопост

Логотип завода не опознан:

Ретропонедельник №98. Синяя лампа Сделано в СССР, Техника, Синяя лампочка, Бытовая техника, Виртуальный музей, Медтехника, Длиннопост

Конструкция простая и изящная, даже выключателя нет.

Ретропонедельник №98. Синяя лампа Сделано в СССР, Техника, Синяя лампочка, Бытовая техника, Виртуальный музей, Медтехника, Длиннопост

Свет от лампы не интенсивный бело-голубой.

Ретропонедельник №98. Синяя лампа Сделано в СССР, Техника, Синяя лампочка, Бытовая техника, Виртуальный музей, Медтехника, Длиннопост
Показать полностью 8
595

Этот китайчик просто любит жизнь: реставрируем игровую консоль с помойки за 250 рублей

Этот китайчик просто любит жизнь: реставрируем игровую консоль с помойки за 250 рублей Покупка, Девайс, Гаджеты, Планшет, Игры, Консоли, Ретро, Китайцы, AliExpress, Android, Диковинки, Барахолка, Длиннопост



Ни для кого не секрет, что иногда на онлайн-барахолках можно встретить продавцов, которые продают различные устройства с помойки. И ведь иногда прямо слёзы наворачиваются от того, какие крутые штуки люди умудряются выкидывать. Зачастую подобные девайсы требуют серьёзного обслуживания, но и стоят копейки: недавно я увидел симпатичную игровую консоль PGP Aio Droid Letto, которая привлекла моё внимание своими миниатюрными размерами и симпатичным дизайном, а ещё тем, что была в ужаснейшем состоянии и стоила всего 250 рублей. А поскольку я обожаю копаться в различных девайсах и давать им вторую жизнь, я сразу же её заказал! Сегодня мы с вами: приведем корпус устройства в подарок, подберем дисплей от GPS-навигатора, найдём прошивку на безымянное устройство и перепрошьём с помощью замыкания ножек NAND, а также посмотрим, годится ли на что-то консоль по цене кофе в столице!

Покупка

Мои давние читатели знают, что я просто обожаю различные старые китайские консоли. Денди, сеги, портативные устройства: уже как минимум с 10'ок игровых консолей я отремонтировал и написал о них статьи. Как уже было упомянуто выше, нашим сегодняшним героем станет некая PGP Aio Droid Letto 2012 года выпуска — ODM устройство, на которое налепили шилдик PGP. В своё время, подобные консоли были довольно популярны (в первую очередь — из-за своей цены) и как минимум несколько китайских заводов разрабатывали и продавали их локальным брендам под реализацию. Средняя цена была 2.000-6.000 рублей, что было весьма немного.

Этот китайчик просто любит жизнь: реставрируем игровую консоль с помойки за 250 рублей Покупка, Девайс, Гаджеты, Планшет, Игры, Консоли, Ретро, Китайцы, AliExpress, Android, Диковинки, Барахолка, Длиннопост



Листал я себе онлайн-барахолку в поисках игровых консолей и увидел Letto за преусловный прайс 250 рублей. Как уже говорил в интро — меня привлек приятный дизайн и компактность: я любитель поиграть в дороге, но даже PS Vita/PSP может оказаться великоватой для кармана летних шорт. А тут идеальный вариант! Ну и конечно же я видел плачевное состояние консоли и мне хотелось в ней покопаться и попытаться довести до ума.

Этот китайчик просто любит жизнь: реставрируем игровую консоль с помойки за 250 рублей Покупка, Девайс, Гаджеты, Планшет, Игры, Консоли, Ретро, Китайцы, AliExpress, Android, Диковинки, Барахолка, Длиннопост



Заказ сделан, консоль пришла из Анапы в Ейск за несколько дней и вот, уже дома я начинаю осматривать покупку и разбирать консольку. И конечно же без серьезного ремонта не обошлось!

Хардварный ремонт

Разобрать устройство довольно легко: лишь выкрутить 4 винтика, которые уже кто-то до меня потерял и расщелкнуть корпус. Перед нами открывается плата, которая не похожа на топляка, но явные следы попадания влаги имеют. Кроме того, она очень пыльная.

Этот китайчик просто любит жизнь: реставрируем игровую консоль с помойки за 250 рублей Покупка, Девайс, Гаджеты, Планшет, Игры, Консоли, Ретро, Китайцы, AliExpress, Android, Диковинки, Барахолка, Длиннопост
Этот китайчик просто любит жизнь: реставрируем игровую консоль с помойки за 250 рублей Покупка, Девайс, Гаджеты, Планшет, Игры, Консоли, Ретро, Китайцы, AliExpress, Android, Диковинки, Барахолка, Длиннопост



Поскольку устройство действительно могло лежать в грязном месте, я решил сначала полностью отмыть корпус в два этапа: мылом и спиртом. Причём спиртом мы не только дезинфицируем устройство, но и оттираем неприятное и липкое софт-тач покрытие, которое разлагается от времени.

Этот китайчик просто любит жизнь: реставрируем игровую консоль с помойки за 250 рублей Покупка, Девайс, Гаджеты, Планшет, Игры, Консоли, Ретро, Китайцы, AliExpress, Android, Диковинки, Барахолка, Длиннопост
Этот китайчик просто любит жизнь: реставрируем игровую консоль с помойки за 250 рублей Покупка, Девайс, Гаджеты, Планшет, Игры, Консоли, Ретро, Китайцы, AliExpress, Android, Диковинки, Барахолка, Длиннопост



После мытья и сушки корпуса, я решил заодно и заменить дисплей. Родной оказался с царапинами и неприятной трещиной на тачскрине. И вот тут есть маленький лайфхак: кто сказал, что дисплеи для таких устройств нужно покупать по названию модели втридорога? Секрет вот в чём: в небольшие консоли, китайцы обычно ставили стандартные матрицы с разрешением 480x232 и интерфейсом TTL RGB от… автомобильных навигаторов и фоторамок! Почти все дисплеи с этим интерфейсом унифицированы и имеют одинаковый шлейф (40 пин) и распиновку, а поскольку тачскрин у таких модулей резистивный (резистивный тач требует всего 4 сигнальных линии), то он сразу же включен в общий шлейф дисплея, делая дисплеи навигаторов и китайских консолей взаимозаменяемыми! Вот вам и идея, куда можно применить старый нерабочий авто-навигатор :)

Этот китайчик просто любит жизнь: реставрируем игровую консоль с помойки за 250 рублей Покупка, Девайс, Гаджеты, Планшет, Игры, Консоли, Ретро, Китайцы, AliExpress, Android, Диковинки, Барахолка, Длиннопост



Включаем устройство и проверяем новый дисплей. Всё работает отлично — цветопередача стала немного лучше по сравнению с родным дисплеем, а ещё на этом этапе выяснилось, что устройство висит на заставке. Но нам ещё есть что сделать по хардварной части.

Этот китайчик просто любит жизнь: реставрируем игровую консоль с помойки за 250 рублей Покупка, Девайс, Гаджеты, Планшет, Игры, Консоли, Ретро, Китайцы, AliExpress, Android, Диковинки, Барахолка, Длиннопост



После осмотра платы, на фронтальной стороне можно увидеть сгнивший SMD-элемент. Скорее всего, это ключ и я изначально предположил, что он отвечает за питание камеры (т.к находился близкой к ней). К сожалению, после того, как я счистил коррозию, оказалось что один пятачок и ножка ключа сгнили :( И чуть позже это стало серьёзной проблемой.

Этот китайчик просто любит жизнь: реставрируем игровую консоль с помойки за 250 рублей Покупка, Девайс, Гаджеты, Планшет, Игры, Консоли, Ретро, Китайцы, AliExpress, Android, Диковинки, Барахолка, Длиннопост



Не забываем почистить аналоговой стик от грязи и пыли. Подойдет спирт или контакт-клинер.

Этот китайчик просто любит жизнь: реставрируем игровую консоль с помойки за 250 рублей Покупка, Девайс, Гаджеты, Планшет, Игры, Консоли, Ретро, Китайцы, AliExpress, Android, Диковинки, Барахолка, Длиннопост



Программный ремонт

Поскольку консоль висела на заставке, нам предстояло найти прошивку и прошить устройство. Тут нам очень помогает Wayback Machine: ищемоф. сайт устройстваи пытаемся найти кликабельные ссылки на прошивку. В моём случае, ссылка была наяндекс диски файл был на месте!

Этот китайчик просто любит жизнь: реставрируем игровую консоль с помойки за 250 рублей Покупка, Девайс, Гаджеты, Планшет, Игры, Консоли, Ретро, Китайцы, AliExpress, Android, Диковинки, Барахолка, Длиннопост



Однако в архиве нет никакой инструкции: лишь софт для прошивки и сама прошивка. У меня был опыт с GP33003, поэтому я быстро разобрался: нам придется замкнуть пару ножек на чипе NAND. Для этого гуглим модель NAND и ищем даташит. В даташите смотрим на распиновку и ищем пины I/O — это сигнальные линии, в моём случае они находятся снизу, 5 и 6. Суть манипуляций проста: при загрузке, первичный загрузчик (Boot ROM) пытается загрузить вторичный загрузчик из встроенной памяти. Если зажата одна из сервисных кнопок (а таковых у этой консоли нет) или вторичный загрузчик найти не удалось (если плата только-только с конвейера), то он переводит консоль в режим прошивки с помощью фирменного софта. Замыкая сигнальные линии, отвечающие за ввод-вывод (и таким образом, выдавая билиберду вместо нормальных данных), мы обманываем первичный загрузчик и как-бы делаем вид, что в памяти нет системы и плата только-только с конвейера.

Этот китайчик просто любит жизнь: реставрируем игровую консоль с помойки за 250 рублей Покупка, Девайс, Гаджеты, Планшет, Игры, Консоли, Ретро, Китайцы, AliExpress, Android, Диковинки, Барахолка, Длиннопост



По итогу девайс определился и пошёл прошиваться фирменной программой без каких либо проблем. 5 минут и вуаля! Устройство уже загрузилось и предложило откалибровать тачскрин!

Этот китайчик просто любит жизнь: реставрируем игровую консоль с помойки за 250 рублей Покупка, Девайс, Гаджеты, Планшет, Игры, Консоли, Ретро, Китайцы, AliExpress, Android, Диковинки, Барахолка, Длиннопост
Этот китайчик просто любит жизнь: реставрируем игровую консоль с помойки за 250 рублей Покупка, Девайс, Гаджеты, Планшет, Игры, Консоли, Ретро, Китайцы, AliExpress, Android, Диковинки, Барахолка, Длиннопост



Собираем девайс и всё проверяем: кнопки работают, стик работает, всё замечательно! Или не совсем… а звук то где? Я полез менять динамик, предположив, что возможно он не перенес солёной ванны но всё оказалось куда печальнее. Ведь тот самый сгнивший ключ как раз относился к аудиотракту… Звука нет совсем, даже на подключение наушников устройство не реагирует… Вот обидно то, а? И Bluetooth у нас тоже нет. И ведь судя по всему, отлетел пятачок IN, а не GND :(

Этот китайчик просто любит жизнь: реставрируем игровую консоль с помойки за 250 рублей Покупка, Девайс, Гаджеты, Планшет, Игры, Консоли, Ретро, Китайцы, AliExpress, Android, Диковинки, Барахолка, Длиннопост



Но это не помешает нам попробовать потестировать консольку в эмуляторах и проверить её в играх. GP33003 — вполне бодрый чип, который тянет большинство эмуляторов вплоть до PS1. Попробуем поиграть в игры для NES, SMD, SNES и PS1. Справится ли она с ними?

Играем

Сначала я решил погонять парочку предустановленных игр: Fruit Ninja и Trial X. И обе игрушки шли отлично: за Trail X можно даже повспоминать про давно ушедшие годы Gravity Defied. Игра идёт стабильно, без каких-либо лагов. В целом, спокойно можно ставить нативные игры до ~2013-2014 года — они здесь пойдут хорошо.

Этот китайчик просто любит жизнь: реставрируем игровую консоль с помойки за 250 рублей Покупка, Девайс, Гаджеты, Планшет, Игры, Консоли, Ретро, Китайцы, AliExpress, Android, Диковинки, Барахолка, Длиннопост



Эмулятор PS1 в лице EPSXE без проблем дал настроить хардварные кнопки и попробовать поиграть в Time Crisis. FPS хороший, а как я понимаю, это далеко не самая легкая игра для PS1. Никаких лагов нет, но плавность звука, по понятным причинам, проверить нельзя. Автопропуск кадров делает своё дело (при этом рывков нет).

Этот китайчик просто любит жизнь: реставрируем игровую консоль с помойки за 250 рублей Покупка, Девайс, Гаджеты, Планшет, Игры, Консоли, Ретро, Китайцы, AliExpress, Android, Диковинки, Барахолка, Длиннопост



А вот эмуляторы классики, такие, как PS1 или SMD работают без нареканий. Ну если уж тяжелющий эмуль PS1 потянул, то с чего бы ему не тянуть 8 и 16 битки? Проблем никаких нет, все кнопки можно забиндить без танцев с бубном (виртуальный джойстик можно убрать).

Этот китайчик просто любит жизнь: реставрируем игровую консоль с помойки за 250 рублей Покупка, Девайс, Гаджеты, Планшет, Игры, Консоли, Ретро, Китайцы, AliExpress, Android, Диковинки, Барахолка, Длиннопост
Этот китайчик просто любит жизнь: реставрируем игровую консоль с помойки за 250 рублей Покупка, Девайс, Гаджеты, Планшет, Игры, Консоли, Ретро, Китайцы, AliExpress, Android, Диковинки, Барахолка, Длиннопост



И конечно же, консоль можно использовать в качестве простенького планшета. В ВК ленту полистать, или видос посмотреть (тут был бы HDMI кстати) — короче доступны почти все фишки планшетов 2012-2013 годов. Вполне неплохо, да?

Заключение

Копаться в этом девайсе было весело. Увы, но малину подпортил сгнивший ключ: со звуком от консоли было бы гораздо больше толку. Однако сама по себе концепция устройства очень классная и я понимаю, почему современные анберники в похожем дизайне и форм-факторе расходятся как горячие пирожки: это действительно удобно! И даже несмотря на довольно старое железо, если у вас есть подобный девайс, он всё ещё может оказаться вам полезным.

А вам как этот гаджет? Жду ваше мнение в комментариях! Кстати, если вдруг у вас есть подобные китайские консольки и вы не хотите с ними замарачиваться/не можете сами оживить — я их последнее время начал коллекционировать и оживлять из принципа. Авось кому-то данная в статье информация окажется полезной и вы сможете оживить свой ништяк?

Показать полностью 19
212

Листал я недавно юлито и наткнулся на такой лот всего за 400 рублей!

Это же новодельный "сюбор": денди, к которой прикрутили клавиатуру и мышь (работают только на "своем" картридже) и который даже позволял выполнять некоторые простые операции обычного ПК. В нем было подобие ворда, экселя, обучающий софт для детей, нинтендовский бэйсик, PC-DOS. При этом, данные действительно сохранялись на картридже: скорее всего, внутри стоит SRAM, которую постоянно подпитывает батарейка (похожая концепция использовалась для некоторых игр типа зельды). Подобные клоны выпускались до ~2005 года, но в продаже их можно найти и сейчас. У меня есть целая куча картриджей для сеги и денди: будем ждать статью?

Листал я недавно юлито и наткнулся на такой лот всего за 400 рублей! Покупка, NES, Dendy, Игры, Консоли, Гаджеты, Famicom, Анонс, Ретро-консоль
82

ReferenceLoosePartFeeder или компьютерное зрение для утилизации рассыпухи

Приветствую всех. Продолжаю знакомить вас с возможностями OpenPNP.
Сегодня поговорим об автоматическом распознавании элементов в ячейке.
До того как обзавестись станком и начать собирать устройства в более-менее большом объеме, я затаривался резисторами и конденсаторами в маленьких партиях и ссыпал их в ручной "расстановщик".

ReferenceLoosePartFeeder или компьютерное зрение для утилизации рассыпухи Электроника, 3D принтер, Автоматизация, 3D печать, Своими руками, Видео, Длиннопост

Но хранить элементы в катушках гораздо удобнее если ты планируешь их потом использовать в расстановщике. Да и когда покупаешь не 100-200, а 2000-4000 компонентов одного номинала высыпать их куда-то - очень глупо.
Но все же некоторые номиналы я успел раскидать по "ящичкам" и их надо бы как-то утилизировать. Загружать в пустые ленты - вариант, но очень муторно. Особенно, если в каждой плате их больше 10 штук используется.
На помощь приходит "Фидер для рассыпухи". Сегодня расскажу как я его настраивал для распознавания SMD резисторов и конденсаторов с "отфильтровкой" резисторов, лежащих "пузом" вверх.

Первым делом печатаем подложку. Я использовал квадратные коробочки, сделанные на 3Д принтере. "Зеленка" - тоже отпечатанная на принтере пластинка с включенным "разглаживанием" верхнего слоя и в последствии обработанная наждачкой для придания матовости. Это важно. Можно использовать любую яркую цветную бумагу. Но зеленка - классический хромакей и на нее рассчитаны стандартные пайплайны (о них позже) компьютерного зрения в OpenPNP.

ReferenceLoosePartFeeder или компьютерное зрение для утилизации рассыпухи Электроника, 3D принтер, Автоматизация, 3D печать, Своими руками, Видео, Длиннопост

Любое распознавание в OpenPNP, будь то элементы, как в нашем случае, ленты с компонентами, реперные точки для центровки платы и т.д. настраиваются в так называемых Пайплайнах (Pipeline), в которых путем комбинации стандартных шагов и настройки их параметров можно добиться нужного Вам результата. Жмем Edit Pipeline и переходим к редактированию. (Далее я буду пояснять картинки, чтобы меньше писать и больше показывать).

Первым делом идет захват изображения и применение гауссового размытия (BlurGaussian) для фильтрации невидимых нашему глазу артефактов (как видим, у нас 2 резистора вверх тормашками лежат):

ReferenceLoosePartFeeder или компьютерное зрение для утилизации рассыпухи Электроника, 3D принтер, Автоматизация, 3D печать, Своими руками, Видео, Длиннопост

Далее делаем картинку серой (ConvertColor), а после черно-белой (Threshold), задавая порог яркости (шаги gray и highlights). Получаем белые контакты (отражают свет) и "пузики" резисторов.
После мы "ищем все контуры" (FindContours). Каждый замкнутый контур на картинке помечается "к работе"
Но нам сейчас нужно найти резисторы лежащие ненправильно, поэтому фильтруем контуры(FilterContours) по размеру, задав минимальный размер больше, чем контактные площадки, но ограничивая максимальный, чтобы при необходимости отфильтровать засветку.

ReferenceLoosePartFeeder или компьютерное зрение для утилизации рассыпухи Электроника, 3D принтер, Автоматизация, 3D печать, Своими руками, Видео, Длиннопост

Далее для поста я включил пункт отрисовки контуров (DrawContours), чтобы видно было какие остались "в работе".

ReferenceLoosePartFeeder или компьютерное зрение для утилизации рассыпухи Электроника, 3D принтер, Автоматизация, 3D печать, Своими руками, Видео, Длиннопост

Отлично. Мы получили контуры резисторов, которые нам не нужны. Теперь переходим к тем, которые было бы неплохо использовать. Вызываем ImageRecall. Конвертируем цвета из RGB в HSVFull (это важно) и вырезаем на зеленке все резисторы (MaskHSV).

ReferenceLoosePartFeeder или компьютерное зрение для утилизации рассыпухи Электроника, 3D принтер, Автоматизация, 3D печать, Своими руками, Видео, Длиннопост

Тут видно Все наши резисторы. Теперь небольшая магия, Вызываем MaskModels и в качестве параметра modelStageName указываем имя(!) шага, где мы отфильтровали неправильные резисторы (counturingResistors). Вуаля:

ReferenceLoosePartFeeder или компьютерное зрение для утилизации рассыпухи Электроника, 3D принтер, Автоматизация, 3D печать, Своими руками, Видео, Длиннопост

Шик? Уже видно, что резисторы, лежащие неправильно сильно отличаются. Теперь нужно обрезать картинку (MaskRectangle) просто чтобы лишнее убрать. И после применения еще одного размытия (BlurMedian посильней, чем в самом начале Гаусс). И все. Наши контурочки ненужных резисторов почти пропали.

ReferenceLoosePartFeeder или компьютерное зрение для утилизации рассыпухи Электроника, 3D принтер, Автоматизация, 3D печать, Своими руками, Видео, Длиннопост

Осталось сделать определение контуров (FindContours + FilterContours), применить несколько шагов из стандартного Pipeline:
Поиск Прямоугольников + их ориентация. Ну и отрисовать все это дело:

ReferenceLoosePartFeeder или компьютерное зрение для утилизации рассыпухи Электроника, 3D принтер, Автоматизация, 3D печать, Своими руками, Видео, Длиннопост
ReferenceLoosePartFeeder или компьютерное зрение для утилизации рассыпухи Электроника, 3D принтер, Автоматизация, 3D печать, Своими руками, Видео, Длиннопост

Собственно, на этом все. Надеюсь было интересно. ;)

P.S. спасибо @Pas.Ratunkow, за мотивацию :)

Показать полностью 10
194

Сам себе игровая консоль: превращаем планшет с нерабочим тачскрином в игровой девайс из 8 кнопок и микроконтроллера

Сам себе игровая консоль: превращаем планшет с нерабочим тачскрином в игровой девайс из 8 кнопок и микроконтроллера Смартфон, Телефон, Идея, Своими руками, Arduino, Embedded, Встраиваемые системы, Планшет, Игры, Консоли, Самоделки, Моддинг, Android, Linux, Java, C++, Kernel, Покупка, Raspberry pi, Микроконтроллеры, Видео, Длиннопост

К сожалению, в наше время многие старые, но весьма неплохие по характеристикам гаджеты отправляются напрямую в помойку, и их владельцы не подозревают, что им можно найти применение. Сервер, мультимедийная-станция, да даже просто как TV-приставка — люди в упор не замечают сфер, где старенький планшет мог бы быть полезен. Но как быть, если посвящаешь жизнь портативным гаджетам, кодингу и копанию в железе? Правильно: сделать довольно мощную игровую консоль из старого планшета самому! Сегодня вам расскажу, как я сделал свою портативную приставку из планшета с нерабочим тачскрином, Raspberry Pi Pico и 8 кнопок! За рабочим результатом прячется несколько дней работы: поиск UART на плате, разработка контроллера геймпада на базе RPi Pico, написание приложения-сервиса, которое слушает события и отправляет их в подсистему ввода Linux в обход Android. Интересно? Тогда жду вас под катом!

❯ Мотивация


Прошло уже практически 10 лет с того момента, как у меня появилась моя первая портативная консоль. Несмотря на то, что я был заядлым ПК-игроком, я уже успел посмотреть на PS3 и PSP, но денег на их покупку у меня особо не было, да и к тому времени уже был в наличии Android-планшет. Но к моему 13-летию в 2014 году, когда я ходил и выбирал себе будущий девайс на день рождения, отец и мама решили подарить мне мою первую портативную консоль. Изначально, я уговаривал её купить мне целых два девайса, но бюджет был ограничен 4.000 рублей, а я хотел взять смартфон Fly IQ239 и консоль JXD S601 одновременно:

Сам себе игровая консоль: превращаем планшет с нерабочим тачскрином в игровой девайс из 8 кнопок и микроконтроллера Смартфон, Телефон, Идея, Своими руками, Arduino, Embedded, Встраиваемые системы, Планшет, Игры, Консоли, Самоделки, Моддинг, Android, Linux, Java, C++, Kernel, Покупка, Raspberry pi, Микроконтроллеры, Видео, Длиннопост


Однако, увидев здоровую 7-дюймовую консоль в магазине TREC (думаю, жители южной части РФ помнят такой), мама уговорила меня взять именно её, мотивируя это «ну и чего ты будешь тыкаться в этот мелкий экран? Возьми большую». После покупки гаджета, я был доволен: играл какие-то игрушки с ретро-платформ, устанавливал игры на Android, сидел в ВК через Kate Mobile. Что еще нужно было школяру? Однако, планшет прожил у меня недолго: с очередного лага я психанул и ударил по нему кулачком, унеся на тот свет и дисплей и тачскрин. Так консолька и пролежала в подвале около 8 лет. Впрочем, мне продолжали импонировать подобные устройства и в прошлом году я купил и написал про несколько подобных девайсов.

Сам себе игровая консоль: превращаем планшет с нерабочим тачскрином в игровой девайс из 8 кнопок и микроконтроллера Смартфон, Телефон, Идея, Своими руками, Arduino, Embedded, Встраиваемые системы, Планшет, Игры, Консоли, Самоделки, Моддинг, Android, Linux, Java, C++, Kernel, Покупка, Raspberry pi, Микроконтроллеры, Видео, Длиннопост



Несколько месяцев назад, мой читатель Кирилл Севостьянов с Хабра прислал мне HTC HD2 в качестве донора и планшет Prestigio PMP7170B3G, который был рабочим, но… у него отказал тачскрин. Я всё думал, чего бы с ним сделать и решил реализовать игровую консольку своими руками из подручных средств. Идея крутилась в голове довольно давно, но реализовал я её только сейчас.

❯ Что нам нужно сделать?


Итак, что должно быть у портативной консоли? Чипсет, дисплей, звук, ОС — это всё нам уже предоставляет планшет. Нам остаётся лишь сделать свой геймпад. Давайте подумаем, что нам будет нужно для того, чтобы его сделать и передавать от него события на планшет:

  • Контроллер для геймпада: тут нам подойдет практически любой микроконтроллер, который работает от 3.3в. Выбор большой: Arduino Pro Mini 3.3v, ESP32, RPi Pico. Я остановился на последнем: недавно я взял себе две штучки «пощупать» их — и они мне очень понравились!

  • Физический интерфейс: с планшетом нужно как-то общаться. У нас есть три варианта: USB (не факт, что поддержка преобразователей включена в ядре), UART и SPI/I2C на пятачках тачскрина (потребуют написания драйвера т. к. в android-устройствах нет прямого доступа к SPI/I2C из userland'а). Я остановился на UART: его легко найти на большинстве китайских планшетов, а если не получилось — то на помощь может прийти схема платы.

  • Программная реализация: как это будет работать? Я решил реализовать геймпад в виде сервиса на Android, который слушает состояния кнопок с UART и «инжектит» события напрямую в драйвер ввода. Таким образом, поддержка нашего геймпада появляется даже в самой системе — можно управлять менюшкой или приложениями как с клавиатуры!


    С планом определились, пора начать с программной части: сначала нам обязательно понадобится ROOT-доступ. Его получение на разных девайсах отличается — на prestigio уже был порт CWM и я просто поставил SuperSU. Без ROOT доступа мы не сможем использовать UART!

Сам себе игровая консоль: превращаем планшет с нерабочим тачскрином в игровой девайс из 8 кнопок и микроконтроллера Смартфон, Телефон, Идея, Своими руками, Arduino, Embedded, Встраиваемые системы, Планшет, Игры, Консоли, Самоделки, Моддинг, Android, Linux, Java, C++, Kernel, Покупка, Raspberry pi, Микроконтроллеры, Видео, Длиннопост


Теперь нам нужно найти пятачки UART на плате. Разведен он не везде, но в случае устройств на MediaTek — почти всегда, ещё и пятачки подписаны. На моём планшете он нашёлся сразу: был между двух металлических экранов и соответствовал 4-ому каналу UART. Получить к нему доступ можно в /dev/ttyMT3. Я использую ESP32 в качестве UART преобразователя: подпаиваемся к RX/TX, запускаем putty и заходим в adb shell. Определяем бодрейт (скорость) нашего UART порта — на MediaTek он обычно равен 921600, на других чипсетах — 115200. Пытаемся что-то вывести и хоба — мы уже можем «поболтать» с планшетом!

Сам себе игровая консоль: превращаем планшет с нерабочим тачскрином в игровой девайс из 8 кнопок и микроконтроллера Смартфон, Телефон, Идея, Своими руками, Arduino, Embedded, Встраиваемые системы, Планшет, Игры, Консоли, Самоделки, Моддинг, Android, Linux, Java, C++, Kernel, Покупка, Raspberry pi, Микроконтроллеры, Видео, Длиннопост

❯ Приложение-сервис


Итак, у нас уже есть доступ к UART и мы можем общаться с планшетом из внешнего мира. Но получить события с кнопок пол дела, нужно их ещё и послать в систему. Для этого есть целых три способа:

  1. InputManager.injectInputEvent — именно этим методом пользуется команда input, которую вы можете использовать через adb. Но увы, он работает только при наличие разрешения INJECT_EVENTS, который доступен только системным приложениям — находятся они в /system/app и подписаны тем же сертификатом, что и остальная прошивка.

  2. Модуль uinput дает возможность создать виртуальное устройство ввода и посылать события из userland'а — т. е. из прикладного приложения. У моего планшета было устройство /dev/uinput, но lsmod показывал, что сам модуль не загружен. Так что отметаем — он есть не везде.

  3. Прямой инжект событий в character устройство — весьма грязный хак, который позволяет инжектить события, не притворяясь системным приложением, но имеет некоторые ограничения. Именно его я и выбрал и о ограничениях ниже.


Сначала нам нужно узнать, какие кнопки поддерживают загруженные устройства ввода в системе. Для этого используем команду getevent -li. Там есть разные устройства ввода, в том числе и тачскрин (если вам нужно симулировать нажатия на экран), мне же подошёл драйвер физических кнопок mtk-kpd. Он занимается обработкой кнопок громкости, включения и т. п. Тут важно обратить внимание на то, что если попытаться послать кнопку, которое устройство не реализует (например пробел), то ничего не произойдет:

Сам себе игровая консоль: превращаем планшет с нерабочим тачскрином в игровой девайс из 8 кнопок и микроконтроллера Смартфон, Телефон, Идея, Своими руками, Arduino, Embedded, Встраиваемые системы, Планшет, Игры, Консоли, Самоделки, Моддинг, Android, Linux, Java, C++, Kernel, Покупка, Raspberry pi, Микроконтроллеры, Видео, Длиннопост



Инжект событий я писал на C, т. к. это требовало прямой записи input_event, а в Java прокинул его через Jni. Концепция простая: открываем устройство /dev/input/event2 и посылаем в него события ввода и синхронизации (это обязательно!), которые затем Android читает и обрабатывает:

#include <linux/uinput.h>

#include <fcntl.h>

#include <unistd.h>

#include <stdio.h>

#include <stdlib.h>

#include <android/log.h>

#include <jni.h>

int uinput;

extern "C" JNIEXPORT void JNICALL Java_com_monobogdan_inputservicebridge_InputNative_init(JNIEnv *env, jclass clazz) {

uinput = open("/dev/input/event2", O_WRONLY);

__android_log_print(ANDROID_LOG_DEBUG , "Test", uinput >= 0 ? "Open event OK" : "Failed to open event"); }

void emit(int fd, int type, int code, int val) {

struct input_event ie; ie.type = type;

ie.code = code; ie.value = val;

ie.time.tv_sec = 0;

ie.time.tv_usec = 0;

write(fd, &ie, sizeof(ie)); }

extern "C" JNIEXPORT void JNICALL Java_com_monobogdan_inputservicebridge_InputNative_sendKeyEvent(JNIEnv *env, jclass clazz, jint key_code, jboolean pressed) {

__android_log_print(ANDROID_LOG_DEBUG , "Test", "Send");

emit(uinput, EV_KEY, key_code, (bool)pressed ? 1 : 0);

emit(uinput, EV_SYN, SYN_REPORT, 0);

}

Основной обработкой занимается сервис, который я реализовал в отдельном потоке: он слушает события с UART и посылает соответствующие изменения состояния через sendKeyEvent. На вход приходят простые сообщения вида:

U L где U/D — нажато, не нажато, а L — однобайтовый идентификатор кнопки. В случае L — это влево, R — вправо и т. п. Вся доступная раскладка хранится в словаре. Причём само чтение из UART реализовано костылем с чтением «чужого» stdout, т. к. android-приложения не умеют сами по себе работать с root правами. В теории, это могло дать неприятный оверхед, но на практике никакого серьезного инпут лага это не создает. Не забываем сделать устройство event записываемым — ставим ему права 777:

package com.monobogdan.inputservicebridge;

public class InputListener extends Service {

private static final int tty = 3;

private InputManager iManager;

private Map<Character, Integer> keyMap;

private Method injectMethod;

private Process runAsRoot(String cmd)

{

try {

return Runtime.getRuntime().exec(new String[] { "su", "-c", cmd });

}

catch (IOException e)

{

e.printStackTrace();

return null;

}

}

@override

public void onCreate() {

super.onCreate();

// According to linux key map (input-event-codes.h)

keyMap = new HashMap<>();

keyMap.put('U', 103);

keyMap.put('D', 108);

keyMap.put('L', 105);

keyMap.put('R', 106);

keyMap.put('E', 115);

keyMap.put('B', 158);

keyMap.put('A', 232);

keyMap.put('C', 212);

InputNative.init();

try {

runAsRoot("chmod 777 /dev/input/event2").waitFor();

} catch (InterruptedException e) {

throw new RuntimeException(e);

}

Executors.newSingleThreadExecutor().execute(new Runnable() {

@override

public void run() {

Process proc = runAsRoot("cat /dev/ttyMT" + tty);

BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()));

while(true)

{

try {

String line = reader.readLine();

if(line != null && line.length() > 0) {

Log.i("Hi", "run: " + line);

boolean pressing = line.charAt(0) == 'D';

int keyCode = keyMap.get(line.charAt(2));

Log.i("TAG", "run: " + keyCode);

InputNative.sendKeyEvent(keyCode, pressing);

}

}

catch(IOException e)

{

e.printStackTrace();

}

/*try {

Thread.sleep(1000 / 30);

} catch (InterruptedException e) {

e.printStackTrace();

}*/

}

}

});

}

@override

public IBinder onBind(Intent intent) {

return null;

}

}

Таким образом, если мы отправляем с ПК «D L» — система считает, что мы зажали стрелку влево, а U L — считает что мы отпустили. Но если mtk-kpd поддерживает стрелки и еще некоторые действия без каких либо проблем, то enter в список обрабатываемых кнопок не входит: придется мудрить! И тут нам приходит на помощь механизм трансляции кодов кнопок в действия: они хранятся в специальных файлах .kl в /system/usr/keylayout/. Я назначил DPAD_CENTER на… кнопку регулировки громкости звука! Ну, а почему бы и нет. :) Таким образом можно переназначить уже имеющиеся кнопки громкости на, например, start/select.

Сам себе игровая консоль: превращаем планшет с нерабочим тачскрином в игровой девайс из 8 кнопок и микроконтроллера Смартфон, Телефон, Идея, Своими руками, Arduino, Embedded, Встраиваемые системы, Планшет, Игры, Консоли, Самоделки, Моддинг, Android, Linux, Java, C++, Kernel, Покупка, Raspberry pi, Микроконтроллеры, Видео, Длиннопост

❯ Геймпад


После того, как сервис был готов и отлажен, нужно было реализовать хардварную часть проекта — сам геймпад. В качестве контроллера я, как уже говорил, выбрал Raspberry Pi Pico на базе МК RP2040 — бодреньком контроллере с двумя ARM Cortex-M0 ядрами. Стоит копейки, а в отличии от ESP'шек, его SDK не такое перегруженное и выглядит более приближенным к bare-metal.

Сам себе игровая консоль: превращаем планшет с нерабочим тачскрином в игровой девайс из 8 кнопок и микроконтроллера Смартфон, Телефон, Идея, Своими руками, Arduino, Embedded, Встраиваемые системы, Планшет, Игры, Консоли, Самоделки, Моддинг, Android, Linux, Java, C++, Kernel, Покупка, Raspberry pi, Микроконтроллеры, Видео, Длиннопост



На данный момент, я решил развести все кнопки на бредборде — макетной плате без пайки, т. к. макеток для пайки у меня под рукой не было. Сделал примитивный геймпад:

Сам себе игровая консоль: превращаем планшет с нерабочим тачскрином в игровой девайс из 8 кнопок и микроконтроллера Смартфон, Телефон, Идея, Своими руками, Arduino, Embedded, Встраиваемые системы, Планшет, Игры, Консоли, Самоделки, Моддинг, Android, Linux, Java, C++, Kernel, Покупка, Raspberry pi, Микроконтроллеры, Видео, Длиннопост



Развел на соответствующие GPIO:

Сам себе игровая консоль: превращаем планшет с нерабочим тачскрином в игровой девайс из 8 кнопок и микроконтроллера Смартфон, Телефон, Идея, Своими руками, Arduino, Embedded, Встраиваемые системы, Планшет, Игры, Консоли, Самоделки, Моддинг, Android, Linux, Java, C++, Kernel, Покупка, Raspberry pi, Микроконтроллеры, Видео, Длиннопост



И написал примитивную прошивку, которая отслеживает состояние кнопок. В прошивке точно так же есть словарь, задающий ассоциацию между физическими пинами и «виртуальными» кнопками. При нажатии или отжатии кнопки, программа изменяет стейт и отсылает новое состояние планшету.

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include "pico/stdlib.h"

#include "pico/time.h"

#include "hardware/uart.h"

struct keyMap

{

int gpio;

char key;

bool pressed;

int lastTick;

};

keyMap keys[] = {

{

15,

'L',

false,

0

},

{

14,

'U',

false,

0

},

{

13,

'D',

false,

0

},

{

12,

'R',

false,

0

},

{

11,

'E',

false,

0

},

{

10,

'B',

false,

0

},

{

20,

'A',

false,

0

},

{

21,

'C',

false,

0

}

};

#define KEY_NUM 8

int main() {

stdio_init_all();

uart_init(uart0, 921600);

gpio_set_function(PICO_DEFAULT_UART_TX_PIN, GPIO_FUNC_UART);

gpio_set_function(PICO_DEFAULT_UART_RX_PIN, GPIO_FUNC_UART);

sleep_ms(1000); // Allow serial monitor to settle

for(int i = 0; i < KEY_NUM; i++)

{

gpio_init(keys[i].gpio);

gpio_set_dir(keys[i].gpio, false);

gpio_pull_up(keys[i].gpio);

}

while(true)

{

int now = time_us_32();

for(int i = 0; i < KEY_NUM; i++)

{

char buf[5];

buf[1] = ' ';

buf[3] = '\n';

buf[4] = 0;

if(!gpio_get(keys[i].gpio) && !keys[i].pressed && now - keys[i].lastTick > 15500)

{

buf[0] = 'D';

buf[2] = keys[i].key;

puts(buf);

keys[i].lastTick = now;

keys[i].pressed = true;

continue;

}

if(gpio_get(keys[i].gpio) && keys[i].pressed && now - keys[i].lastTick > 15500)

{

buf[0] = 'U';

buf[2] = keys[i].key;

puts(buf);

keys[i].pressed = false;

keys[i].lastTick = now;

}

}

}

}

Собираем всё вместе и тестируем. Хоба, всё работает, мы можем перемещаться по менюшке используя наш геймпад!

Сам себе игровая консоль: превращаем планшет с нерабочим тачскрином в игровой девайс из 8 кнопок и микроконтроллера Смартфон, Телефон, Идея, Своими руками, Arduino, Embedded, Встраиваемые системы, Планшет, Игры, Консоли, Самоделки, Моддинг, Android, Linux, Java, C++, Kernel, Покупка, Raspberry pi, Микроконтроллеры, Видео, Длиннопост



А почему бы не попробовать поиграть в какую-нибудь игру? Ну мы же консоль вроде делаем: берём эмулятор NES, биндим кнопки в настройках и наслаждаемся игрой в Марио!

❯ Заключение


Реализация этого проекта заняла у меня не так уж и много времени: всего около 3-х дней работы по вечерам. Вероятно кто-то спросит: «а чего ты просто Bluetooth геймпад не купил?». Так это не прикольно ведь. Гораздо приятнее играть в девайс, к которому ты приложил руку сам. Более того, не у всех старых планшетов есть BT. Обошёлся на данной стадии проект недорого: планшет мне подарили бесплатно (точно также у вас дома может лежать подобный), RPi Pico — 350 рублей, кнопки по 10 рублей/штучка.

В целом, я сам по себе обожаю копаться в различных железках и их софтварной части (вспомнить хотя-бы статью про перекомпиляциюu-boot из вендорских исходников для нонейм консоли), а созидать что-то свое вообще вызывает какие-то нереальные всплески эндорфина — оно и понятно! :)

Однако несмотря на то, что мы уже имеем рабочий «прототип», проект далёк от завершения: я намерен довести его до конца и окончательно перевоплотить старый планшет в автономную игровую консоль (и рассказать об этом во второй части статьи). Для этого мне понадобится распечатать корпус и кнопки на 3D-принтере. К сожалению, у меня в городе ни у кого особо нет 3D-принтеров, поэтому начну копить на Ender 3, а от вас, читателей, с удовольствием почитаю мнение в комментариях и советы касательно выбора принтера!

Статья подготовлена при поддержке TimeWeb Cloud. Подписывайтесь на меня и @Timeweb.Cloud, чтобы не пропускать еженедельные статьи про моддинг различных гаджетов!

Показать полностью 10 1
164

Вездеходы Судного дня

Думаю, все помнят такие крупные проекты Советского Союза, как экраноплан «Лунь», который сейчас просто догнивает на Каспии, и «Буран» на ВДНХ, хочу дополнить этот список еще одним невероятным проектом – СВГ-701 «Ямал».

В 80-е годы прошлого века Советским руководством была поставлена задача разработать вездеход, предназначенный для доставки в труднопроходимые нефтяные месторождения тяжёлых и крупногабаритных грузов.

Вести работу поручили совместно с канадской компанией Foremost Industries LP (™FOREMOST). Эта компания производила колёсные и гусеничные вездеходы для нефтегазовой и горнодобывающей промышленности.

Вездеходы Судного дня Факты, Транспорт, Доставка, Вездеход, Гусеничный вездеход, Ямал, Безопасность, СССР, Сделано в СССР, Техника, Судьба, Изобретения, Достижение, Забытое, Забытое авто, Тундра, Длиннопост

Чертеж из архивов компании Foremost Industries.

Результатом совместной работы стал тяжёлый вездеход СВГ-701 «Ямал». Это был самый большой советский вездеход, который бороздил бескрайние просторы Тундры. «Ямал» получил резинометаллические гусеницы шириной 1,85 м. Большая площадь опорной поверхности позволила получить весьма низкое удельное давление на грунт. Для болотохода без нагрузки этот параметр составлял 0,22 кг/кв.см, для машины с максимальным грузом – лишь 0,38 кг/кв.см. (Для сравнения, удельное давление на грунт среднего человека достигает 0,7 кг/кв.см.)

Вездеходы Судного дня Факты, Транспорт, Доставка, Вездеход, Гусеничный вездеход, Ямал, Безопасность, СССР, Сделано в СССР, Техника, Судьба, Изобретения, Достижение, Забытое, Забытое авто, Тундра, Длиннопост

Чтобы не душнить, остальные характеристики уберу под спойлер!

Вся задняя часть корпуса в виде плоской платформы предназначалась для размещения полезной нагрузки. Грузовая площадка имела длину 12,5 м и ширину около 4,5 м, что позволяло брать на борт самые разные объекты. Перед площадкой имелся кожух с лебедкой, развивавшей тяговое усилие до 450 кН. Трос выдавался назад, что позволяло использовать его при погрузочных работах. Одно из главных требований к проекту СВГ-701 «Ямал» заключалось в резком повышении грузоподъемности в сравнении с существующей техникой. Эта задача была успешно решена. Болотоход мог перевозить 70 т груза.

Новая машина сверхвысокой проходимости получилась весьма крупной. Максимальная ее длина, обусловленная габаритами корпуса, составляла 20,56 м. Ширина – 4,7 м, высота по крыше – 4,5 м. Дорожный просвет составлял 520 мм, однако корпус и груз помещались на гораздо большей высоте. Снаряженная масса «Ямала» составляла 27,5 т. Полный вес с максимальной полезной нагрузкой – 97,5 т.

Этой машиной даже заинтересовались не только технари, но также военные и специальные организации, например Центральное управление специальной связи СССР (ныне - Главный центр специальной связи России, или просто Спецсвязь). Этой организации вездеходы пригодились бы не просто для доставки гуманитарных грузов в ОЧЕНЬ труднодоступные места, но и для чего-то более габаритного.

А вот военные с помощью Ямала планировали доставлять баллистические ракеты в непроходимую Тундру. Зачем? Да все просто: запуск ракет из той местности мог стать максимальной неожиданностью для противника.

Вездеходы Судного дня Факты, Транспорт, Доставка, Вездеход, Гусеничный вездеход, Ямал, Безопасность, СССР, Сделано в СССР, Техника, Судьба, Изобретения, Достижение, Забытое, Забытое авто, Тундра, Длиннопост

Вырезка из газеты тех времён.

В целом, такой монстр заинтересовал буквально ВСЕХ. Многие компании готовы были сразу же разместить объявления о покупке Ямала.

Однако, именно в это время в стране начинаются экономические проблемы и финансирование проекта СВГ-701 «Ямал» прекращается. Несмотря на это, выпущенные образцы продолжили работу: на них перевозили различную технику, оборудование и другие тяжелые грузы.

После длительной тяжёлой работы, вездеходы выработали свой ресурс и их пришлось вывести из эксплуатации. И вот информация о дальнейшей судьбе этих машин расходится. По одной версии, их просто утилизировали. А согласно другой – так и оставили стоять в труднодоступных уголках страны…

Показать полностью 3
Отличная работа, все прочитано!