Skip to the content
2 layers175 × 90 mmController, the printed circuit board in 3D

A machine vision-based robotic assembly system using the MechArm 270, NVIDIA Jetson Nano, and a custom ESP32 controller board for automated pick-and-place and miniature car assembly.

Size
175 × 90 mm
Copper layers
2
Thickness
1.6 mm
Parts
95
Nets
101
Pads
325
Tracks, vias
489, 101
Pours
6
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
17 Jul 2026
Updated
21 Jul 2026

Overview

Controller is an open-source printed circuit board by Circuit-Digest, from the Circuit-Digest/machine-vision-robotic-assembly-system repository on GitHub, published under the MIT licence. It is a 2-layer board of 175 × 90 mm with 95 parts on 101 nets, routed with 489 tracks and 101 vias.

It is built around the ESP32-S3-WROOM-1-N8, LM2596S-3.3 and SI4463CDY-T1-GE3-VB, with the SP0504BAHTG, LL4148 and SS8550 among its other parts. Its parts include 32 resistors, 15 diodes, 13 connectors, 9 ICs and 6 capacitors. It belongs with the ESP32 boards of this library.

Main components

8

README

README.md

🤖 Machine Vision-Based Robotic Assembly System Using MechArm 270 and Jetson Nano

A real-time computer-vision system that drives a 6-DOF robotic arm + linear rail to autonomously assemble two toy cars, verifying every part placement using black-pixel ROI detection on an on-board webcam.

Python Flask OpenCV SocketIO License: MIT



Robotic Assembly Line Vision Demo


📖 Table of Contents

  1. Project Overview
  2. Key Features
  3. System Architecture
  4. Hardware Requirements
  5. Software Requirements & Installation
  6. Configuration
  7. Running the Server
  8. Dashboard Guide
  9. Calibration Workflow
  10. Vision Pipeline
  11. Inspection Stations
  12. Waypoint System
  13. Socket.IO Event Reference
  14. Project Structure
  15. Troubleshooting
  16. Contributing
  17. License

🎯 Project Overview

This system orchestrates a MechArm 270 6-DOF robotic arm mounted on a stepper-driven linear rail to perform automated, vision-verified pick-and-place assembly of two toy cars.

The arm visits five physical stations. At each inspection station it positions its wrist-mounted webcam over a part tray, and a real-time OpenCV pipeline verifies the correct component is present using black-pixel ROI analysis before the arm is allowed to pick it up. A missing part immediately halts the sequence, triggers a physical buzzer alert, and waits for an operator to place the correct component.

The entire stack — robot control, vision processing, rail control, and web dashboards — runs as a single Python process on port 5000, eliminating all inter-service network latency.


✨ Key Features

FeatureDescription
🎥 Live MJPEG StreamReal-time webcam feed with annotated ROI overlays served to the browser
🔍 Black-Pixel ROI DetectionStation-aware part detection using calibrated bounding boxes and HSV black masking
🤖 Wi-Fi Arm ControlNon-blocking TCP socket control of MechArm 270 via pymycobot
🚂 ESP32 Rail ControlHTTP-driven stepper linear rail with 5 presets (P1–P5)
🚦 Physical IndicatorsGreen/Red LED + buzzer relay control for workshop-audible alerts
✅ Assembly ChecklistLive progress bar and per-part checklist updating on every verification
🖥️ Three DashboardsHome display, Operator dashboard, Waypoint editor — all browser-based
🛡️ Sim Mode FallbackFull simulation when no hardware is connected — no code changes needed
💾 JSON PersistenceAll waypoints, poses, ROIs, and network config survive server restarts

🏗️ System Architecture

text
┌─────────────────────────────────────────────────────────────────┐
│            main.py  (single process, port 5000)       │
│                                                                  │
│  ┌──────────────┐   ┌──────────────┐   ┌─────────────────────┐ │
│  │ RobotManager │   │  RailManager │   │  RailIndicatorMgr   │ │
│  │  Wi-Fi TCP   │   │  HTTP / ESP32│   │  HTTP relay control  │ │
│  └──────┬───────┘   └──────┬───────┘   └──────────┬──────────┘ │
│         │                  │                        │            │
│  ┌──────▼──────────────────▼───────────────────────▼──────────┐ │
│  │                   PlaybackEngine                            │ │
│  │  Sequences arm + rail movements + vision verification       │ │
│  └──────────────────────────┬──────────────────────────────────┘ │
│                             │  shared in-process memory           │
│  ┌──────────────────────────▼──────────────────────────────────┐ │
│  │             vision_thread()  (~30 FPS)                      │ │
│  │   OpenCV: Black-pixel ROI detection per station             │ │
│  └─────────────────────────────────────────────────────────────┘ │
│                                                                  │
│  Flask Routes + Socket.IO  →  Browser Dashboards                │
└─────────────────────────────────────────────────────────────────┘

