Wednesday, October 2, 2024

Give a Man a Fish, and He Eats for a Day. Give a Man a Singing Fish, and He'll Hate You the Rest of His Life

In this post, I will detail how I customized a Big Mouth Billy Bass animatronic fish to sing any song of my choosing.

Github Link for the lazy 

Video for instant gratification

My Annoying Life Story that Details Why I Decided to Do This in the First Place

Ever since my brother moved into his new house, I had planned to give him a classic Big Mouth Billy Bass audio-animatronic singing fish as a housewarming gift.

Billy Bass in an original box as I remember from the aughties

Alas, these have become rather scarce since they first surfaced in 1998. So, I cast my line to myriad online classified marketplaces and patiently waited for a nibble. At last, in the waning days of February, 2021, I got a bite on Kijiji (local classified ads). I purchased the fish after the seller assured me that it worked, and brought it home.
Billy Bass that I bought

I had landed what appeared to be a fine specimen. This project would ultimately teach me far more about Big Mouth Billy Bass singing fish than I ever thought I would want to know, and the first thing I would learn is the difference between ‘new-era’ Billy Bass fish and ‘legacy’ fish. The manufacturer modified their design several times throughout the years in efforts to cut costs. The most significant mechanical alteration was to reduce the number of motors from 3 to 2. This means that newer Billy Bass fish are unable to move their heads and tap their tails at the same time: the same motor controls both motions by switching its direction. The fish I’d caught was a second edition of Big Mouth Billy Bass Sings for the Holidays, manufactured in 2000. This means that it was one of the fish with 3 motors, and thus a superior range of motion. 

Alas, when I brought it home, I found that I had been misled. When I plugged it in (using the decidedly non-stock AC/DC adapter) and pressed the button, I was subjected to an arthritic performance that could be traced to a failed gear.

The gear is split and does not grip the motor shaft.

No matter, I thought, this will be straightforward to repair. At this point, I ventured into the very active genre of Big Mouth Billy Bass repair videos on YouTube. From these fine internet people, I learned how to properly fillet one of these singing fish to replace the cracked plastic gears. I tried 3D printing a gear, but the printer I have access to is not able to print at the required precision, so I wound up ordering two bags of gears from Amazon. Incidentally, please let me know if you live in Winnipeg, MB and are interested in ordering small plastic gears, I’ll be happy to share! 

Teach the Fish to Sing

Once the motion was repaired, I needed to set about changing the songs that the fish sang and danced to. This particular fish, being a Yule-themed variant, sang Appalachian-inspired versions of ‘Up on the Housetop’ and ‘Jingle Bells’. Neither of these arrangements synchronized particularly well with the fish motions, nor were they nice to listen to.

At this point, I knew I was going beyond merely repairing a broken tchotchke, and entering the fun company of Boston Dynamics and Disney Imagineers: I was going to program my own dancing robot.

Literature Review

At this point, I consulted the internet to review the existing Billy Bass conversion projects, and there are many of them! The most common deficiency that I observed was that many people would simply rip out the control board and try and control everything using commercial motor control boards (e.g. Arduino Shields or Raspi hats). I felt that this would be wasteful, and I may be able to control the motors using the existing transistor control circuitry. 

Here are a few notable works:

Animate a Billy Bass Mouth With Any Audio Source

I hacked a singing fish.

MBed Cookbook: Big Mouth Billy Bass This resource proved the most useful because it shows the pinout for the logic board (which I verified matched my specimen), and a useful software model.

Design

Being an audio-animatronics project, this design includes both hardware and software components.

Hardware

I selected a Raspberry Pi as the controller for several reasons:

  1. I had one handy, this would save money since I would not be buying any new hardware.
  2. It has a built-in card reader for storing audio files, and a built-in network stack to make it easier to add extra functionality later on.
  3. I could program it using Python. This would allow me to model the control software on my PC without needing to build the hardware first. I also wanted an excuse to practice Python :)
  4. It has sufficient processing power to play back high quality audio in real time, and allow for future feature expansion. In fact, it’s probably overkill.

I broke out the Billy Bass control board as described in the MBed article, and tested that the Python script on the raspberry pi could control the motors. This worked quite well. The audio on the other hand, took a little more doing. My original plan was to use the audio output from the Raspberry Pi to drive the same audio pin that the original Billy bass controller had driven. However, I discovered that the speaker driver in the Billy Bass enclosure expected a biased input signal, while the audio output from the raspberry pi produces a line-level differential signal. Therefore I decided to create a custom amplifier circuit from discrete components to drive the speaker using the line-level audio signal from the Raspberry Pi.

The Raspberry Pi audio signal cannot directly drive Billy's speaker


 

System Diagram

Software

Each song that Billy knows comes in two pieces:
  1. The audio file that is played: this is encoded as a wav file
  2. The set of motions that billy does along with the audio: this is encoded as a JSON file with a .mtn file extension.

The billy.py control script runs two threads: one plays back the audio file, and the second parses the .mtn file and schedules the motions to occur in time to the music. I also created a program to help author the motion files that Billy would process. This authoring program has been tested on a Windows PC, and includes an emulator to let the user make sure the motion files synchronize properly with the music.You can use the authoring program to generate different motion files for each of Billy's motors, then stitch them all together.

 

Authoring a motion file



billy.py

record-motion.py emulator.py

OS

Raspian OS on Raspberry Pi 1 (Armv6)

Any

Any

Purpose

Detect existing .mtn/.wav file pairs as they are added

When push-button is pressed, play back an audio file and animate Billy according to the matching .mtn file

Allow user to create .mtn files while a song plays back

Emulate the AP processor so the user can see if the timings for their AP file are correct

Playing the audio file was simple enough. Since I used a Raspberry Pi with Python, I thought that I could simply select a Python library for playing back audio files, and call it. This was easier said than done: I went through several audio libraries trying to find one that would work on both Windows and armv6 Linux. In the end, I wound up using different libraries for the emulator and the fish software (`playsound` on the Raspberry Pi and `playwav` on Windows). 

I presented the fish to my brother, and it was a big hit!

Look at him sing!

The software and appropriate instructions are available on Github.

 

 

 

 

 

 

 

 

 

 

 

 

 

No comments:

Post a Comment