Skip to the content
2 layers31 × 46.5 mmVibro Band, the printed circuit board in 3D

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

1

README

README.md

Haptics-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

bash
git clone https://github.com/connormmckelvey/Haptics-FRI
cd Haptics-FRI

2. Firmware setup (PlatformIO)

The firmware project is configured in firmware/platformio.ini for seeed_xiao_esp32c3.

From the firmware directory:

bash
platformio run
platformio run --target upload
platformio device monitor -b 115200

Notes:

  • 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:

bash
pip install pyserial
python firmware/tools/test_send_mtr_cmd.py

For vision prototype (software/Pose.py):

bash
pip install opencv-python numpy tensorflow tensorflow-hub
python software/Pose.py

Engineering 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

  1. Promote band firmware into an actively built PlatformIO target.
  2. Add requirements files for reproducible Python environments.
  3. Implement serial output from software/Pose.py into the 4-byte dongle protocol.
  4. 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
QtyValueFootprintReferences
1Conn_01x04_SocketConnector_PinSocket_2.54mm:PinSocket_1x04_P2.54mm_HorizontalJ1
1Conn_01x06_SocketConnector_PinSocket_2.54mm:PinSocket_1x06_P2.54mm_HorizontalJ2
1Conn_01x08_SocketConnector_PinSocket_2.54mm:PinSocket_1x08_P2.54mm_HorizontalJ3
1SW_SPDTButton_Switch_THT:SW_Slide_SPDT_Angled_CK_OS102011MA1QSW1
1ULN2003APackage_DIP:DIP-16_W7.62mmU1
1XIAO-ESP32-C3-SMDSeeed:XIAO-ESP32-C3-SMDU3

Similar boards

  • 2 layers107 × 54 mmInterface board 1, the printed circuit board in 3D

    Interface board 1

    Green-bms/SmartBMS

    Open source Smart Battery Management System

    63 parts756
  • 4 layers93.3 × 60.3 mmArduino 386EX V5, the printed circuit board in 3D

    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 mmArduino motorfocus, the printed circuit board in 3D

    Arduino motorfocus

    fehlfarbe/arduino-motorfocus

    Arduino motorfocus with moonlite protocol for telescopes

    23 parts58MIT
  • 4 layers199.9 × 69.3 mmZaphod controller, the printed circuit board in 3D

    Zaphod controller

    Scottapotamas/zaphod-bot

    A DIY high performance delta-bot for fun, and lightpainting...

    251 parts53
  • 4 layers285.1 × 48.1 mmAyab esp32, the printed circuit board in 3D

    Ayab esp32

    AllYarnsAreBeautiful/ayab-hardware

    Contains the schematics and layouts for the AYAB Arduino shield

    246 parts50CC-BY-SA-4.0
  • 2 layersDrehorgel20, the printed circuit board in 3D

    Drehorgel20

    bixb922/crank-organ

    MIDI based crank organ software and hardware

    14 parts47MIT
  • 2 layers40 × 80 mmSplitflappcb, the printed circuit board in 3D

    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 mmAudio board 0033 rev.a, the printed circuit board in 3D

    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.