Skip to the content
2 layers100 × 100 mmFood Dispenser Control, the printed circuit board in 3D

Food Dispenser Control

RiceMiceA/ECE_445

For Sp26 ECE445 Project - Griffin, Jackson, Tony

Size
100 × 100 mm
Copper layers
2
Thickness
1.6 mm
Parts
63
Nets
86
Pads
275
Tracks, vias
432, 169
Pours
2
Routed
Yes
KiCad
KiCad 9.0 (file 20241229)
Created
24 Feb 2026
Updated
8 May 2026

Overview

Food Dispenser Control is an open-source printed circuit board by RiceMiceA, from the RiceMiceA/ECE_445 repository on GitHub. It is a 2-layer board of 100 × 100 mm with 63 parts on 86 nets, routed with 432 tracks and 169 vias.

It is built around the ESP32-S3-WROOM-1-N8, DRV8833PW and HX711, with the AP2112K-3.3 among its other parts. Its parts include 21 capacitors, 19 resistors, 10 connectors, 7 ICs and 4 switches. It belongs with the ESP32 boards of this library.

Main components

4

README

README.md

NuChefTM - AI Culinary Assistant

Table of Contents

  1. Final Product
  2. How to use our repo?
  3. Third-Party Libraries & Licenses

1. Final Product

Photos

alt text alt text

YouTube Demo

NuChef Demo

2. How to use our repo?

2.1 Init

Freshly Clone 1st time
bash
git clone --recurse-submodules <repo-url>

This does everything:

  • clones the parent repo
  • initializes submodules
  • checks out the correct commits
Already cloned repo
bash
git submodule update --init --recursive

2.2 Managing the submodule Unity folder

2.2.1 Before Work/Update
In parent folder
bash
git pull
git submodule update --init --recursive
2.2.2 Post-work
bash
cd path/to/submodule
git checkout main
git pull origin main
git add .
git commit -m "Update submodule"
git push origin main

cd /path/to/parent-repo
git add Software/src/Unity-PassthroughCameraApiSamples
git commit -m "Bump submodule"
git push origin main

Verify Health

bash
git submodule status

Tip

bash
git config --global submodule.recurse true
# if we wanna track the specific branch
git submodule set-branch --branch tony Software/src/Unity-PassthroughCameraApiSamples
git submodule update --remote

3. Network Configuration

Kill previous run

bash
kill $(lsof -t -i:8000) 

Update IP Address before operation

bash
Check the current ip address: 

When switching networks, update the backend IP (192.168.x.x) in these files:

Note: The ESP32 now communicates via BLE (not WiFi), so it no longer needs an IP address or network config.

Then start the backend and BLE bridge:

bash
# Terminal 1 — backend
cd Software/src/web_app
source .env   # loads OPENAI_API_KEY, OPENAI_MODEL, USE_LLM_PLANNER from .env file
uvicorn backend:app --host 0.0.0.0 --port 8000 --reload

# Terminal 2 — BLE bridge (connects to ESP32 over Bluetooth, forwards to backend)
pip install bleak httpx   # first time only
python ble_bridge.py

4. Troubleshooting

Upload new ESP32 file

bash
~/.platformio/penv/bin/pio run 2>&1 | tail -20

ESP32 BLE not broadcasting / bridge can't find device

  1. Press the physical RESET button on the ESP32-S3 board. It will re-advertise as NuChef-Dispenser within a few seconds.
  2. If the bridge still can't find it, kill and restart ble_bridge.py. Linux's BlueZ stack sometimes caches stale BLE data.
  3. As a last resort, power-cycle the ESP32 (unplug & replug USB).

Serial port changed (/dev/ttyACM0 ↔ /dev/ttyACM1)

After a reset or replug the port may shift. Check with:

bash
ls /dev/ttyACM*

Then update upload_port and monitor_port in Software/src/esp_driver/platformio.ini if you need to re-flash.

Permission denied on /dev/ttyACM*

bash
sudo usermod -aG dialout $USER
# then log out & back in (or reboot) for the group to take effect

Bridge connects but dispense doesn't trigger from the UI

  • Make sure the backend (uvicorn) and ble_bridge.py are both running.
  • Verify BACKEND_URL in script.js is window.location.origin (not a hardcoded IP).
  • Check the bridge terminal for BLE CMD → and write OK logs when you click Dispense.

Quick sanity check (motor spin from CLI)

bash
# Direct BLE test — bypasses the backend entirely
python3 -c "
import asyncio
from bleak import BleakClient, BleakScanner
SVC  = '4e7a9b1c-d203-4e2a-b8f1-67c1d9e3f5a0'
CMD  = '4e7a9b1c-d203-4e2a-b8f1-67c1d9e3f5a1'
async def test():
    dev = await BleakScanner.find_device_by_name('NuChef-Dispenser', timeout=10)
    async with BleakClient(dev) as c:
        await c.write_gatt_char(CMD, b'spin', response=True)
        await asyncio.sleep(5)
        await c.write_gatt_char(CMD, b'stop', response=True)
asyncio.run(test())
"

5. Third-Party Libraries & Licenses

Unity Utility Packages (MIT)

Meta Quest, "Unity-UtilityPackages," GitHub. [Online]. Available: https://github.com/meta-quest/Unity-UtilityPackages. [Accessed: May 7, 2026].

MIT License attribution:

text
Unity Utility Packages
Copyright (c) Meta Platforms, Inc. and affiliates.
Licensed under the MIT License.
https://github.com/meta-quest/Unity-UtilityPackages

Parts