Data Flow

text
Camera → vision_thread → stable_detected_parts (dict)
                              ↓ (zero-latency in-process read)
                         PlaybackEngine → verifies part → continues sequence
                              ↓
                         Socket.IO → Browser (checklist, log, progress)

🔧 Hardware Requirements

ComponentSpecificationNotes
Robot ArmElephant Robotics MechArm 270Wi-Fi model required
Linear RailCustom stepper rail with ESP32-C65 presets: P1–P5
CameraUSB webcam (640×480 minimum)Wrist-mounted on arm
Relay Board3-channel relay (12V)Buzzer + Green/Red LED
NetworkWi-Fi AP or routerArm, ESP32, and host PC on same LAN
Host ComputerAny x86/ARM Linux or Windows PCPython 3.9+ required

[!NOTE] The system runs in full simulation mode if no hardware is connected. The camera stream is replaced by an animated mock feed, all Socket.IO events fire normally, and you can test the complete UI and checklist flow without any physical hardware.


💻 Software Requirements & Installation

1. Clone the repository

bash
git clone https://github.com/YOUR_USERNAME/machine-vision-robotic-assembly-system.git
cd machine-vision-robotic-assembly-system

2. Create a virtual environment (recommended)

bash
python -m venv venv

# Windows
venv\Scripts\activate

# Linux / macOS
source venv/bin/activate

3. Install dependencies

bash
pip install -r requirements.txt

Dependency Overview

PackagePurpose
flaskWeb server & template rendering
flask-socketioReal-time WebSocket transport
requestsHTTP calls to the ESP32 Rail API
pymycobotMechArm 270 Wi-Fi TCP SDK
opencv-pythonVideo capture, black-pixel ROI masking, MJPEG stream
numpyArray operations for vision pipeline

⚙️ Configuration

Step 1 — Set your network IPs

Edit config.py and update the two IP constants at the bottom of the file:

python
ARM_IP         = "192.168.1.100"   # Your MechArm270's Wi-Fi IP address
RAIL_IP        = "192.168.1.101"   # Your ESP32-C6 Rail controller IP

[!TIP] You can also set these at runtime without restarting the server — open the Operator Dashboard, click the gear icon ⚙️, and enter your IPs. They are saved to robot_config.json and rail_config.json and take effect immediately.

Step 2 — Camera index

In config.py, set the correct USB camera index:

python
CAMERA_INDEX = 0    # 0 = default (first USB camera)
                    # 1 = second USB camera, etc.

Step 3 — Vision detection thresholds

Tune these in config.py to match your lighting and part colours:

python
# Black part detection
BLACK_HSV_LOWER = (0,   0,   0)    # HSV lower bound for black
BLACK_HSV_UPPER = (180, 255, 50)   # V < 50 = genuinely dark/black
BLACK_PIXEL_RATIO = 0.10           # 10% of ROI must be black to count as "present"

# Temporal hysteresis (noise suppression)
CONFIRM_FRAMES   = 5    # frames a part must be seen before "stable"
DISAPPEAR_FRAMES = 10   # frames a part must be missing before "lost"

Step 4 — Runtime-persisted configuration files

The following JSON files are auto-generated and updated by the dashboards. They override the config.py defaults:

FileContentsEditable via
robot_config.jsonArm IP, port, axis calibration offsetsOperator Dashboard ⚙️
rail_config.jsonRail ESP32 IPOperator Dashboard ⚙️
camera_settings.jsonBrightness, contrast, exposure, gainOperator Dashboard 🎥
scan_poses.json6-joint arm angles per inspection stationWaypoint Editor → Scan Poses
roi_boundaries.jsonPer-part pixel bounding boxes (ROI)Operator Dashboard → ROI Editor
zone_boundaries.jsonSpatial zone definitions per stationOperator Dashboard → Zone Editor
waypoints.jsonFull arm + rail motion sequenceWaypoint Editor

[!WARNING] The waypoints.json included in this repository was recorded on a specific physical rig. Joint angles and positions will not transfer to a different robot or table layout. You must re-record all waypoints using the Waypoint Editor for your own setup.


