Skip to content

d3vv3/open-motorcycle-intercom

Repository files navigation

OpenHelmet

OpenHelmet Logo
Open Source Mesh and Bluetooth Motorcycle Intercom
website | discord

OpenHelmet is an open-source, motorcycle intercom system designed to outperform current proprietary solutions in latency, scalability, transparency, and hackability.

Key goals

  • Open protocol and open firmware
  • Commodity, off-the-shelf hardware
  • Use any microphone and any speakers from your existing helmet setup
  • Mesh networking for 4-8+ riders
  • Real-time full-duplex voice
  • 8-16 hours of active riding per charge
  • Interoperability with legacy Bluetooth intercoms (Cardo, Sena, etc.) via standard profiles

This project explicitly avoids reverse-engineering proprietary intercom protocols. Interoperability is achieved only through standard Bluetooth audio profiles.


Why

  • Cardo/Sena mesh protocols are proprietary and closed
  • True mesh interoperability with them is impossible today
  • Voice communication requires deterministic latency, not best-effort networking

As a result, OpenHelmet is designed around custom real-time audio transport.


Roadmap

Single-MCU

  • ESP32-S3
  • TDMA mesh protocol over ESP-NOW (2.4 GHz)
  • Opus low-bitrate voice
  • Analog microphone via headphone jack
  • Speaker output via headphone jack
  • VOX for voice activation
  • Configure ESP32 tx power to 20 dBm (100 mW) for ESP-NOW
  • Silence suppression (Opus DTX) - no radio TX during silence

Dual-MCU

  • ESP32-S3 + Nordic nRF52 52840
  • TDMA mesh protocol over ESB radio with custom PHY control

    ESB runs at 250 kbps with 8 dBm TX power (OMI_ESB_BITRATE / OMI_ESB_TX_POWER_DBM).

  • SPI audio & control bridge between MCUs

    Needed to make the SPI handling to take place only in 1 core of the ESP32

  • Noise supression, echo cancellation
  • Allow user to choose between ESP-NOW and ESB

    ESP-NOW is not interoperable with nRF52' ESB.

  • Add nRF21540 RF FEM to boost range

    Validation

Triple-MCU

  • FSC-BT1026D (Qualcom QCC3034) BT5.1 audio SoC
  • Phone interop via HFP profile
  • Audio mixing for legacy intercom bridging

Custom PCB

  • PCB design with integrated audio codec and power management
  • Battery power with charging circuit
  • USB-C for firmware flashing
  • Buttons
  • Open-source manufacturing files
  • Testing on real motorcycle rides

Niceties

  • Good configuration menu buttons
  • LED status indicators
  • Channels for multiple groups

    Channels are represented as an LED color, e.g. green=1, red=2, blue=3, etc.


Transport Protocol Design

Why Not Bluetooth Mesh / BLE Audio

  • High latency
  • Unpredictable scheduling
  • Poor scaling for continuous audio

These technologies are unsuitable for real-time group voice.


Custom Mesh Strategy

Hybrid TDMA + CSMA

OpenHelmet uses a hybrid MAC design:

  • TDMA for voice frames
  • CSMA for control traffic

TDMA (Voice)

  • Fixed time slots per node
  • Deterministic latency
  • Zero collisions
  • Linear scaling with rider count

Frame structure (20 ms frame, 8 riders):

| Slot 1 | Slot 2 | Slot 3 | ... | Slot 8 | Control | Guard |
|  2 ms  |  2 ms  |  2 ms  | ... |  2 ms  |   2 ms  |  2 ms |
  • Voice slots: 8 × 2 ms = 16 ms
  • Control window: 2 ms (CSMA for join/leave/sync)
  • Guard time: 2 ms (absorbs clock drift)

Motorcycle groups are small and topology changes slowly, making TDMA practical.

CSMA (Control)

Used for:

  • Joining/leaving the group
  • Topology updates
  • Slot renegotiation

Quick Start

Prerequisites

Build

# Activate ESP-IDF environment
source ~/esp/esp-idf/export.sh

# Build firmware
idf.py build

Flash

# Find your serial port
ls /dev/ttyACM* /dev/ttyUSB*

# Flash firmware (replace PORT with your device)
idf.py -p /dev/ttyACM0 flash

Monitor Serial Output

# Option 1: Using idf.py (interactive, requires TTY)
idf.py -p /dev/ttyACM0 monitor

# Option 2: Using stty + cat (non-interactive)
stty -F /dev/ttyACM0 115200 raw -echo && cat /dev/ttyACM0

Exit monitor: Ctrl+]

Expected Boot Log

I (xxx) omi: ========================================
I (xxx) omi: OMI - Open Motorcycle Intercom
I (xxx) omi: Boot time: 0 ms
I (xxx) omi: Opus version: libopus x.x.x
I (xxx) omi: Free heap: 275432 bytes
I (xxx) omi: ========================================
I (xxx) audio: Initializing audio subsystem
I (xxx) audio: Audio task heartbeat: loops=0, encoded=0, decoded=0

Troubleshooting

Issue Solution
Device not found Use a data cable (not charge-only), try different USB port
Garbage characters in monitor Wrong baud rate, use 115200

About

Open Source implementation for motorcycle intercoms. The cheapest way into mesh intercoms.

Topics

Resources

License

Stars

18 stars

Watchers

1 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors