Skip to the content
4 layers76 × 72 mmKeychain rev b panel, the printed circuit board in 3D

Keychain rev b panel

olerast67/emotion-keychain

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

Size
76 × 72 mm
Copper layers
4
Thickness
1.6 mm
Parts
168
Nets
78
Pads
530
Tracks, vias
1,070, 218
Pours
14
Routed
Yes
KiCad
KiCad 7 (file 20221018)
Created
23 Oct 2026
Updated
1 Nov 2026

Overview

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.

Main components

12

README

hardware/rev-b/README.md

English | Русский

Плата rev B

Статус: готова к заказу. Перед выпуском плату исправили по полному предрелизному аудиту и независимой проверке: 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″ стоит над ней на ушках акриловых рамок корпуса, ячейка — между ними. Как устроена схема и почему так — в описании железа.

Плата rev B: лицевая сторона и оборот

Корпус из акрила под лазерную резку и 3D-просмотр собранного брелока — в case/.

Всё генерируется скриптами из одного описания gen/netlist.py: схема, плата, трассировка, Gerber, BOM и CPL. Руками в KiCad ничего не правится.

Для заказа ничего запускать не нужно. Плата keychain-rev-b.kicad_pcb разведена и проверена, файлы для заводов лежат в out/ и out/panel/ — их загружают как есть (JLCPCB, PCBWay). Скрипты нужны, только чтобы изменить плату:

sh
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.pdf
  • place и 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/.

  • Если что-то пошло не так, вернуть плату и файлы из репозитория:

    sh
    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:

sh
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 panel

fab и 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):

КлассЦепиДорожкаГде
PowerVBUS, VBAT, VSYS0.4 ммL3
RailVDD (3.3 В)0.3 ммL3
Supplyпитание экрана и мотора0.3 ммL1, L3, L4
USBD+, 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.

Порядок трассировки:

  1. Каждая площадка земли получает своё переходное в L2, каждая площадка питания — в L3, с зазорами классов цепей.
  2. Шины питания в L3 прокладывает свой трассировщик (gen/powerroute.py).
  3. Сигналы разводит Freerouting; земля для него — плоскость L2, уже проложенное питание закреплено.
  4. Что Freerouting не довёл, прокладывает gen/fixroute.py по L1, L3 и L4 с переходными, но не в площадках деталей; обрезки и висящие переходные убираются.
  5. Заливки земли, сшивка островков, DRC.

Поэтому у питания и земли нет длинных тонких путей по внешним слоям.

Расстановка по блокам

  • Ушко, лицевая сторона:
    • модуль;
    • датчик света, его выводы SDA, INT и SCL напротив своих ножек модуля;
    • конденсаторы у ножек питания модуля.
  • Ушко, оборот:
    • пищалка за модулем, левее антенны;
    • подтяжки шины датчиков;
    • микрофон: его отверстие выходит на лицевую сторону мимо конденсаторов;
    • ключ питания экрана над штырями;
    • акселерометр.
  • Середина, оборот:
    • перемычки порядка питания экрана R16–R19 — в ряд под штырями, почти в 2 мм от них;
    • площадки программатора Tag-Connect TC2030 и контрольные точки 3V3, SYS, GND;
    • вибромотор с ключом слева;
    • кнопка на правом торце.
  • Низ, оборот:
    • USB-C с защитой ESD посередине, TVS D3 — у разъёма;
    • зарядка слева;
    • разделение питания USB и батареи справа.

Ножки модуля выбраны под эту расстановку (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 дБм, встречи) стоит проверить на собранных брелоках в корпусе.

