- 32 tines → 16 tines: Reduced to manage PCB routing complexity and sensor array fabrication time within the project timeline. The 16-tine version provides sufficient spatial resolution for the primary use case.
- 4-pin OLED (SSD1306) → 7-pin SPI TFT color screen: The SSD1306 had a pin-swap issue between the physical module and the KiCAD footprint; the SPI TFT offered higher resolution and a cleaner interface for the final product.
- Per-trace pull-down resistors → two shared resistors for tactile switches only: Simplified the PCB layout considerably. Multiplexer floating-gate protection was handled differently in the final firmware.
No input detected test, then a flybird inspired test run !
Digital Contour Gauge Mockup - Breadboard
This video demonstrates a part of my final project iterations to explore the potential setup for my final project.
This video demonstrates the code I uploaded to my new PCB working. On the left, it shows how the PCB communicates via UART and the Python code, where it shows a message confirming data sent from the obstacle sensor. On the right, it shows the obstacle sensor on the serial monitor to confirm the sensor is in fact working and to verify.
This video shows the computer side and the Python program running after receiving data from the obstacle sensor and PCB, where we start by running
obstacle.py and it starts listening for information from the PCB connected to the PC port. The video later on shows the data being received as expected.
Digital Contour Gauge Mockup - Computer Side
| Library | Role |
|---|---|
serial | Hooks the active hardware port connection, running structural timeout limits to catch incoming packets. |
ezdxf | Assembles the 16 separate horizontal coordinates per row into high-precision, continuous polyline entities inside full 3D CAD vectors. |
json | Serializes multi-point slice packages into persistent log file registries. |
os | Validates file structural access paths and handles multi-layer atomic file buffering. |
time | Appends UNIX file timestamps for long-term profiling histories. |
DCG_V3 by m.azizi2793 on Sketchfab
| Sub-Assembly | Description |
|---|---|
| SA1 — Back Plate and Clamps | Houses the two common copper busbars (Gnd and PWR) and encloses to the chassis |
| SA2 — Tine Array | 16 spring-loaded sliding tines with embedded steel wire wiper contacts, packed into precision guide tracks |
| SA4 — Electronic Module Casing | Protective top cover preventing particulate contamination of the sensor electronics also pushes the PCB to the spring loaded tines |
| SA5 — Dual-PCB Substrate | Two milled single-sided FR1 copper boards designed to face each other and close the sensor contact loop |
One major fabrication hurdle I hit was getting the toolpath to generate for the through-holes. In the raw vector export, the via holes were smaller than my 0.792mm (1/32") endmill, which caused Mods CE to completely ignore them during calculation.
To fix this without messing up the layout, I brought the SVG into Inkscape and used the Object Transform and Scale tool. By locking the proportions and scaling the hole vectors up to 0.85mm—making them explicitly larger than the tool diameter—I forced Mods to generate a clean, concentric drilling path. Because I scaled them uniformly using their bounding box centers, I cleared the tool path perfectly without losing their precise relative positions on the board grid.
Once the front layer was sorted, I repeated this exact same scaling and mirroring workflow for the back copper layer vectors to make sure everything aligned flawlessly back-to-back.
Bill of Materials & Cost
Electronics BOM (Final — 16-Tine Version)
| # | Category | Component | Qty | Description | Link / Reference |
|---|---|---|---|---|---|
| 1 | Core Electronics | Seeed Studio XIAO RP2040 | 1 | Main MCU (ESP32C3 as drop-in alternative) | https://www.digikey.com/en/products/detail/seeed-technology-co-ltd/102010428/14672129 |
| 2 | Core Electronics | CD74HC4067 16-Ch Multiplexer | 1 | 16 analog channels → single ADC pin | https://mikroelectron.com/product/me-2912 |
| 3 | Display | 1.8" SPI TFT (ST7789 / ILI9341) | 1 | Color display; MOSI, CLK, CS, DC, RST, PWM backlight | https://mikroelectron.com/product/me-12725 |
| 4 | Sensor | Milled FR1 Single-Sided Copper Board | 2 | Dual-layer stator — 16 vertical traces each | https://store.bantamtools.com/products/pcb?variant=574277429 |
| 5 | Sensor | Velostat Conductive Plastic Sheet | 1 | Resistive layer for voltage division | From the lab, no link found |
| 6 | Sensor | Brass or Copper Busbars | 2 | VCC and GND rails along Velostat edges cut from the 5"X4" BOARDS | https://store.bantamtools.com/products/pcb?variant=574277429 |
| 7 | Mechanicals | Custom Sliding Tines (PLA + wire) | 16 | FDM printed, 1mm conductive steel wire wiper | From the lab / CPF Makerspace / Ultimaker Blue - PLA |
| 8 | Mechanicals | Main Enclosure Chassis | 1 | FDM printed, white PLA | From the lab / CPF Makerspace / Ultimaker White - PLA |
| 9 | Mechanicals | M3 Bolts and Nuts | 4 sets | Structural fastening for main chassis setup | From the lab inventory / CPF Makerspace |
| 10 | Power | 3.7V LiPo Battery (500–1000 mAh) | 1 | Native pads on ESP32C3; TP4056 needed for RP2040 | https://mikroelectron.com/product/me-14016 |
| 11 | Passives | 10µF 25V Capacitors (0805) | 2 | Noise filtering and via bridging | https://mikroelectron.com/product/me-14685 |
| 12 | Passives | 10kΩ Resistors (1206) | 2 | Pull-down resistors for MUX SIG lines | https://www.digikey.com/en/products/detail/yageo/RC1206FR-0710KL/728483 |
| 13 | Passives | 0Ω Resistors (1206) | 1 | PCB trace bridge | https://www.digikey.com/en/products/detail/yageo/RC1206FR-070RL/5698945 |
| 14 | Input | Tactile SMD Push Buttons | 2 | Mode select and capture trigger | From Mikroelektron / no public link / listed invoice image here 1, 2 |
| 15 | Connectors | 2.54mm Female Pin Headers | 2 rows | MCU docking, screen docking, board-to-board | From Mikroelektron / no public link / listed invoice image here 1, 2 |
| 16 | Connectors | JST 2-Pin Headers | 2 | VCC/GND bridging to bottom copper layer | From Mikroelektron / no public link / listed invoice image here 1, 2 |
12. Files & References
- Final Assembly Final (Fusion 360 Public Link Assembly File)
- DCG_V3.f3z (can be found on sketchfab, exceeds size limit) (Fusion 360 Assembly)
- Enclosure.stl (3D Print STL)
- FrontCover.stl (3D Print STL)
- Final_Tine.f3d (Tine Fusion file)
- Tine.stl (3D Print STL)
- Clamp.stl (3D Print STL)
- CopperPlates.stl (3D Print STL)
- UMS5_CopperBasePlates.3mf (Ultimaker Print Job)
- UMS5_Tine.3mf (Ultimaker Print Job)
- UMS6_Clamp.3mf (Ultimaker Print Job)
- KiCAD Files(zip)
- Final_Python_Code.py (Python UART → DXF/JSON pipeline)
- Final_Code.ino Arduino IDE
- presentation.png (Slide, 1920×1080)
- presentation.mp4 (Video, 1080p)
Fusion 360 Public Link for the Design
Final Model for the Digital Contour Gauge
Week 06 & 08: Electronics Design
KiCAD schematic layout and CD74HC4067 multiplexer integration.
Week 09: Electronics Production
Double-sided isolation milling on the Roland SRM-20 using Mods CE.
Week 10: Output Devices
OLED integration, EMA filter implementation, curve plotting, and Flappy Bird demo.
Week 11: Networking & Communications
Python serial pipeline, ezdxf DXF export, and new PCB documentation.
Week 15: System Integration
DFM checklist, prototype cycles, FMEA, and BOM finalization.
Week 17: Applications & Implications
Use case analysis, scope decisions, and project success criteria.