- You have: A stereo, another room without said stereo
- You want: Speakers in said other room playing the same content that is playing on the stereo
I bought a set of wireless headphones for very cheap (< €5) off eBay. I use a 2x 15W amplifier board to hook up a spare set of JBL Control 1C. The amplifier is powered by a 12V 3A power supply off eBay. The volume control and tone adjustments are handled by a TDA7439 4 stereo input sound processor IC. The resulting product should go in a case and offer some controls, such as volume, equalizer, and mute.
The wireless headphone set was a great deal. It comes with a 5V wall wart PSU, a transmitter, a Li-Ion battery, two speakers and a receiver unit.
Luckily the extraction of the remote receiver (RX) circuit was even easier than I had hoped for—the RX is socked on a daughter board:
The receiver board contains a presumably custom IC labeled
W001RX and a set of other ICs I cannot identify.
Reverse engineering the rxboard signals gives this pinout:
- right audio out
- left audio out
- Vcc 3.17V in
- /SCAN in
- /TUNED out
- antenna GND
The audio lines carry an AC signal with the amplitude depending on the amplitude going into the TX circuit. My portable audio player produced a 150mV p-p signal, and the PC line out produced a 1V p-p signal.
/SCAN is kept low in operation; a positive edge makes the circuit jump to the next channel. There are 3 channels supported, and it defaults to a fixed channel on power on. If you want to select a specific channel, you’ll have to hop to it by triggering /SCAN once or twice.
/TUNED is pulled low by the circuit if it detects a carrier, otherwise it is high.
The antenna is roughly 83mm in length (λ/4).
All files in KiCAD format are available from a Gitorious repo.
The circuit hosts power input, power out for the amplifier, and a set of honky capacitors to reduce switching noise from the PSU and amplifier. Two voltage regulators produce 8V for the audio processor and 3.3V for the rest of the system.
The input to the system are a rotary encoder for volume and tone and an on-off switch for sound source selection. One line of the rotary encoder is wired up to an interrupt pin on the µC, as is the push button of the rotary encoder. The on-off switch is polled. A power LED can give some visual feedback on the state of the controls. The LED is hooked up to a timer/PWM output pin so that the brightness of the LED can be modified easily to convey more information.
A 10-pin IPS (In System Programming) header allows for firmware upgrades for the Atmel µC.
Inputs come from the receiver board and from an optional external input such as a mobile audio player. The central part of the circuit is the TDA7439 with 4 stereo inputs and tone control. The µC connects to the audio processor via I²C bus and controls input channels and tone/volume settings. The TDA7439 requires a fair amount of discrete components for tone control, and I simply used the values of the datasheet’s test (and only) circuit. I added an AC coupling capacitor to the outputs to remove the 4V DC offset.
The TDA7439 comes in a SDIP30 package, for which it is virtually impossible to obtain a socket. Therefore I designed a breakout board from SDIP32 to DIP32-600, and the main board uses a DIP32-600 socket. Most board inputs are screw terminals, except for the panel and ISP connectors which are male IDC headers.
The audio part (left) and the digital part (right) have their own 2-sided flood-filled ground planes. Both sides are only connected on one spot to minimize digital noise coupling. In the end I did not connect front and back planes with additional vias, but the existing through-hole ground connections should be enough. The ground zones are not shown in the board layout to improve clarity.
The board shown here is revision 2, using SMT components.
Interfacing with the TDA7439
With the first board back from the fab, I put on all components except for the AVR and the wireless module in order to check for design problems. I hooked up my Bus Pirate to the I2C bus via the AVR socket:
We initialize the TDA7439 to produce some output signal using the bus pirate:
% screen /dev/ttyUSB1 115200 HiZ>m 1. HiZ 2. 1-WIRE 3. UART 4. I2C 5. SPI 6. 2WIRE 7. 3WIRE 8. LCD 9. DIO x. exit(without change) (1)>4 Set speed: 1. ~5KHz 2. ~50KHz 3. ~100KHz 4. ~400KHz (1)>4 Ready I2C>W Power supplies ON I2C>P Pull-up resistors ON I2C>(1) Searching I2C address space. Found devices at: 0x88(0x44 W) 0x89(0x44 R) I2C>[0x88 0x10 2 10 0 7 7 7 0 0] I2C START BIT WRITE: 0x88 ACK WRITE: 0x10 ACK WRITE: 0x02 ACK WRITE: 0x0A ACK WRITE: 0x00 ACK WRITE: 0x07 ACK WRITE: 0x07 ACK WRITE: 0x07 ACK WRITE: 0x00 ACK WRITE: 0x00 ACK I2C STOP BIT I2C>
The I2C sequence breaks down to:
- 0x88 TDA chip address
- 0x10 use address incrementing (bit 4), write address 0 (bits 3-0)
- 2 input channel 2 (the external input)
- 10 20dB input gain
- 0 0dB volume
- 7 0dB bass gain
- 7 0dB mi-range gain
- 7 0dB treble gain
- 0 0dB right speaker attenuation
- 0 0dB left speaker attenuation
Now the output comes to life:
The blue channel 2 shows the input from the music player, the yellow channel 1 shows the output from the TDA; both are scoped AC-coupled because there is a serious DC offset on both signals. You can see that the output sort of matches the input signal: the scale of the input channel is 500mV/div, the scale of the output channel is 2V/div; the output seems about double the amplitude for small signals, so we’re probably running with a 10dB amplification.
Because I didn’t have sufficiently large DC blocking ceramic or film capacitors, the signal is a bit distorted; slopes do not match properly, and sometimes you can see a phase offset. I have the impression that the input trails the output at times, but that of course doesn’t make any sense.
The schematic of the amplifier shows that on the input line are a 0.1µF cap to ground; then a 10µF cap and a 20k resistor in series (plus some biasing circuitry) go into the amplifier chip.
Signal lines: SLEEP and MUTE
The amplifier chip is a TA2024 class D amplifier. It requires between 3.5V and 5V input for a logic high for the SLEEP and MUTE lines. However, the AVR on my receiver board circuit runs at 3.3V, with 8V available for the TDA7439.
Looking at the schematic, the MUTE board input forms a 20k/20k voltage divider to ground; the SLEEP input to the board goes directly to the sleep pin of the TA2024, with a 20k resistor to ground. I will remove the input resistor for MUTE, so that both SLEEP and MUTE are conditioned the same way. On the controller board, one 12k resistor per signal forms a voltage divider from 8V to 5V, and each a N-channel MOSFET lets the µC to pull this signal to GND.