Топ проектов недели: Linux 6.11 на ESP32-S3, часы на ATtiny, акустический детектор дронов и Mac с открытой схемой

Подборка проектов за неделю с 12 по 18 сентября: много ESP32, немного ретро и один очень практичный детектор.
Linux 6.11 на ESP32-S3 — и на этот раз всерьёз#

Версия 0.8: 3,7 МБ свободной памяти после загрузки
Два ядра Xtensa LX7 на 240 МГц и до 16 МБ PSRAM — рано или поздно кто-нибудь должен был спросить, потянет ли ESP32-S3 Linux. Paulneja отвечает: да, с оговорками.
Главная сложность в том, что у ESP32-S3 нет блока управления памятью (MMU), к которому избалованные операционные системы давно привыкли. Поэтому взята конфигурация NOMMU и написана собственная реализация fork(). Версия 0.7 работала кое-как, а вот 0.8 — первая, которая грузится стабильно и оставляет вменяемый объём свободной памяти: 3,7 МБ после загрузки, при заметно улучшившихся общем потреблении ресурсов и производительности. Linux при этом достаётся только одно ядро — второе занято привычным стеком FreeRTOS из ESP-IDF, который обеспечивает Wi-Fi и Bluetooth. Всё это на конфигурации N16R8: 16 МБ флеша (он же используется как записываемое хранилище) и 8 МБ octal PSRAM. Автор честно называет проект исследовательским, но представить на этой базе маленький роутер с BusyBox вполне можно.
Сверхточные часы на ATtiny и сигнале DCF77#

ATtiny, приёмник DCF77 и дисплей по I²C — вот и все часы
DCF77 — немецкая ОНЧ-станция, которая вещает на 77,5 кГц сигнал точного времени на всю Европу. Отсюда и привычные европейцам часы с надписью «Radio controlled» на циферблате. Формат сигнала простой и медленный, декодировать его может почти любое железо — вплоть до ATtiny, что и сделал kwolf1909.
Проект берёт битовый поток DCF77 от приёмника и выводит время на дисплей по I²C. Самого приёмника в проекте нет, но одночастотный длинноволновый приёмник собрать несложно. Интерфейс — одна кнопка: короткое нажатие переключает режимы отображения, долгое запускает повторную синхронизацию. Если взять ATtiny с достаточным количеством выводов, поддерживаются ещё внешний датчик температуры и модуль часов реального времени. Хороший пример того, что не каждому устройству нужен процессор-монстр.
Открытый нагрудный пульсометр#

AD8232 плюс Seeed XIAO ESP32 — вот и весь монитор
Если вы бываете в спортзале, вам наверняка знакомы нагрудные Bluetooth-пульсометры: небольшая коробочка на ремне, которая передаёт пульс на часы, телефон или логгер. Милош Расич сделал открытую версию такого монитора.
Съём ЭКГ выполняет специализированная микросхема AD8232, за Bluetooth отвечает плата Seeed Studio XIAO ESP32. Питание — один элемент 3,7 В с повышающим преобразователем до 5 В; контроллер заряда в схему сознательно не заложили ради простоты, так что заряжать аккумулятор придётся как-нибудь самостоятельно. Прошивка грузится из Arduino IDE, а значит, при небольших правках можно завести и другие ESP32. Проект на удивление простой — и хотя заводские пульсометры стоят недорого, иметь открытый вариант всё же полезно, особенно в контексте открытой медтехники, которой автор занимается всерьёз.
Как написать драйвер Bluetooth-принтера для ESP32 в два действия#

Дешёвый термопринтер, поддавшийся реверс-инжинирингу
Бас Ботберг хотел печатать отчёты по данным с датчиков на портативном термопринтере, подключённом к ESP32-C3. Как водится, официальный способ общения с принтером один — фирменное приложение для смартфона, а документации нет. Дальше начинается интересное: путь, которым он пошёл, отличается от привычного.
Обычно в таких случаях включают в Android логирование Bluetooth-трафика, гоняют фирменное приложение, а получившийся дамп разбирают в Wireshark. Бас же проигнорировал приложение производителя и взял утилиту, показывающую сервисы и характеристики BLE-устройства. Он нашёл характеристики, помеченные как записываемые, и начал просто пихать в них данные, глядя на реакцию принтера. Для быстрых итераций использовал Python с библиотекой Bleak — и довольно скоро нащупал команду, от которой мотор протянул бумагу. Это и был ключевой первый рубеж. Дальше оставалось перенести найденные посылки из Python в C++ на ESP32, а для красоты автор прикрутил библиотеку Adafruit GFX, чтобы рисовать иконки и нормально форматировать вывод. Код, к сожалению, пока не опубликован.
OSHintosh — Macintosh 512k как открытое железо#

