From 626f141007c229acd10c9bde4681afeb66903045 Mon Sep 17 00:00:00 2001 From: Michele Bigi Date: Sun, 16 Aug 2026 17:03:27 +0200 Subject: [PATCH] Add real FSC-BT1035 footprint, reconstructed from DigiRadio's EasyEDA project Extracted 52 pad records + silkscreen geometry from the raw JSON-Lines document format inside manvalan/DigiRadio's fabricated EasyEDA Pro project (epro2kicad couldn't handle this project's newer multi-doc export format, so the relevant FOOTPRINT document was located and parsed directly). Pad size/pitch independently match the official FSC-BT1035 datasheet's mechanical spec exactly; pad numbering follows the same perimeter walk as the datasheet's own pin table, so pad N = pin N. The underlying component was originally a SnapEDA export for the mechanically-compatible FSC-BT806 (same 13x26.9mm 52-pad family package), relabeled BT1035 by the designer -- documented in README. Validated with kicad-cli fp export + visual SVG comparison against the datasheet's own footprint layout figure before import. No 3D model. --- MANIFEST.csv | 1 + README.md | 40 ++++---- .../rf/FSC-BT1035.pretty/FSC-BT1035.kicad_mod | 91 +++++++++++++++++++ fp-lib-table | 1 + fp-lib-table.global | 1 + symbols/rf/FSC-BT1035.kicad_sym | 2 +- 6 files changed, 117 insertions(+), 19 deletions(-) create mode 100644 footprints/rf/FSC-BT1035.pretty/FSC-BT1035.kicad_mod diff --git a/MANIFEST.csv b/MANIFEST.csv index 74a414f..e2b24a2 100644 --- a/MANIFEST.csv +++ b/MANIFEST.csv @@ -542,3 +542,4 @@ footprint,/var/folders/cv/lwgyj_k14gx2rc3t2rlt29s80000gn/T/snapeda_n_5b_7ct/QFN4 symbol,/var/folders/cv/lwgyj_k14gx2rc3t2rlt29s80000gn/T/snapeda_prgp47iz/TLV320AIC3104IRHBR.kicad_sym,symbols/audio/TLV320AIC3104IRHBR.kicad_sym,NEW,ea3a215cfb4d8778ea76eb0733e4b67c61b7761d2897eee2f375f11ce80f7252,category=audio footprint,/var/folders/cv/lwgyj_k14gx2rc3t2rlt29s80000gn/T/snapeda_prgp47iz/QFN50P500X500X100-33N.kicad_mod,footprints/audio/TLV320AIC3104IRHBR.pretty/QFN50P500X500X100-33N.kicad_mod,NEW,4d708f625a47c33414d9883c479a00a1819e666a2edf63016c803211893fd038,category=audio 3d-model,/var/folders/cv/lwgyj_k14gx2rc3t2rlt29s80000gn/T/snapeda_prgp47iz/TLV320AIC3104IRHBR.step,3dmodels/audio/TLV320AIC3104IRHBR.step,NEW,654de545fab7075336f7ddce6521d1562e7c414d6930785a7860a5e2fdf7c5ee,category=audio +footprint,/private/tmp/claude-501/-Users-michelebigi-Development-mikylab-kikad-library/1f1c2942-9607-4b23-b424-c9eee772a9a0/scratchpad/FSC-BT1035.kicad_mod,footprints/rf/FSC-BT1035.pretty/FSC-BT1035.kicad_mod,NEW,fe476fbba379d3ef2c26823bf72d4397190227bed02da4ed5ead7d546d1fcadb,category=rf diff --git a/README.md b/README.md index cda41e2..85e25d6 100644 --- a/README.md +++ b/README.md @@ -258,31 +258,35 @@ reference *standard* KiCad footprint libraries (e.g. `Package_SO`, scope (they ship with every KiCad install) and are not checked or reported as errors. -### FSC-BT1035 (symbol only, hand-authored -- footprint still needed) +### FSC-BT1035 (Feasycom Bluetooth module) `symbols/rf/FSC-BT1035.kicad_sym` (Feasycom Bluetooth 5.2 dual-mode stereo audio module, Qualcomm QCC3056) was hand-authored from the official [Feasycom datasheet](https://www.feasycom.com/datasheet/fsc-bt1035.pdf) Table 3-2 (Pin definition) -- all 52 pins, names and electrical types transcribed directly from that table and validated with `kicad-cli sym -export`. No existing KiCad symbol for this part could be found publicly -(SnapEDA blocks unauthenticated access; no GitHub project had one). +export`. -**No footprint or 3D model is included.** The datasheet's mechanical -section (module 13 x 26.9 x 2.2mm, castellated LCC-52 package, 1.0mm pad -pitch, antenna keep-out on one edge) has enough detail to build one, but -extracting exact per-pad coordinates reliably from the PDF's dimensioned -drawing (rather than a real coordinate table) was judged too -error-prone to commit blind -- a wrong castellated-pad footprint could -produce an unfabricatable board without anyone noticing until parts -don't line up. A working footprint for this exact part does exist -(fabricated, per the gerbers) in `manvalan/DigiRadio`'s EasyEDA project, -but its pad geometry is embedded in EasyEDA's proprietary JSON format, -which wasn't reverse-engineered here. Import a verified footprint (e.g. -from a SnapEDA KiCad download, or by exporting the DigiRadio EasyEDA -footprint to KiCad format) with `scripts/import_snapeda.py` or -`scripts/add_component.py --name FSC-BT1035 --footprint ...` -- it will -detect the existing symbol and only need the footprint/model added. +`footprints/rf/FSC-BT1035.pretty/FSC-BT1035.kicad_mod` was reconstructed +from the actual PCB footprint in `manvalan/DigiRadio`'s EasyEDA Pro +project (a fabricated, gerber-verified design) by extracting the raw pad +records from that project's internal document format (JSON-Lines with +`PAD`/`POLY` records per document; the relevant footprint document was +located, isolated, and parsed directly -- KiCad's own `epro2kicad` +converter couldn't be used as-is, since this newer EasyEDA Pro export +bundles all documents into one multi-record file rather than the +per-document files it expects). Notably, that project's component was +originally sourced from a SnapEDA export for the mechanically-compatible +**FSC-BT806** (same manufacturer, same 13 x 26.9mm 52-pad castellated +family package used across BT806/BT1026/BT1035/BT1038) and relabeled +`FSC-BT1035` by the designer; the extracted pad size (1.6 x 0.6mm) and +pitch (1.0mm) match the official FSC-BT1035 datasheet's own mechanical +spec exactly, and the pad numbering follows a single clean perimeter +walk (left column top-to-bottom, bottom row left-to-right, right column +bottom-to-top) identical to the datasheet's own Table 3-2 pin order, so +`pad N` = `pin N` throughout. Rounded body corners were simplified to +straight lines in the silkscreen (cosmetic only, no pad geometry +affected). No 3D model is included. ## Provenance diff --git a/footprints/rf/FSC-BT1035.pretty/FSC-BT1035.kicad_mod b/footprints/rf/FSC-BT1035.pretty/FSC-BT1035.kicad_mod new file mode 100644 index 0000000..fcc4c37 --- /dev/null +++ b/footprints/rf/FSC-BT1035.pretty/FSC-BT1035.kicad_mod @@ -0,0 +1,91 @@ +(footprint "FSC-BT1035" + (version 20241229) + (generator "mikilab_manual_conversion") + (layer "F.Cu") + (descr "Feasycom FSC-BT1035 Bluetooth 5.2 audio module. Pad geometry extracted from manvalan/DigiRadio EasyEDA project (fabricated design); pad numbering verified against the official Feasycom datasheet Table 3-2 perimeter walk. Rounded body corners simplified to straight lines.") + (tags "Feasycom FSC-BT1035 Bluetooth module") + (attr smd) + (fp_text reference "REF**" (at 0 -18) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value "FSC-BT1035" (at 0 18) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + ) + (pad "1" smd rect (at -6.5 -12.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "2" smd rect (at -6.5 -11.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "3" smd rect (at -6.5 -10.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "4" smd rect (at -6.5 -9.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "5" smd rect (at -6.5 -8.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "6" smd rect (at -6.5 -7.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "7" smd rect (at -6.5 -6.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "8" smd rect (at -6.5 -5.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "9" smd rect (at -6.5 -4.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "10" smd rect (at -6.5 -3.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "11" smd rect (at -6.5 -2.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "12" smd rect (at -6.5 -1.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "13" smd rect (at -6.5 0.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "14" smd rect (at -6.5 1.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "15" smd rect (at -6.5 2.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "16" smd rect (at -6.5 3.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "17" smd rect (at -6.5 4.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "18" smd rect (at -6.5 5.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "19" smd rect (at -6.5 6.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "20" smd rect (at -6.5 7.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "21" smd rect (at -6.5 8.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "22" smd rect (at -4.5 9.5) (size 0.6 1.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "23" smd rect (at -3.5 9.5) (size 0.6 1.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "24" smd rect (at -2.5 9.5) (size 0.6 1.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "25" smd rect (at -1.5 9.5) (size 0.6 1.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "26" smd rect (at -0.5 9.5) (size 0.6 1.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "27" smd rect (at 0.5 9.5) (size 0.6 1.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "28" smd rect (at 1.5 9.5) (size 0.6 1.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "29" smd rect (at 2.5 9.5) (size 0.6 1.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "30" smd rect (at 3.5 9.5) (size 0.6 1.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "31" smd rect (at 4.5 9.5) (size 0.6 1.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "32" smd rect (at 6.5 8.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "33" smd rect (at 6.5 7.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "34" smd rect (at 6.5 6.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "35" smd rect (at 6.5 5.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "36" smd rect (at 6.5 4.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "37" smd rect (at 6.5 3.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "38" smd rect (at 6.5 2.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "39" smd rect (at 6.5 1.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "40" smd rect (at 6.5 0.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "41" smd rect (at 6.5 -1.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "42" smd rect (at 6.5 -2.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "43" smd rect (at 6.5 -3.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "44" smd rect (at 6.5 -4.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "45" smd rect (at 6.5 -5.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "46" smd rect (at 6.5 -6.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "47" smd rect (at 6.5 -7.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "48" smd rect (at 6.5 -8.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "49" smd rect (at 6.5 -9.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "50" smd rect (at 6.5 -10.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "51" smd rect (at 6.5 -11.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (pad "52" smd rect (at 6.5 -12.0) (size 1.6 0.6) (layers "F.Cu" "F.Paste" "F.Mask")) + (fp_line (start -6.495 8.5813) (end -6.495 9.505) (stroke (width 0.127) (type default)) (layer "F.SilkS")) + (fp_line (start -6.0 10.0) (end -6.495 9.505) (stroke (width 0.127) (type default)) (layer "F.SilkS")) + (fp_line (start -6.0 10.0) (end -5.0 10.0) (stroke (width 0.127) (type default)) (layer "F.SilkS")) + (fp_line (start 5.0 10.0) (end 6.0 10.0) (stroke (width 0.127) (type default)) (layer "F.SilkS")) + (fp_line (start 6.5 9.5) (end 6.0 10.0) (stroke (width 0.127) (type default)) (layer "F.SilkS")) + (fp_line (start 6.5 9.5) (end 6.5 8.5) (stroke (width 0.127) (type default)) (layer "F.SilkS")) + (fp_line (start -6.495 -17.5) (end 6.5 -17.5) (stroke (width 0.127) (type default)) (layer "F.SilkS")) + (fp_line (start -6.495 -12.4977) (end -6.495 -17.5) (stroke (width 0.127) (type default)) (layer "F.SilkS")) + (fp_line (start 6.5 -12.5) (end 6.5 -17.5) (stroke (width 0.127) (type default)) (layer "F.SilkS")) + (fp_line (start 4.5 -12.5) (end 4.5 -16.5) (stroke (width 0.4) (type default)) (layer "F.SilkS")) + (fp_line (start 4.5 -16.5) (end 2.0 -16.5) (stroke (width 0.4) (type default)) (layer "F.SilkS")) + (fp_line (start 2.0 -16.5) (end 2.0 -14.0) (stroke (width 0.4) (type default)) (layer "F.SilkS")) + (fp_line (start 2.0 -14.0) (end 1.0 -14.0) (stroke (width 0.4) (type default)) (layer "F.SilkS")) + (fp_line (start 1.0 -14.0) (end 1.0 -16.5) (stroke (width 0.4) (type default)) (layer "F.SilkS")) + (fp_line (start 1.0 -16.5) (end 0.0 -16.5) (stroke (width 0.4) (type default)) (layer "F.SilkS")) + (fp_line (start 0.0 -16.5) (end 0.0 -14.0) (stroke (width 0.4) (type default)) (layer "F.SilkS")) + (fp_line (start 0.0 -14.0) (end -1.0 -14.0) (stroke (width 0.4) (type default)) (layer "F.SilkS")) + (fp_line (start -1.0 -14.0) (end -1.0 -16.5) (stroke (width 0.4) (type default)) (layer "F.SilkS")) + (fp_line (start -1.0 -16.5) (end -2.0 -16.5) (stroke (width 0.4) (type default)) (layer "F.SilkS")) + (fp_line (start -2.0 -16.5) (end -2.0 -14.0) (stroke (width 0.4) (type default)) (layer "F.SilkS")) + (fp_line (start -2.0 -14.0) (end -3.0 -14.0) (stroke (width 0.4) (type default)) (layer "F.SilkS")) + (fp_line (start -3.0 -14.0) (end -3.0 -16.5) (stroke (width 0.4) (type default)) (layer "F.SilkS")) + (fp_line (start -3.0 -16.5) (end -5.5 -16.5) (stroke (width 0.4) (type default)) (layer "F.SilkS")) + (fp_rect (start -6.5 -17.5) (end 6.5 10.0) (stroke (width 0.05) (type default)) (layer "F.Fab")) + (fp_rect (start -6.75 -17.75) (end 6.75 10.25) (stroke (width 0.05) (type default)) (layer "F.CrtYd")) +) diff --git a/fp-lib-table b/fp-lib-table index 6e88889..50165a7 100644 --- a/fp-lib-table +++ b/fp-lib-table @@ -95,6 +95,7 @@ (lib (name "MIKILAB_ublox")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/ublox.pretty")(options "")(descr "ublox.pretty")) (lib (name "MIKILAB_wurth")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/wurth.pretty")(options "")(descr "wurth.pretty")) (lib (name "MIKILAB_zif")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/zif.pretty")(options "")(descr "zif.pretty")) + (lib (name "MIKILAB_FSC_BT1035")(type "KiCad")(uri "${KIPRJMOD}/footprints/rf/FSC-BT1035.pretty")(options "")(descr "FSC-BT1035.pretty")) (lib (name "MIKILAB_RTL8211F_CG")(type "KiCad")(uri "${KIPRJMOD}/footprints/rf/RTL8211F-CG.pretty")(options "")(descr "RTL8211F-CG.pretty")) (lib (name "MIKILAB_antenna")(type "KiCad")(uri "${KIPRJMOD}/footprints/rf/antenna.pretty")(options "")(descr "antenna.pretty")) (lib (name "MIKILAB_hackrf_expansion")(type "KiCad")(uri "${KIPRJMOD}/footprints/rf/hackrf_expansion.pretty")(options "")(descr "hackrf_expansion.pretty")) diff --git a/fp-lib-table.global b/fp-lib-table.global index d793285..e7c4d51 100644 --- a/fp-lib-table.global +++ b/fp-lib-table.global @@ -95,6 +95,7 @@ (lib (name "MIKILAB_ublox")(type "KiCad")(uri "${MIKILAB}/footprints/other/ublox.pretty")(options "")(descr "ublox.pretty")) (lib (name "MIKILAB_wurth")(type "KiCad")(uri "${MIKILAB}/footprints/other/wurth.pretty")(options "")(descr "wurth.pretty")) (lib (name "MIKILAB_zif")(type "KiCad")(uri "${MIKILAB}/footprints/other/zif.pretty")(options "")(descr "zif.pretty")) + (lib (name "MIKILAB_FSC_BT1035")(type "KiCad")(uri "${MIKILAB}/footprints/rf/FSC-BT1035.pretty")(options "")(descr "FSC-BT1035.pretty")) (lib (name "MIKILAB_RTL8211F_CG")(type "KiCad")(uri "${MIKILAB}/footprints/rf/RTL8211F-CG.pretty")(options "")(descr "RTL8211F-CG.pretty")) (lib (name "MIKILAB_antenna")(type "KiCad")(uri "${MIKILAB}/footprints/rf/antenna.pretty")(options "")(descr "antenna.pretty")) (lib (name "MIKILAB_hackrf_expansion")(type "KiCad")(uri "${MIKILAB}/footprints/rf/hackrf_expansion.pretty")(options "")(descr "hackrf_expansion.pretty")) diff --git a/symbols/rf/FSC-BT1035.kicad_sym b/symbols/rf/FSC-BT1035.kicad_sym index ec269c4..406a3c3 100644 --- a/symbols/rf/FSC-BT1035.kicad_sym +++ b/symbols/rf/FSC-BT1035.kicad_sym @@ -13,7 +13,7 @@ (at -20.32 -34.29 0) (effects (font (size 1.27 1.27))) ) - (property "Footprint" "" + (property "Footprint" "MIKILAB_FSC_BT1035:FSC-BT1035" (at 0 0 0) (effects (font (size 1.27 1.27)) hide) )