63
QtyValueFootprintReferences
90.1uFCapacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolderC8, C11, C13, C16, C18, C19, C21, C23, C25
610KOhmsResistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR15, R22, R25, R26, R29, R30
610uFCapacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolderC3, C12, C17, C20, C24, C26
32.2uFCapacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolderC10, C15, C22
3200OhmsResistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR14, R21, R24
322OhmsResistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR1, R27, R28
3DRV8833PWPackage_SO:TSSOP-16_4.4x5mm_P0.65mmU5, U6, U8
3Motor OutputTerminalBlock_Phoenix:TerminalBlock_Phoenix_MKDS-1,5-4_1x04_P5.00mm_HorizontalJ1, J8, J9
3SW_PushButton_Switch_THT:SW_PUSH_6mm_H5mmSW1, SW2, SW6
2100KOhmsResistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR6, R10
21uFCapacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolderC1, C5
25.1kohmsResistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR19, R20
2Conn_01x01TestPoint:TestPoint_Pad_D1.5mmJ5, J6
2LEDLED_SMD:LED_0805_2012Metric_Pad1.15x1.40mm_HandSolderD1, D3
10.1OhmsResistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR23
14.7uFCapacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolderC14
168ohmsResistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR2
1800OhmsResistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR3
1AP2112K-3.3Package_TO_SOT_SMD:SOT-23-5U2
1Conn_01x02_PinTerminalBlock_Phoenix:TerminalBlock_Phoenix_MKDS-1,5-2_1x02_P5.00mm_HorizontalJ3
1Conn_01x03_PinTerminalBlock_Phoenix:TerminalBlock_Phoenix_MKDS-1,5-3_1x03_P5.00mm_HorizontalJ10
1Conn_01x04_PinTerminalBlock_Phoenix:TerminalBlock_Phoenix_MKDS-1,5-4_1x04_P5.00mm_HorizontalJ7
1Conn_01x07_PinTerminalBlock_Phoenix:TerminalBlock_Phoenix_MKDS-1,5-7_1x07_P5.00mm_HorizontalJ4
1ESP32-S3-WROOM-1PCM_Espressif:ESP32-S3-WROOM-1U9
1HX711Package_SO:SOP-16_3.9x9.9mm_P1.27mmU7
1MCP73831-2-OTPackage_TO_SOT_SMD:SOT-23-5U1
1SW_SPSTButton_Switch_THT:SW_DIP_SPSTx01_Slide_6.7x4.1mm_W7.62mm_P2.54mm_LowProfileSW3
1USB_C_Receptacle_USB2.0_16PConnector_USB:USB_C_Receptacle_GCT_USB4105-xx-A_16P_TopMnt_HorizontalJ2

More from RiceMiceA/ECE_445

1
  • 2 layersIR Sensor, the printed circuit board in 3D

    IR Sensor

    RiceMiceA/ECE_445

    For Sp26 ECE445 Project - Griffin, Jackson, Tony

    12 parts

Similar boards

  • 2 layersSaltOMeter, the printed circuit board in 3D

    SaltOMeter

    basil-squared/SaltOMeter

    a device that makes salty magic players saltier

    45 parts
  • 2 layers133.1 × 90 mmQuiz master v3, the printed circuit board in 3D

    Quiz master v3

    tjmcguire95/Sensor-scales

    KiCad and Arduino files for my sensor scales project

    73 parts
  • 4 layers55 × 35 mmCAPE B-1, the printed circuit board in 3D

    CAPE B-1

    Stab-Rabbit-coding/Serenity-UAV

    A functional, security conscious, Unmanned Aerial Vehicle based on the Firefly Class spacecraft Serenity from the 2002 show..

    33 parts1CERN-OHL-W-2.0
  • 4 layers102 × 100 mmZelvicka, the printed circuit board in 3D

    Zelvicka

    RoboticsBrno/Robutek

    Robůtek je robotická platforma založená na čipu ESP32-S3. Je velice rozšitiřelný, ale ze základu umí jezdit, kreslit fixou, jezdit po čáře, pohybovat se bludištěm. Programování je přes Jaculus.

    214 parts12
  • 2 layers60 × 50 mmRove sv, the printed circuit board in 3D

    Rove sv

    crzhacko/rove-esp32s3

    ROVE — ESP32-S3 voice-controlled RC car platform (monorepo: firmware + electronics)

    27 parts
  • 4 layers100 × 74 mmMission board, the printed circuit board in 3D

    Mission board

    tmb5932/fixed-wing-drone

    The basics needed to allow a RC plane to be turned autonomous on signal.

    128 parts
  • 2 layers30 × 50 mmMINI. ESP S3, the printed circuit board in 3D

    MINI. ESP S3

    electromotif208/pcb-portfolio

    👨‍💻 Electronics Engineer 📺 YouTube: ELECTROMOTIF 🔧 Tools: KiCad, EasyEDA 📡 Domains: Power Supply, ESP32, IoT, Embedded Hardware

    13 parts
  • 2 layers70 × 50 mmAT01 no ftdi, the printed circuit board in 3D

    AT01 no ftdi

    hshahzada/automated-tourniquet

    2023/2024 Capstone Design Project for Biomedical Engineering

    50 parts

Questions

How big is the Food Dispenser Control PCB?

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

What parts does the Food Dispenser Control use?

63 parts, built around the ESP32-S3-WROOM-1-N8, DRV8833PW, HX711 and AP2112K-3.3. 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 Food Dispenser Control KiCad files?

From the RiceMiceA/ECE_445 repository on GitHub, at the commit this page was made from: the board is Hardware/Food_Dispenser_Control/Food_Dispenser_Control.kicad_pcb and its schematic Hardware/Food_Dispenser_Control/Food_Dispenser_Control.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Food Dispenser Control design in my own project?

Its repository states no licence, so its author keeps all rights: ask RiceMiceA before reusing the design.