
PianoMatrice
manvalan/MuonScope
Piano di rivelazione MuonScope con 16 fotodiodi VBPW34S in matrice 4×4 a passo 10 mm, per il bus MIKILAB REV5.1.

TVC model rocket (after BPS.space Scout F): Teensy 4.1 flight firmware, mainboard spec, project log
Kartonaut is an open-source printed circuit board by Jan-Philipp-Munsch, from the Jan-Philipp-Munsch/kartonaut repository on GitHub, published under the MIT licence. It is a 4-layer board of 54 × 120 mm with 174 parts on 141 nets, routed with 3,146 tracks and 469 vias.
It is built around the E22-400T22S, BMP390 and DRV8833PWPR, with the INA239AIDGSR, LIS3MDL and SHT40-AD1B-R2 among its other parts. Its parts include 51 capacitors, 49 resistors, 19 connectors, 16 ICs and 9 transistors. It belongs with the NXP (LPC, Kinetis, i.MX RT) boards of this library.
Stand 2026-10-22. Schaltplan und Platine werden hier aus Code erzeugt, nicht von Hand gezeichnet.
Die Quelle der Wahrheit ist circuit.py: Schaltplan, Platine und Prüfungen werden daraus abgeleitet.
Die Vorgabe ist die Spezifikation ../README.md, Stand B1: rev B plus Review A1 bis A8
(../review_kicad_2026-10-21.md) und die Entscheidungen E1 bis E10 (../Komponenten_2026-10-22.md).
Dieses Dokument beschreibt, wie das Projekt entstanden ist, was fertig ist, was offen ist und wo bewusst
von der Spezifikation abgewichen wurde. Die Fertigerwahl steht in ../Fertiger_2026-10-21.md.