Питание и зарядка

  • USB-C. Резисторы 5.1 кОм на CC1 и CC2 — «я потребитель 5 В». USBLC6 (U3) защищает линии от статики, от выброса на VBUS она не спасает.
  • Выброс при горячем подключении. Индуктивность кабеля и керамика C1 дают на VBUS звон. По модели в ngspice он заметен только с коротким толстым кабелем (меньше ~0.2 Ом вместе с контактами) от зарядника, у которого 5 В на гнезде есть всегда: VBUS — до 6.2–6.9 В (зарядник 5.0–5.25 В), выше 5.8 В несколько микросекунд. VSYS за диодом D1 на ~0.35 В ниже, но выше 5.8 В может держаться до ~0.3 мс. Предел модуля и на выводе VBUS (на нём C8 100 нФ), и на VDDH (это VSYS) — 5.8 В, так что короткое превышение возможно. Зарядники USB-C по стандарту включают 5 В плавно и только после подключения, такого звона они не дают; длинный тонкий кабель его гасит.
    • TVS D3 SMF5.0A (рабочее 5 В, пробой 6.4–7.1 В, катод к VBUS) стоит у разъёма от статики и бросков на входе — ограничитель, которого требует документация MCP7383x. Звон ниже ~6.6 В он не трогает и под 5.8 В его не держит. Срезает только пики, которые ушли бы за предел зарядника 7 В, и то без гарантии.
    • Исправление — гасить звон у J1: RC-цепочка или конденсатор с ESR ~0.5–1 Ом и не меньше 10 мкФ. Это защитит и VBUS модуля, и VDDH, и зарядник; одного резистора 10 Ом перед VBUS модуля мало. Это — в плане rev C, а на первых платах звон меряют осциллографом (на первых платах); перед продажей этот замер обязателен.
  • Зарядка. MCP73832, 4.2 В, ток задаёт R3: I = 1000 В / R3, 10 кОм — 100 мА. Для ячеек 150–250 мА·ч по номиналу это не больше 0.7C; что проверить в паспорте ячейки — в README корпуса.
    • Заряд включает прошивка. Нижний конец R3 — не на земле, а на ножке P0.24 (CHG_EN, площадка 48 модуля). Ножка в нуле — заряд идёт; ножка отпущена — PROG висит, и зарядник выключен.
    • Прошивка заряжает только при температуре кристалла nRF от 10 до 42 °C и останавливает заряд ниже 7 °C и выше 45 °C (датчик кристалла ошибается до ±5 °C, а на USB кристалл теплее ячейки — поэтому запас у холода). Проверка — сразу при подключении USB и дальше раз в 30 с. У MCP73832 нет входа термистора, а заряжать литиевую ячейку на морозе нельзя. Подробно — в README прошивки.
    • Без прошивки заряда нет: на чистой плате, в загрузчике и до старта прошивки CHG_EN отпущен. Плата при этом работает от USB через D1.
    • Пока идёт заряд, ярко горит красный светодиод.
  • Статус заряда. Открытый сток STAT приходит на ножку CHG_IO (P0.20) через R5 10 кОм, на землю — R20 47 кОм. Читать без подтяжки и только при USB:
    • «0» — заряжается: не выше 0.82 В (выход STAT в нуле — до 1.0 В);
    • «1» — заряд не идёт или окончен: (VBUS − Vf светодиода) · 47/58 = 2.4–3.3 В при VBUS 4.75–5.5 В и Vf 1.45–1.75 В. На прошитой плате (VDD 3.3 В) это ниже предела ножки VDD + 0.3 В. Без R20 «1» доходила бы до 3.8 В.
    • Непрошитая плата на USB (VDD 1.8 В, предел ножки 2.1 В): заряда нет, STAT отпущен, и эти 2.4–3.3 В выше предела. Защитный диод ножки держит её около 2.3 В, в него идёт до ~0.13 мА (от обычного зарядника 5 В — меньше 0.1 мА). Это только до первой прошивки, которая ставит 3.3 В, и ножке не вредит. Непрошитую плату на USB надолго не оставляйте.
    • Слабый USB. «1» читается наверняка, только если на VBUS не меньше ~4.6 В. От слабого источника (старый хаб, слабый пауэрбанк, длинный тонкий кабель) конец заряда может читаться как «заряжается»: сцена зарядки не сменится на «заряжено», процент так и останется 99 %. Сам зарядник при этом заряд заканчивает правильно.
    • Когда заряд не идёт, светодиод слабо тлеет: через него, R5 и R20 течёт 50–70 мкА. Так и задумано.
  • Разделение питания.
    • Есть USB — система питается через диод Шоттки D1: VSYS = VBUS − 0.15…0.4 В, это до ~5.4 В. P-MOSFET Q1 закрыт.
    • Нет USB — R6 10 кОм тянет затвор Q1 на землю, и ячейка питает систему через открытый MOSFET почти без потерь.
    • После отключения USB Q1 открывается за ~15 мс (модель в ngspice; со 100 кОм было бы ~130 мс). Пока он не открылся, система живёт через его внутренний диод, и VSYS на 0.5–0.6 В ниже ячейки. Прошивка поэтому полторы секунды после отключения не верит замеру ячейки.
    • От USB R6 берёт лишние 0.5 мА. Зато утечка нагретого D1 из VSYS в VBUS даёт на нём в 10 раз меньшее напряжение, чем дала бы на 100 кОм; в жару это стоит проверить на первой плате.
  • 3.3 В даёт сам модуль: регулятор REG0 nRF52840 (VDDH = VSYS, VDD — его выход).
    • На чистом чипе REG0 выдаёт 1.8 В. 3.3 В (UICR.REGOUT0 = 3V3) записывает заводской файл прошивки или загрузчик при первом запуске.
    • На VDD — C6 4.7 мкФ и четыре по 100 нФ: 5.1 мкФ номинально. Nordic для REG0 допускает не больше ~5.5 мкФ, а на 3.3 В керамика теряет ещё часть ёмкости.
    • Нагрузка REG0 — датчики, микрофон, подтяжки, пищалка: 3–4 мА при пределе 25 мА. Экран и мотор — на VSYS.
  • Заряд ячейки меряется через внутренний делитель VDDHDIV5, отдельный делитель не нужен.
  • Экран питается через ключ Q2: прошивка выключает его целиком, а R9 держит его выключенным при сбросе. C11 стоит между затвором и стоком Q2 и включает ключ плавно: бросок тока в конденсаторы модуля по модели в ngspice — не больше ~0.15 А вместо 0.6–1.3 А, VSYS и 3.3 В не проседают.
  • Модуль экрана берётся с LDO на плате (662K / XC6206): он получает VSYS, а это до ~5.4 В от USB. Подтяжки SDA/SCL модуля должны идти на выход LDO 3.3 В — прозвоните до пайки.
  • Вибромотор на 3 В стоит на VSYS (до ~5.4 В): прошивка включает его ШИМом 20 кГц со скважностью 3 В / VSYS.

