Project Plan v1

MaBell Project Plan v1: On the Bench #

Plan: MaBell Bluetooth Gateway: Project Plan Β· Previous: v0: Foundation Β· Next: v2: A low-voltage phone

✓ 0 | ↻ 0 | ⏳ 24 (24 total)

Legend: βœ… Complete | πŸ”„ In Progress | ⏳ Planned

The gateway works on the bench with stand-ins: a Bluetooth call runs end to end through a speaker and microphone, dialed with a bare rotary dial or DTMF from a phone app, and rung with an LED and an electronic ring. Status: current, the MVP.

Done when:

  • Each functional section works on the bench with stand-ins: call tones, ringing, hook, rotary detection, DTMF detection, call audio and indicators.
  • The firmware detects rotary pulses and DTMF digits, and dials the collected number over HFP.
  • Dial tone and the call-progress tones are measured against the North American frequencies and cadences, and sound authentic by ear.
  • A full call works: dial out (rotary and DTMF), ring in and answer, talk, hang up.
  • The bench build is written up: a build guide in the gateway repository, and the tone results in the project’s design docs.

Not in v1: a real phone (v2), line voltage or a real bell (v3), the circuit board (v4).


Bench Setup ⏳ #

Sub-Assembly A from the prototyping build guide, with a speaker, microphone, LEDs, buttons and a bare rotary dial as stand-ins for the phone.

  • ⏳ Order the parts: Sub-A, speaker amplifier and speaker, electret microphone, LEDs, buttons, a bare rotary dial
  • ⏳ Build Sub-A (ESP32 + PCM5100 DAC + PCM1808 ADC on I2S) and pass its test points
  • ⏳ Wire the speaker to the DAC and the microphone to the ADC
  • ⏳ Resolve the GPIO 21 clash in the firmware’s pin map (I2C SDA and an AEC line)

Call Tones ⏳ #

  • ⏳ Dial tone plays on the speaker when the hook stand-in goes off-hook
  • ⏳ Each call-progress tone measured (frequencies, cadence) against the North American values
  • ⏳ Each tone judged authentic by ear

Ringing ⏳ #

  • ⏳ An incoming Bluetooth call flashes the ring LED and plays an electronic ring on the speaker, 2s on / 4s off
  • ⏳ Going off-hook during ringing stops the ring and answers the call

Hook Detection ⏳ #

  • ⏳ A toggle switch on GPIO 32 stands in for the hook switch, debounced in firmware
  • ⏳ Hook state shows in the web interface and the event log

Rotary Dial Detection ⏳ #

  • ⏳ Firmware pulse decoder: counts loop breaks, splits digits on the inter-digit gap, debounces
  • ⏳ A bare rotary dial on GPIO 34 decodes every digit, 1 through 0

Touch-Tone (DTMF) Detection ⏳ #

  • ⏳ Firmware Goertzel DTMF detector on the ADC audio
  • ⏳ DTMF from a phone app into the microphone decodes 0–9, * and #

Dialing to a Call ⏳ #

  • ⏳ End-of-dialing timeout, then the collected number is dialed over HFP
  • ⏳ Ringback plays until the far end answers, then the call connects
  • ⏳ Digits dialed during a call are passed to the cell phone (esp_hf_client_send_dtmf)

Call Audio ⏳ #

  • ⏳ Two-way Bluetooth call audio through the speaker and microphone

Indicators ⏳ #

  • ⏳ Dial lamp LED (GPIO 27), status LED (GPIO 2), UI LED (GPIO 18)
  • ⏳ User button (GPIO 4) triggers its action

Documentation & Release ⏳ #

  • ⏳ Bench build guide in the gateway repository’s notebook (notebook/build-guides/), drawing on Sub-A, the speaker-and-microphone option and the stand-in modules in the low-voltage guide
  • ⏳ Tone results in the project’s design docs
  • ⏳ Firmware versioning set up, and the firmware tagged when v1 closes
Page last modified: November 6, 2026