🚀 Running the Server

bash
python main.py

The server starts on http://0.0.0.0:5000. Open a browser and navigate to:

URLDashboard
http://localhost:5000/🏠 Home Display Dashboard
http://localhost:5000/camera_view🖥️ Operator Dashboard
http://localhost:5000/editor✏️ Waypoint Editor

On startup you will see:

text
======================================================================
  Robotic Assembly System (MechArm 270 & Jetson Nano) -> http://localhost:5000
  Robotic Arm + Stepper Linear Rail + Black-pixel ROI Vision Integrated.
======================================================================

The robot arm and rail connections are made in the background — if they fail the server continues in simulation mode and retries every 15 seconds.


🖥️ Dashboard Guide

🏠 Home Display Dashboard (/)

Clean status overview, suitable for display on a monitor during operation.

text
┌──────────────────────────┬──────────────────────┐
│   Live Camera Stream     │   System Info         │
│   (annotated MJPEG)      │   Robot: MechArm 270  │
│                          │   Detection: Black ROI│
├──────────────────────────┼──────────────────────┤
│   Last Detection         │  Assembly Progress   │
│   Snapshot               │  ████████░░░  75%    │
│                          │                      │
│                          │  ✅ Chassis 1         │
│                          │  ✅ Chassis 2         │
│                          │  ✅ WheelBase 1a      │
│                          │  ⏳ WheelBase 2a      │
│                          │  ...                  │
│                          │                      │
│                          │  Sensor: 24.3°C      │
│                          │  Door: CLOSED        │
│                          │                      │
│                          │  System Log          │
│                          │  ✓ Chassis 1 confirmed│
└──────────────────────────┴──────────────────────┘
  • ▶ Play Sequence — starts the full automated assembly run
  • ⏹ Stop Arm — emergency halt

🖥️ Operator Dashboard (/camera_view)

Full-featured operator view for monitoring and controlling the assembly:

  • Live annotated stream — ROI boxes (grey → yellow → green), part labels, pixel-ratio readout, station overlay
  • Robot telemetry — 6 joint angles, XYZ coordinates updated every 200 ms
  • Assembly checklist — all parts for both cars, updating in real time
  • 8-Switch Simulator Panel — toggle any part as "present" for dry-run testing without physical components
  • Halt/Error Panel — if the sequence stops on a missing part, this panel shows the reason and a restart button

✏️ Waypoint Editor (/editor)

Engineering tool for teaching the robot its motion sequence:

  1. Jog controls — move each of the 6 joints or X/Y/Z coordinates from the browser
  2. Record — save the current arm pose as a new waypoint (angles, coords, or both)
  3. Edit sequence — rename, reorder, adjust speed, vacuum action, delay, and rail preset per waypoint
  4. Scan Pose console — jog the arm to the perfect camera inspection angle, then click Set P1 (or P2/P4/P5) to save to scan_poses.json
  5. Motor calibration — lock/unlock individual joints, adjust motor power levels
  6. Network settings — change Arm IP, Rail IP, and speed without restarting the server

📐 Calibration Workflow

Follow this sequence when setting up on a new physical rig:

text
1. Physical setup
   └─ Mount arm on rail, position part trays at stations P1, P2, P4, P5

2. Network configuration
   └─ Set ARM_IP and RAIL_IP in config.py or via Operator Dashboard ⚙️

3. Camera verification
   └─ Open /camera_view, check live stream
   └─ Adjust CAMERA_INDEX in config.py if wrong camera opens

4. Scan pose recording  (Waypoint Editor → 📸 Inspection Scan Poses)
   └─ Jog arm to view P1 tray → click "Set P1 (Chassis)"
   └─ Repeat for P2, P4, P5

5. ROI calibration  (Operator Dashboard → ROI Editor)
   └─ Move arm to scan pose for each station
   └─ Draw bounding boxes around each part slot on the video frame
   └─ Save → updates roi_boundaries.json

6. Detection threshold tuning  (config.py)
   └─ Adjust BLACK_PIXEL_RATIO until parts detect cleanly
   └─ Use 8-Switch Simulator to verify checklist behaviour

7. Waypoint recording  (Waypoint Editor)

👁️ Vision Pipeline

The vision system runs in a dedicated background thread at ~30 FPS using OpenCV.

Black-Pixel ROI Detection

The only detection method used is black-pixel ratio analysis within calibrated Region of Interest (ROI) bounding boxes:

