

A low cost, vibrotactile band and computer vision system to train large motor skills and provide haptic feedback for robotic teleoperation.
- Size
- 31 × 46.5 mm
- Copper layers
- 2
- Thickness
- 1.6 mm
- Parts
- 6
- Nets
- 32
- Pads
- 61
- Tracks, vias
- 98, 9
- Routed
- Yes
- KiCad
- KiCad 9.0 (file 20241229)
- Created
- 23 Mar 2026
- Updated
- 2 May 2026
Overview
Vibro Band is an open-source printed circuit board by connormmckelvey, from the connormmckelvey/TACTUS-Medical-Robotics-FRI-Project repository on GitHub. It is a 2-layer board of 31 × 46.5 mm with 6 parts on 32 nets, routed with 98 tracks and 9 vias.
It is built around the ULN2003A. Its parts include 3 connectors, 2 ICs and 1 switch. It belongs with the robots and motor control boards and the ESP32 and RISC-V boards of this library.
Main components
1README
README.mdHaptics-FRI
Haptics-FRI is a wearable vibrotactile feedback system developed in the UT Austin Human Enabled Robotics Lab (HERL) for the Freshman Research Initiative (FRI) stream. The project explores how lightweight haptic cues can support motor learning and robotic teleoperation.
At a system level, a host computer sends motor activation commands to a USB dongle, the dongle relays those commands over ESP-NOW to a wearable band, and the band drives four vibration motors after remapping commands based on wrist orientation from an IMU.
Project Goals
- Build a low-latency, wireless haptic communication loop
- Provide intuitive directional feedback using a 4-motor wearable band
- Keep feedback aligned to the user's physical orientation using IMU-based remapping
- Support rapid prototyping from both embedded firmware and host-side Python tools
System Architecture
PC -> USB Serial -> Dongle (ESP32-C3) -> ESP-NOW -> Band (ESP32-C3 + MPU6050 + motor driver) -> 4 haptic motors
Repository Structure
- firmware/: PlatformIO project for embedded firmware, protocol types, and test tooling
- firmware/src/dongle.cpp: Active dongle firmware (serial-to-ESP-NOW bridge)
- firmware/excluded_src/band.cpp: Band firmware (IMU-aware motor remapping and motor control)
- firmware/include/packet_types.h: Shared packet and IMU data structures
- firmware/tools/test_send_mtr_cmd.py: Python utility that sends random 4-byte motor packets
- masterpod_pcb_kicad/: KiCad design files and Gerber outputs for the wearable board
- software/Pose.py: MoveNet-based wrist tracking prototype for vision-driven haptic logic
- software/how_to_send_mtr_cmds.md: Serial packet protocol reference for host applications
Hardware and Firmware
Hardware
- 2x Seeed XIAO ESP32-C3 (dongle and band)
- MPU6050 IMU on band
- ULN2003A motor driver
- 4 haptic motors arranged as top/right/bottom/left
- External antenna recommended for reliable ESP-NOW range
Firmware Responsibilities
-
Dongle firmware:
- Reads raw 4-byte motor commands from USB serial at 115200 baud
- Forwards commands to the band via ESP-NOW
- Tracks send success/failure on serial logs
-
Band firmware:
- Receives motor commands over ESP-NOW
- Reads IMU orientation
- Remaps motor indices to preserve directional meaning relative to wrist orientation
- Drives motor output pins
Packet Format
Each command is exactly 4 bytes:
- Byte 0: top motor
- Byte 1: right motor
- Byte 2: bottom motor
- Byte 3: left motor
Each byte is 0 (off) or 1 (on).
Software Components
Host Command Interface
- software/how_to_send_mtr_cmds.md documents the serial protocol
- firmware/tools/test_send_mtr_cmd.py provides a quick motor-command generator for validation
Computer Vision Prototype
- software/Pose.py runs MoveNet (TensorFlow Hub) on webcam frames
- Detects wrist keypoints and demonstrates where haptic feedback logic can plug in
- Current feedback hook prints decisions; it is not yet wired to serial transmission
Getting Started
1. Clone the repository
git clone https://github.com/connormmckelvey/Haptics-FRI
cd Haptics-FRI2. Firmware setup (PlatformIO)
The firmware project is configured in firmware/platformio.ini for seeed_xiao_esp32c3.
From the firmware directory:
platformio run
platformio run --target upload
platformio device monitor -b 115200Notes:
- The active source in firmware/src is the dongle firmware.
- Band firmware currently lives in firmware/excluded_src/band.cpp and is not in the default build path.
- Ensure dongle and band use the same ESP-NOW channel.
- Update the hardcoded band MAC address in firmware/src/dongle.cpp when changing hardware.
3. Python tooling setup
For motor command testing:
pip install pyserial
python firmware/tools/test_send_mtr_cmd.pyFor vision prototype (software/Pose.py):
pip install opencv-python numpy tensorflow tensorflow-hub
python software/Pose.pyEngineering Notes
- IMU calibration is performed at band startup; keep the device still during calibration.
- The serial command path uses raw bytes without framing, acknowledgements, or checksums.
- If packets stop midway, dongle firmware resets partial serial reads after a short timeout.
Current Status and Known Gaps
- Root-level documentation is now expanded, but some subsystem docs are still in-progress.
- software/cv_docs.md is currently empty.
- Pose-to-haptics closed-loop integration is not complete yet.
- Band firmware is stored under excluded_src and may need project reconfiguration for direct builds.
Suggested Next Milestones
- Promote band firmware into an actively built PlatformIO target.
- Add requirements files for reproducible Python environments.
- Implement serial output from software/Pose.py into the 4-byte dongle protocol.
- Add repeatable validation tests for motor mapping and IMU remapping behavior.
Acknowledgment
This project was created in the UT Austin Freshman Research Initiative within the Human Enabled Robotics Lab (HERL), with the goal of combining embedded systems, wearable haptics, and human-robot interaction research.
Parts
6| Qty | Value | Footprint | References |
|---|---|---|---|
| 1 | Conn_01x04_Socket | Connector_PinSocket_2.54mm:PinSocket_1x04_P2.54mm_Horizontal | J1 |
| 1 | Conn_01x06_Socket | Connector_PinSocket_2.54mm:PinSocket_1x06_P2.54mm_Horizontal | J2 |
| 1 | Conn_01x08_Socket | Connector_PinSocket_2.54mm:PinSocket_1x08_P2.54mm_Horizontal | J3 |
| 1 | SW_SPDT | Button_Switch_THT:SW_Slide_SPDT_Angled_CK_OS102011MA1Q | SW1 |
| 1 | ULN2003A | Package_DIP:DIP-16_W7.62mm | U1 |
| 1 | XIAO-ESP32-C3-SMD | Seeed:XIAO-ESP32-C3-SMD | U3 |
Similar boards
- 2 layers107 × 54 mm

- 4 layers93.3 × 60.3 mm

Arduino 386EX V5
dbalsom/arduinoX86
An interface between an Arduino Due or Arduino GIGA and 8088, 8086, V20, V30, 186 or 286 CPUs
56 parts114 - 2 layers52 × 61 mm

Arduino motorfocus
fehlfarbe/arduino-motorfocus
Arduino motorfocus with moonlite protocol for telescopes
23 parts58MIT - 4 layers199.9 × 69.3 mm

Zaphod controller
Scottapotamas/zaphod-bot
A DIY high performance delta-bot for fun, and lightpainting...
251 parts53 - 4 layers285.1 × 48.1 mm

Ayab esp32
AllYarnsAreBeautiful/ayab-hardware
Contains the schematics and layouts for the AYAB Arduino shield
246 parts50CC-BY-SA-4.0 - 2 layers

- 2 layers40 × 80 mm

Splitflappcb
codingcatgirl/split-flap-fae-pcb
Alternative drop-in replacement PCB for David Kingsman's split-flap display
46 parts31Apache-2.0 - 2 layers177.9 × 187.4 mm

Audio board 0033 rev.a
palazzol/CyberamicControlCenter
Repo for docs and info about the Cyberamic Control Center
105 parts16
Questions
How big is the Vibro Band PCB?
It measures 31 × 46.5 mm and has 2 copper layers, 1.6 mm thick.
What parts does the Vibro Band use?
6 parts, built around the ULN2003A. 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 Vibro Band KiCad files?
From the connormmckelvey/TACTUS-Medical-Robotics-FRI-Project repository on GitHub, at the commit this page was made from: the board is masterpod_pcb_kicad/Vibro_Band.kicad_pcb and its schematic masterpod_pcb_kicad/Vibro_Band.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Can I use the Vibro Band design in my own project?
Its repository states no licence, so its author keeps all rights: ask connormmckelvey before reusing the design.