
Keychain rev b
olerast67/emotion-keychain
Брелок с OLED-экраном и анимированными эмоциями

Брелок с OLED-экраном и анимированными эмоциями
Keychain rev b panel is an open-source printed circuit board by olerast67, from the olerast67/emotion-keychain repository on GitHub, published under the Apache-2.0 licence. It is a 4-layer board of 76 × 72 mm with 168 parts on 78 nets, routed with 1,070 tracks and 218 vias.
It is built around the MDBT50Q-1MV2, LTR-303ALS-01 and LIS3DH, with the SPH0641LM4H-1, USBLC6-2SC6 and AO3400A among its other parts. Its parts include 40 resistors, 28 capacitors, 12 ICs, 8 diodes and 8 transistors. It belongs with the lEDs and displays boards and the nRF52 and nRF5x boards of this library.
English | Русский
Статус: готова к заказу. Перед выпуском плату исправили по полному предрелизному аудиту и независимой проверке: SA0 акселерометра на VDD, ёмкость на выходе REG0 в норме Nordic, перемычки экрана дальше от штырей, заряд по разрешению прошивки, уровень статуса заряда, TVS на VBUS, панель для монтажа, нормы JLCPCB по отверстиям и шёлку (список). Переходные 0.25/0.55 мм, переходных в площадках нет. DRC — 0 ошибок, 0 несоединённых, 0 предупреждений (
out/keychain-rev-b-drc.rpt). Файлы для заказа уже собраны: одна плата — вout/, панель для монтажа — вout/panel/. Перед заказом пройдите список «Что сверить».
Своя плата брелока: модуль nRF52840 (Raytac MDBT50Q), зарядка Li-Po от USB-C, датчики, пищалка, вибро и кнопка. Модуль экрана SSD1306 0.96″ стоит над ней на ушках акриловых рамок корпуса, ячейка — между ними. Как устроена схема и почему так — в описании железа.

