View on GitHub

Converting an '80s Fisher-Price tape recorder into a Bluetooth speaker

Download this project as a .zip file Download this project as a tar.gz file

Case exterior

This is my #826 Fisher-Price tape recorder. Manufactured January 21, 1987 (as stamped in the battery compartment).

I used it constantly when I was a kid. When I found it again in 2015, it didn’t work anymore. The problem was probably just a broken or missing belt for the tape deck, which I could have replaced. Instead, I made some deeper changes - I converted it into a Bluetooth speaker.

Click the image below to play a YouTube demo video.

Demo Video

A Look Inside

The #826 tape recorder is quite easy to open up - just six screws on the back, and then the entire back slides right off.

Case interior

The Speaker

There’s a 3" speaker mounted to the back of the case. I was hoping to re-use the speaker as-is, but measured it to have an impedance of 32Ω, which I thought might be a little high for the amplifier components designed for 8Ω speakers that I was planning on using (I expected a too-high impedance might result in low volume, but not damage). I stuck with the original speaker at first, which seemed to work, but eventually I replaced it with an 8Ω speaker of the same size.

Mechanical and Electronic Components

Case interior closeup

This is a closer view of most of the mechanical and electronic components, with the belt mechanism (visible in the previous image) already removed. There are a fair number of mechanical springs, plastic levers, etc. that are used to control the tape deck. I did not want to simply remove these, because I wanted to try to maintain the original feel of the buttons, and I thought keeping the springs intact would be the easiest way to do so.

There was a single PCB in a slot near the right side of the case. I did not intend to reuse any of its electronics. The interesting part here was the volume knob, which I wanted to remain functional. It was attached directly to a potentiometer on the PCB. To get a value from the volume knob, I would either have to keep the existing potentiometer in place and measure it digitally, or replace it with another sensor that fit the volume knob and would sit at the correct location in the case. I decided to replace the PCB and potentiometer, as that gave me the flexibility to use a rotary encoder instead of a potentiometer, and removing the PCB introduced more space for my components around where the PCB used to be.

Fully Disassembled

Case interior front half (middle section removed)

This is the front half of the case, with the middle section of the case removed - this was the most I would ever disassemble the tape recorder. I took it apart this far to remove the thick grey wires for the microphone. I did not intend to try to reuse the microphone, and the microphone wires were in the way taking up a lot of space (although subsequently, using the tape recorder as a giant Bluetooth headset has come up in conversation - maybe I will someday regret removing the microphone wires).

The underside of the play/forward/rewind/record buttons can also be seen in this image. They push down on the slotted metal bars, which then push on the various levers and switches that control the tape deck. Getting the buttons to fit into their hinges and sit on the metal bars just right is very annoying - every time I open the case and disturb the button mechanism, I have to spend a bunch of time jiggling the buttons back into place.

The PCB

Case interior PCB

This is a view of the (blurry) battery compartment and the (in-focus, more or less) PCB. You can see how the volume knob is mounted to the potentiometer. I power the whole project off of C batteries in the original battery compartment.

Audio Components

Almost all of the parts I used came from SparkFun, an excellent source of easy-to-use and well-documented hobbyist electronics components.

The Bluetooth Audio Module

The core of the project is a Roving Networks RN-52 Bluetooth Audio module (mounted to SparkFun’s breakout board for this module).

Bluetooth module with power

The first time I powered up the RN-52 module I used 3 rechargable 1.2 volt AA batteries, for a total voltage of 3.6 volts (the RN-52 is a 3.3 volt component, but 3.6 volts is acceptable). It started up without any problems.

The RN-52 can do a lot! It can handle many different Bluetooth versions and profiles, and accepts configuration and commands via a UART console interface. I’m only using a subset of what it’s capable of.

Bluetooth module with many test connections