text
Frame (BGR)
  │
  ├─ GaussianBlur (5×5) → HSV conversion
  │
  └─ For each active part at current station:
        Crop frame to ROI bounding box  (from roi_boundaries.json)
        Apply black HSV mask: H[0-180] S[0-255] V[0-50]
        ratio = countNonZero(mask) / roi_area
        present = ratio - ambient_baseline ≥ BLACK_PIXEL_RATIO (10%)

An adaptive ambient baseline is captured on the first frame after the arm settles at its scan pose. This compensates automatically for dim environments or dark surfaces in the background.

How Detection Works Per Station

  1. Rail moves arm to station (e.g. P1)
  2. Arm commands itself to pre-saved scan pose for that station (scan_poses.json)
  3. Vision thread activates and begins checking only the parts registered to that station (STATION_PARTS in config.py)
  4. For each active part slot, it crops the frame to the ROI (roi_boundaries.json) and measures the black-pixel ratio
  5. Parts meeting the threshold are accumulated over frames; confirmed after CONFIRM_FRAMES consecutive detections

Hysteresis Filtering

Raw frame results are not immediately acted upon — a two-stage filter prevents false positives from motion blur, shadows, or lighting glitches:

text
MISSING ──[seen for 5 consecutive frames]──→ STABLE (detected)
STABLE  ──[missing for 10 consecutive frames]──→ MISSING

Stream Annotation

During an active vision check, the live stream shows:

  • Grey boxes — ROI is active, part not detected
  • Yellow boxes — part seen but not yet stable (accumulating frames)
  • Green boxes — part confirmed stable (checkmark ✓ + ratio %)
  • Station panel — current station label + list of active part slots

🏭 Inspection Stations

StationPresetDetection MethodParts Verified
P1P1 (Chassis)Black-pixel ROIChassis 1, Chassis 2
P2P2 (Wheelbase)Black-pixel ROIWheelBase 1a, 2a, 1b, 2b
P3P3 (Assemble)(none — assembly zone)—
P4P4 (Wheels)Black-pixel ROI (8 slots)Wheel Slots 1–8
P5P5 (Body)Black-pixel ROIBody 1, Body 2

📋 Waypoint System

Waypoint Record Format

json
{
  "name": "Pick Chassis 1",
  "type": "angles",
  "data": [15.2, -45.1, 90.0, 0.0, 45.0, 0.0],
  "speed": 40,
  "vacuum": "on",
  "vacuum_delay_ms": 300,
  "delay_ms": 200,
  "rail_preset": "P1"
}
FieldValuesDescription
typeangles, coords, both, vision_checkMovement type
data[j1, j2, j3, j4, j5, j6] or [x, y, z, rx, ry, rz]Target position
vacuum"on", "off", "none"Vacuum pump action after movement
rail_preset"P1"–"P5", "NONE"Rail position to move to after arm arrives
speed1–100Arm movement speed percentage

vision_check Waypoint

A special waypoint type that does not move the arm or rail. It triggers a vision verification cycle:

json
{
  "name": "Verify Chassis 1",
  "type": "vision_check",
  "rail_preset": "P1",
  "check_part": "Chassis 1"
}

When the PlaybackEngine reaches this waypoint it:

  1. Commands the arm to the pre-saved scan pose for that station
  2. Waits 1.5 s for mechanical settling
  3. Activates vision detection for the named part
  4. Waits until the part is stably detected (or halts on timeout/stop)
  5. Emits part_verified to update the UI checklist

📡 Socket.IO Event Reference

Server → Client

EventKey Payload FieldsDescription
robot_statusangles[], coords[], rail{}, vision_detected[]Full telemetry broadcast (every 200 ms)
statusstate, step, total, messagePlayback state machine update
playback_progressindex, total, name, statePer-waypoint progress update
part_verifiedpart, rail, snapshot_tsPart confirmed — update checklist
vision_loglevel, messageColour-coded log line for consoles
detection_startedpart, stationVision scan is active
detection_stoppedpart, station, foundVision scan ended
snapshot_updated(none)Last-detection image on disk has changed
errorpart, position, messageEmergency stop / verification fault
command_completeaction, cmd_idArm command acknowledged by hardware

Client → Server

EventPayloadDescription
play_sequencestart_index, speed, skip_visionStart playback
stop_sequence(none)Emergency stop
toggle_mockpart, valueToggle hardware simulator switch
jog_jointjoint, delta, speedMove one joint by delta degrees
jog_coordaxis, delta, speedMove in Cartesian space
record_waypointtype, name, vacuum, rail_preset, speedSave current pose
set_scan_posestationSave current arm angles as scan pose
update_iparm_ip, rail_ipChange network config without restart