Корпус из акрила под лазерную резку и 3D-просмотр собранного брелока — в case/.
Всё генерируется скриптами из одного описания gen/netlist.py: схема, плата, трассировка, Gerber, BOM и CPL. Руками в KiCad ничего не правится.
Для заказа ничего запускать не нужно. Плата keychain-rev-b.kicad_pcb разведена и проверена, файлы для заводов лежат в out/ и out/panel/ — их загружают как есть (JLCPCB, PCBWay). Скрипты нужны, только чтобы изменить плату:
cd hardware/rev-b/gen
python3 build.py place --force # расставить детали заново — плата БЕЗ дорожек (out/work/place-*.png)
python3 build.py route # переходные земли и питания, шины питания, Freerouting, доводка, заливки, DRC
python3 build.py finish # доводка разведённой платы без перетрассировки — только проверка, без записи
python3 build.py finish --force # то же с записью: паста, шёлк и надписи из netlist.py, отверстия
python3 build.py fab # DRC, Gerber, BOM, CPL, файлы PCBWay, чертежи, превью, панель → out/, out/panel/ (нужен KiKit, ниже)
python3 build.py panel # DRC платы, потом только панель → out/panel/ (нужен KiKit, ниже)
python3 schematic.py # схема A3 + сверка с netlist.py → out/keychain-rev-b-schematic.pdfplace и route заменяют разведённую плату: place — платой без дорожек, route — новой разводкой (Freerouting от прогона к прогону разводит по-разному). Поэтому без --force оба отказываются, если в плате уже есть дорожки. После place --force нужен route — уже без --force, дорожек ведь нет.
route и finish --force записывают плату только после чистого DRC. Не прошла — keychain-rev-b.kicad_pcb не тронута, а результат для разбора лежит в out/work/keychain-rev-b-*-failed.kicad_pcb, отчёт — в out/work/keychain-rev-b-drc.rpt. route сначала проверяет Java и Freerouting и только потом трогает плату. finish без --force ничего не пишет: доводит плату в памяти, гоняет DRC и говорит, изменилась бы плата.
fab сам прогоняет DRC. Если есть ошибки, несоединённые площадки, в плате нет дорожек или на площадках деталей, которые завод не ставит, есть паста, он ничего не пишет ни в out/, ни в out/panel/. Панель он собирает раньше файлов одной платы, в черновик out/work/panel-new: не собралась или не прошла проверки — out/ и out/panel/ не тронуты; собралась — пишутся файлы одной платы, и черновик целиком заменяет out/panel/. build.py panel сначала так же проверяет плату и только потом собирает панель.
Отчёт out/keychain-rev-b-drc.rpt пишет только fab и только для платы, которая прошла. Отчёты route и finish — в out/work/.
Если что-то пошло не так, вернуть плату и файлы из репозитория:
git checkout -- hardware/rev-b/keychain-rev-b.kicad_pcb hardware/rev-b/Keychain.pretty hardware/rev-b/outНужен именно KiCad 7 (pcbnew для Python и kicad-cli): на KiCad 8 и новее скрипты не работают. Для превью и чертежей — cairosvg (pip install cairosvg, путь можно дать в CAIROSVG) или rsvg-convert, и Pillow. Для route — Java 21 и Freerouting 2.1, путь к jar — в FREEROUTING_JAR. Для панели — KiKit 1.5.1 в Python, где виден pcbnew KiCad 7:
python3 -m venv --system-site-packages ~/kikit-venv && ~/kikit-venv/bin/pip install kikit==1.5.1
KIKIT_PYTHON=~/kikit-venv/bin/python python3 build.py fab # и так же build.py panelfab и panel берут KiKit из того python3, которым запущены, а если там его нет — из Python по пути в KIKIT_PYTHON. Без KiKit fab останавливается до того, как что-то записать. build.py fab --no-panel собирает файлы одной платы и удаляет out/panel/: старая панель уже не совпадала бы с платой.
Плата: 30 × 46 мм и ушко для кольца по центру сверху (полукруг R4.5, отверстие 3.2 мм без металлизации), 4 слоя, 1.6 мм, углы R2.
Верхние 18 мм — модуль nRF антенной к правому краю и датчик света, который смотрит вперёд. Ниже — модуль экрана.
Сбоку стек: стекло и плата модуля экрана → две рамки ячейки из акрила, на их ушках лежит модуль, внутри ячейка Li-Po на тонком двустороннем скотче → эта плата → детали на обороте. Покупных стоек нет.
Три версии, S, M и L: ячейки 402025, 502025 и 602025 (~150, ~200 и ~250 мА·ч), под модулем экрана 6, 7 и 8 мм (рамки ячейки 3 + 3, 3 + 4 и 3 + 5 мм). Плата и прошивка у всех одни и те же, винты корпуса у всех M2 × 25. Ячейка подходит, если:
толщина ячейки + 0.3 мм (каптон и скотч под ней) + 0.1 мм (каптон на обороте модуля) + 0.3 мм (вздутие) ≤ высота под модулем − самая высокая деталь на обороте модуля
Толщину ячейки меряют штангенциркулем в самом толстом месте. Высота под модулем — это две рамки ячейки стопкой, тоже по штангенциркулю: листы акрила гуляют на ±0.1–0.3 мм. Пересчёт по вашим листам — python3 case.py --sheet 3=… --sheet 4=… в папке case/. Деталь на обороте модуля — 1.1–1.45 мм, смерьте свой модуль. Не влезает — версия на ступень выше. Подробно, вместе с гребёнкой экрана и винтами, — в README корпуса.
| Слой | Что на нём |
|---|---|
| L1 (лицевая) | модуль nRF, датчик света, конденсаторы модуля, площадки ячейки и штырей экрана; длинные сигналы под ячейкой |
| L2 | сплошная земля, без разрезов |
| L3 | шины питания: VBUS, VBAT и VSYS по 0.4 мм, VDD 0.3 мм; медленные сигналы; всё остальное место — земля |
| L4 (оборотная) | остальные детали и сигналы |
Ширины по классам цепей (NETCLASSES):
| Класс | Цепи | Дорожка | Где |
|---|---|---|---|
| Power | VBUS, VBAT, VSYS | 0.4 мм | L3 |
| Rail | VDD (3.3 В) | 0.3 мм | L3 |
| Supply | питание экрана и мотора | 0.3 мм | L1, L3, L4 |
| USB | D+, D− | 0.18 мм | L1, L4 |
| Default | сигналы, питание микрофона | 0.15 мм | L1, L3, L4 |
Токи здесь до 0.25 А, 0.4 мм во внутреннем слое держит около 0.7 А. Сигналы в L3 опираются на сплошную землю L2 рядом. Переходные — 0.25/0.55 мм (поясок 0.15 мм): это норма и JLCPCB, и PCBWay.
Порядок трассировки:
gen/powerroute.py).gen/fixroute.py по L1, L3 и L4 с переходными, но не в площадках деталей; обрезки и висящие переходные убираются.Поэтому у питания и земли нет длинных тонких путей по внешним слоям.
Ножки модуля выбраны под эту расстановку (GPIO в netlist.py). Датчики выведены на левый столбец модуля. Экран, USB, SWD, пищалка, кнопка, вибро и зарядка — на нижний ряд, слева направо в том же порядке, что их блоки. Все сигналы — на внешних площадках или в широких зазорах между ними, тонких дорожек нет.
Антенна. Под антенной модуля меди нет ни на одном слое — это зона из документации Raytac (x ≥ 26, y ≤ 12.5 мм). Ниже неё вдоль правого края идут единственным путём сигналы от модуля к SWD и кнопке, поэтому зону вниз не расширяли; угол платы и так открыт с двух сторон. Винт корпуса справа сверху (x 26.75, y 20.2) — всего в 7.7 мм ниже зоны: винты и гайки корпуса берите нейлоновые, M2 × 25 (что купить). Если нейлоновых M2 × 25 не найти, стальные винты допустимы для своих прототипов, а гайки всё равно нейлоновые. Для брелоков на продажу — только нейлон. Порог сигнала встреч (−70 дБм, встречи) стоит проверить на собранных брелоках в корпусе.
UICR.REGOUT0 = 3V3) записывает заводской файл прошивки или загрузчик при первом запуске.keychain-revb-factory.hex (готовые файлы) сразу записывает в UICR 3.3 В, и после сброса в конце прошивки на 3V3 уже 3.3 В. Если записан только загрузчик, 3.3 В он ставит сам при первом запуске и перезагружается.Детали стоят с двух сторон, а такой монтаж у JLCPCB — только Standard PCBA: плата или панель не меньше 70 × 70 мм, с технологическими полями, реперными точками и технологическими отверстиями. Плата меньше (30 × 52.5 мм с ушком), и у двух её краёв почти ничего нельзя — V-cut и полей нет нигде:
Поэтому панель готова в out/panel/ (её собирает gen/panel.py через KiKit):