I made many temporary connections to the Bluetooth module to test it. Here I’ve got it hooked up to a SparkFun FT231X breakout board for communicating with the module’s console interface via USB on my laptop, and I’ve got it’s audio outputs (poorly) clipped to a pair of headphones.

Programming the Bluetooth Audio Module

The console interface offers a lot of settings, but the defaults were pretty close to what I wanted. The only changes I made were setting the device name to "FisherPrice" (this is the name that will appear when pairing), and enabling AVRCP (Audio/Video Remote Control Profile) so that I could use the RN-52's GPIO pins to send play/pause, next/previous, and volume commands. Instructions for enabling the AVRCP were pretty well hidden - luckily, the SparkFun RN-52 Bluetooth Hookup Guide covers this feature, and links to the Command Specifications document which has even more detail.

Stereo Summing and Amplification

The RN-52 offers stereo differential audio outputs, which can be connected directly to speakers without using an external amplifier. I was concerned that this might not be loud enough, and I also wanted to attempt to use the Fisher-Price tape recorder’s original single mono speaker, so some more components were needed for the audio output.

I added another amplifier, which would take the RN-52's pre-amplified output as an input. I used a SparkFun TPA2005D1 Mono Audio Amp Breakout. This is a class-D amplifier based on the Texas Instruments TPA2005D1. It defaults to a 2x gain, but provides the option to solder more resistors to the board to achieve even higher gain.

I needed to sum the left and right outputs of the RN-52 to be able to attach them both to the mono audio amp’s single input. I searched around for suggestions for a circuit to do this, and came up with putting resistors (I used 680Ω) in series with each differential output, then attaching both positive outputs to the amp’s positive input and both negative outputs to the amp’s negative input. This seemed to work, although it also seemed to lose some volume in the process.

Breadboard with summing circuit, rotary encoder

Here’s the left/right summing circuit - inputs on the bottom, outputs on the top. I also added a 10KΩ resistor between the outputs. When I took this photo, I had already started using some of the remaining space on this breadboard for other connections. The rotary encoder for the volume knob can be seen on the left. On the right side, I used this board for power distribution - only a ground bus is connected in this image, but eventually I'd also add a +3.3v bus and a +6v bus.

I measured the impedance of the original speaker to be 32Ω - higher than the 8Ω the mono audio amp was designed for. I figured this was another reason for relatively low volume, and eventually replaced it with an 8Ω speaker (a CUI GF0771 I ordered from DigiKey). This surprisingly (to me, anyway, with my poor understanding of speaker impedance) did not result in significantly louder output. Eventually I added more resistors (47KΩ) to the TPA2005D1 board to increase the gain even further - that helped. The volume level still isn't earth-shaking, but practically it's usable.

Power

For a power source, I use C batteries in the original 4 battery compartment. 4 C batteries at 1.5 volts each provides 6 volts. This is almost perfect for the mono audio amp (which suggests 5.5 volts max, with an absolute maximum of 6 volts - I just run it at 6 volts), but the RN-52 requires 3.3 volts. I needed a voltage regulator to provide power from these batteries at a voltage level appropriate for the RN-52. Unrelatedly, I also needed a microcontroller to read the volume knob rotary encoder and write to the RN-52 volume up and down pins. The SparkFun Arduino Pro Mini 328 - 3.3V/8MHz serves both purposes. It has a 3.3 volt voltage regulator that provides power to both the Arduino and the RN-52, as well as a microcontroller and an excellent software library for reading from rotary encoders.

Power Switch

I needed to add a new power switch to turn it all on and off. The original electronics didn’t have a power switch for the whole system, and I didn’t want to leave the electronics on all the time, or have to pull out batteries to turn it off, or start messing around with low-power modes. I couldn't figure out an easy way to use one of the existing buttons as a power button (e.g. Record, which I didn't need for anything else), because that would require either a mechanical switch that could be toggled by a button press, or a button press detector that was always on.