Программатор (SWD)

  • J3 — площадки под кабель Tag-Connect TC2030 на обороте, с подписью SWD:
    • 1 — VTref (это VDD платы): программатор по ней только берёт напряжение платы как опорное (преобразователь уровней питает от неё свою сторону брелока, ток крошечный). Питание на неё не подавать, с выходом 3.3 В программатора (у Pico — 3V3) не соединять — это выход регулятора модуля;
    • 2 — SWDIO, 4 — SWDCLK, 5 — GND;
    • 3 и 6 не подключены, сброс не выведен.
  • Плату на время прошивки питают от USB-C, и на заводе тоже. Ячейки на этом шаге может не быть. Ножка статуса заряда на непрошитой плате при этом чуть выше своего предела — это безвредно (статус заряда).
  • На контрольной точке 3V3 — 1.8 В, пока плата не прошита. Заводской файл keychain-revb-factory.hex (готовые файлы) сразу записывает в UICR 3.3 В, и после сброса в конце прошивки на 3V3 уже 3.3 В. Если записан только загрузчик, 3.3 В он ставит сам при первом запуске и перезагружается.
  • Программатор — Raspberry Pi Pico с прошивкой debugprobe через модуль преобразователя уровней TXS0108E (~$4–6 и ~$1–2). Линии SWD идут к модулю nRF напрямую, без резисторов, а Pico выдаёт только 3.3 В: на плате при 1.8 В он без преобразователя гнал бы ток через защитные диоды выводов. Поэтому преобразователь обязателен: его сторона A питается от площадки 1 J3 (VTref), сторона B — от 3V3 Pico.
    • Схема: VA → J3.1 (VTref), VB → 3V3 Pico (вывод 36), OE → VA, GND → GND Pico и J3.5, A1 → J3.2 (SWDIO), B1 → GP3 Pico, A2 → J3.4 (SWDCLK), B2 → GP2 Pico. 3V3 Pico с J3.1 не соединять никогда; брелок питается от своего USB-C. Провода — не длиннее 10–15 см.
    • Pico делает всё, что нужно: первую прошивку загрузчика вместе с приложением, стирание и снятие защиты, перепрошивку потом. После первой прошивки обновления идут по USB, программатор больше не нужен.
    • На этой плате связка Pico + TXS0108E ещё не проверялась: сначала прошейте одну плату.
    • Другой вариант — J-Link EDU Mini V2: уровни по VTref держит сам, кабель TC2030-CTX-NL втыкается в него прямо. По лицензии SEGGER — только для некоммерческого использования; для брелоков в подарок подходит. J-Link EDU Mini V1 работает только с 3.3 В и не годится.
    • Кабель TC2030-CTX-NL — без защёлок: у J3 нет отверстий под фиксаторы. Вилку прижимают к J3 рукой, ровно, всё время прошивки, или ставят фиксатор Tag-Connect для кабелей NL (TC2030-CLIP). К Pico кабель идёт через переходник с 10 контактов 1.27 мм на штыри 2.54 мм. Можно и без кабеля: тонкие провода, припаянные к площадкам 1, 2, 4 и 5 J3.
    • Что купить, как записать debugprobe на Pico, схема целиком, что установить на компьютер и команды — в README прошивки.

Панель для монтажа

Детали стоят с двух сторон, а такой монтаж у JLCPCB — только Standard PCBA: плата или панель не меньше 70 × 70 мм, с технологическими полями, реперными точками и технологическими отверстиями. Плата меньше (30 × 52.5 мм с ушком), и у двух её краёв почти ничего нельзя — V-cut и полей нет нигде:

  • нижний край: корпус USB-C J1 выходит за него на ~0.7 мм, TVS D3 — в 0.95 мм от края, в обоих углах — отверстия винтов корпуса. Место есть только для одной короткой перемычки справа, между J1 и винтом;
  • правый край: шток кнопки SW1 выходит за край на 0.17 мм, модуль U1 стоит в 0.25 мм от края нарочно (антенна у края). Перемычек здесь нет.

Поэтому панель готова в out/panel/ (её собирает gen/panel.py через KiKit):

Панель: две платы в рамке, вторая повёрнута на 180°

  • 76 × 72 мм, две платы в ряд. Вторая повёрнута на 180°: правые края обеих смотрят в общий паз посередине, нижние — в пазы у рамки.
  • Сплошная рамка вокруг плат: 5 мм слева и справа, 7.75 мм сверху и снизу (панель добрана до 72 мм). Между платой и рамкой — фрезерованный паз 2 мм по всему контуру, V-cut нигде нет.
  • Перемычки с mouse bites — на левом крае каждой платы (три), на верхнем левее ушка (одна) и на нижнем справа, между USB-C и винтом (одна). Так плата держится с трёх сторон, а не только у левого края: JLCPCB советует перемычки по разные стороны платы. Отверстия 0.6 мм, между краями отверстий 0.4 мм — как советует JLCPCB. Перемычки слева — 5, 5 и 3 мм (5, 5 и 3 отверстия), сверху — 4 мм (4 отверстия), снизу — 3 мм (3 отверстия). Узкие стоят там, где у края мало места: между R3 и R4, рядом с C15 и между J1 и винтом (до корпуса J1 — 2.5 мм, скругление паза — в 1.5 мм от его выступа). JLCPCB советует от 5 отверстий, но десяти перемычек на две маленькие платы хватает. Отверстия стоят в самой перемычке, центрами в 0.25 мм за краем платы: заливки платы — в 0.3 мм от края, и сверло подходит к меди не ближе 0.25 мм.
  • Медь у перемычек. В заливках земли всех слоёв у каждой перемычки — вырез на 0.3 мм от края. Поперёк перемычки нет контура платы, и без выреза любая перезаливка (кнопка B в KiCad, DRC с перезаливкой) довела бы землю до линии разлома. gen/panel.py при сборке проверяет это сам, потому что DRC KiCad этого не видит: отверстия mouse bites — не ближе 0.25 мм к меди, медь — не ближе 0.3 мм к линиям разлома, и так же на копии панели после перезаливки.
  • На рамке: 3 реперные точки с обеих сторон (медь 1 мм, окно 2 мм, центр в 5 мм от краёв панели; JLCPCB просит не ближе 3.85 мм) и 4 технологических отверстия 1.152 мм без металлизации по углам (норма JLCPCB). Другой меди на рамке нет.
  • Обозначения на панели — с номером копии: R1_1 на левой плате, R1_2 на правой, повёрнутой. Так их ждут BOM и CPL панели.
  • DRC панели — 0 ошибок и 0 несоединённых (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) — для заказа голых плат, без монтажа.

