
Recorder
akiihito/expresslrs_realtime_recorder
USB Gamepad to ExpressLRS adapter using Raspberry Pi Pico

I took an old pay phone from the 2000's and replaced the brains with a raspberry pi and some arduinos.
Phonev6 is an open-source printed circuit board by kmatzen, from the kmatzen/millennium repository on GitHub, published under the MIT licence. It is a 4-layer board of 81 × 114 mm with 64 parts on 127 nets, routed with 638 tracks and 87 vias.
It is built around the TDA2822M/TR, P6KE6.8CA and AO3401A. Its parts include 20 capacitors, 15 resistors, 10 diodes, 7 connectors and 2 ICs.
This directory contains the PCB design files created with KiCad.
make verify guardrail suite (netlist sync, footprint
parity, pinout and footprint checks, ERC, DRC) that must be all-green before
ordering. This is the revision currently installed in the phone.The TDA2822M is a dual low-voltage audio power amplifier in a DIP-8 package (same footprint as the LM386 it replaces). It provides two independent amplified channels, solving both the speaker coupling and quiet handset issues.
USB audio card (stereo 3.5mm)
├─ Left channel → J7 tip → C_inA → TDA2822 IN_A (pin 3)
│ → OUT_A (pin 1) → C_outA → speaker_front+ → ringer
│
└─ Right channel → J7 ring → C_inB → TDA2822 IN_B (pin 4)
→ OUT_B (pin 5) → C_outB → speaker_receiver+ → J4 RJ9 → handsetEach channel has its own input coupling capacitor (100nF) and output coupling capacitor (100µF). The channels are electrically isolated inside the TDA2822M, eliminating the crosstalk present in the v4 LM386 design.
| Pin | Function | Net |
|---|---|---|
| 1 | OUT_A | → C_outA → speaker_front+ |
| 2 | GND | gnd |
| 3 | IN_A | speaker_front_pre+ via C_inA |
| 4 | IN_B | speaker_receiver_pre+ via C_inB |
| 5 | OUT_B | → C_outB → speaker_receiver+ |
| 6 | V+ | 5V_MAIN |
| 7 | RIPPLE | → C_ripple (4.7µF) to GND |
| 8 | NC | Not connected |
| Ref | Value | Purpose |
|---|---|---|
| C_inA | 100nF | Input coupling, channel A (ringer) |
| C_inB | 100nF | Input coupling, channel B (handset) |
| C_outA | 100µF 16V | Output coupling, channel A (ringer) |
| C_outB | 100µF 16V | Output coupling, channel B (handset) |
| C_vcc | 100µF 16V | Vcc bypass |
| C_ripple | 4.7µF | Ripple rejection (pin 7) |
| C_dec | 100nF | Vcc decoupling |
| Ref | Value / Part | Qty | Footprint | Notes |
|---|---|---|---|---|
| A1 | Arduino Micro (keypad) | 1 | Socket headers | Millennium Alpha board |
| A2 | Arduino Micro (display) | 1 | Socket headers | Millennium Beta board |
| A3 | Raspberry Pi Zero WH | 1 | ADA3708 footprint | Adafruit ADA3708 |
| U1 | XL6009 boost converter | 1 | Module | 12V output (from 5V input), coin validator supply |
| U2 | TDA2822M | 1 | DIP-8 | Dual audio amplifier |
| R1 | 4.7kΩ resistor | 1 | Axial | I2C pull-up (SDA) |
| R2 | 4.7kΩ resistor | 1 | Axial | I2C pull-up (SCL) |
| R3 | 1kΩ resistor | 1 | Axial | Power LED current limit |
| C_inA | 100nF ceramic | 1 | Axial L3.8mm THT | TDA2822 ch A input coupling |
| C_inB | 100nF ceramic | 1 | Axial L3.8mm THT | TDA2822 ch B input coupling |
| C_outA | 100µF 16V electrolytic | 1 | Radial D8mm P3.8mm | TDA2822 ch A output coupling |
| C_outB | 100µF 16V electrolytic | 1 | Radial D8mm P3.8mm | TDA2822 ch B output coupling |
| C_vcc | 100µF 16V electrolytic | 1 | Radial D8mm P3.8mm | TDA2822 Vcc bypass |
| C_ripple | 4.7µF electrolytic | 1 | Radial D5mm P2.0mm | TDA2822 ripple rejection |
| C_dec | 100nF ceramic | 1 | Axial L3.8mm THT | TDA2822 Vcc decoupling |
| C-* | 100nF ceramic | 5 | Axial L3.8mm THT | Decoupling (see below) |
| D1–D3 | P6KE6.8CA | 3 | DO-15 (THT axial) | TVS clamp signal lines to GND (600W bidirectional) |
| Q1 | AO3401A P-ch MOSFET | 1 | SOT-23 (SMD, JLCPCB basic C15127) | Reverse polarity protection |
| F1 | 1A PTC fuse | 1 | Radial D10mm THT | Resettable overcurrent fuse |
| D4 | Red LED (0603, C2286 basic) | 1 | LED_0603 SMD | Power indicator |
| J1 | Coin validator | 1 | 2x5 pin header | 10-pin IDC |
| J2 | Keypad | 1 | 2x10 pin header | 20-pin IDC |
| J3 | VFD display | 1 | 2x13 pin header | 26-pin IDC |
| J4 | Handset (RJ9) | 1 | RJ9 jack | 4P4C handset connector |
| J5 | Microphone | 1 | 3.5mm stereo jack | Handset mic input |
| J6 | Card reader | 1 | 2x7 pin header | 14-pin for magstripe reader |
| J7 | Speaker | 1 | 3.5mm stereo jack | Stereo audio from USB card |
| TP1–5 | Test points | 5 | Through-hole loop D2.5mm | 5V_MAIN, Pi 3.3V, GND, SDA, SCL (see Test Points section) |
| Ref | Location |
|---|---|
| C-arduino1 | Near keypad Arduino |
| C-arduino-display1 | Near display Arduino |
| C-raspi1 | Near Raspberry Pi |
| C-coin1 | Near coin connector |
| C-card1 | Near card reader |
A P-channel MOSFET (AO3401A, SOT-23 SMD; JLCPCB basic C15127) on the incoming 5V rail protects against accidental reverse-polarity connections. Q1 is placed on the power input before distribution and before feeding U1 IN+. The MOSFET's body diode conducts during normal operation with near-zero voltage drop, and blocks current when polarity is reversed.
Three P6KE6.8CA TVS diodes (600W bidirectional, THT DO-15) protect signal lines from ESD and transients. Each clamps between the protected signal and GND—one pin to signal, one to GND. D1 protects J4 (handset); D2 protects speaker_front+ (ringer output from TDA2822); D3 protects the third signal line. These protect against back-EMF and ESD on external connectors.
A 1A resettable PTC fuse (F1) is placed on the incoming 5V rail, in series with Q1, before power distribution and before U1. It protects the entire board (including the boost converter input) from downstream shorts. The fuse self-resets when the fault is cleared.
A red LED on the 5V_MAIN rail provides visual confirmation that the board is powered, useful when debugging inside the payphone enclosure.
The coin validator is powered from the 12V_COIN rail (U1 output). The PCB routes SoftwareSerial (600 baud) from the display Arduino pins 14 (RX) and 23 (TX), plus a reset line from pin 15. See the coin validator documentation for the serial protocol.
Routes to the keypad Arduino's row pins (6–9) and column pins (10–13, 18–20),
plus the hook switch pins (4, 5, 21). See Arduino/PINOUT.md for the complete
mapping.
8-bit parallel data bus (D0–D7) plus control signals (WR, AD, RD, CS, TEST,
RESET) routed from the display Arduino. See Arduino/PINOUT.md for the pin-
to-VFD-pin mapping with wire colors.
| Pin | Signal |
|---|---|
| 1 | mic+ |
| 2 | speaker_receiver+ |
| 3 | gnd |
| 4 | gnd |
MagStripe reader connections routed to the keypad Arduino: CLS (pin 22), RDT/data (pin 0), RCL/clock (pin 1).
| Contact | Signal | Destination |
|---|---|---|
| Tip | speaker_receiver_pre+ | → TDA2822 ch B → handset |
| Ring | speaker_front_pre+ | → TDA2822 ch A → ringer |
| Sleeve | gnd | Ground |
The two Arduinos communicate over I2C (SDA/SCL). The PCB provides 4.7kΩ pull-up resistors (R1, R2) to 5V on both lines — the standard recommended value for 100kHz I2C.
The board is powered from an external 5V supply. Power flows as follows:
Incoming 5V enters the board and passes through:
5V_MAIN rail (after Q1 and F1) distributes to:
12V_COIN rail: U1 (XL6009) boosts 5V → 12V. XL6009 pins: IN+ = 5V_MAIN, IN- = GND, OUT- = GND, OUT+ = 12V_COIN. The 12V_COIN rail powers the coin validator only (J1). Nothing else on the board uses 12V.
| Label | Signal | Purpose |
|---|---|---|
| TP1 | 5V_MAIN | Main 5V power rail |
| TP2 | 3.3V | Pi's 3.3V output (if accessible) |
| TP3 | GND | Ground reference |
| TP4 | SDA | I2C data (Arduino ↔ Arduino) |
| TP5 | SCL | I2C clock |
| TP6 | 12V_COIN | Boosted 12V rail for coin validator |
Note on USB connectivity: Arduino ↔ Pi communication is via USB through an external hub. There are no discrete USB serial TX/RX nets on the PCB; TP6 and TP7 in older docs referred to USB serial, but that path does not exist as PCB nets. Only the test points above (5V_MAIN, GND, 12V_COIN, I2C) are actual PCB nets.
Run python3 audit_schematic.py to check component/BOM alignment, net labels, and documentation consistency. See AUDIT.md for findings and action items.
| File | Description |
|---|---|
phonev6.kicad_pro | KiCad project file |
phonev6.kicad_sch | Schematic (updated with TDA2822M) |
phonev6.kicad_pcb | PCB layout (needs re-layout for new parts) |
phonev6.kicad_prl | KiCad preferences (local) |
phonev6.csv | Bill of materials (updated) |
phone.kicad_sym | Custom symbol library (xl6009, TDA2822M, P6KE6.8CA) |
footprints.pretty/ | Project footprint lib (F1: Fuse_Radial_D10.0mm_P5.00mm) |
fp-lib-table | Footprint library table (includes project footprints) |
jlcpcb/production_files/ | Gerbers zip, BOM, CPL (JLCPCB upload) |
audit_schematic.py | Python script to audit schematic vs BOM vs README |
AUDIT.md | Audit findings and action items |
SCHEMATIC_D2_CHANGES.md | TVS diode wiring (D1, D2, D3 P6KE6.8CA) and net reference |
See JLCPCB_WORKFLOW.md for fabrication steps.
Quick summary:
./pcb/scripts/export_jlcpcb.sh to generate jlcpcb/production_files/GERBER-phonev6.zipjlcpcb/production_files/ to JLCPCBThe schematic file has been updated with the TDA2822M symbol and updated component values. The following wiring changes need to be completed in KiCad's schematic editor:
J7 pin 1 (tip): Change net from speaker_receiver+ to
speaker_receiver_pre+. This is the pre-amplified handset signal that
now feeds into the TDA2822 channel B input.
TDA2822 IN_A (pin 3): Connect to speaker_front_pre+ via input
coupling cap C_inA.
TDA2822 IN_B (pin 4): Connect to speaker_receiver_pre+ via input
coupling cap C_inB.
TDA2822 OUT_A (pin 1): Connect via output coupling cap C_outA to
speaker_front+ (ringer speaker).
TDA2822 OUT_B (pin 5): Connect via output coupling cap C_outB to
speaker_receiver+ (handset earpiece via J4).
TDA2822 GND (pin 2): Connect to gnd.
TDA2822 V+ (pin 6): Connect to 5V_MAIN via C_vcc and C_dec bypass caps.
TDA2822 RIPPLE (pin 7): Connect via C_ripple (4.7µF) to gnd.
Q1 (reverse polarity): Place on the incoming 5V rail before distribution and before U1. Source to incoming 5V, drain to 5V_MAIN bus, gate to source (or appropriate pull-down for PMOS). Protects the entire board including U1 input.
F1 (fuse): Insert in series on the incoming 5V rail, before Q1 or between Q1 drain and 5V_MAIN distribution. Protects the 5V supply and boost converter input from overcurrent.
D1, D2, D3 (TVS): P6KE6.8CA bidirectional TVS. Each: pin 1 → GND, pin 2 → protected signal (e.g. speaker_receiver+, speaker_front+, or other external signal). Protects signal lines, not power.
D4 + R3: Connect from 5V_MAIN through R3 (1kΩ) through D4 to GND.
Add test point symbols connected to: 5V_MAIN, 3.3V, GND, SDA, SCL, 12V_COIN. Do not add TX/RX test points for USB serial; Arduino ↔ Pi communication uses USB through an external hub, so there are no discrete USB serial nets on the PCB.
Speaker output coupling (#42) — Fixed: TDA2822M provides fully
isolated dual channels. No more crosstalk between handset and ringer.
Handset earpiece too quiet (#44) — Fixed: Both channels are now
amplified by the TDA2822M. The handset earpiece is no longer driven at
unamplified line level.
The phonev6 schematic, layout, and generated BOM are the fabricated as-built revision. Its migration is intentionally mixed technology: protection and support parts moved to SMD while U2 remains the verified DIP-8 TDA2822M. The layout is not pending; only the GPIO27 reset bodge in Known PCB Errata remains for a future revision.
ALSA config update: The ALSA softvol max_dB setting in
host/asoundrc.example may need adjustment since the TDA2822M provides
hardware amplification. Software gain can likely be reduced.
Gain tuning: The TDA2822M's default gain may need adjustment for comfortable volume. If too loud, input attenuation resistors can be added. If too quiet, the coupling cap values can be increased.
Mounting holes: Consider adding M3 mounting holes at board corners for mechanical support inside the payphone enclosure.
Ideas for future revisions, ordered by likely impact.
Bulk capacitor on 5V input — Add a 470–1000 µF electrolytic (16–25V) on the 5V rail (after Q1/F1, before distribution). Smooths supply during Pi boot current spikes and audio peaks.
Bulk capacitor on 12V_COIN — Add 100–220 µF (25V) near J1 (coin validator). Coin validators draw current spikes when the motor runs; the bulk cap reduces rail droop.
Series resistor on coin validator reset — If the Arduino drives the reset line directly to J1, add a 100–220 Ω series resistor. Limits fault current and reduces coupling.
I2C series resistors — Add 22–33 Ω series resistors on SDA/SCL at each Arduino I2C port. Dampens ringing if cable lengths increase or in noisy environments.
XL6009 thermal — The 5V→12V boost at ~50–100 mA can get warm in a confined enclosure. Use adequate copper around the module; consider a small heatsink if airflow is limited.
Undervoltage handling — The bulk input cap (item 1) helps. If the 5V supply is marginal during boot, consider explicit UVLO or reset sequencing for critical loads.
ESD on audio jacks — J5 (mic) and J7 (speaker) are externally accessible. Consider PRTR5V0U2X or similar TVS on their signal pins for robustness.
Power LED brightness — If D4 is too bright in a dark payphone, increase R3 (e.g., 2–4.7 kΩ) for dimmer indication.
TDA2822M gain flexibility — Add DNP footprints for optional input attenuation resistors so gain can be tuned without a respin.
Connector keying — Verify J1 (coin validator) is keyed to prevent reverse insertion. Document pin-1 orientation clearly.
Pi power path — Document whether the Pi receives 5V only from the GPIO header or also via USB; affects power sequencing and fault behavior.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 9 | 0.1u | Capacitor_SMD:C_0805_2012Metric | C1, C2, C3, C4, C5, C16, C18, C19, C20 |
| 6 | 1k | Resistor_SMD:R_0805_2012Metric | R4, R5, R12, R13, R14, R15 |
| 4 | 22u | Capacitor_SMD:C_0805_2012Metric | C13, C14, C15, C17 |
| 3 | 100nF | Capacitor_SMD:C_0805_2012Metric | C6, C9, C10 |
| 3 | 100µF 16V | Capacitor_SMD:CP_Elec_6.3x5.4 | C7, C11, C12 |
| 3 | P6KE6.8CA | Diode_SMD:D_SMB | D5, D6, D7 |
| 2 | 10k | Resistor_SMD:R_0805_2012Metric | R6, R7 |
| 2 | 4.7 | Resistor_SMD:R_0805_2012Metric | R8, R9 |
| 2 | 4.7k | Resistor_SMD:R_0805_2012Metric | R1, R2 |
| 2 | Blue LED | LED_SMD:LED_0805_2012Metric | D12, D13 |
| 2 | Green LED | LED_SMD:LED_0805_2012Metric | D8, D9 |
| 2 | Yellow LED | LED_SMD:LED_0805_2012Metric | D10, D11 |
| 1 | 1kΩ | Resistor_SMD:R_0805_2012Metric | R3 |
| 1 | 2A | Fuse:Fuse_1812_4532Metric | F1 |
| 1 | 3.3k | Resistor_SMD:R_0805_2012Metric | R11 |
| 1 | 330 | Resistor_SMD:R_0805_2012Metric | R10 |
| 1 | 4.7µF | Capacitor_SMD:C_0805_2012Metric | C8 |
| 1 | 5V_MAIN | TestPoint:TestPoint_Loop_D2.50mm_Drill1.0mm | TP1 |
| 1 | ADA3708 | ADA3708:ADA3708_RPI-ZERO | A3 |
| 1 | AO3401A | Package_TO_SOT_SMD:SOT-23 | Q1 |
| 1 | Arduino_Micro_Socket | PCM_arduino-library:Arduino_Micro_Socket | A1 |
| 1 | Arduino_Micro_Socket (display) | PCM_arduino-library:Arduino_Micro_Socket | A2 |
| 1 | Ground | TestPoint:TestPoint_Loop_D2.50mm_Drill1.0mm | TP3 |
| 1 | Pi 3.3v out | TestPoint:TestPoint_Loop_D2.50mm_Drill1.0mm | TP2 |
| 1 | RJ9 | Connector_RJ:RJ9_Evercom_5301-440xxx_Horizontal | J4 |
| 1 | Red LED | LED_SMD:LED_0805_2012Metric | D4 |
| 1 | SCL | TestPoint:TestPoint_Loop_D2.50mm_Drill1.0mm | TP5 |
| 1 | SDA | TestPoint:TestPoint_Loop_D2.50mm_Drill1.0mm | TP4 |
| 1 | TDA2822M | Package_SO:SOIC-8_3.9x4.9mm_P1.27mm | U2 |
| 1 | card_reader | Connector_IDC:IDC-Header_2x07_P2.54mm_Vertical | J6 |
| 1 | coin | Connector_IDC:IDC-Header_2x05_P2.54mm_Vertical | J1 |
| 1 | display | Connector_IDC:IDC-Header_2x13_P2.54mm_Vertical | J3 |
| 1 | keypad | Connector_IDC:IDC-Header_2x10_P2.54mm_Vertical | J2 |
| 1 | mic | audio:AUDIO-TH_HOOYA_PJ-320 | J5 |
| 1 | speaker | audio:AUDIO-TH_HOOYA_PJ-320 | J7 |
| 1 | ~ | misc_footprints:XL6009_module | U1 |
It measures 81 × 114 mm and has 4 copper layers, 1.6 mm thick.
64 parts, built around the TDA2822M/TR, P6KE6.8CA and AO3401A. 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.
From the kmatzen/millennium repository on GitHub, at the commit this page was made from: the board is pcb/phonev6.kicad_pcb and its schematic pcb/phonev6.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository publishes it under the MIT licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).

akiihito/expresslrs_realtime_recorder
USB Gamepad to ExpressLRS adapter using Raspberry Pi Pico


tomassasovsky/segno-hardware
Segno hardware: boards, sheet-metal enclosure, printed parts and decals



clwe/SolarSoundBoards
A small collection of PCBs for DIY manufacturing on the CNC machine.

