Animate a Billy Bass Mouth With Any Audio Source

45,918

193

54

Published

Introduction: Animate a Billy Bass Mouth With Any Audio Source

About: I run the Maker Project Lab blog, and a weekly video series called Maker Update. Email me at donald@makerprojectlab.com

About a month ago, an artist named Brian Kane published a viral video showing a Big Mouth Billy Bass novelty singing fish, seemingly voiced by Amazon’s Alexa virtual assistant. The internet went nuts for it, and so did I -- but mostly I just wanted to know how it worked so that I could make my own.

After seeing a number of Raspberry Pi projects that made use of Alexa, I initially assumed that Brian had created an Alexa-powered Pi project that doubled as a means to animate the existing Billy Bass hardware -- and that may be the case. I even posed this idea on my weekly YouTube show, Maker Update.

But after giving it some more thought, I figured the easiest hack would be a way to simply use the audio from a $49 Amazon Echo, and process it through an Arduino to drive existing motors.

I already had an Arduino and a motor shield handy (though this was my first time using the shield).

Next, I ordered the Billy Bass used on Amazon for around $15. I’m sure you can pick up a used one at a yard sale or Thrift store for less money, but I wanted one quickly. I also ordered the Echo Dot new.

With those ordered, I moved on to research. Two Instructables provided me with hope: this 2012 guide from sfool on using an Arduino to make a servo move to sound and this 2013 guide from Dotten on understanding the animatronics of a Billy Bass toy.

Understanding that the Billy Bass (much like a Furby) is essentially driven by two cheap 5v DC toy motors -- the problem then becomes simply how to make these motors twitch in response to sound. With a little trial and error, I found a workable solution. The code is far from perfect and there are a lot of other features I want to build in, but I wanted to get this up so that everyone can help make this better.

Materials Needed

Tools Needed

  • Small Screwdriver
  • Soldering Iron and Solder
  • Wire strippers
  • Snips
  • Drill and bits

Step 1: Prepare the Fish

For better or worse, by used fish was dead on arrival. At least I had no hesitation about opening it up and hacking it. For my hack, simply undo the screws on the back, open it up, and apply gentle pressure to unseat the cable harnesses so that the back can be removed completely.

To create more room for the electronics we’ll be adding, unscrew and remove the Billy Bass circuit board and piezo buzzer.

What you have left is one 4-wire harness sticking up from the fish. This includes two wires that animate the mouth (you can see them trail into the fish) and two wires that raise either the head or the tail depending which way direction you run the motor.

The last step in preparing the fish is to cut four equal lengths of different colored wire, expose and tin the tips, and insert the ends into each of the four sockets in the wire harness. In the next step, we’ll connect these to the Arduino motor shield.

Step 2: Prepare the Motor Shield

There are only 4 connections you’ll need to make to the motor shield, and only two of them are soldered. You can also hook up an additional two wires if you want to experiment with the tail/head motor.

Let's start with the soldering to get it over with. To create an audio input for your fish, take two equal lengths of different color wire, strip the ends, and solder one to ground, and one to Analog 0. Clip away any excess wire running through the board.

Now let’s run these wires to the panel-mount mini jack for our audio input. The jack I had was one of those fancy mono switch jacks with three possible connections. All that matters is that you create a mono input by running the wire from Analog 0 to the lead on the jack that makes contact with the tip of the audio connector. Then run the Ground wire to a lead on the jack that makes contact with the base (or sleeve) of the audio connector.

Next, to connect up the fish motor(s) to the shield, run the pair of wires leading to the fish mouth motor (black and orange) into the terminal blocks for motor 1 and screw them down. Optionally, you can run the tail/head motor wires (white and red) to the terminals for motor 2, though the code does not yet do anything with this motor (more on this in the next section). For my fish, the wire coloring on the terminal blocks goes black, orange (yellow in my case) for the mouth motor (M1) and white, red from for the optional tail motor (M2).

Finally, check that the motor shield has the jumper sleeve attached to the pins labelled VIN Jumper. I missed this initially and was scratching my head wondering why the shield wouldn’t power on. You should now be able to sandwich the shield onto the Arduino Uno, power up the Arduino, and see a power indicator LED light up on the shield as well. If the shield doesn’t light up, I’d check the jumper.