📁 Project Structure

text
machine-vision-robotic-assembly-system/
│
├── main.py                    # Main Flask + SocketIO application (2,700+ lines)
├── config.py                  # Shared constants: IPs, HSV thresholds, station maps
├── requirements.txt           # Python dependencies
├── .gitignore                 # Excludes __pycache__, logs, runtime snapshots
├── LICENSE                    # MIT License
│
├── templates/
│   ├── home.html              # 🏠 Home display (live feed + status checklist)
│   ├── operator_view.html     # 🖥️  Operator Dashboard (full telemetry + controls)
│   └── waypoint_editor.html   # ✏️  Waypoint Editor & Scan Pose console
│
├── static/
│   └── socket.io.min.js       # Socket.IO client (served locally, no CDN dependency)
│
├── hardware/                  # 🔌 PCB & Schematic Design Files
│   ├── schematic.pdf          # PCB schematic diagram (PDF)
│   ├── gerbers.zip            # Manufacturing-ready Gerber files
│   ├── controller.kicad_sch   # KiCad Schematic design
│   ├── controller.kicad_pcb   # KiCad PCB board layout
│   ├── controller.kicad_pro   # KiCad Project file
│   └── controller.kicad_prl   # KiCad Project local settings
│

🔧 Troubleshooting

Robot arm won't connect

  • Confirm the MechArm 270 is powered on and joined to your Wi-Fi network
  • Check ARM_IP in config.py or robot_config.json matches the arm's actual IP
  • The arm's IP is shown on the robot's display or in your router's DHCP table
  • The server retries the connection every 15 seconds — check the console for Wi-Fi connect failed messages

Rail won't move

  • Confirm the ESP32-C6 board is powered and on the same LAN
  • Check RAIL_IP in config.py or rail_config.json
  • Open http://YOUR_RAIL_IP/status in a browser — you should get a JSON response

Camera not opening / black screen

  • Try changing CAMERA_INDEX in config.py (0, 1, 2 …)
  • On Linux, if using V4L2: ensure CAMERA_BACKEND = "CAP_V4L2" in config.py
  • Check that no other application has the camera locked

Parts not being detected

  • Verify the arm reaches the correct scan pose (check scan_poses.json)
  • Use the ROI Editor in the Operator Dashboard to confirm the bounding boxes are positioned over the part slots
  • Lower BLACK_PIXEL_RATIO in config.py if detection is too strict
  • Check ambient lighting — very bright or uneven light can wash out the black pixel mask

Detection works in sim but not on hardware

  • Verify roi_boundaries.json is calibrated for your actual camera view angle (sim uses default zones)
  • Re-run the scan pose recording for each station in the Waypoint Editor

🤝 Contributing

Contributions, bug reports, and feature suggestions are welcome!

  1. Fork the repository
  2. Create a feature branch: git checkout -b feature/your-feature-name
  3. Commit your changes: git commit -m "feat: add your feature description"
  4. Push to your fork: git push origin feature/your-feature-name
  5. Open a Pull Request against the main branch

Code Style

  • Python: follow PEP 8
  • Docstrings: include for all new public functions and classes
  • Existing # ───── section dividers should be preserved for consistency

📄 License

This project is licensed under the MIT License — see the LICENSE file for details.


Built with ❤️ using Flask · OpenCV · pymycobot · Socket.IO

Parts

