Built by Team Pandava (Team 12) at the 2026 Embedded World North America Edge AI Hackathon, Robotics Challenge sponsored by Quilter.
Team Members:
- Deepanshu Tanwar (dtanwar@uci.edu)
- Arya Sureshbhai Patel (aryasp1@uci)
- Shubham Shailendra Kanhere (kanheres@uci.edu)
- Pranav Upadhyay (upadhyp1@uci.edu)
- Shivank Valiya (svaliya@uci.edu)
The Python files are uploaded with an _ac suffix (for arm_control) so they're easy to tell apart on this page. To run them, remove the suffix (for example, main_ac.py becomes main.py), because the files import each other by their original names.
arm_robotic/
├── esp32_firmware/ ESP32 Max V1.0 (real-time control)
│ └── main_esp.ino Servo PWM, joystick control, home pose, kill switch
│
└── arm_control/ Arduino UNO Q, Debian side (Python, fully offline)
│
├── Setup
│ ├── setup_ac.sh One-time install: venv, OpenCV, pyserial, serial/camera permissions
│ ├── cam_setup_ac.sh Locks C270 exposure and white balance for stable colours
│ ├── requirements_ac.txt Python libraries
│ └── config_ac.py Every tunable value: camera, colours, arm dimensions, step | sizes
│
├── Calibration and testing tools
│ ├── vision_server_ac.py Browser tool (port 8000): ArUco calibration, background
│ │ capture, colour readout, path preview
│ ├── vision_core_ac.py Detection helpers used by the browser tool
│ ├── cam_ac.py Camera helpers used by the browser tool
│ ├── markers_mm_ac.json Real-world positions (mm) of the 4 ArUco markers
│ └── probe_ac.py Quick camera check: resolution and frame rate
│
├── Perception
│ ├── camera_ac.py C270 capture that always returns the newest frame
│ ├── homography_ac.py Pixel <-> millimetre mapping and work-area masks
│ ├── marker_ac.py Finds the Crayola marker by colour
│ ├── path_trace_ac.py Turns the Sharpie line into ordered waypoints
│ └── obstacle_ac.py Obstacle detection (background subtraction, TFLite-ready)
│
├── Planning and control
│ ├── kinematics_ac.py Inverse kinematics and conversion to servo angles
│ ├── planner_ac.py Guarded Move: 5 mm steps with obstacle detours
│ ├── state_machine_ac.py Full task: home → find → grasp → trace → return → home
│ └── arm_link_ac.py Serial link to the ESP32 (plus a simulated arm for dry runs)
│
└── main_ac.py Entry point (python main.py, or --dry-run to simulate)
Run order on the UNO Q: setup.sh, then cam_setup.sh, then probe.py, then vision_server.py (calibrate, capture the background, check the path), then main.py --dry-run, and finally main.py
Where to look
- Instructions: how to rebuild it, from assembling the arm to setting up the UNO Q and the software.
- Build logs: our progress over the two days, including what broke and how we fixed it.
- Files: the code, the BOM and the system flowcharts.
Pranav Upadhyay