Step 3: Load the Code

So, the code’s a messy hack that pulls together elements of the DC Motor Test sketch (essentially the demo for the motor shield) and the Sound to Servo sketch by Cenk Özdemir (2012), included in that Arduino Sound to Servo Instructable I linked to above.

Also, be sure to download the Adafruit MotorShield V2 Library, as this code will reference it and it's needed to drive the motor shield. You can find the library here (or install it directly through the Arduino Library Manager): https://learn.adafruit.com/adafruit-motor-shield-v2-for-arduino/install-software

The code in its current state does not yet animate the head/tail motor. I had one version that did, but it slowed down the responsiveness of the mouth movement. Ideally I’d like the mouth to remain responsive while the head and tail slowly cycle through their own animation, but this is the current limit of my Arduino coding capability. As soon as I figure it out or get suggestions from you guys, I’ll post updated code.

Step 4: Putting It All Together

With the code loaded, and the audio cable connected to the jack, you should be able to make the fish’s mouth move just by connecting an audio source to the free end of the cable (I used my phone playing a podcast). If it’s working, drill a small hole somewhere on the plastic fish plaque, push the jack through and tighten it in place.

To get Alexa (or whatever you want) talking through your fish, connect the free end of the audio cable to the Y-adapter, the rechargeable speaker to the other input of the adapter, and then run the male plug of the adapter into the audio output of the Echo Dot.

Make sure your speaker is switched on and the volume is up on both the speaker and Alexa. Then, summon Alexa and ask her a question to get her talking (weather, jokes, news). You should hear her voice through the portable speaker while simultaneously witnessing your fish’s rubber lips flapping in time. The closer the speaker is to the fish’s head, the more uncanny the effect is.

If it’s all working out, the trick then becomes packing the speaker and Arduino into the Billy Bass enclosure and closing it up. Honestly, I’m still figuring this bit out.

Step 5: Where Next?

There’s a lot left to do here, and I welcome all your suggestions on making this better. I'd love to post a version 2.0 for this in the near future.

1. I want the head and tail to animate. The connections are there and I’ve been able to get them working but not without sacrificing the responsiveness of the mouth, which is critical.

2. I want the speaker to be able to recharge from the Arduino. Seems simple enough, but I haven’t done it yet.