OSHintosh — двухслойная плата, повторяющая Mac 512k
Железо Apple всегда было проприетарным, иногда до крайности. Но это не значит, что нельзя сделать нечто, выполняющее ту же работу: DosFox1 выпустил OSHintosh — открытую печатную плату, реализующую Macintosh 512k.
Она грузится в классическую Mac OS, но полноценным «маком» всё же не является: ни дисков, ни SCSI здесь нет, система стартует из образа в ПЗУ — что, надо думать, ощутимо быстрее тогдашней дискеты. Отдельно приятно, что всё уложилось в двухслойную плату: при её размерах изготовление не должно выйти разорительным. С правовой стороной заливки образа ПЗУ Mac всё туманно, но если исходить из того, что у вас есть неисправный оригинал, то современная замена для тех, кому нужно именно железо, а не эмулятор, выглядит вполне разумно.
Cheap Yellow Display превратили в телевизор#

CYD в печатном ретро-корпусе — и одна кнопка вместо пульта
Cheap Yellow Display — та самая дешёвая плата-моноблок на ESP32 с сенсорным экраном, всплывшая когда-то из недр AliExpress и с тех пор засветившаяся в сотне проектов. Теперь Nickm324 сделал из неё мини-телевизор.
Мир крошечных телевизоров устроен как эстафета: каждый автор дорабатывает чужую идею, и этот проект заметно опирается на более раннюю поделку на ESP32. Собственный вклад — управление одной-единственной кнопкой BOOT на самой CYD. Поддерживаются «каналы», каждый из которых — свой ролик с SD-карты. Играть умеет только синхронизированные .mjpeg и звуковые файлы — вероятно, ограничение старого ESP32 на борту CYD. На фотографии плата живёт в симпатичном печатном корпусе ретро-телевизора, ссылки на который в репозитории, увы, нет.
Цифровой плеер в корпусе кассеты#

ESP32-S3, microSD и PCM5102 в корпусе кассеты
На стыке эпох кассет и MP3 продавались специальные «кассеты», внутри которых прятался цифровой плеер: одни просто давали вход 3,5 мм, другие были полноценными MP3-плеерами или Bluetooth-приёмниками, выводившими звук прямо на магнитную головку. Джонатан Раунни сделал свою версию.
Завести звук в головку несложно — по сути нужен её аналог, работающий как записывающая. Гораздо интереснее подружиться с механикой деки: автостоп, реверс и прочее требуют шестерён, которые изображают движение подающего и принимающего узлов, а заодно передают движение с одного на другой, чтобы автостоп не срабатывал. Мозгом служит модуль на ESP32-S3, музыка лежит на microSD, аналоговый сигнал делает кодек PCM5102 по I²S, шестерни напечатаны на SLA-принтере и работают неплохо. Единственный просчёт — автор не учёл роль тонвала, который и тянет ленту, поэтому его вращение не измеряется; обещает исправить в следующей версии.
VolAnti — детектор дронов, который слушает винты#

Четыре MEMS-микрофона, ESP32-S3 и экран на электронных чернилах
Агам Россен собрал VolAnti — открытый акустический детектор дронов, который опознаёт мультикоптеры по звуку винтов. Обычные детекторы ищут радиосигнал, но у дронов с управлением по оптоволокну полезного радиоизлучения может просто не быть: команды и видео идут по физическому кабелю. Звук в этом случае — единственная зацепка. Проект задуман именно как система обнаружения и оповещения, не как средство подавления или перехвата.
Внутри — ESP32-S3 и четыре цифровых MEMS-микрофона ICS-43434 на собственной плате; сигналы объединяются и обрабатываются микроконтроллером. Прошивка оцифровывает звук на 16 кГц и каждые 32 мс считает БПФ на 2048 точек. Ищет она не громкость, а повторяющуюся гармоническую структуру, которую создают винты: перебираются возможные частоты прохождения лопастей в диапазоне от 70 до 2000 Гц, причём сразу несколькими методами параллельно — это важно, потому что зависший дрон даёт ровный звук, который легко спутать с фоном. Из периферии — 1,54-дюймовый экран на электронных чернилах (последнее оповещение остаётся на нём даже без питания), зуммер, RGB-светодиод, вибромотор и LoRa-модуль Ra-01H, чтобы разослать тревогу другим устройствам сети. Питание — аккумулятор на 2500 мА·ч с зарядником BQ24074 и преобразователем TPS63020.