У вас когда-нибудь была острая нехватка всратых наклеечек в жизни? В один из вечеров это случилось со мной, и я решил поделиться этим с коллегами :) Полный лог событий, ошибки и переделки тачёвой ёлочки — всё в этом посте.

Intro
Начало истории довольно типичное для меня — вечером прошлого четверга перебирал шкаф, увидел лежащий на полке термопринтер для самоклеящихся наклеек NIIMBOT B1, вот такой:

И всё, это мэтч — нужно срочно задарить наклеечек коллегам! Тем более что следующая неделя — новогодняя, сложно найти более подходящее время. В связи с ограничением по времени и остротой желания принял решение ввести для себя пару важных ограничений:
- собрать из того, что есть под рукой. Никаких заказов из Озона/Алика, никакого Резонита и всего прочего
- на всё про всё — одни выходные. Среди декабрьской недели всё равно ровно 0 шансов что-то доделать
Я редко так делаю и чаще что-то пилю потихоньку вечерами, но вызов принят. Погнали!
Вечер пятнички
Наступил пятничный вечер, сходил в зал, принял душ и продолжил рыться в шкафу, дабы зафиналить план. Думал я недолго (спойлер: зря ^_^):
- у каждого на работе есть RFID-бейдж, потому берём
pn532в роли “пикалки” - к нему в пару — ESP32S3 Zero
- по uid’у бейджа выбираем один из заранее подготовленных стикеров
- отправляем на печать
- профит, останется только напечатать какой-то не скучный корпус на 3D-принтере
Мне тогда этот план очень понравился. Можно было бы сделать полноценную авторизацию с походом в ручку проверки uid’ов, но посчитал это со всех сторон небезопасным. Или генерить “уникальное” послание какой-нить крошечной моделькой с использованием TinyML, но кормить коллег слопом — признак дурного вкуса. В общем, и так отличный план решил я.
Ночь пятнички
Т.к. печать — это ключевая фича, без которой вообще нет смысла что-то мутить, логично было с неё и начать. Я знаю, что у людей разное отношение к NIIMBOT за “вендор локинг” и прочие приколы. Но у них есть и свои плюсы:
- они довольно популярны
- сносное качество для бытового использования. Жена регулярно пользуется для подписи баночек и скляночек
- есть как USB CDC-ACM, так и Bluetooth интерфейсы
Собсно, благодаря популярности не было проблемой найти OSS-библиотечки для референса:
Да, на Python, но это и не важно. Важно, что не нужно тратить время на реверс самого протокола :) Тем более что современные модельки сносно справляются с переписыванием с одного языка на другой. Изначально я хотел заиспользовать USB CDC-ACM (не зря же взял esp32s3), потому закинул в Cursor:
- референсные библиотечки на Python
- пример использования USB CDC-ACM Host Driver для ESP32
- своё желание скрестить одно с другим
- через пару итераций получил готовый код
И это был провал. Нет, моделька справилась хорошо и код выглядит валидно (я перечитал), но принтер печатал через раз :/ Скорее всего, дело в каких-то таймингах, с которыми совладать за час с небольшим я не сумел. Потому забил на USB CDC-ACM и переключился на Bluetooth. Тем более что это полностью развязывало руки — больше нет USB-шнурка от принтера к ESP32. Не провал, а развитие продукта, так сказать!
Следующий час–полтора на пару с Claude писали/дебажили взаимодействие с принтером по BLE (ble.cc + printer.cc), добились стабильной печати, и я довольный ушёл спать :)
Утро субботы
Проснулся, заварил кофейку, выгулял кота и принялся моделировать корпус в Autodesk Fusion для новогодней пикалки. Сначала думал собрать pn532 + esp32s3 на весу, но не стал (зря-зря-зря), дабы потом не перепаивать. Так и провёл весь день за игрой “поправил → распечатал → оценил IRL → поправил → распечатал → оценил IRL → …”. К вечеру получил модель корпуса, которая меня удовлетворяла:

Звезда должна гореть при чтении бейджа, за крышкой будет спрятан pn532, а снизу — ESP32. Без дизайнерских изысков :)
Вечер субботы
Наконец-то запах припоя! Собираю pn532 + esp32s3 в новом корпусе:

Пишу нужный код, благо под ESP-IDF есть готовая библиотечка: esp-idf-pn532. Проверяю на карточке из комплекта к pn532 — работает!
Достаю свой бейдж, “пикаю”, и ничего! Ну конечно ничего! С чего бы ему вдруг заработать, если pn532 поддерживает только HF (13.56 MHz), а у нас используются LF RFID-карты на 125 kHz :/ Вот это я сэкономил времени! Вот это я понимаю! Целые 5 минут на чтение даташита или 20 минут на перепайку ценой почти всей субботы :)
Но деваться было некуда. Заказать что-то в духе RDM6300 нет ни времени, ни возможности (сроки, правила, бла-бла-бла). Сдаваться тоже не в моих правилах, потому осталось только классическое переобувание в воздухе. Отказываюсь от бейджа в пользу обычной тачёвой кнопки с огоньками. У меня как раз была такая в шкафу:

Дальше уделил время домашним, выгулял перед сном кота и ушёл переспать с новым планом.
Утро воскресенья
Не знаю, почему на утро я не вспомнил о встроенном в ESP32 Capacitive Touch Sensor — видимо, какое-то очередное когнитивное искажение от наличия плана :) Впрочем, это уже детали. Дальше меня снова ждал Fusion 360. Череда танцев вокруг принтера — и у меня получился такой “бутербродик” с 6+1 огоньками:

Звезда должна будет гореть при прикосновении, а шарики — проигрывать анимашку при печати. Симпатично, как по мне. Уже после финальной сборки пришла мысль, что лучше было бы развернуть шарики вверх, а не вниз, но я сильно быстрее умных мыслей (ха!).
Вечер воскресенья
К вечеру всё было напечатано и примеряно, осталось зафиналить незамысловатую схемку подключения огоньков и кнопки:

Удлинить сенсорную часть кнопки и заменить светодиод:

Подсобрать всё вместе:

Да, страшненько, я знаю. Идея паять сразу в корпусе — это фейл, неудобно капец. Лучше бы взял макетную платку, всё запаял и использовал её в качестве колбаски для бутербродика. Но ни сил, ни времени переделывать уже не было.
Ближеночье воскресенья
Теперь по железной части точно всё :) Осталось дописать прошивку, чтобы реагировала на кнопку, играла анимашку огоньками и печатала тестовый стикерок. Ах да, стикерочки! Чтобы распечатать что-то ненужное, сначала нужно нарисовать что-то ненужное. Т.к. от идеи генерить налету в самом ESP32 я отказался, задачка была бесхитростной:
- пишу набор фразочек. Не без помощи ChatGPT, но под чутким контролем, с кожаной приёмкой и в финале разбавляю рукотворными фразочками
- пару часов мучаю Claude с генерацией скрипта, который:
- возьмёт фразу
- красиво впишет в размер стикера
- разбавит всякой мешурой
- сгенерит код, закодировав в RLE каждый стикер
- ESP32 останется только быстренько раскодировать и отправить на печать
Профит:

На работе катить такой код я бы не решился, но в этом случае он меня устроил, и я довольный отправился баиньки.
Результат
Всё припер на работу, всё подключил, и вуаля — всратые стикерочки готовы к печати!
Если кому пригодится, весь код есть на github: buglloc/printmas
А на сегодня у меня всё. Всем (づ˶•༝•˶)づ♡