3. I want the Billy Bass red button (or a substitute) to toggle between a “speech” mode (more about mouth movement and the whole “talking fish” appeal, and a “music” mode that’s more about the fish flopping around in time to music.

4. Cleaner code. I’m certain there’s a lot of leftovers in the code from the mashup I did. I welcome any efforts to clean it up.

5. Use a smaller Arduino. The Uno and Motor Shield are totally overkill for what we’re using it for. I think that an Adafruit Feather and their 2-motor shield for the feather would be a nice alternative. Perhaps you can have one powering the mouth and a separate one powering the tail-head motor.

5 People Made This Project!

Recommendations

  • Make it Move Contest

    Make it Move Contest
  • Casting Contest

    Casting Contest
  • Woodworking Contest

    Woodworking Contest
user

We have a be nice policy.
Please be positive and constructive.

Tips

If you are using the same power source to power the speakers and run the arduino, you may experience a buzzing sound. This is due to a ground loop between power negative and the audio. You will need to use a small 1:1 audio isolation transformer on your audio line to break this loop.

7 Questions

Got it! I just needed to reverse the motor and ground wires! Now if I can just get Katrina's code to work to move the head out I'll be a happy camper . . .

Hey Donald. I have the same setup kaiS30 had a year ago (I didn't notice an answer, though). When I connect the red and orange wires I just get a clicking sound, even without any sound input. I think I uploaded the .ino file correctly to the Arduino but I just can't figure out what I'm doing wrong. Thanks so much for your help. -- John (johnsigwald@texasonline.net)

What can I use in place of the adafruit motor shield v2?

You said that you used a 2nd Arduino to move the tail, did you really mean a 2nd Ardunio, or was it a 2nd Adafuit motor shield, stacked, so you could control more than 2 Servo's? Also, I was thinking of using a bluetooth receiver inside of billy, coming out of its aux out to a splitter, then to the speaker, and the motors, so that alexa does not have to be inside of billy. Is this feasible?

Hey Scott! Sorry for the late reply. So cool that you got Bluetooth working. To clarify, I actually used a second Arduino with a simple smaller motor shield from Pololu to just run the tail back and forth now and then (nothing interactive). I just could figure out how to run both the mouth motor loop and the tail motor loop in parallel on the same board without slowing down the mouth motor sensitivity.

1 more answer

To answer my own question, yes the bluetooth receiver works. One three usb power bank inside of billy powering the Arduino, Speaker, and Bluetooth receiver makes him completely wireless. Just have to recharge the power bank every so often.

0

Hey Donald! This is amazing. I've never worked with any Arduino or the like. After reading multiple posts on reddit and the comments on here, I was curious if we were going to get an update for the tail/head movement? I see pieces of information everywhere, but I haven't found anything as beginner friendly as your post!

I eventually solved it the hard way by cramming a whole second Arduino in there just to handle the tail movement. It was a dumb and expensive way to pull it off, but someone made me an offer to buy one that I couldn't refuse, so I made it work. What I'm excited to try for another run at this is this technique for using a raspberry Pi Zero to both host Alexa and drive the motors. https://howchoo.com/g/otewzwmwnzb/amazon-echo-furby-using-raspberry-pi-furlexa I'm not sure if the mouth will be as responsive with this method, but I like the idea of everything being contained inside the Billy Bass.

0

Wanna make me one? $

I'm just getting stuck at this point with this error message.
Arduino: 1.8.5 (Windows Vista), Board: "Arduino/Genuino Uno"

libraries\Adafruit_Motor_Shield_V2_Library\Adafruit_MotorShield.cpp.o (symbol from plugin): In function `Adafruit_MotorShield::setPWM(unsigned char, unsigned int)':

(.text+0x0): multiple definition of `microstepcurve'

libraries\AFMotor\AFMotor.cpp.o (symbol from plugin):(.text+0x0): first defined here

collect2.exe: error: ld returned 1 exit status

exit status 1
Error compiling for board Arduino/Genuino Uno.
Exception in thread "Thread-16" java.util.ConcurrentModificationException
at java.util.LinkedList$LLSpliterator.forEachRemaining(LinkedList.java:1239)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
at cc.arduino.contributions.libraries.LibrariesIndexer.rescanLibraries(LibrariesIndexer.java:127)
at processing.app.BaseNoGui.onBoardOrPortChange(BaseNoGui.java:683)
at processing.app.Base.onBoardOrPortChange(Base.java:1313)
at processing.app.Editor$DefaultExportHandler.run(Editor.java:2198)
at java.lang.Thread.run(Thread.java:748)

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

54 Comments

Hallelujah! This looks promosing. Thank you!

How can I purchase this??

I just checked Amazon and those Billy Bass fish are $40 and up.Definitely going to watch yard sales for one.

4 replies

Yeah, definitely shop used. I got this one as a discounted Used, as-is item from an amazon reseller. It arrived DOA, but I was going to tear it apart anyway, so no big deal. I recommend saving a search for "broken Billy Bass" on eBay and keeping an eye on the feed. Typically it's just a loose wire or shorted connection. Worst case, you've got parts for the next fish.

You bet. Though now that I'm looking closely at those AliExpress ones, I don't see any indication that the tail moves. Still, I'm curious to see how close it is to the original. It definitely would be great if there were a $15 source for these things.

For what it's worth, AliExpress has some knockoffs for around $15 that could be a good alternative (search for Singing Fish). I just ordered one to see if they're any good. So crazy that it somehow costs $1.50 to ship a new one from China, but it costs $15 to ship broken ones on eBay.

Really cool tutorial! I'm currently using the Adafruit Feather and motor FeatherWing and I also am using the built-in speaker inside Billy Bass. However, I'm having tons of white noise constantly blaring through the speakers. I am suspecting it's noise from digital GND on the Feather being shared with the analog GND from the audio input and I'm thinking to use a ferrite bead between the two GND's. Any ideas?

Has anyone made any progress in getting the head/tail to operate without the mouth lagging? I'd love to see if there are any updates to the code or additional instructions! Thanks

So I was finally able to make this. My only problems was having to find a speaker that could charge and have the aux cable plugged in at the same time and trying to control the lights on my billy bass bones fish. The speaker makes this giant noise when charging with aux cable in it, so maybe i need to be lucky when finding one that doesn't do that. The fish LEDs worked when I got it, but now only 2 out of 3 work and one of them looks like its loosing connection. I tried the Ground pin and 5v pin and the two light up, but when I put the 5v pin to the 12 pin, the code doesn't control it. So I don't know how to fix that. I also got the fish to be able to hold it's head out when it is responding with the mouth, like in the original videos.

2 replies

Well when I opened up the fish, I noticed that one led was receiving power but not working. So I replaced it with a red LED I had and now it works.Turns out my sound problem from the speaker was me not using the charging cable that came with the echo dot. I can't figure out how to make the fish dance to the music either yet, so I bought a wireless mini plug that works with the alexa. I am going to plug the arduino into that. When I tell alexa to turn off the fish, the arduino will lose power.

This sounds great! You could always wire in switch to a pin on the Arduino to trigger a generic dance mode for the fish. It wouldn't be timed with the music, necessarily, but a fun option to have.

This is so cool. I'm currently working on this project on my own fish :) I do have a question though: to operate this would require that the Arduino be constantly plugged in? If so would it be possible to potentially just run it off a portable battery source such as with the original fish. I apologize if I'm mistaken.

Thanks :)

1 reply

You could connect up a 9v battery with one of these and see how long it lasts (http://amzn.to/2rzCdMY), but I imagine it will chew through batteries quickly. I would add a power switch too. You could also try a USB rechargeable battery pack like this (http://amzn.to/2qIObjK) and see what happens. It may last longer than the 9v battery (and less wasteful) but suspect that the motor shield is going to be happier with the 9v connected power supply.

Hello Donald!

I nearly fell out of my chair when I saw you made a walk through and video about this!

I've been buying every version of Billy and other singing fish or animal i come across for some time in preparation of right now.

About 7-8 years ago, I saw the video below and swore I would build one. I found several other videos and builds similar to this one from the same time period. Great work utilizing Alexa, BTW! I've compiled a bunch of info over the years including different versions of code, although some is for MBED/ARM.

I need to go through my notes and info and review this forum so I'm not repeating what's been discussed.

There were def some clever ways to get all 3 motors reacting independently to whatever input method you decide on. I liked the idea of using a simple talk to text engine that incorporates a randomized +/- millisecond stutter while assigning a value to vowels = 0 (mouth open), consonants = 1 (mouth closed) Sorry for babbling. I'm just excited at the prospect that there are others who are into this!

cheers!

1 reply

I'm so glad you found my guide! It's a bit of a hack compared to proper animatronic program, but it's effective!

I'm gathering the parts to make this now.

Donald, given your passion for maker projects, I suggest you put together a kickstarter campaign to create Animatronic speakers for Alexa. I think it would be quickly funded and would allow for a lot of creative flexibility. Something based off of Billy the bass w/be an ideal first project. It could use a universal audio input, or be configured specifically for something such as the Amazon Dot. Cheers!

1 reply

Cool idea! I did recently pick up a couple of these dancing cat animatronic speakers to play around with. Just waiting for a free afternoon to tinker with them. http://amzn.to/2pMw2ln

After appealing to the Reddit Arduino forum, one lovely sole named Hello_Mouse gave me a few ideas to streamline the code and possibly get the tail moving without compromising the mouth movement. You can read the thread here (https://www.reddit.com/r/arduino/comments/5heyq7/n..., but the gist is that perhaps I'm wasting time by ramping the motors up and down instead of just driving them at a single defined speed. As for the tail, I'm told to investigate the "Blink without Delay" example, found here (https://www.arduino.cc/en/Tutorial/BlinkWithoutDel... and explained here (https://www.baldengineer.com/blink-without-delay-e.... I did some playing around with it and I'm optimistic, but it will take some time for me to figure out how to swap out the LED example given for a motor function. Seems possible, though.

That's it. Just wanted to give you all an update. I'm also exploring a way to simply drive both motors separately using two Arduinos and two inexpensive DC motor shields from Pololu.