gen/panel.py при сборке проверяет это сам, потому что DRC KiCad этого не видит: отверстия mouse bites — не ближе 0.25 мм к меди, медь — не ближе 0.3 мм к линиям разлома, и так же на копии панели после перезаливки.R1_1 на левой плате, R1_2 на правой, повёрнутой. Так их ждут BOM и CPL панели.out/panel/keychain-rev-b-panel-drc.rpt), у перезалитой копии — тоже.Обломки перемычек. После разламывания на краю платы остаются бугорки до ~0.3 мм (до линии центров отверстий и чуть дальше, если перемычка обломилась неровно). Их сошлифовывают надфилем или наждачкой заподлицо с краем: торец платы в корпусе должен быть ровным, как в модели корпуса. Где они, в координатах платы (мм от левого верхнего угла прямоугольника 30 × 46, ушко не в счёт):
| Край | Где |
|---|---|
| левый (x = 0) | y 3.25–8.25, 24.5–29.5 и 35.2–38.2 |
| верхний (y = 0), левее ушка | x 2.5–6.5 |
| нижний (y = 46), между USB-C и правым винтом | x 22.0–25.0 |
У правого края и на ушке обломков нет.
Одна плата без панели (out/keychain-rev-b-gerbers.zip) — для заказа голых плат, без монтажа.
Ничего запускать не нужно: файлы уже в out/panel/.
Файлы для монтажа (панель):
out/panel/keychain-rev-b-panel-gerbers.zip — панель;out/panel/keychain-rev-b-panel-bom-jlcpcb.csv и out/panel/keychain-rev-b-panel-cpl-jlcpcb.csv — BOM и CPL на обе платы панели.Только голые платы, без монтажа, — out/keychain-rev-b-gerbers.zip.
PCB: 4 слоя, 1.6 мм, покрытие ENIG (кнопки и площадки Tag-Connect служат дольше), чёрная маска, контроль импеданса не нужен. Переходные 0.25/0.55 мм, отверстия разных цепей — не ближе 0.5 мм. Шёлк — обычный: надписи 1.0 мм, линия 0.16 мм.
JLCJLCJLCJLC. Метка — шёлком на лицевой стороне под ячейкой (x 10–20, y 25.8 мм), у каждой платы, то есть у обеих копий на панели. Ячейка и модуль экрана её закрывают. Без этого выбора завод ставит номер, куда сочтёт нужным, и метку может не заметить, а плату видно сквозь прозрачный корпус. «Remove Mark» (без номера вовсе) тоже годится, но может стоить дороже — цену покажет форма.Панель:
Delivery Format — Panel by Customer, одна разработка в панели;
размер 76 × 72 мм;
PCB Qty — в панелях, на каждой две платы. Меньше 5 у JLCPCB не заказать: 5 панелей — это 10 плат. Сколько из них собрать, задаётся отдельно, в монтаже;
Edge Rails / Fiducials и Tooling Holes — Added by Customer: рамка, реперные точки и отверстия уже в файлах;
в комментарии к заказу:
Customer panel 76 x 72 mm, 2 boards. Routed slots with mouse-bite tabs only; no V-cut anywhere. Frame, fiducials, tooling holes and all tabs are in the files. Please do not add any rails, tabs or V-cuts: the USB-C connector overhangs the boards' bottom edges and the side button overhangs their right edges. The only bottom-edge tab is the short one between the USB-C connector and the corner screw hole (on the rotated copy it appears at the top, left end).
Монтаж:
out/panel/;gen/fab.py). SOT-23 (Q1–Q4) — 180°, так его показывает предпросмотр JLCPCB по отчётам пользователей; SOT-23-6 (U3) — −90°. U2 (SOT-23-5, C38066) — −90° наугад: посадочные места SOT-23-5 у JLCPCB повёрнуты по-разному, и нужно либо −90°, либо 180°, а какое место у C38066, мы не видели. USB-C J1 (C165948) — 180° по двум давним таблицам, но единственное сообщение о проверке в предпросмотре (проверить его мы не смогли) говорит 0°, то есть разворот на 180°. U2 и J1 — первые кандидаты на поворот. Для SW1 и U1 (Global Sourcing) поправки нет вовсе: посадочное место им рисует сама JLCPCB. Поэтому в предпросмотре JLCPCB сверьте метку первого вывода каждой полярной детали, у обеих копий на панели (_1 и _2, вторая повёрнута на 180°), и поверните там, что не сходится. Точную поправку потом впишите по номеру LCSC в JLC_PART_ROTATION в gen/fab.py (как её посчитать — там же) и пересоберите build.py fab: следующий заказ уйдёт с верными углами. Что сверять:
out/panel/keychain-rev-b-panel-assembly-bottom.png (одна плата — out/keychain-rev-b-assembly-bottom.png): Q1–Q4, U2, U3, U4, U6, D1, D2, D3, LED1, J1 и SW1. У SW1 шток должен смотреть наружу, за правый край платы: на чертеже панели — в общий паз посередине у обеих копий, на зеркальном чертеже одной платы — влево. Две большие площадки SW1 — у края, маленькая — внутрь. Перевёрнутый J1 сразу видно: лапки корпуса не попадают в отверстия;out/panel/keychain-rev-b-panel-assembly-top.png (одна плата — out/keychain-rev-b-assembly-top.png): U1 — треугольник первого вывода, сторона без площадок (антенна) — к правому краю платы; U5 (LTR-303) — метка первого вывода. У U5 площадки 2 × 3 симметричны, и поворот на 180° выдаёт только метка;Руками паяются модуль экрана, ячейка и вибромотор (ниже). Перемычки R16 и R18 ставит завод; на площадках R17 и R19 пасты нет. Прошивки в этом заказе нет: первую прошивку запишите сами (программатор).
Платы из панели выламываются по перемычкам, обломки сошлифовываются заподлицо (где они).
Ничего запускать не нужно.
Файлы из out/panel/ (та же панель, что для JLCPCB):
keychain-rev-b-panel-gerbers.zip — панель;keychain-rev-b-panel-bom-pcbway.csv — производитель, MPN, описание с номиналами, обозначения обеих копий; R17 и R19 — строками DNP;keychain-rev-b-panel-centroid-pcbway.csv — расстановка с углами KiCad, без поправок JLCPCB;keychain-rev-b-panel-assembly-top.png и -bottom.png — сборочные чертежи с метками первого вывода (оборот — зеркально, как его видит монтажник);keychain-revb-factory.hex из firmware/release/ (версия и сумма — там же); для брелоков на продажу — firmware-factory.hex своей сборки со своими номерами (раздел [sale] в firmware/platformio.ini).Голые платы без монтажа — out/keychain-rev-b-gerbers.zip; файлы одной платы (out/keychain-rev-b-*) — на случай, если завод захочет собрать панель сам.
PCB: 4 слоя, 1.6 мм, ENIG, дорожка/зазор 0.15 мм (6/6 mil), минимальное отверстие 0.25 мм. Переходные 0.25/0.55 мм, поясок 0.15 мм — это норма PCBWay; отверстия меньше 0.3 мм у них с небольшой доплатой.
Панель — своя («Panel by customer»), 76 × 72 мм, две платы. В комментарии к заказу — тот же текст, что для JLCPCB. Если в форме есть номер заказа или логотип на плате, откажитесь от него: плату видно сквозь корпус. Метка JLCJLCJLCJLC под ячейкой PCBWay не мешает — она так и останется надписью, закрытой ячейкой. Технологические отверстия на рамке — 1.152 мм, под JLCPCB; если PCBWay нужны свои (обычно 2–3 мм), на верхней и нижней планках рамки (7.7 мм) для них есть место — попросите добавить.
Монтаж: Turnkey, детали с двух сторон, SMD и немного THT — у J1 четыре лапки корпуса в отверстиях.
keychain-rev-b-panel-assembly-bottom.png, лицевая сторона (U1, U5) — по keychain-rev-b-panel-assembly-top.png.Прошивка на заводе («Firmware loading»). Для прототипов — keychain-revb-factory.hex из firmware/release/. Для брелоков на продажу — firmware-factory.hex своей сборки со своими USB VID/PID (раздел [sale] в firmware/platformio.ini): в файлах release/ номера прототипа. Площадки SWD — J3 под кабель Tag-Connect TC2030 (разъёма нет): уточните, что завод может так прошить. Плату при этом питают от USB-C 5 В; площадка 1 J3 — только VTref, не питание, а программатор должен работать с уровнями по ней: до сброса в конце прошивки VDD = 1.8 В.
Руками — то же, что у JLCPCB: модуль экрана, ячейка и вибромотор. Обломки перемычек — сошлифовать.
Вся сборка — по шагам сборки корпуса: это единственный подробный порядок, вместе с проверками первого включения. Ячейка лежит под модулем экрана, и её площадки модуль закрывает, поэтому порядок именно такой: прошивка, перемычки экрана, мотор, ячейка, потом экран. Всё, что паяют на плате рядом с ячейкой, — до неё.
Коротко, с теми же номерами шагов:
Брелок, который уходит в подарок, последним шагом после сборки и проверок получает factory yes в консоли (команды): он возвращается в заводское состояние и гаснет.
Проверки идут по ходу сборки корпуса, каждая на своём шаге. Консоль брелока — USB, 115200 бод, любой терминал: монитор порта Arduino IDE, pio device monitor -b 115200, PuTTY или screen (как открыть). Приветствие при включении печатается один раз и до терминала обычно не доходит: порт появляется, когда брелок уже запустился. Поэтому проверяют командами ver и sensors — они отвечают в любой момент. Контрольные точки — на обороте, три круглые площадки с подписями GND, SYS и 3V3 (TP3, TP2, TP1). Что делать, если не так, — ниже.
ver — Прошивка <версия>, плата rev B. Версия — та же, что в firmware/release/; у брелока на продажу — метка вашей сборки для продажи, без -dirty.sensors — первая строка Ускорение: x … или «Ускорение: нет новых выборок» (тогда повторите), но не «Акселерометр не отвечает»; вторая начинается с Свет: есть, а не Свет: нет ответа. Так проверяют акселерометр и датчик света на каждой плате.sensors пишет «USB да, заряжается да».Пустая ячейка и хранение. Брелок выключается сам («Ячейка почти пуста — выключаюсь»), пока в ячейке ещё остаётся ~3.6 мА·ч до отсечки её платы защиты. Выключенный брелок берёт 6–17 мкА (предел на проверке — 25 мкА), так что этого запаса хватит на 9–25 дней. Дальше ячейка разряжается глубже, и это её портит. Зарядите брелок в течение недели. На долгое хранение оставляйте его заряженным примерно наполовину и подзаряжайте раз в 2–3 месяца. Расчёт — в энергобюджете.
| Что видно | Что делать |
|---|---|
| SYS около 0 В при USB-C | Возьмите кабель USB-A → USB-C от компьютера: зарядник USB-C с кабелем C–C даёт 5 В, только когда видит резисторы 5.1 кОм на CC, а при плохой пайке J1 он их не видит. Осмотрите пайку J1 в лупу. Если 5 В есть на конденсаторе C1 (оборот, сборочный чертёж), а на SYS нет, виноват диод D1 |
| SYS есть, 3V3 около 0 В | Обесточьте плату и прозвоните 3V3–GND (TP1–TP3). Короткий писк — это заряжаются конденсаторы, длинный — замыкание. Замыкание или непропай модуля на плате, собранной заводом, — брак монтажа: плату и фото — заводу |
| 3V3 так и 1.8 В после прошивки | В UICR не записано 3.3 В: залит файл без загрузчика и UICR (keychain-revb.hex, firmware.hex) или не было сброса. Запишите именно заводской файл — keychain-revb-factory.hex (своя сборка — firmware-factory.hex), с --reset, потом отключите и снова подключите USB. Проверка: nrfjprog -f nrf52 --memrd 0x10001304 должен показать FFFFFFFD. С Pico: pyocd cmd -t nrf52840 -f 100k -c "read32 0x10001304" — должно быть FFFFFFFD. |
| Нет диска KEYCHAIN | После keychain-revb-factory.hex его и не должно быть: брелок сразу запускает прошивку. Диск появляется только в загрузчике: зажать кнопку и, не отпуская, сразу подключить USB (в течение 10 с от нажатия) или команда dfu в консоли. Нет ни диска, ни порта консоли — кабель «только для зарядки» (возьмите другой) или пайка J1 |
| Нет лица после нажатия кнопки | Выключите брелок и отключите USB. Сверьте надписи на модуле (GND VCC или VCC GND) с перемычками — шаг 2 сборки корпуса (если ячейка уже стоит, перемычки перепаивают только после того, как её отпаяют); модуль, которому подали питание наоборот, мог сгореть. Осмотрите пайку штырей J2 в лупу и прозвоните их, как в шаге 10 |
| Лицо искажено: полоса, мусор у края, картинка сдвинута | Вероятно, модуль на SH1106, а не на SSD1306: прошивка брелока работает только с SSD1306 (экран). Замените модуль на SSD1306 0.96″; модули новой партии сначала проверьте на стенде (что сверить) |
| Консоль: «Шина экрана зажата: SDA или SCL в нуле или замкнуты между собой» (печатается один раз, обычно при включении) | Брелок работает без экрана: консоль, зарядка и выключение кнопкой действуют. Выключите его (кнопка 3 с) и отключите USB. Ищите каплю припоя между штырями J2 (SCL–SDA, SCL или SDA на GND) в лупу, лишний припой снимите оплёткой. Прозвоните SCL–GND, SDA–GND и SCL–SDA: несколько килоом между SCL и SDA — это подтяжки модуля, норма. Замыкания нет — неисправен модуль, замените. Строка «Шина экрана зажата посреди работы» повторяется — модуль тоже ненадёжен |
| Лицо было и пропало | Темно дольше минуты — это режим кармана: экран выключен. Свет, касание или кнопка возвращают лицо |
| Светодиод заряда ярко не горит (только слабо тлеет или не виден), ячейка есть, USB подключён | Консоль «Заряд не идёт: … °C» или sensors показывает температуру ниже 10 °C или выше 42 °C — кристалл слишком холодный или горячий: согрейте или остудите брелок, проверка раз в 30 с. Виден диск KEYCHAIN — в загрузчике заряда нет: отключите и снова подключите USB. ver отвечает «Не знаю такую команду» или sensors пишет «Акселерометр не отвечает» — возможно, прошивка старая и не заряжает: залейте новую (готовые файлы). sensors пишет «заряжается нет», а лицо показывает полный заряд — ячейка уже заряжена |
| Заряд всё идёт, процент стоит на 99 % | Слабый USB (ниже ~4.6 В на плате): конец заряда читается как «заряжается» (статус заряда). Возьмите другой зарядник или кабель короче |
| Ток выключенного больше 25 мкА | Сначала убедитесь, что брелок правда выключен: экран тёмный, консоль молчит, ток не скачет каждые несколько секунд. Если выключен — утечка: SA0 акселерометра не на VDD или D1 и R6 у VBUS. Это брак монтажа или детали: такую плату не продавайте |
Эти замеры делают один раз на первых платах партии, не на каждом брелоке.
OLED в gen/footprints.py — плата, ряд штырей, отверстия. Высота самой высокой детали на обороте модуля — от неё зависит зазор над ячейкой.h — это SH1106, для брелока не годится.CELL). Не шире 20.7 мм и не длиннее 25.0 мм вместе с плёнкой и платой защиты: гнездо в рамках 21.0 мм, а сверху ячейку подпирает пластик гребёнки. Многие «402025» на деле до 20.5 × 25.5 мм — по длине такая не войдёт (README корпуса). По паспорту ячейки (datasheet): максимальный ток заряда — не меньше 100 мА, диапазон температуры заряда включает 0–45 °C, как минимум 7–45 °C.gen/netlist.py).out/keychain-rev-b-drc.rpt — 0 ошибок, 0 несоединённых, 0 предупреждений; у панели — out/panel/keychain-rev-b-panel-drc.rpt. Оба отчёта пишет build.py fab и только для платы, которая прошла. Если вы меняли плату, out/ должен быть собран после последней правки.out/panel/, текст комментария — из заказа на JLCPCB. V-cut и полей нигде нет, перемычки — только те, что в файлах: у правого края ни одной, у нижнего одна короткая справа.JLCJLCJLCJLC под ячейкой (заказ).JLC_PART_ROTATION (gen/fab.py).out/panel/ (выше): без неё Standard PCBA у JLCPCB не заказать.fab это проверяет.keychain-rev-b.kicad_dru, его видит DRC. Три переходных сдвинуты на 18–40 мкм, теперь самый малый зазор — 0.512 мм. Трассировщики (build.py, fixroute.py) эту норму тоже держат.place не затирает разведённую плату без --force, route проверяет Java и Freerouting до начала, fab не пишет файлы без чистого DRC.JLCJLCJLCJLC на лицевой стороне под ячейкой и выбор «Order Number (Specify Position)» в заказе: номер не встанет на виду. Количество в заказе — в панелях, PCB от 5, PCBA от 2.panel.py проверяет медь у перемычек сам.build.py panel и fab проверяют плату раньше, чем тронута out/panel/, и собирают панель в черновик; не вышло — out/ и out/panel/ как были. route без --force не трогает разведённую плату, route и finish --force пишут плату только после чистого DRC, finish без --force только проверяет. Отчёт в out/ пишет только fab.gen/fab.py есть таблица точных поправок по номеру LCSC (JLC_PART_ROTATION) — для заполнения после первого предпросмотра.netlist.py совпадают по всем выводам; ножки модуля — с board.h и variant.h прошивки; NFC-ножки и сброс не заняты; в запретной зоне антенны меди нет.| Qty | Value | Footprint | References |
|---|---|---|---|
| 44 | NPTH | NPTH | KiKit_MB_1_2, KiKit_MB_1_3, KiKit_MB_1_4, KiKit_MB_1_5, KiKit_MB_1_6, KiKit_MB_2_2, KiKit_MB_2_3, KiKit_MB_2_4, KiKit_MB_2_5, KiKit_MB_2_6, KiKit_MB_3_2, KiKit_MB_3_3, KiKit_MB_3_4, KiKit_MB_10_2, KiKit_MB_10_3, KiKit_MB_10_4 +28 |
| 16 | 100nF | Capacitor_SMD:C_0402_1005Metric | C5_1, C5_2, C7_1, C7_2, C8_1, C8_2, C11_1, C11_2, C13_1, C13_2, C14_1, C14_2, C15_1, C15_2, C16_1, C16_2 |
| 14 | 10k | Resistor_SMD:R_0402_1005Metric | R3_1, R3_2, R5_1, R5_2, R6_1, R6_2, R8_1, R8_2, R10_1, R10_2, R11_1, R11_2, R12_1, R12_2 |
| 8 | 0R | Resistor_SMD:R_0402_1005Metric | R16_1, R16_2, R17_1, R17_2, R18_1, R18_2, R19_1, R19_2 |
| 8 | 10uF | Capacitor_SMD:C_0603_1608Metric | C1_1, C1_2, C2_1, C2_2, C3_1, C3_2, C4_1, C4_2 |
| 6 | 100k | Resistor_SMD:R_0402_1005Metric | R7_1, R7_2, R9_1, R9_2, R15_1, R15_2 |
| 6 | 1k | Resistor_SMD:R_0402_1005Metric | R4_1, R4_2, R13_1, R13_2, R14_1, R14_2 |
| 6 | Fiducial | Fiducial | KiKit_FID_B_1, KiKit_FID_B_2, KiKit_FID_B_3, KiKit_FID_T_1, KiKit_FID_T_2, KiKit_FID_T_3 |
| 4 | 5.1k | Resistor_SMD:R_0402_1005Metric | R1_1, R1_2, R2_1, R2_2 |
| 4 | AO3400A | Package_TO_SOT_SMD:SOT-23 | Q3_1, Q3_2, Q4_1, Q4_2 |
| 4 | AO3401A | Package_TO_SOT_SMD:SOT-23 | Q1_1, Q1_2, Q2_1, Q2_2 |
| 2 | 1N4148WS | Diode_SMD:D_SOD-323 | D2_1, D2_2 |
| 2 | 1uF | Capacitor_SMD:C_0402_1005Metric | C12_1, C12_2 |
| 2 | 4.7uF | Capacitor_SMD:C_0603_1608Metric | C6_1, C6_2 |
| 2 | 47k | Resistor_SMD:R_0402_1005Metric | R20_1, R20_2 |
| 2 | B3U-3100P | Button_Switch_SMD:SW_SPST_B3U-3100P | SW1_1, SW1_2 |
| 2 | B5819W | Diode_SMD:D_SOD-123 | D1_1, D1_2 |
| 2 | GND | TestPoint:TestPoint_Pad_D1.0mm | TP3_1, TP3_2 |
| 2 | LIS3DH | Package_LGA:LGA-16_3x3mm_P0.5mm_LayoutBorder3x5y | U4_1, U4_2 |
| 2 | LTR-303ALS-01 | OptoDevice:Lite-On_LTR-303ALS-01 | U5_1, U5_2 |
| 2 | LiPo 402025 | Keychain:LiPo_Pads_20x25mm | BT1_1, BT1_2 |
| 2 | MCP73832-2 | Package_TO_SOT_SMD:SOT-23-5 | U2_1, U2_2 |
| 2 | MDBT50Q-1MV2 | RF_Module:Raytac_MDBT50Q | U1_1, U1_2 |
| 2 | OLED 0.96" I2C | Keychain:OLED_SSD1306_0.96in_I2C_Module | J2_1, J2_2 |
| 2 | PKMCS0909E4000 | Buzzer_Beeper:Buzzer_Murata_PKMCS0909E | BZ1_1, BZ1_2 |
| 2 | SMF5.0A | Diode_SMD:D_SOD-123F | D3_1, D3_2 |
| 2 | SPH0641LM4H-1 | Sensor_Audio:Knowles_LGA-5_3.5x2.65mm | U6_1, U6_2 |
| 2 | SWD | Connector:Tag-Connect_TC2030-IDC-NL_2x03_P1.27mm_Vertical | J3_1, J3_2 |
| 2 | USB-C | Connector_USB:USB_C_Receptacle_HRO_TYPE-C-31-M-12 | J1_1, J1_2 |
| 2 | USBLC6-2SC6 | Package_TO_SOT_SMD:SOT-23-6 | U3_1, U3_2 |
| 2 | VDD | TestPoint:TestPoint_Pad_D1.0mm | TP1_1, TP1_2 |
| 2 | VSYS | TestPoint:TestPoint_Pad_D1.0mm | TP2_1, TP2_2 |
| 2 | red | LED_SMD:LED_0603_1608Metric | LED1_1, LED1_2 |
| 2 | вибромотор 0820 | Keychain:VibroMotor_Coin_D8mm | M1_1, M1_2 |
| 2 | кольцо брелока или винт корпуса | MountingHole:MountingHole_3.2mm_M3 | H1_1, H1_2 |