I struggled to find a relatively accessible spot to add a power switch that didn’t affect the original aesthetics too much. Eventually I found a little spot underneath the cassette tape holder where I could hot glue a simple plastic DPST on-off switch. The hot connection from the battery compartment is switched directly using this switch, rather than using a relay, so the full current is passing through the switch - in practice, this hasn't yet been a problem.

Power switch mounted underneath tape deck

Look closely at the bottom center of the cassette tape holder, and you can make out the tiny black plastic power switch. You can also see the red glow from the power LEDs on the Bluetooth audio board and the amplifier board.

Volume Control

I was lucky that this 12-step Rotary Encoder I ordered from SparkFun just happened to fit the volume knob perfectly (it had a D-shaped post that I suppose is fairly standard). I guess some things haven’t changed since 1987. I connected the rotary encoder to the Arduino and installed the Encoder library from PJRC. This made it really easy to tell when the volume knob was clicked up or down, and I wrote a sketch to pull down the volume up or volume down pins on the RN-52 each time this happened.

volume.ino

#include <Encoder.h>

#define ENC_A 2
#define ENC_B 3
#define VOL_UP 8
#define VOL_DOWN 9
#define LED 13

#define BUTTON_PRESS_DELAY 100

Encoder encoder(ENC_A, ENC_B);
int lastValue = 0;

void setup() {         
  pinMode(VOL_UP, OUTPUT);
  digitalWrite(VOL_UP, HIGH);

  pinMode(VOL_DOWN, OUTPUT);
  digitalWrite(VOL_DOWN, HIGH);

  pinMode(LED, OUTPUT);
}

void loop() {
  int value = encoder.read();
  if (value < lastValue) {
    digitalWrite(VOL_UP, LOW);
    digitalWrite(LED, HIGH);
    delay(BUTTON_PRESS_DELAY);
    digitalWrite(VOL_UP, HIGH);
    digitalWrite(LED, LOW);
  } else if (value > lastValue) {
    digitalWrite(VOL_DOWN, LOW);
    digitalWrite(LED, HIGH);
    delay(BUTTON_PRESS_DELAY);
    digitalWrite(VOL_DOWN, HIGH);
    digitalWrite(LED, LOW);
  }
  lastValue = value;
}

Getting the rotary encoder PCB (a SparkFun Solder-able Breadboard - Mini) to stay in the correct place relative to the volume knob slot was a challenge. After several unsatisfactory attempts using layers of double-sided tape, I decided it was time to get serious, and designed a custom 3D printed part to keep the PCB in place.

3D rendering of PCB slot adapter

I designed this PCB slot “adapter” using OpenSCAD. It's designed to fit in the same slot as the original PCB, and hold my new, smaller PCB in the correct place relative to the volume knob slot on top of the tape recorder. I had to be careful to leave some gaps where it would be blocked by plastic pieces of the tape recorder case.

Below is the text of the OpenSCAD file I used to model this. Where the comments don’t match the actual values, that’s where my original measurements didn’t quite work out and I tweaked the numbers a little bit. The final fit was still a little tight, I might have tweaked a few of the numbers even smaller if I were to do another print.

pcbslot.scad

// slot height = 3 5/16" = 84mm
cardHeight = 81;
// slot depth = 1 11/16" = 43mm
cardDepth = 43;
// slot width = 2mm
cardWidth = 1.7;
// pcb top = 6mm from slot top
pcbFromTop = 6;
// pcb height = 1 13/16" = 46mm
pcbHeight = 43;
// pcb depth = 1 5/16" = 33mm
pcbDepth = 33;
// pcb width = 2mm
pcbWidth = 3;

postFromTop = 24;
postGapSize = 13;

deepMaterialStart = pcbFromTop - 4;