95
QtyValueFootprintReferences
191Kcontroller:R_0603_1608MetricR2, R11, R12, R13, R14, R15, R17, R19, R20, R21, R23, R24, R25, R27, R28, R29 +3
710Kcontroller:R_0603_1608MetricR7, R8, R16, R18, R22, R26, R30
53mm Red LED with 13mm Spacercontroller:LED_0805_2012MetricLED6, LED7, LED8, LED9, LED10
5Conn_01x03controller:JST_XH_S3B-XH-A-1_1x03_P2.50mm_HorizontalJ3, J4, J5, J6, J7
5LED Redcontroller:LED_0805_2012MetricLED1, LED2, LED3, LED4, LED5
5LOGOLOGOG***, G***, G***, G***, G***
4LL4148controller:D_MiniMELFD2, D3, D4, D5
4PC817controller:DIP-4_W7.62mmU4, U5, U6, U7
4SANYOU_SRD_Form_Ccontroller:Relay_SPDT_SANYOU_SRD_Series_Form_CK1, K2, K3, K4
4SS8550controller:SOT-23Q2, Q3, Q4, Q5
4Screw_Terminal_01x03controller:TerminalBlock_Phoenix_MKDS-1,5-3-5.08_1x03_P5.08mm_HorizontalJ10, J11, J12, J13
20.1uFcontroller:C_0603_1608MetricC5, C6
2220uFcontroller:CP_Elec_8x10.5C1, C3
233Rcontroller:R_0603_1608MetricR9, R10
25K1controller:R_0603_1608MetricR5, R6
2MountingHole_Padcontroller:DinRailMountH1, H2
2PTS641_SM25_SMTR2_LFScontroller:PTS641SM25SMTR2LFSS1, S2
10.22uFcontroller:C_0603_1608MetricC4
10Rcontroller:R_0603_1608MetricR3
1100Kcontroller:R_0603_1608MetricR1
110Vcontroller:D_MiniMELFZD1
13.3nFcontroller:C_0603_1608MetricC2
147uHcontroller:L_12x12mm_H8mmL1
1Conn_01x02controller:JST_XH_S2B-XH-A-1_1x02_P2.50mm_HorizontalJ8
1Conn_01x04controller:JST_XH_S4B-XH-A-1_1x04_P2.50mm_HorizontalJ9
1ESP32-S3-WROOM-1controller:ESP32-S3-WROOM-1U2
1LM2596S-3.3controller:TO-263-5_TabPin3U1
1Polyfusecontroller:30R500UFF1
1SI4463CDY-T1-GE3controller:SOIC127P600X175-8NU8
1SP0504BAHTGcontroller:SOT95P280X145-5NIC1
1SS34controller:D_SMAD1
1Screw_Terminal_01x02controller:TerminalBlock_Phoenix_MKDS-1,5-2-5.08_1x02_P5.08mm_HorizontalJ1
1USB_C_Receptacle_USB2.0controller:USB_C_Receptacle_HCTL_HC-TYPE-C-16P-01AJ2
1~controller:TMC5160_BOBU3

Similar boards

  • 2 layers100 × 73.9 mmSecurity Alarm Panel, the printed circuit board in 3D

    Security Alarm Panel

    Matyas604/Security-Alarm-Panel

    Home Assistant Smart Home Alarm Control Panel with fingerprint reader, NFC/RFID card reader, motion radar, and touchscreen TFT display. It can control your smart home, not just your home security system.

    132 parts1GPL-3.0
  • 2 layers52 × 56 mmGimbal driver board, the printed circuit board in 3D

    Gimbal driver board

    PA-33/gopro-control-station

    Two-axis motorised GoPro mount with physical buttons, BLE camera control, and a built-in HTTPS web UI for live HDMI preview and gallery access. ESP32-S3 / SimpleFOC.

    71 partsMIT
  • 2 layers90 × 80 mmEsp32s3 power buck, the printed circuit board in 3D

    Esp32s3 power buck

    AlexOpanasevych/beetroot_embedded_course

    Module tasks for Beetroot Embedded course

    10 partsGPL-3.0
  • 4 layers160.4 × 76.9 mmSmartswitch board, the printed circuit board in 3D

    Smartswitch board

    Arhamee/hardware-portfolio

    Multi-layer PCB designs in KiCad 10 schematic capture to fabrication-ready Gerbers. High-speed routing, BGA escape, power electronics.

    116 partsMIT
  • 2 layers70 × 65 mmFluepdot, the printed circuit board in 3D

    Fluepdot

    Fluepke/Fluepdot

    Project for controlling Annax flipdot panels used by the Berliner Verkehrsbetriebe

    116 parts17AGPL-3.0
  • 2 layers50 × 50 mmEsp32 drone, the printed circuit board in 3D

    Esp32 drone

    saravanan-x/esp32-drone-pcb_design

    61 parts
  • 2 layers95 × 67.5 mmThrust meter, the printed circuit board in 3D

    Thrust meter

    Bigbee452/thrust-meter-pcb

    58 parts

Questions

How big is the Controller PCB?

It measures 175 × 90 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Controller use?

95 parts, built around the ESP32-S3-WROOM-1-N8, LM2596S-3.3, SI4463CDY-T1-GE3-VB and SP0504BAHTG. 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 Controller KiCad files?

From the Circuit-Digest/machine-vision-robotic-assembly-system repository on GitHub, at the commit this page was made from: the board is hardware/controller.kicad_pcb and its schematic hardware/controller.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Controller design in my own project?

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