olerast67/emotion-keychain
Брелок с OLED-экраном и анимированными эмоциями

rjsc/BECom
BECom - Battery Emulator Companion - Open Source Hardware, designed to run dalathegreat/Battery-Emulator

mmazzanti/PMT-counter
A PCB board for counting pulses up to 1.5GHz from a PMT (or similar)

open-dynamic-robot-initiative/open-motor-driver-initiative
Open-source drive for brushless motors, following the open dynamic robot initiative


SkyRizzAI/SkyRizz-ESPSOL
An open-hardware, coin-sized ESP32-S3 development board with an on-board secure element, 6-axis IMU, PDM microphone, buzzer, USB-C, and Li-Po charging — all on a 40.6 mm (1.6") round, 2-layer PCB.
zgeez/Pixel-Badge
Wearable 32x32 LED badge with Zephyr firmware, BLE control, passive NFC, and a Flutter Android app, built around a custom nRF52840 PCB.

ssjowowo/bleep
Most universal remotes either have a screen and few buttons, or lots of buttons and no screen. Bleep has both. The touchscreen shows activities, now-playing and smart-home controls.
It measures 76 × 72 mm and has 4 copper layers, 1.6 mm thick.
168 parts, built around the MDBT50Q-1MV2, LTR-303ALS-01, LIS3DH and SPH0641LM4H-1. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the olerast67/emotion-keychain repository on GitHub, at the commit this page was made from: the board is hardware/rev-b/out/panel/keychain-rev-b-panel.kicad_pcb and its schematic hardware/rev-b/keychain-rev-b.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository publishes it under the Apache-2.0 licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).