| Schritt | Stand |
|---|---|
Schaltung als Daten (circuit.py) | 174 Bauteile (12 davon DNP), 114 Netze, 7 Schaltplanblätter |
| ERC | 0 Fehler, 0 Warnungen, 4 begründete Ausschlüsse (§6) |
Netzliste gegen Spezifikation §4 (check_design.py) | OK: 39 Teensy-Pins, 7 Chip-Selects, 7 Mux-Kanäle, 11 Schienen, Kelvin-Abgriff |
| Platzierung | alle 174 Footprints, keine Überschneidung; die drei Sensoren vom 23.10. mit add_parts.py nachgesetzt |
| Strompfade | 2S-Pfad, Pyro-Ausgänge und VSYS_IN als F.Cu-Flächen (§5.4); kein 2S-Netz auf In2 |
| Routing | 3145 Bahnsegmente, 469 Vias, vier Lagen (Stand 24.10.); ./make.sh pcb braucht etwa 25 Minuten, danach close_gaps.py (§5.5) |
| DRC (JLC-Regeln) | 0 Fehler, Schaltplan-Parität 0 Abweichungen |
| Offene Verbindungen | 0 (23.10., nach Handrouting und Skript-Router) |
| Abbildungen | Renders oben, unten und schräg, Lagenbilder (img/) |
| Rundgang | RUNDGANG_PLATINE.pdf: Anleitung mit Bildern zu Aufbau, Lagen, Strompfaden, Vias und DRC (guide_dump.py, make_guide.py) |
| Fertigungsdaten (Gerber, BOM, CPL) | ./make.sh fab → fab/, Stand 23.10. mit den drei Sensoren (§8) |
| Oben | Unten |
|---|---|
![]() | ![]() |
Die Lagen einzeln: img/layers.pdf (F.Cu, In1 GND, In2, B.Cu Versorgung, Bestückungsdruck) und
img/layer_*.png.
/S /CurrentUser nach %LOCALAPPDATA%\Programs\KiCad\10.0. Die globalen
Bibliothekstabellen (sym-lib-table, fp-lib-table) wurden aus dem Template nach
%APPDATA%\kicad\10.0\ kopiert; das macht die GUI sonst beim ersten Start.%LOCALAPPDATA%\Programs\freerouting\, Prüfsummen kontrolliert. Die native
freerouting-cli.exe derselben Version stürzt mit einem GraalVM-Fehler ab; die JAR braucht Java 25.circuit.py Schaltung als Daten: Bauteile, Werte, Footprints, LCSC-Nummern, Netze, Blätter, Blöcke, Netzklassen
build_lib.py lib/mainboard.*: Teensy-Symbol, INA239-Symbol, Sockel-Footprint, Kelvin-Shunt-Footprint
R_2512_Kelvin, 3D-Modelle Teensy und XT30; Pin-Typen der LCSC-Symbole
gen_schematic.py Projektdatei (JLC-Regeln, Netzklassen, ERC-Ausschlüsse), Wurzelblatt und 7 Unterblätter
check_design.py Tor 1: Netzliste aus dem Schaltplan gegen die Pin-Tabelle der Spezifikation
gen_pcb.py Platine: Umriss, Footprints, Platzierung, Flächen, Sperrflächen, Plane-Vias, DSN-Export, SES-Übernahme, Nachbesserung,
Bestückungsdruck (`gen_pcb.py silk`: nur der Druck, auf der gerouteten Platine)
logo.py Kartonaut-Abzeichen als Polygone, für den Bestückungsdruck und docs/brand/*.svg
render.py Lagenbilder zuschneiden und zusammenfügen, Renders auf die Platine zuschneiden
make.sh ganze Kette: ./make.sh [sch|pcb|drc|img|fab]
fab.py `./make.sh fab`: Bestelldateien für JLCPCB nach fab/ (Gerber/Bohrdaten als ZIP, BOM, CPL, FAB.md)
widen.py verbreitert schmale Versorgungsstücke, soweit der DRC es zulässt (nach dem Handrouting)
add_parts.py setzt neue Bauteile aus circuit.py an feste Positionen in die fertige Platine (Netze, Blattpfad, DNP),
räumt fremdes Kupfer unter ihren Pads weg; danach close_gaps.py / route_gaps.py
snapshot.py schnelles Bild einzelner Lagen beim Entwickeln
gaps.py die offenen Verbindungen aus out/drc.json: was, wo, wie weit; `gaps.py png` mit Bild je Häufung
close_gaps.py `dump`: Geometrie der Platine und die offenen Verbindungen nach out/geom.json; `apply`: Ergebnis des
Gitter-Routers in die Platine (KiCad-Python)
route_gaps.py Gitter-Router (System-Python mit numpy/scipy): A* auf 0,05 mm, F.Cu/In2 mit Vias, Rip-up von
Signalbahnen; `debug n` mit Bild und Kennzahlen je Lücke, `region x0 y0 x1 y1` reißt einen Bereich auf
lib/ lcsc.* (easyeda2kicad), mainboard.* (eigene)
out/ Schaltplan-PDF, ERC- und DRC-Bericht (alles andere dort ist Zwischenstand)
img/ Renders und Lagenbilder
fab/ Bestelldateien (ZIP, BOM, CPL, FAB.md); fab/gerber/ ist der ungepackte ZwischenstandNeu erzeugen (Git Bash):
./make.shmake.sh ruft kicad-cli aus der Bash auf und nicht aus Python. Aus der Microsoft-Store-Python gestartet,
findet kicad-cli die globalen Bibliothekstabellen nicht, denn der App-Container der Store-Python
verdeckt sie. Der ERC meldet dann 265 Bibliotheksfehler, und die Renders haben keine Modelle.
Warum Code statt GUI: Schaltung, Schaltplan und Platine können nicht auseinanderlaufen, jede Änderung ist
ein Diff in circuit.py, und ERC, Netzlistenprüfung und DRC laufen auf Knopfdruck. Die Dateien lassen sich
normal in KiCad öffnen. Sobald dort von Hand geroutet wird (§5.4), ist die Platinendatei die Quelle und
./make.sh pcb darf nicht mehr laufen. ./make.sh sch und ./make.sh drc bleiben nutzbar.
Jedes Pin bekommt einen kurzen Draht und ein globales Netzlabel. So sind die Netznamen in Netzliste,
Platine, Netzklassen und Spezifikation dieselben (VSERVO, nicht /Versorgung/VSERVO). Jedes Blatt
ist in umrahmte Funktionsblöcke gegliedert. Die Blätter heißen Versorgung, Teensy, Sensorik, Funk,
Aktoren, Pyro und Signal. Die UUIDs werden aus Blatt und Referenz berechnet und sind deshalb bei jedem
Lauf gleich. PDF: out/mainboard_schematic.pdf.
| Lage | Inhalt |
|---|---|
| F.Cu | alle Bauteile, Signale, GND-Füllung |
| In1.Cu | durchgehende GND-Fläche (Lagentyp power, wird nicht geroutet) |
| In2.Cu | Signale, GND-Füllung |
| B.Cu | geteilte Versorgungsfläche: GND_PWR unter allem, was am 2S hängt (TVC-Band mit XT30 und Servos, Mitte unter den VSERVO-Puffern, rechter Streifen mit den Aktoren, äußerer rechter Streifen neben J_STACK, Spitzen-Band unter Pyro, Arming und Summer); 5V_SYS unter der 1S-Seite (linker Streifen, unter dem Teensy) |
Die Spezifikation sah die Versorgungsflächen auf Lage 3 vor. B.Cu ist gleichwertig und trägt ohnehin keine Bauteile. In2 bleibt so als zweite Signallage frei; ohne sie war die Platine nicht zu entflechten. Jedes SMD-Pad von GND, GND_PWR und 5V_SYS bekommt ein eigenes Via zu seiner Fläche. Das Via sitzt nur dort, wo Pad und Via über dem eigenen Teil der Teilung liegen, außerhalb der Stromflächen (§5.4) und außerhalb der 5-mm-Zone um die IMU; nur die IMU und ihre Kondensatoren dürfen ihre eigenen Masse-Vias im Ring zwischen 2,6 und 5 mm setzen.
| Klasse | Bahn | Netze |
|---|---|---|
| Strom | 1,0 mm (Router: 0,5 mm), nur F.Cu | VBAT2_RAW, VBAT2_REV, VBAT2_F, VBAT_PROT, VSERVO, VBAT_ARMED, PYRO1..4_NEG |
| Rückstrom | 0,8 mm | GND_PWR (wo es nicht auf der Fläche läuft) |
| Versorgung | 0,6 mm | 1S-Pfad mit VSYS_IN (A7), 5V_SYS, 3V3_RF, 3V3_EXP, TEENSY_VIN, MOT_A/B, VBUS_CHG |
| Wandler | 0,4 mm | U2_L1, U2_L2 |
| Default | 0,2 mm | Signale, 3V3, 3V3_SENS, GND (GND läuft über die Flächen) |
Alles, was in der Klasse Strom wirklich Strom führt, ist keine Bahn, sondern eine Kupferfläche (§5.4),
ebenso VSYS_IN am TPS63070. Was Freerouting an diese Netze noch anschließt, sind Messteiler,
Gate-Widerstände, Abblockkondensatoren und Testpunkte. export_dsn gibt der Klasse Strom deshalb für
den Router 0,5 mm statt 1,0 mm und (use_layer F.Cu) (A6); an 0603-Pads und durch die engen Kanäle
kam eine 1-mm-Bahn nicht.
JLC-Regeln im Projekt: 0,127 mm Abstand, Bahn mindestens 0,09 mm (Freerouting verjüngt an Pins auf 0,10 bis 0,12 mm), Via 0,45/0,2 mm, 0,2 mm zum Rand.
Stecker, ICs, die Kette des 2S-Pfads, Elkos und die Pyro-Spalten sind fest gesetzt (ANCHORS, EDGE,
PYRO_COLS in gen_pcb.py). Die übrigen Teile setzt eine gierige Suche je Funktionsblock in dessen Region
an das Pad, mit dem sie ein Netz teilen, mit 0,35 mm Abstand für Routingkanäle. Abblockkondensatoren
gehören über OWNERS fest zu ihrem IC. Findet ein Teil in seiner Region keinen Platz, sucht es auf der
ganzen Platine möglichst nah an seinem Partner und wird gemeldet (heute JP2, R26 und die drei kleinen
Kondensatoren des DRV8833, alle innerhalb weniger Millimeter). Die Flächen der Strompfade (§5.4) bleiben
für andere Teile gesperrt.
| Bereich | Inhalt |
|---|---|
| TVC-Kante | J_SERVO1 und 2 liegend, XT30 liegend rechts davon |
| links, TVC-Ende | J_SW, J_BAT1, J_CHG1 stehend; 1S-Kette Q2 → F2 → Q7; Lader MCP73831 unter dem Teensy |
| Mitte, TVC-Ende (SD-Weg, nur flach) | VSERVO-Puffer 2 × 330 µF, Shunt mit INA239 darunter |
| rechts, TVC-Ende | 2S-Kette XT30 → Q1 → F1 → Q6, Sternpunkt NT1 am XT30-Minus, J_CHG2 |
| rechter Streifen | J_SERVO3 und 4, J_MOT, DRV8833; J_STACK neben der rechten Teensy-Reihe, daneben LDO 3V3_EXP, BMP390, J_ARM; Summer |
| unter dem Teensy (≤ 3 mm) | CS-Decoder und Analogmux an ihren Pins, alle 33-k/100-n-Hälften der Messteiler, IMU, das zweite BMP390 (DNP), Hold-up 2 × 470 µF und D1 am VIN-Pin |
| linker Streifen | Buck-Boost mit Spule (≥ 25 mm von der IMU), Funkmodul, dann GPS, Kamera, LED-Stecker, Pegelwandler mit beiden WS2812B, LDO 3V3_RF |
| Spitzen-Kante | vier Pyro-Stecker liegend; darunter je Kanal eine Spalte mit TVS und FET, flach unter dem USB-Stecker; Qwiic rechts |
Gemessene Regeln:
Der 2S-Pfad wird nicht dem Autorouter überlassen. CORRIDORS in gen_pcb.py beschreibt ihn als
Wegpunkte zwischen Pads; der Generator macht daraus je Netz eine F.Cu-Fläche:
| Netz | Weg | Breite |
|---|---|---|
| VBAT2_RAW, VBAT2_REV, VBAT2_F | XT30-Plus → Q1 → F1 → Q6, kurze Stücke | 1,0 bis 1,2 mm |
| VBAT_PROT | Q6 → Shunt; Q6 → äußere Schiene am rechten Rand (u 24,9 bis 26,6) → J_ARM | 1,4 / 1,7 mm |
| VBAT_ARMED | J_ARM → äußere Schiene → Band hinter den Pins der vier Pyro-Stecker → je TVS | 1,6 bis 2,0 mm |
| VSERVO | Shunt → Bus quer unter den Teensy-Buchsen (v 28,1 bis 29,5) → Puffer → Band an beiden TVC-Servo-Steckern; Bus → innere Schiene (u 22,9 bis 24,6) → J_SERVO3/4 (über der Pinreihe, am Minus-Pin vorbei), DRV8833 VM | 0,6 bis 4,2 mm |
| PYRO1..4_NEG | FET-Drain senkrecht zu Pin 2 des Pyro-Steckers | 1,0 mm |
| VSYS_IN | C10 → beide Eingangspins des TPS63070; die Füllung wird erst am VQFN-Pin schmal (A7) | 0,6 bis 1,0 mm |
Zwei Eigenheiten von Freerouting waren dafür zu umgehen. Erstens liest es eine Fläche als ihren bloßen
Umriss, ohne die Aussparungen um fremde Pads; carve_corridors füllt die Flächen deshalb vor dem
Export und übernimmt die gefüllte Form als Umriss. Zweitens ist eine Kupferfläche auf einer Signallage für
fremde Netze kein Hindernis: Freerouting hat Signale quer durch die Flächen gelegt, und beim Füllen
zerfielen sie in Inseln. Jede Fläche bekommt deshalb für den Routinglauf eine deckungsgleiche Sperrfläche
für Bahnen und Vias; bei den breiten Netzen (VBAT_PROT, VBAT_ARMED, VSERVO) ist sie 0,6 mm kleiner, damit
die 1-mm-Stiche des eigenen Netzes am Rand andocken. gen_pcb.py patch löscht diese Sperrflächen am Ende.
Der Pyro-Rückstrom läuft über die GND_PWR-Fläche auf B.Cu direkt unter den Schienen.
Freerouting entflechtet den Großteil. Die Kette (route in make.sh) hat seit dem 22.10. abends diese Form:
gen_pcb.py dsn exportiert die platzierte Platine. Alles, was schon auf der Platine liegt, ist für den
Router fix (im ersten Lauf die 124 Plane-Vias mit ihren Stummeln, in den Nachläufen die ganze
Verdrahtung); In1 und B.Cu sind Power-Lagen, die Klasse Strom bleibt auf F.Cu. Das 5-mm-Via-Verbot um die
IMU ist ein Polygon mit Löchern um die eigenen Masse-Vias der IMU; als volle Scheibe meldete Freerouting
sie bei jedem Lauf als 22 „unfixable violations“ (jetzt 12, alle an den Sperrflächen des LoRa-Moduls).gen_pcb.py ses übernimmt die Session durch Zusammenführen, nicht durch Ersetzen: KiCads SES-Import
löscht die vorhandene Verdrahtung, und Freerouting schreibt fixe Elemente nicht in die Session. Danach
kommen die GND-Füllungen auf F.Cu und In2 dazu.gen_pcb.py patch schließt Lücken mit dem Abstand der Platinenregel (0,2 mm; mit 0,13 mm entstanden
DRC-Fehler): erst mit einem geraden Stummel auf einer Lage, dann über In2 mit zwei Vias (nicht für die
Klasse Strom, nicht in der IMU-Zone, nicht durch fremde Stromflächen). Danach löscht es die Sperrflächen
aus §5.4.Ein ganzer Lauf dauert damit etwa 25 Minuten statt 40. Was Freerouting am Ende als „unrouted“ zählt (80 bis 90), ist nicht das Maß: rund 55 davon sind die Pads, die schon über Stummel und Via an ihrer Fläche hängen. Freerouting kennt die Flächen auf den Power-Lagen nicht als Verbindung, legt für diese Pads in seiner Fanout-Stufe eigene Vias und zählt sie dann als offen. Zwei Auswege wurden am 22.10. ausprobiert und verworfen: In1 und B.Cu als Signallagen unter einer Bahnensperre (668 Abstandsverletzungen, jedes fremde Via gegen die GND-Fläche) und die schon angebundenen Pads aus der Netzliste nehmen (146 Verletzungen, fixe Stummel gegen netzlose Pads). Das Maß ist der KiCad-DRC.
Drei Läufe am 22.10. abends endeten bei 25, 27 und 28 offenen Verbindungen, acht Läufe davor zwischen 26 und 35; die Liste ist von Lauf zu Lauf fast dieselbe. Die Platine ist gegenüber rev B um 32 Teile und vier Stromflächen dichter.
Skript-Routing der Reste (23.10. nachts): close_gaps.py dump schreibt die Geometrie der Platine und die
offenen Verbindungen des DRC nach out/geom.json; route_gaps.py (System-Python mit numpy/scipy) rastert
alles Kupfer mit 0,05 mm und sucht je Lücke mit A* einen Weg auf F.Cu und In2 mit Vias (Klasse Strom nur
F.Cu, Versorgungsflächen-Netze auch B.Cu), Abstand nach Netzklasse, Sperrflächen und 5-mm-IMU-Zone
beachtet; ein Endpunkt ist das ganze zusammenhängende Kupferstück (Pad, Stummel, Via). Wo ein Pin
eingekesselt ist, reißt es Signalbahnen auf, routet und legt die aufgerissenen Netze neu; klappt das nicht,
wird alles zurückgesetzt. close_gaps.py apply übernimmt das Ergebnis, dann ./make.sh drc. So gingen
sechs der 27 zu, mit 0 DRC-Fehlern. Die übrigen 21 liegen in drei Häufungen, in denen das Aufreißen nicht
konvergiert: um den DRV8833 mit der VSERVO-Schiene, um J_STACK mit CS-Decoder und Analogmux, und um den
Shunt mit der 2S-Kette. Ein Versuch, den ganzen Bereich x 120..154 / y 85..133 aufzureißen und neu zu
verlegen (route_gaps.py region), schloss zwar alle Lücken dort, ließ aber 24 Signalnetze offen: dafür
braucht es einen echten Autorouter mit Schieben, also KiCads interaktiven Router.
Stand 23.10.2026 nachmittags: 0 offene Verbindungen, 0 DRC-Fehler, 0 Abweichungen vom Schaltplan. Der Weg dahin:
93a348c).
Die übrigen 14 lagen nicht an Enge, sondern an der Platzierung: VBAT_PROT von Q6 zum Shunt musste
F1/VBAT2_F und die VSERVO-Schiene kreuzen, C36/C38 saßen 8 bis 14 mm vom DRV8833 entfernt (U7_VINT lief
45 mm über die Platine), J15 Pin 5/6 und J18 hatten keinen Strompfad.gen_pcb.py, Commit 80559dd):
add_corridor_spines(): in jedem Strompfad eine 0,2 mm breite Sperrfläche auf der Mittellinie (keine
Bahnen, keine Vias). Die geschrumpfte Sperre aus carve_corridors() verschwand bei Pfaden unter 1,4 mm,
und Freerouting schnitt sie durch (LORA_M0 und der R2-Abgriff durch VBAT_PROT über F1, 3V3 durch den
VM-Stich des DRV8833). Wie die alten Sperren heißen sie „… frei halten“ und werden nach dem Routen gelöscht.ESCAPES); R2 und R4 fest unter Q6 mit eigenen
VBAT2_F-Pfaden; J18 mit eigenem VBAT2_RAW-Pfad zum XT30; VSERVO-Schiene bis v 74 und weiter unter J4
durch zu J_STACK Pin 5/6.ANCHORS)../make.sh pcb: 18 offen, alle schweren Fälle von vorher verbunden.4018f02 bis e9c7124): Gitter-Router mit B.Cu für Signale
(Signale dürfen kurz durch die Versorgungsflächen auf B.Cu, Freigabe 23.10.; Strom-Netze bleiben F.Cu
ohne Via) und Einzelkorrekturen: GND-Vias an U6 Pin 7 und U2 Pin 15; PYRO3_SENSE ein Stück über In2,
damit PYRO3_NEG Q8 → D5 direkt geht; PYRO4: VBAT_ARMED-Abgriff zu R28 rechts um D6 herum, R44 um 180°
gedreht; DRV8833: ISEN-Pins 3 und 6 direkt ans Wärmepad (statt über eigene Vias links), MOT_A über zwei Vias
und B.Cu zu J8.1, MOT_B über ein Via und B.Cu zu J8.2; LoRa: Fanout-Via von TXD versetzt, damit RXD eins bekommt.B.Cu-Stücke von Signalen (Schlitze in den Versorgungsflächen; der DRC meldet keine zerfallene Fläche): VBAT1_SENSE 10,9 mm, U7_VINT 12 mm (statt 45 mm über In2) im alten Stand; im jetzigen Stand CS_EXT2 16 mm in drei Stücken unter dem Teensy, LORA_RXD 6,3 mm entlang der LoRa-Pinreihe, MOT_A 7 mm und MOT_B 5,6 mm unter dem DRV8833, 5V_SYS 1,6 mm. LORA_RXD ist 73 mm lang (Luftlinie 38 mm), CS_EXT2 37 mm, PYRO2_SENSE 41 mm. Seit dem SPI0-Umbau (24.10.) zusätzlich SPI0_MOSI 6,0 mm, SPI0_MISO 13,3 mm (vier Stücke), LORA_M0 19,4 mm, PYRO3_FIRE 12,2 mm, PWM_EXT 17,6 mm, MOT_NSLEEP 2,7 mm (Tabelle unten).
SPI0-Umbau (E11, 23./24.10.): Nach dem Umhängen von J_STACK Pin 7–9 auf SPI0 und dem Verlegen von nSLEEP, PYRO3_FIRE, PWM_EXT und LORA_M0 waren sieben Verbindungen offen. Vier automatische Anläufe schlossen keine davon (Gitter-Router mit Rip-up; Freerouting mit fester Verkabelung; Freerouting über die aufgerissene Region x 100–146 / y 88–141, danach 14 offene Signale und zerschnittene Versorgungsflächen, verworfen; Freerouting mit beweglichen statt festen Bahnen der Region, nichts bewegt). Geschlossen wurden sie in einer eigenen Sitzung (24.10.) mit einem Planer, der B.Cu nur dort nimmt, wo es nicht anders geht, danach begradigt; keine fremde Bahn und kein Bauteil wurde dafür bewegt, nur die Reststummel der entfernten SPI1-Äste gelöscht. Freigabe für B.Cu-Stücke der Signale: Jan, 24.10.
| Verbindung | Länge | Vias | davon auf B.Cu |
|---|---|---|---|
| SPI0_SCK A1-38 → J15-7 | 25 mm | 3 | – |
| SPI0_MOSI A1-13 → J15-8 | 55 mm | 5 | 6,0 mm |
| MOT_NSLEEP A1-41 → U7-1 | 26 mm | 4 | 2,7 mm |
| SPI0_MISO A1-14 → J15-9 | 114 mm | 16 | 13,3 mm in vier Stücken |
| PYRO3_FIRE R38-1 → A1-40 | 86 mm | 10 | 12,2 mm |
| PWM_EXT A1-48 → J15-18 | 48 mm | 9 | 17,6 mm |
| LORA_M0 U10-20 → A1-35 | 62 mm | 12 | 19,4 mm |
SPI0_MISO ist mit 114 mm und 16 Vias die längste Signalbahn der Platine; der SPI0-Takt zur Zusatzplatine bleibt deshalb bei höchstens 8 MHz (Firmware). Die Stücke auf B.Cu liegen als Schlitze von 2,5 bis 12 mm in der 5V_SYS-Fläche unter dem Teensy und in der GND_PWR-Fläche rechts daneben; beide Flächen bleiben zusammenhängend, der DRC meldet keine zerfallene Fläche. Dazu kamen beim IMU-Tausch (E12) die geöffneten Pads 9–11 des LSM6DSV16X: ihre GND-Stummel zu den Vias bei x 130 entfielen, die Massepads 2/3/6/7 hängen jetzt über Pad 7 an C26 (GND-Bahn 0,2 mm auf F.Cu), dafür läuft 3V3_SENS von Pad 5 über C26 und C28 nach unten zu Pad 8 statt quer unter dem Chip. AN5763 Tab. 1 bestätigt die Beschaltung: Pins 2/3 an GND, Pin 9 (INT2) ist ein Ausgang, Pins 10/11 „Vdd_IO oder offen“.
Die Platinendatei ist wieder die Quelle: ein neuer ./make.sh pcb erzeugt eine andere Restliste und löscht
die Nacharbeit. Werkzeuge der Nacharbeit (Planer mit B.Cu, Kupfer-Bilder, Abstandsprüfung, Bearbeitung
per JSON) lagen im Sitzungsordner, nicht im Repository; die Klick-für-Klick-Anleitung für KiCad steht in HANDROUTING_KLICKS.md.
Breiten der Versorgung nach dem Handrouting (23.10., widen.py): Das Skript setzt jedes Stück der
Versorgungsnetze unter 0,25 mm und alle Stücke von MOT_A/MOT_B auf 0,6 / 0,4 / 0,3 mm, soweit der DRC es
zulässt. Ergebnis: VSYS_IN 0,6 mm durchgehend (A7 erfüllt), MOT_A und MOT_B 0,6 mm, an den DRV8833-Pins 0,4;
der 5V_SYS-Zweig zum LDO 3V3_EXP 0,4 mm auf In2 und 0,3 an U14; der GND_PWR-Stich zu J_SW 0,6 mm. Nicht
breiter zu bekommen: das 1,9-mm-Stück GND_PWR am DRV8833 Pin 13 (0,15 mm, x 144,5 / y 114,9); der Rückstrom
der Brücke läuft hauptsächlich über das Wärmepad mit seinen Vias, das Stück ist ein Reviewpunkt. MOT_A und
MOT_B laufen über zwei Vias auf B.Cu zum Motorstecker J8 und schneiden dort die GND_PWR-Fläche an (Reviewpunkt).
Zusatzsensoren (23.10.): Magnetometer, SHT40 und der DNP-ADXL375 wurden nach dem Handrouting mit
add_parts.py gesetzt und ihre Leitungen mit dem Skript-Router gezogen (I²C vom Qwiic-Stecker zur Spitze,
3V3 vom nächsten Zweig, Masse-Vias in die neuen Inseln der GND-Füllung). Danach DRC 0/0, Parität 0.
Gemessen mit ../review_check_layout.py: kein 2S-Netz auf In2 (A6); im Umkreis von 5 mm um die IMU nur
deren eigene Masse-Vias, keine In2-Bahnen (B16); die Sense-Netze berühren nur die Sense-Pads des Shunts (A5).
add_silk in gen_pcb.py setzt den ganzen Druck; gen_pcb.py silk macht nur diesen Schritt auf der
gerouteten Platine (Bauteile, Bahnen und Flächen bleiben). Regeln nach JLC: 1,0 mm Schrift, 0,15 mm
Strich, nur 0° und 90°. Jeder Text sucht sich einen Platz rund um sein Bauteil, der frei ist von
offenen Pads, Bauteilumrissen, fremden Courtyards, dem Rand und schon gesetztem Text. Findet er keinen,
bleibt die Referenz nur auf F.Fab; das Skript listet sie. Auf der dichteren B1-Platine sind das 27
Referenzen (unter anderem J2, J8, J10, J13, J15, J17, U2, U3, U5, U6, U8, U12 bis U15, die Pyro-FETs und drei
Testpunkte) und das kleine Abzeichen der Vorderseite. Die Steckernamen (LABELS) stehen fast alle.
LABELS: ARM, PYRO1, YAW …) statt J-Nummer, Referenzen der
ICs, Transistoren, LEDs und Jumper, Testpunkte mit Netznamen (TP_LABELS), IMU-Achsen und
JLCJLCJLCJLC unter dem Teensy, ein kleines Abzeichen (6 mm) an der ersten freien Stelle.PINOUT, Pin 1 zuerst, Wortzahl gegen circuit.py geprüft) in ein oder zwei Blöcken.MASK_COLOR, als Stackup JLC04161H-7628 ins Board geschrieben (set_stackup);
die Renders nutzen die Stackup-Farben.Der DRC meldet 17 Druckwarnungen, alle aus Footprint-Grafik (Teensy-Umriss über den Randpads des LoRa-Moduls, Umriss-Kreuzungen); JLC schneidet den Druck über Pads weg.
| Punkt | Entscheidung | Grund |
|---|---|---|
| Referenzen | Standard (J1 bis J20, U2 bis U15, Q1 bis Q9, A1 = Teensy); der Name aus der Spezifikation steht im Feld Funktion. Entfallene Teile (U1, U9, L1) lassen ihre Nummer frei | KiCad-Annotation braucht Präfix plus Zahl; Zuordnung in §7 |
| Stecker an der TVC-Stirnseite | XT30 und die zwei TVC-Servos liegend; alle anderen stehend | nutzbar sind 41 mm Kante |
| Stecker an der Spitze | vier Pyro-Stecker liegend an der Kante; ARM, GPS, Kamera, LED und Qwiic stehend | die vier Pyro-Stecker füllen die 41 mm |
| Sternpunkt | eigenes Netz GND_PWR, eine Netzbrücke NT1 (0,5-mm-Pads) am 2S-Minus, als Fläche auf B.Cu | macht §3/§8 im Layout prüfbar |
| Versorgungsflächen | auf B.Cu statt In2 (§5.1) | In2 wird als Signallage gebraucht |
| 2S-Pfad | Kupferflächen statt 2-mm-Bahnen (§5.4) | Review B13; 2 mm passen nicht an 2,0/2,5-mm-Steckerpins |
| Lastschalter (E1) | AO3401A wie der Verpolschutz, Gate 100 k nach Source und 1 k zum Stecker | Basic-Teil; im 1S-Pfad bei −3 V Gate knapp (Review B5), am Bestelltag einen bei −2,5 V spezifizierten Typ prüfen |
| Ladeanschlüsse (E2) | Lader-IC MCP73831 auf der Platine; USB-C, CC-Widerstände und Lade-LED am Schalterbrett (J_CHG1: VBUS, GND, LED-Kathode). 2S-Ladestecker J_CHG2 als JST-PH 2 (≤ 1 A) direkt am Akku-Plus | das CAD legt Buchsen und LED auf das Schalterbrett an Luke B (cad/README.md) |
| Teensy-Pinbelegung (E10) | 74HC138 und 74HC4051 teilen die Adresse SEL0..2 (Pins 38, 25, 30); CS_EN an Pin 31; Mux-Ausgang an Pin 24; 16, 40, 41 seit E11 belegt | Komponenten §9; alle Flugsensoren direkt auf dem Decoder |
| Messteiler | 100 k sitzt am gemessenen Knoten, 33 k und 100 nF am Mux-Eingang unter dem Teensy | gleicher Teiler, Filter direkt am ADC-Pfad; an der Spitze war kein Platz |
| J_STACK Pin 2 | GND_PWR statt zweitem GND | Rückleiter für VSERVO an Pin 5/6; auf der Zusatzplatine nicht mit GND verbinden |
| J_STACK Pin 19 (ARM) | ARM_SENSE (0 bis 2,1 V) über 10 k | Logikpegel ohne Zusatzteil; die Zusatzplatine vergleicht |
| INA239 VBUS | am Kelvin-Abgriff ISENS_N (8 µA) statt an VSERVO | VSERVO erbt 0,2 mm Netzklassenabstand, der zwischen die 0,5-mm-Pins nicht passt |
| TVS | SMAJ12CA (SMA, 400 W) statt SMBJ12CA | vier Kanäle unter dem USB-Stecker; Review C3 nennt SMAJ als Alternative |
| DRV8833 nSLEEP | direkt an Pin 40 (bis 22.10. Pin 11), ohne externen Widerstand | interner Pull-down hält den Motor beim Booten aus |
| SPI0 auf J_STACK (E11, 23.10.) | J_STACK Pin 7/8/9 an SPI0 (Teensy 13/11/12) statt SPI1; dafür nSLEEP → 40, PYRO3_FIRE → 41, PWM_EXT → 33, LORA_M0 → 16; keine Reservepins mehr | ein Fehler auf der Zusatzplatine kann den Flugbus SPI1 nicht stören; nSLEEP und LORA_M0 gegenüber dem Vorschlag (16/40) getauscht, weil Pin 40 in der rechten Reihe neben dem DRV8833 und Pin 16 in der linken Reihe zum Funkmodul hin liegt. Geroutet von Hand mit kurzen Stücken auf B.Cu (§5.5), SPI0_MISO 114 mm: SPI0-Takt zur Zusatzplatine höchstens 8 MHz |
| TPS63070 | FB 680 k / 130 k (4,98 V); EN-Teiler 330 k / 115 k: an ab 3,1 V, aus unter 2,7 V (A2); FB2 offen (B2); PS/SYNC hoch | |
| LSM6DSV16X (E12, 23.10.; war ICM-42688-P) | SDx/SCx an GND, INT2/OCS_Aux/SDO_Aux offen, Vdd 100 n + 2,2 µ, Vdd_IO 10 n, an 3V3_SENS; CS aus dem Decoder; Footprint und Kondensatoren vom ICM übernommen | AN5763 Tab. 1; JLC-Preis 3,4 statt 21,5 USD, Bestand 7000 statt 453 |
| Servo-Signale | 220 Ω in Reihe | Schutz der Teensy-Pins |
| E22 | ANT-Pad offen, Antenne über die IPEX-Buchse; NRST mit 10 k nach 3V3_RF an Pin 6 | B9 |
| LCSC-Nummern | nur bei den Teilen aus ../ORDER.md §3.3 und dem Lader | Passive beim Bestellen mit dem JLC-Plugin zuordnen |
| ERC-Ausschlüsse | DRV8833: Brückenausgänge parallel; AISEN/BISEN direkt an GND_PWR | gewollt |
| Zusatzsensoren (23.10.) | LIS3MDL (Magnetometer, 0x1E) und SHT40 (Feuchte/Temperatur, 0x44) bestückt, ADXL375 (±200 g, 0x53) als DNP-Footprint; alle drei an I²C und an 3V3 statt 3V3_SENS; Magnetometer und seine Kondensatoren in der linken Spitzenecke (45 mm von der 2S-Schiene), SHT40 neben J_QWIIC, ADXL375 im Streifen hinter dem USB-Ende des Teensy | Zukunftsfähigkeit (Jan, 23.10.); die Spitze ist nur über das I²C-Paar erreichbar, SPI1 bleibt der Flugbus unter dem Teensy; 3V3_SENS liegt 45 mm entfernt; im Flug ist das Magnetometer durch Servo-, Motor- und Pyroströme gestört |
| Ref | Spezifikation | Ref | Spezifikation |
|---|---|---|---|
| A1 | U_TEENSY | J11 | J_GPS |
| J1 | J_BAT2 (XT30) | J12 | J_QWIIC |
| J2 | J_BAT1 | J13 | J_CAM |
| J3 | J_SW | J14 | J_LED |
| J4 | J_ARM | J15 | J_STACK |
| J5, J6, J7, J16 | J_SERVO1, 2, 3, 4 | J17, J18 | J_CHG1, J_CHG2 |
| J8 | J_MOT | J9, J10, J19, J20 | J_PYRO1, 2, 3, 4 |
| R_SH1 | R_SHUNT | F1, F2 | F_BAT2, F_BAT1 |
| Q6, Q7 | Q_SW2, Q_SW1 (Lastschalter) | Q3, Q4, Q8, Q9 | Q_P1 bis Q_P4 |
| Q5 | Q_BZ | D2, D3, D5, D6 | D_TVS Pyro 1 bis 4 |
| U12, U13 | CS-Decoder, Analogmux | U11, U14 | Lader, LDO 3V3_EXP |
| U5, U15 | Barometer, zweites (DNP) | NT1 | Sternpunkt GND_PWR/GND |
| U16 | Magnetometer LIS3MDL | U18 | SHT40 |
| U17 | ADXL375 (DNP) |
./make.sh pcb nicht mehr laufen lassen.../review_check_layout.pyimg/layers.pdf und Design Guide (Tor 1 und 2 in
../ORDER.md). Besonders: Breite und Lage der Strompfade, Masseführung um den Sternpunkt, Abstand
LoRa ↔ IMU, der Anlauf des TPS63070 mit 940 µF hinter D1../make.sh fab erzeugt seit 23.10. Gerber, Bohrdaten, BOM und CPL im JLC-Format nach
fab/ (Übersicht in fab/FAB.md); DNP-Teile (Pyro 3/4, zweites BMP390) sind ausgeschlossen. Vor dem Upload
nach jeder Änderung an der Platine neu erzeugen. LCSC-Nummern der Passiven, des SN74LV1T34, des 74HC138/4051, der Polymer-
Elkos und der Polyfuses ergänzen. INA239 bei DigiKey bestellen. Fertiger nach ../Fertiger_2026-10-21.md.../Review_Bewertung_2026-10-26.md §5): VSYS_IN 0,6 mm auf F.Cu und
1,2 mm auf In2 (0,78 mm auf den 0,9 mm am Via), Stich zu D1 0,6 mm, Zone „VSERVO Stich DRV8833 VM“; make.sh sch
exportiert jetzt auch out/mainboard.net. DRC 0 Fehler, fab/ und img/ neu.../datasheet/MS-MB-B.tex auf B1 umschreiben../figures.py und ../outline.py ebenfalls auf B1). Offen: der Design Guide docs/DesignGuide_Mainboard_revB.md im Text.| Qty | Value | Footprint | References |
|---|---|---|---|
| 26 | 100n | Capacitor_SMD:C_0603_1608Metric | C1, C2, C3, C12, C24, C25, C26, C29, C30, C31, C32, C34, C36, C39, C40, C41 +10 |
| 14 | 100k | Resistor_SMD:R_0603_1608Metric | R2, R4, R9, R11, R28, R31, R32, R35, R36, R39, R40, R43, R44, R48 |
| 7 | 33k | Resistor_SMD:R_0603_1608Metric | R5, R12, R29, R33, R37, R41, R45 |
| 6 | 10k | Resistor_SMD:R_0603_1608Metric | R1, R8, R18, R19, R22, R27 |
| 5 | 100 | Resistor_SMD:R_0603_1608Metric | R30, R34, R38, R42, R47 |
| 5 | 1u | Capacitor_SMD:C_0603_1608Metric | C18, C19, C21, C22, C50 |
| 5 | AO3400A | Package_TO_SOT_SMD:SOT-23 | Q3, Q4, Q5, Q8, Q9 |
| 4 | 10u/25V | Capacitor_SMD:C_0805_2012Metric | C6, C10, C11, C35 |
| 4 | 220 | Resistor_SMD:R_0603_1608Metric | R23, R24, R25, R26 |
| 4 | AO3401A | Package_TO_SOT_SMD:SOT-23 | Q1, Q2, Q6, Q7 |
| 4 | M3 | MountingHole:MountingHole_3.2mm_M3 | H1, H2, H3, H4 |
| 4 | SMAJ12CA | Diode_SMD:D_SMA | D2, D3, D5, D6 |
| 3 | 1k | Resistor_SMD:R_0603_1608Metric | R3, R10, R49 |
| 3 | 22u/10V | Capacitor_SMD:C_0805_2012Metric | C13, C14, C15 |
| 2 | 10 | Resistor_SMD:R_0603_1608Metric | R6, R7 |
| 2 | 10n | Capacitor_SMD:C_0603_1608Metric | C28, C37 |
| 2 | 10u | Capacitor_SMD:C_0805_2012Metric | C23, C33 |
| 2 | 2.2u | Capacitor_SMD:C_0603_1608Metric | C27, C38 |
| 2 | 330u/16V polymer | Capacitor_Tantalum_SMD:CP_EIA-7343-31_Kemet-D | C4, C5 |
| 2 | 4.7k | Resistor_SMD:R_0603_1608Metric | R20, R21 |
| 2 | 4.7u | Capacitor_SMD:C_0805_2012Metric | C8, C9 |
| 2 | 470u/6.3V polymer | Capacitor_Tantalum_SMD:CP_EIA-7343-31_Kemet-D | C16, C17 |
| 2 | AP2112K-3.3TRG1 | Package_TO_SOT_SMD:SOT-23-5 | U3, U14 |
| 2 | BMP390 | lcsc:LGA-10_L2.0-W2.0-P0.50-BL | U5, U15 |
| 2 | WS2812B-2020 | LED_SMD:LED_WS2812B-2020_PLCC4_2.0x2.0mm | LED1, LED2 |
| 1 | 1.5u Isat>=4A | Inductor_SMD:L_Changjiang_FNR5040S | L2 |
| 1 | 100u/6.3V | Capacitor_SMD:C_1210_3225Metric | C20 |
| 1 | 115k | Resistor_SMD:R_0603_1608Metric | R17 |
| 1 | 130k | Resistor_SMD:R_0603_1608Metric | R15 |
| 1 | 1N4148W | Diode_SMD:D_SOD-123 | D4 |
| 1 | 20m 1% 1W | mainboard:R_2512_Kelvin | R_SH1 |
| 1 | 2A hold | Fuse:Fuse_1812_4532Metric | F2 |
| 1 | 2k | Resistor_SMD:R_0603_1608Metric | R13 |
| 1 | 330 | Resistor_SMD:R_0603_1608Metric | R46 |
| 1 | 330k | Resistor_SMD:R_0603_1608Metric | R16 |
| 1 | 3A hold 6A trip | Fuse:Fuse_1812_4532Metric | F1 |
| 1 | 3V3_EXP | TestPoint:TestPoint_Pad_D1.5mm | TP6 |
| 1 | 3V3_RF | TestPoint:TestPoint_Pad_D1.5mm | TP5 |
| 1 | 5V_SYS | TestPoint:TestPoint_Pad_D1.5mm | TP3 |
| 1 | 600R@100MHz | Inductor_SMD:L_0603_1608Metric | FB1 |
| 1 | 680k | Resistor_SMD:R_0603_1608Metric | R14 |
| 1 | 74HC138PW | Package_SO:TSSOP-16_4.4x5mm_P0.65mm | U12 |
| 1 | 74HC4051PW | Package_SO:TSSOP-16_4.4x5mm_P0.65mm | U13 |
| 1 | ADXL375 | lcsc:LGA-14_L5.0-W3.0-P0.80-BL-1 | U17 |
| 1 | DRV8833PWPR | Package_SO:HTSSOP-16-1EP_4.4x5mm_P0.65mm_EP3.4x5mm_Mask2.46x2.31mm_ThermalVias | U7 |
| 1 | E22-400T22S | lcsc:WIRELM-SMD_E22-400T22S_1 | U10 |
| 1 | GND | TestPoint:TestPoint_Pad_D1.5mm | TP7 |
| 1 | INA239AIDGSR | Package_SO:MSOP-10_3x3mm_P0.5mm | U6 |
| 1 | J_ARM | Connector_JST:JST_XH_B2B-XH-A_1x02_P2.50mm_Vertical | J4 |
| 1 | J_BAT1 | Connector_JST:JST_PH_B2B-PH-K_1x02_P2.00mm_Vertical | J2 |
| 1 | J_CAM | Connector_JST:JST_GH_BM03B-GHS-TBT_1x03-1MP_P1.25mm_Vertical | J13 |
| 1 | J_CHG1 | Connector_JST:JST_PH_B3B-PH-K_1x03_P2.00mm_Vertical | J17 |
| 1 | J_CHG2 | Connector_JST:JST_PH_B2B-PH-K_1x02_P2.00mm_Vertical | J18 |
| 1 | J_GPS | Connector_JST:JST_GH_BM04B-GHS-TBT_1x04-1MP_P1.25mm_Vertical | J11 |
| 1 | J_LED | Connector_JST:JST_GH_BM03B-GHS-TBT_1x03-1MP_P1.25mm_Vertical | J14 |
| 1 | J_MOT | Connector_JST:JST_XH_B2B-XH-A_1x02_P2.50mm_Vertical | J8 |
| 1 | J_PYRO1 | Connector_JST:JST_XH_S2B-XH-A_1x02_P2.50mm_Horizontal | J9 |
| 1 | J_PYRO2 | Connector_JST:JST_XH_S2B-XH-A_1x02_P2.50mm_Horizontal | J10 |
| 1 | J_PYRO3 | Connector_JST:JST_XH_S2B-XH-A_1x02_P2.50mm_Horizontal | J19 |
| 1 | J_PYRO4 | Connector_JST:JST_XH_S2B-XH-A_1x02_P2.50mm_Horizontal | J20 |
| 1 | J_QWIIC | Connector_JST:JST_SH_BM04B-SRSS-TB_1x04-1MP_P1.00mm_Vertical | J12 |
| 1 | J_SERVO1 | Connector_JST:JST_XH_S3B-XH-A_1x03_P2.50mm_Horizontal | J5 |
| 1 | J_SERVO2 | Connector_JST:JST_XH_S3B-XH-A_1x03_P2.50mm_Horizontal | J6 |
| 1 | J_SERVO3 | Connector_JST:JST_XH_B3B-XH-A_1x03_P2.50mm_Vertical | J7 |
| 1 | J_SERVO4 | Connector_JST:JST_XH_B3B-XH-A_1x03_P2.50mm_Vertical | J16 |
| 1 | J_STACK | Connector_PinHeader_2.54mm:PinHeader_2x10_P2.54mm_Vertical | J15 |
| 1 | J_SW | Connector_JST:JST_PH_B4B-PH-K_1x04_P2.00mm_Vertical | J3 |
| 1 | LIS3MDL | lcsc:LGA-12_L2.0-W2.0-P0.50-BL | U16 |
| 1 | LSM6DSV16X | lcsc:LGA-14_L3.0-W2.5-P0.50-TL | U4 |
| 1 | MCP73831T-2ACI/OT | Package_TO_SOT_SMD:SOT-23-5 | U11 |
| 1 | NetTie | NetTie:NetTie-2_SMD_Pad0.5mm | NT1 |
| 1 | SHT40-AD1B | lcsc:DFN-4_L1.5-W1.5-P0.8-TL-EP | U18 |
| 1 | SJ 1S | Jumper:SolderJumper-2_P1.3mm_Open_RoundedPad1.0x1.5mm | JP1 |
| 1 | SJ 2S | Jumper:SolderJumper-2_P1.3mm_Open_RoundedPad1.0x1.5mm | JP2 |
| 1 | SN74LV1T34DBVR | Package_TO_SOT_SMD:SOT-23-5 | U8 |
| 1 | SS14 | Diode_SMD:D_SMA | D1 |
| 1 | TPS63070RNMR | lcsc:VQFN-15_L3.0-W2.5-P0.50-BL | U2 |
| 1 | Teensy 4.1 | mainboard:Teensy41_Socket | A1 |
| 1 | VBAT_PROT | TestPoint:TestPoint_Pad_D1.5mm | TP1 |
| 1 | VSERVO | TestPoint:TestPoint_Pad_D1.5mm | TP4 |
The 171 most common of 174 parts.
It measures 54 × 120 mm and has 4 copper layers, 1.6 mm thick.
174 parts, built around the E22-400T22S, BMP390, DRV8833PWPR and INA239AIDGSR. 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 Jan-Philipp-Munsch/kartonaut repository on GitHub, at the commit this page was made from: the board is hardware/mainboard/kicad/mainboard.kicad_pcb and its schematic hardware/mainboard/kicad/actuators.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository publishes it under the MIT licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).

manvalan/MuonScope
Piano di rivelazione MuonScope con 16 fotodiodi VBPW34S in matrice 4×4 a passo 10 mm, per il bus MIKILAB REV5.1.

AQUA-Warrior/fpv-drone
Frame needs to be printed using nylon/nylon with carbon fiber only exclusions being ArmAbsorber1-4 and AntenaMount/GPSConnector.


GeneralSyb/Sagittarius-Headtracker
Project files for the Sagittarius S1 Prototype

Curtisflo/swipe-smart-ring
BLE smart ring main board — 2-layer rigid-flex KiCad PCB (nRF52832 + LSM6DSV16X IMU/Qvar). PCB layout, schematic, footprints.