Заказ на JLCPCB

Ничего запускать не нужно: файлы уже в out/panel/.

  1. Файлы для монтажа (панель):

    • 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.

  2. PCB: 4 слоя, 1.6 мм, покрытие ENIG (кнопки и площадки Tag-Connect служат дольше), чёрная маска, контроль импеданса не нужен. Переходные 0.25/0.55 мм, отверстия разных цепей — не ближе 0.5 мм. Шёлк — обычный: надписи 1.0 мм, линия 0.16 мм.

    • Номер заказа (Mark on PCB) — выберите Order Number (Specify Position); в старой форме это «Remove Order Number» → Specify a location. Тогда JLCPCB напечатает номер на месте метки JLCJLCJLCJLC. Метка — шёлком на лицевой стороне под ячейкой (x 10–20, y 25.8 мм), у каждой платы, то есть у обеих копий на панели. Ячейка и модуль экрана её закрывают. Без этого выбора завод ставит номер, куда сочтёт нужным, и метку может не заметить, а плату видно сквозь прозрачный корпус. «Remove Mark» (без номера вовсе) тоже годится, но может стоить дороже — цену покажет форма.
  3. Панель:

    • 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).

  4. Монтаж:

    • нужен Standard PCBA: детали с двух сторон;
    • PCBA Qty — тоже в панелях, от 2 (4 платы). Например, PCB 5 и PCBA 3 — это 6 собранных плат и 2 голые панели. Сколько плат выйдет, форма покажет сама;
    • BOM и CPL — из out/panel/;
    • модуль MDBT50Q и кнопку B3U-3100P заказать через Global Sourcing или прислать свои: в каталоге LCSC их нет;
    • углы в CPL посчитаны по правилу JLCPCB: у оборота угол отражается (180° − θ), потом поправка детали. Поправки — лучшие догадки: открытые таблицы (KiBot, kicad-jlcpcb-tools, Fabrication-Toolkit) в них расходятся, на нашем заказе их никто не проверял (таблица и доводы — в 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° выдаёт только метка;
      • ошибка на 180° губительна для Q1, U2, U3, U4, D1 и D3: перевёрнутый TVS D3 — это диод в прямом направлении поперёк VBUS. У перевёрнутого U5 земля датчика сядет на SENS_SDA, и не заработает вся шина датчиков, вместе с акселерометром;
    • микрофон U6 — с портом снизу: попросить не мыть плату или закрыть порт.
  5. Руками паяются модуль экрана, ячейка и вибромотор (ниже). Перемычки R16 и R18 ставит завод; на площадках R17 и R19 пасты нет. Прошивки в этом заказе нет: первую прошивку запишите сами (программатор).

  6. Платы из панели выламываются по перемычкам, обломки сошлифовываются заподлицо (где они).

Заказ на PCBWay

Ничего запускать не нужно.

  1. Файлы из 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 — сборочные чертежи с метками первого вывода (оборот — зеркально, как его видит монтажник);
    • если завод прошивает платы сам («Firmware loading»): для прототипов — keychain-revb-factory.hex из firmware/release/ (версия и сумма — там же); для брелоков на продажу — firmware-factory.hex своей сборки со своими номерами (раздел [sale] в firmware/platformio.ini).

    Голые платы без монтажа — out/keychain-rev-b-gerbers.zip; файлы одной платы (out/keychain-rev-b-*) — на случай, если завод захочет собрать панель сам.

  2. PCB: 4 слоя, 1.6 мм, ENIG, дорожка/зазор 0.15 мм (6/6 mil), минимальное отверстие 0.25 мм. Переходные 0.25/0.55 мм, поясок 0.15 мм — это норма PCBWay; отверстия меньше 0.3 мм у них с небольшой доплатой.

  3. Панель — своя («Panel by customer»), 76 × 72 мм, две платы. В комментарии к заказу — тот же текст, что для JLCPCB. Если в форме есть номер заказа или логотип на плате, откажитесь от него: плату видно сквозь корпус. Метка JLCJLCJLCJLC под ячейкой PCBWay не мешает — она так и останется надписью, закрытой ячейкой. Технологические отверстия на рамке — 1.152 мм, под JLCPCB; если PCBWay нужны свои (обычно 2–3 мм), на верхней и нижней планках рамки (7.7 мм) для них есть место — попросите добавить.

  4. Монтаж: Turnkey, детали с двух сторон, SMD и немного THT — у J1 четыре лапки корпуса в отверстиях.

    • MDBT50Q и B3U-3100P завод покупает по MPN. Микрофон SPH0641LM4H-1 в BOM записан на Knowles; эту линейку теперь выпускает Syntiant — если завод не найдёт деталь, подскажите.
    • Микрофон U6 — с портом снизу: попросить не мыть плату или закрыть порт.
    • Повороты. В расстановке углы KiCad как есть, а как PCBWay читает углы деталей оборота, у них не опубликовано. Попросите завод подтвердить правило и в их предпросмотре (DFA) сверьте первый вывод каждой полярной детали у обеих копий — те же списки, что для JLCPCB: оборот (Q1–Q4, U2, U3, U4, U6, D1, D2, D3, LED1, J1, SW1) — по keychain-rev-b-panel-assembly-bottom.png, лицевая сторона (U1, U5) — по keychain-rev-b-panel-assembly-top.png.
  5. Прошивка на заводе («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 В.

  6. Руками — то же, что у JLCPCB: модуль экрана, ячейка и вибромотор. Обломки перемычек — сошлифовать.

Ручная сборка

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

Коротко, с теми же номерами шагов:

  1. Прошивка и проверка только от USB-C.
  2. Перемычки порядка питания экрана по надписям модуля: R16 + R18 или R17 + R19, никогда обе пары. До мотора и ячейки, USB отключён, паяльником, не феном.
  3. Вибромотор — в круг VIBRO на обороте.
  4. Ножки USB-C и обломки перемычек панели — заподлицо.
  5. Модуль экрана: длинная гребёнка у M и L, каптон на оборот модуля и на шлейф.
  6. Ток выключенного брелока, пока ячейки нет, потом ячейка по шаблону из нижней рамки ячейки. Дальше феном у платы не работают.
  7. Выключение кнопкой 3 с.
  8. Рамки ячейки.
  9. Модуль на винтах с шайбами, пайка штырей.
  10. Прозвонка VCC–GND, VCC–SCL, SCL–SDA, SCL–GND и SDA–GND до включения, потом кнопка — лицо.
  11. Корпус, шаги 11–18: трубка микрофона, рамка экрана, шайбы, крышка, оборот (обе части рамки оборота клеят к дну плёнкой), гайки, проверка.

Брелок, который уходит в подарок, последним шагом после сборки и проверок получает factory yes в консоли (команды): он возвращается в заводское состояние и гаснет.

Первое включение

Проверки идут по ходу сборки корпуса, каждая на своём шаге. Консоль брелока — USB, 115200 бод, любой терминал: монитор порта Arduino IDE, pio device monitor -b 115200, PuTTY или screen (как открыть). Приветствие при включении печатается один раз и до терминала обычно не доходит: порт появляется, когда брелок уже запустился. Поэтому проверяют командами ver и sensors — они отвечают в любой момент. Контрольные точки — на обороте, три круглые площадки с подписями GND, SYS и 3V3 (TP3, TP2, TP1). Что делать, если не так, — ниже.

  • Только USB-C, без ячейки и экрана (шаг 1, сразу после прошивки).
    • SYS = VBUS − 0.15…0.4 В (до ~5.4 В). 3V3 ≈ 1.8 В на непрошитой плате, ≈ 3.3 В после прошивки и сброса.
    • ver — Прошивка <версия>, плата rev B. Версия — та же, что в firmware/release/; у брелока на продажу — метка вашей сборки для продажи, без -dirty.
    • sensors — первая строка Ускорение: x … или «Ускорение: нет новых выборок» (тогда повторите), но не «Акселерометр не отвечает»; вторая начинается с Свет: есть, а не Свет: нет ответа. Так проверяют акселерометр и датчик света на каждой плате.
    • Светодиод заряда: на непрошитой плате ярко не горит, слабо тлеть может. С прошивкой, но без ячейки он может мигать: зарядник ищет ячейку. Заряд проверяют позже, с ячейкой.
  • Ток выключенного брелока — меньше 25 мкА (шаг 6, до пайки ячейки, на каждой плате). Нужен Nordic PPK2.
    • PPK2 — в режиме источника (Source meter), 3.7 В. Тонкими проводами: VOUT — на площадку «+» BT1, GND — на «−». USB отключён.
    • Прошивка запустится сама, без экрана. Удержите кнопку 3 с, подождите 15 с (сцена прощания и звук) и запишите ток за 60 с. Среднее должно быть меньше 25 мкА.
    • Провода отпаяйте: площадки останутся залуженными под ячейку.
    • µCurrent и другой амперметр ставят последовательно между источником 3.7 В и «+» BT1, а не вместо источника. Обычный мультиметр не годится: при переключении предела цепь рвётся, и брелок включается заново.
  • Прозвонка J2 перед первым включением экрана (шаг 10 сборки корпуса).
  • Лицо (шаг 10, после прозвонки). Нажатие кнопки — загрузка, потом лицо. Лицо ровное, без полосы и мусора у края.
  • Заряд (с ячейкой, на USB). При 10–42 °C по кристаллу светодиод горит ярко, пока ячейка не зарядится; 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. Это брак монтажа или детали: такую плату не продавайте

На первых платах

Эти замеры делают один раз на первых платах партии, не на каждом брелоке.

  • Плата для замеров. Ток с лицом, в кармане и ток выключенного вместе с экраном меряют на одной плате без ячейки. Соберите её по шагам 1–10 сборки корпуса, но без ячейки: в шаге 6 — только замер тока, шаг 7 не нужен (без ячейки плата и так обесточена). PPK2 в режиме источника, 3.7 В — на контрольные точки на обороте: VOUT на SYS (TP2), GND на GND (TP3). Для платы это то же, что ячейка: без USB ключ Q1 соединяет SYS с площадками ячейки. Точки доступны, пока не надеты рамка оборота и дно. Пока PPK2 подключён, USB не подключайте: от USB на SYS выше, чем 3.7 В, и ток пойдёт в выход PPK2. Поставить ячейку в эту плату потом можно, только выпаяв экран.
    • Что мерить и как долго — в энергобюджете и списке прошивки.
    • Ток выключенного с экраном — тоже меньше 25 мкА. Если он заметно больше, чем у этой же платы до экрана, ток утекает через выводы экрана при закрытом ключе.
  • Звон VBUS при горячем подключении (почему). Перед продажей этот замер обязателен; для своих прототипов риск принят, и без осциллографа его можно отложить. Нужен осциллограф от 50 МГц (можно взять на время в мейкерспейсе), щуп с пружинкой земли вместо длинного провода. Точки: VBUS модуля — на C8 (лицевая сторона, у модуля nRF), VSYS — на TP2.
    • На 2–3 платах сразу после шага 1 сборки корпуса: плата прошита, ячейки и экрана ещё нет, обе точки открыты. На собранном брелоке их уже не достать: C8 закрывает модуль экрана, TP2 — рамка оборота и дно.
    • Запуск — одиночный, по фронту на 5.5 В; развёртка 2 мкс/дел для VBUS и 50 мкс/дел для VSYS.
    • Возьмите самый короткий толстый кабель, какой найдёте (худший случай — короткий кабель USB-A → USB-C на 3 А). Подключите USB по 10 раз к каждому: к заряднику телефона с гнездом USB-A, к порту компьютера, к пауэрбанку и к заряднику, который будете советовать покупателям.
    • Запишите пик и время выше 5.8 В. Годно: пик и на C8, и на TP2 не выше 5.8 В (предел модуля на VBUS и VDDH).
    • Выше 5.8 В — так не продавайте. Либо советуйте покупателям только зарядник и кабель, с которыми замер прошёл (по модели — зарядник USB-C с кабелем C–C или длинный тонкий кабель), напишите это в памятке и на карточке в коробке и повторите замер с ними. Либо ждите гашения звона у разъёма — rev C (план); переделку на rev B — только проверенную тем же замером.
  • Зарядник у конца заряда. C1 и C2 — 10 мкФ 0603, под напряжением их ёмкость падает до ~4–5 мкФ, около минимума MCP73832 (4.7 мкФ). С почти полной ячейкой осциллографом на C2 (VBAT) и C1 (VBUS), оба на обороте: линия должна быть ровной, без пилы или синусоиды больше 0.1 В. Светодиод в конце заряда гаснет и больше не мигает. Если генерирует — сохраните осциллограмму: это пункт для rev C.
  • Экран на почти пустой ячейке и датчик света при ярком экране — в списке прошивки.

Что сверить перед заказом

  • Размеры купленного модуля экрана: OLED в gen/footprints.py — плата, ряд штырей, отверстия. Высота самой высокой детали на обороте модуля — от неё зависит зазор над ячейкой.
  • Модуль экрана с LDO и подтяжками на 3.3 В (см. «Питание»).
  • Модуль экрана — 0.96″ на SSD1306: прошивка брелока запускает экран только как SSD1306. Модули 1.3″ обычно на SH1106 — не подходят. Если есть стенд на ESP32, до пайки проверьте на нём по модулю от каждого продавца и из каждой партии: лицо ровное — подходит; ровное только после команды h — это SH1106, для брелока не годится.
  • Ячейка: толщина по правилу версий S, M, L, плата защиты, расположение проводов (CELL). Не шире 20.7 мм и не длиннее 25.0 мм вместе с плёнкой и платой защиты: гнездо в рамках 21.0 мм, а сверху ячейку подпирает пластик гребёнки. Многие «402025» на деле до 20.5 × 25.5 мм — по длине такая не войдёт (README корпуса). По паспорту ячейки (datasheet): максимальный ток заряда — не меньше 100 мА, диапазон температуры заряда включает 0–45 °C, как минимум 7–45 °C.
  • TVS D3 SMF5.0A: в BOM-инструменте JLCPCB номер C1509112 должен найтись как SMF5.0A в корпусе SOD-123FL и быть на складе. Иначе выберите другой SMF5.0A в SOD-123FL. Остальные номера LCSC уже сверены (пометка «✓» в gen/netlist.py).
  • DRC: out/keychain-rev-b-drc.rpt — 0 ошибок, 0 несоединённых, 0 предупреждений; у панели — out/panel/keychain-rev-b-panel-drc.rpt. Оба отчёта пишет build.py fab и только для платы, которая прошла. Если вы меняли плату, out/ должен быть собран после последней правки.
  • Панель: заказ «Panel by Customer» из out/panel/, текст комментария — из заказа на JLCPCB. V-cut и полей нигде нет, перемычки — только те, что в файлах: у правого края ни одной, у нижнего одна короткая справа.
  • Количество у JLCPCB: PCB Qty — в панелях, от 5; PCBA Qty — сколько панелей собрать, от 2. На панели две платы.
  • Номер заказа у JLCPCB: Order Number (Specify Position) («Specify a location») — номер ляжет на метку JLCJLCJLCJLC под ячейкой (заказ).
  • Повороты полярных деталей в предпросмотре завода, с обеих сторон и у обеих копий на панели, первыми — U2 и J1 (их поправки — догадки): оборот (Q1–Q4, U2, U3, U4, U6, D1, D2, D3, LED1, J1, SW1) — по сборочному чертежу оборота, лицевая сторона (U1, U5) — по чертежу лицевой стороны. Найденные поправки — в JLC_PART_ROTATION (gen/fab.py).
  • Вилка USB-C: окно в дне и рамке оборота — на корпус вилки по стандарту, до 12.35 × 6.5 мм, с запасом 0.5 мм. Сверху вилку ограничивает нижняя рамка ячейки: окна в ней нет, торец ячейки закрыт. Проходят вилки до ~6.4 мм, вилка 6.5 мм касается рамки и может войти не до упора (вилка USB-C). Кабели, которые будете советовать, проверьте на собранном брелоке.
  • Винты корпуса M2 × 25 нейлоновые и гайки нейлоновые; стальные винты — только для своих прототипов, если нейлоновых не найти, тогда порог встреч проверить в корпусе. Для продажи — только нейлон.

Проверка перед заказом

  • Предрелизный аудит (что изменилось на плате):
    • SA0 акселерометра (U4, вывод 7) — на VDD, адрес 0x19. На земле через внутреннюю подтяжку всё время, даже в выключенном брелоке, шло бы 0.11–0.16 мА. Прошивка ещё и отключает эту подтяжку (CTRL_REG0 = 0x90).
    • C6 — 4.7 мкФ 16 В (CL10A475KO8NNNC, C19666), C14 и C15 — 100 нФ: ёмкость на выходе REG0 в пределе Nordic.
    • Ряд R16–R19 опущен с y = 21.6 на y = 23.0 мм: голые площадки другой цепи почти в 2 мм от штырей J2.
    • R3 — на CHG_EN (P0.24): заряд только с разрешения прошивки.
    • R20 — 47 кОм: «1» статуса заряда не выше 3.3 В при любом USB.
    • D3 SMF5.0A на VBUS — от статики и бросков на входе; звон при горячем подключении он не ограничивает (выше).
    • На площадках ячейки и мотора нет пасты: провода паяются руками.
    • В rev B не вошли и перенесены в план rev C: гашение звона VBUS у разъёма (вместо 10 Ом перед выводом VBUS модуля), 100 Ом в линиях SWD, запретная зона антенны ниже вдоль правого края.
  • Независимая проверка (что изменилось после аудита):
    • Панель для монтажа в out/panel/ (выше): без неё Standard PCBA у JLCPCB не заказать.
    • Площадки DNP-перемычек R17 и R19 — без пасты: трафарет не печатает на них припой, и капля не замкнёт питание экрана. Так же у всех деталей, которых нет в CPL; fab это проверяет.
    • Отверстия разных цепей — не ближе 0.5 мм (норма JLCPCB): правило в keychain-rev-b.kicad_dru, его видит DRC. Три переходных сдвинуты на 18–40 мкм, теперь самый малый зазор — 0.512 мм. Трассировщики (build.py, fixroute.py) эту норму тоже держат.
    • Надписи на шёлке — 1.0 мм, линия 0.16 мм (минимум JLCPCB 1.0 и 0.153 мм), не ближе 0.15 мм к окнам маски: G/V перемычек экрана, 3V3/SYS/GND, SWD, OLERAST, «+»/«−» ячейки и мотора, 1/2/SCL/SDA штырей экрана. Подписи G/V перенесены над перемычки: под R19 места не было. Подписи контрольных точек и штырей экрана — с узким знаком (0.75 мм), чтобы слова не сливались. Контуры деталей из библиотеки KiCad остались линией 0.12 мм.
    • Шёлк посадочных мест обрезан по контуру платы, метка первого вывода U6 — по окну маски R8. DRC больше не выдаёт предупреждений.
    • В CPL для JLCPCB добавлена поправка USB-C J1, у SOT-23-5/6 (U2, U3) поправка теперь −90° (у U2 и J1 это догадки — заказ на JLCPCB); список проверки в предпросмотре дополнен SW1 и деталями лицевой стороны U1 и U5.
    • place не затирает разведённую плату без --force, route проверяет Java и Freerouting до начала, fab не пишет файлы без чистого DRC.
  • Финальная проверка (что изменилось после независимой):
    • Метка номера заказа JLCPCB JLCJLCJLCJLC на лицевой стороне под ячейкой и выбор «Order Number (Specify Position)» в заказе: номер не встанет на виду. Количество в заказе — в панелях, PCB от 5, PCBA от 2.
    • Пятая перемычка панели — на нижнем крае, между USB-C и винтом: плата держится с трёх сторон. Вырезы в заливках у перемычек: перезаливка не доведёт медь до линии разлома; panel.py проверяет медь у перемычек сам.
    • build.py panel и fab проверяют плату раньше, чем тронута out/panel/, и собирают панель в черновик; не вышло — out/ и out/panel/ как были. route без --force не трогает разведённую плату, route и finish --force пишут плату только после чистого DRC, finish без --force только проверяет. Отчёт в out/ пишет только fab.
    • Поправки поворота U2 и J1 названы догадками, а в gen/fab.py есть таблица точных поправок по номеру LCSC (JLC_PART_ROTATION) — для заполнения после первого предпросмотра.
  • Номиналы: «100k» в BOM был с номером LCSC C25086 — это не 100 кОм (у LCSC/JLCPCB он 1 Ом). На R6, R7, R9 и R15 это закоротило бы VBUS, а экран и вибро не работали бы. Теперь C25741 (0402WGF1003TCE, 100 кОм, базовая). Новые номиналы: 47 кОм — C25792, 4.7 мкФ — C19666.
  • Аналоговая часть — по моделям в ngspice (AO3401A/AO3400A, B5819W, 1N4148WS, светодиод, защитные диоды ножек nRF): включение экрана, переход питания при отключении USB, выброс при горячем подключении, ключ мотора, ток пищалки на ножку (пик 2.3 мА, standard drive хватает). Схемы для ngspice в репозиторий не входят; числа отсюда — оценки, на первой плате их стоит проверить осциллографом. Уровни CHG_IO посчитаны по формуле выше.
  • Соединения: схема, плата и netlist.py совпадают по всем выводам; ножки модуля — с board.h и variant.h прошивки; NFC-ножки и сброс не заняты; в запретной зоне антенны меди нет.
  • Прошивка на этой плате прогоняется в симуляции целиком — модели всех микросхем, две платы и эфир между ними (README прошивки).

Parts

168
QtyValueFootprintReferences
44NPTHNPTHKiKit_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
16100nFCapacitor_SMD:C_0402_1005MetricC5_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
1410kResistor_SMD:R_0402_1005MetricR3_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
80RResistor_SMD:R_0402_1005MetricR16_1, R16_2, R17_1, R17_2, R18_1, R18_2, R19_1, R19_2
810uFCapacitor_SMD:C_0603_1608MetricC1_1, C1_2, C2_1, C2_2, C3_1, C3_2, C4_1, C4_2
6100kResistor_SMD:R_0402_1005MetricR7_1, R7_2, R9_1, R9_2, R15_1, R15_2
61kResistor_SMD:R_0402_1005MetricR4_1, R4_2, R13_1, R13_2, R14_1, R14_2
6FiducialFiducialKiKit_FID_B_1, KiKit_FID_B_2, KiKit_FID_B_3, KiKit_FID_T_1, KiKit_FID_T_2, KiKit_FID_T_3
45.1kResistor_SMD:R_0402_1005MetricR1_1, R1_2, R2_1, R2_2
4AO3400APackage_TO_SOT_SMD:SOT-23Q3_1, Q3_2, Q4_1, Q4_2
4AO3401APackage_TO_SOT_SMD:SOT-23Q1_1, Q1_2, Q2_1, Q2_2
21N4148WSDiode_SMD:D_SOD-323D2_1, D2_2
21uFCapacitor_SMD:C_0402_1005MetricC12_1, C12_2
24.7uFCapacitor_SMD:C_0603_1608MetricC6_1, C6_2
247kResistor_SMD:R_0402_1005MetricR20_1, R20_2
2B3U-3100PButton_Switch_SMD:SW_SPST_B3U-3100PSW1_1, SW1_2
2B5819WDiode_SMD:D_SOD-123D1_1, D1_2
2GNDTestPoint:TestPoint_Pad_D1.0mmTP3_1, TP3_2
2LIS3DHPackage_LGA:LGA-16_3x3mm_P0.5mm_LayoutBorder3x5yU4_1, U4_2
2LTR-303ALS-01OptoDevice:Lite-On_LTR-303ALS-01U5_1, U5_2
2LiPo 402025Keychain:LiPo_Pads_20x25mmBT1_1, BT1_2
2MCP73832-2Package_TO_SOT_SMD:SOT-23-5U2_1, U2_2
2MDBT50Q-1MV2RF_Module:Raytac_MDBT50QU1_1, U1_2
2OLED 0.96" I2CKeychain:OLED_SSD1306_0.96in_I2C_ModuleJ2_1, J2_2
2PKMCS0909E4000Buzzer_Beeper:Buzzer_Murata_PKMCS0909EBZ1_1, BZ1_2
2SMF5.0ADiode_SMD:D_SOD-123FD3_1, D3_2
2SPH0641LM4H-1Sensor_Audio:Knowles_LGA-5_3.5x2.65mmU6_1, U6_2
2SWDConnector:Tag-Connect_TC2030-IDC-NL_2x03_P1.27mm_VerticalJ3_1, J3_2
2USB-CConnector_USB:USB_C_Receptacle_HRO_TYPE-C-31-M-12J1_1, J1_2
2USBLC6-2SC6Package_TO_SOT_SMD:SOT-23-6U3_1, U3_2
2VDDTestPoint:TestPoint_Pad_D1.0mmTP1_1, TP1_2
2VSYSTestPoint:TestPoint_Pad_D1.0mmTP2_1, TP2_2
2redLED_SMD:LED_0603_1608MetricLED1_1, LED1_2
2вибромотор 0820Keychain:VibroMotor_Coin_D8mmM1_1, M1_2
2кольцо брелока или винт корпусаMountingHole:MountingHole_3.2mm_M3H1_1, H1_2

More from olerast67/emotion-keychain

1
  • 4 layers30 × 52.5 mmKeychain rev b, the printed circuit board in 3D

    Keychain rev b

    olerast67/emotion-keychain

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

    59 partsApache-2.0

Similar boards

  • 4 layers63.6 × 86 mmBECom, the printed circuit board in 3D

    BECom

    rjsc/BECom

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

    276 parts2GPL-3.0
  • 4 layers160 × 100.1 mmPMT counter 4 layers, the printed circuit board in 3D

    PMT counter 4 layers

    mmazzanti/PMT-counter

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

    126 parts3GPL-3.0
  • 6 layers50 × 50 mmEcatExBrd, the printed circuit board in 3D

    EcatExBrd

    open-dynamic-robot-initiative/open-motor-driver-initiative

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

    173 parts122BSD-3-Clause
  • 2 layers77.6 × 116.3 mmSolana badge, the printed circuit board in 3D

    Solana badge

    spacemandev-git/solana-defcon-badge-26

    2026 Solana Defcon Badge

    113 parts2
  • 2 layersSkyRizz ESPSOL, the printed circuit board in 3D

    SkyRizz ESPSOL

    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.

    101 partsCERN-OHL-S-2.0
  • 4 layers118 × 76 mmSmart led badge, the printed circuit board in 3D

    Smart led badge

    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.

    1,236 partsMIT
  • 2 layers53.9 × 177.5 mmMainboard placed, the printed circuit board in 3D

    Mainboard placed

    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.

    80 parts
  • 2 layers60 × 45 mmTracker lite, the printed circuit board in 3D

    Tracker lite

    Sanu0910/RFMW-ANT

    109 parts

Questions

How big is the Keychain rev b panel PCB?

It measures 76 × 72 mm and has 4 copper layers, 1.6 mm thick.

What parts does the Keychain rev b panel use?

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.

Where can I download the Keychain rev b panel KiCad files?

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.

Can I use the Keychain rev b panel design in my own project?

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).