difference() {
  union() {
    // most of the card
    cube(size = [cardHeight, cardWidth, cardDepth], center = false);
    // make deep only where the PCB goes
    translate([deepMaterialStart, cardWidth, 0]) {
      cube(size = [pcbHeight + pcbWidth * 4, pcbWidth, cardDepth], center = false);
    }
  }

  // make space for the posts
  translate([postFromTop, cardWidth, 0]) {
    cube(size = [postGapSize, pcbWidth, cardDepth]);
  }

  // remove some deep material to fit bottom slot
  translate([0, cardWidth * 2 + pcbWidth, 0]) {
    rotate([90, 0, 0]) {
      linear_extrude(height = cardWidth + pcbWidth, center = false) {
        polygon(points = [
          [deepMaterialStart, -1],
          [deepMaterialStart, cardDepth - pcbDepth - 2],
          [24, -1]],
          paths=[[0,1,2]]);
      }
    }
  }  

  // remove card body where pcb goes
  translate([pcbFromTop, 0, cardDepth - pcbDepth]) {
    cube(size = [pcbHeight, cardWidth + pcbWidth, pcbDepth], center = false);
  }

  // remove a little more to make a pcb slot
  translate([pcbFromTop - pcbWidth, cardWidth / 2, cardDepth - pcbDepth]) {
    cube(size = [pcbHeight + pcbWidth * 2, pcbWidth, pcbDepth], center = false);
  } 
}

PCB slot adapter in place

Here’s the final PCB slot "adapter" in-place in the build. The Ultimaker I used just happened to have green filament loaded at the time I made the print - the color didn't matter since this wouldn't be visible from outside the case. It took a few prints to get it to fit well enough - I am guilty of relying a little too much on trial-and-error when 3D printing parts, instead of measuring more carefully, as it’s so easy to make minor tweaks and try another print.

Button Controls

The first step toward getting the buttons working was to change their mechanical behavior. When there was no tape loaded, the play and record buttons could not be pressed at all, and when there was a tape loaded, the play and record buttons "stuck" until Stop/Eject was pressed. Neither of these behaviors were what I needed to match the AVRCP functionality, which has a momentary play/pause button press.

After some poking around with the springs and levers, I managed to find some spots that I could modify to get the mechanical behavior I wanted (momentary press/release of all button presses). There is a lever that is pushed down when a tape is inserted - I locked it in place using some double-sided tape. Once this was done, I could get all of the buttons to release instantly by holding down the Stop/Eject button. I found the lever that the Stop/Eject button was activating, and used some hot glue to lock it in place.

Detecting Button Presses

The electronics for detecting button presses were more challenging. There didn't appear to be a good way to mount the microswitches I had such that they could be triggered by the motion of the buttons or the vertical metal button bars. The switches were also too large. I ended up not using them.

After some experimentation, the solution that finally worked was simply hot-gluing a stripped stranded wire to each of the vertical metal button bars. Hot glue itself didn't stick well to the metal button bars, so I wound up sticking some double-sided tape to each metal button bar, and hot-gluing the wire insulation to the tape. When each button is pressed, its exposed stranded wire moves downward and makes contact with a horizontal metal bar that runs in front of the vertical metal button bars. By grounding the horizontal metal bar, each button's wire is floating when the button is not pressed, but pulled low when the button is pressed - exactly the signals that the RN-52 Bluetooth audio module needs for the AVRCP commands.

Button wires

I've outlined some interesting spots in this photo - the ground connection to the horizontal metal "ground" bar, and the exposed stranded wires and the spots where they make contact with the ground bar.

The spot I chose for the play/pause wire actually happens to be moved by the record button as well. This was an accident, but it was an easier spot to glue to than a metal bar (because it was plastic), and I didn't need the record button for anything else anyway, so I left it in place. The record button now effectively acts as an additional play/pause button.

This is obviously not a great solution - it hasn't fallen apart yet, but I don't expect it to last forever. Some improvements I've considered are using a better glue to attach the plastic wire insulation directly to the metal bars (maybe jewelry epoxy), and using a solid metal pin to make contact with the ground bar instead of stranded wire which will get bent out of shape over time.