Making a Life Sized Talking Humanoid Head With a WowWee Elvis Alive
by defwheezer in Circuits > Robots
6808 Views, 41 Favorites, 0 Comments
Making a Life Sized Talking Humanoid Head With a WowWee Elvis Alive
Using "off the shelf" parts to make a life-sized human head that moves in a life-like manner and can be made to move its mouth in sync with sound, or even manually using a joystick. Total hardware cost target: ~$200
You can also use what you learn here to apply to ANY other type of bot that uses similar dc motors to control movements (WowWee "Chimp Alive" for instance).
Potential uses: Uncanny Valley Chatbot, Halloween/party prop, Talking alarm clock, or Robotic Youtuber!
Tools: screwdriver, wire clipper/stripper, soldering iron/solder, hot glue gun.
Hardware: Arduino pro mini ($5), motor driver ($10), Sparkfun Spectrum Shield ($30), audio board ($10, optional), audio cables ($10, for audio in and out), misc solid and braided wire. If you are not comfortable with the small form factor of the Pro mini, you can always use a costlier, relatively large and easy to wire up Uno (the Sparkfun spectrum shield is made to fit on an Uno). Also, using a board with a USB connector makes programming much more convenient (no FTDI adapter needed).
Software: you will need to know how to program an Arduino at a very basic level.
A WowWee "Elvis Alive" was used as a human head. The Elvis is a very complex robotic head that has DC motors independently controlling head "roll", back and forth movements, eyes, upper lip, and the jaw. While an "Elvis Alive" bot can almost always be had on ebay for $250-400 "new", they do occasionally go for ~$100 for used ones. The reason I like the Elvis Alive is that it has an interesting "Alive" mode where it makes random movements like a strung out pop star, and says canned audio clips of Elvis himself.
As mentioned, the Elvis has an "Alive" mode (hence its name "Elvis Alive"!) which does basic random head and eye movement. The head will also track left and right using the IR detectors on the left and right front pockets on the bust.
They key for this Instructable is hijacking the jaw servo only, so we can make the bot talk in response to audio input of our own choosing instead of the factory canned audio clips of Elvis. Some things that could be used for audio input include, of course, TTS from your computer (email, weather, rss feed news, Twitter, Facebook) or simply voice clips of who/what ever you please. You could even make it speak in response to input from a microphone.
Step 1: Acquire the Elvis Alive
If you are lucky you can get one that is still in the original box and has the shipping strut still attached (plastic post that hold base and head rigid during transport). But no matter what you get, this IS a hack, so you can make do with whatever you end up and who knows, it may lead you down an entirely unexpected path. Anyhow- once you have a bot, test it to see how well it still works. These are old bots (2007-ish), so even "new" ones may not be 100% functional. You will need to have the 9V AC/DC 2.7A adaptor "wall wart", the microphone-shaped remote control, and of course the bust itself. Basic test includes putting it in "Alive" mode and making sure the head roll and left/right tracking are working. If you press the "Alive" button twice on the remote, the bot will go into "sleep" mode (centers head and eyes and then stops moving). If the left/right tracking does not work, or you hear clicking/grinding noises, fear not (yet). Often when you cut the head skin loose from the body skin, the resistance for head movement gets reduced and the left/right tracking may work perfectly. Also note that the microphone-shaped remote controller is NOT a microphone, just a IR remote to change modes and adjust volume. It is needed to put the bot into "Alive mode" and "Sleep" mode. After this hack, the volume feature on the remote control will no longer work since we are going to disable all the original internal audio. The original manual can be referenced at hightechscience.org - Elvis_Manual.pdf.
Brain Surgery - A: Get the Hair Out of the Way
We need to get inside this fellas head, literally, to get access to a couple of sets of wires (from his jaw motor). To get into the head, we just need to remove the back of the skull. Cracking open the head involves moving the hair from at least the bottom back of the head where it is attached to the skull by glue, cutting the glued skin from the ears down on both sides, and removing the screws. To remove the wig, pull it at the base of the skull where it is glued and it will come right off. The wig is also attached to the top of the head by some threads connecting the wig to the rubber flesh, but if you want to keep the hair, just pull the wig over the top of the head as shown in the photo.
Brain Surgery - B: Prepare to Crack Open Head
With the hair out of the way, now we can:
1.) Remove the screws (see photo),
2.) Cut the skin from the back part of skull (from behind the ears to the bottom)
Note about cutting the skin: Use a technique similar to dissection- pull the flesh out with one hand and cut with the other hand, with a very sharp blade, as close to the plastic as possible (while gently pulling the flesh back). Only pull back the skin on the back skull piece, just enough to free the back of the skull so we get remove it.
Brain Surgery - C: Crack Open Head
Once you get the back of the head off you will see lots of wires and boards. Don't freak out! We only need to access two sets of wires- the jaw motor wires (a pair of wires) and the jaw motor position sensor (potentiometer, three wire set).
The wires are labeled in the photos.
Brain Surgery - D: Isolate Motor and Sensory Nerve Fibers for Later Use.
OK, the head surgery is pretty much done now! If you managed to isolate the motor and sensory nerve fibers (those wires we talked about in the last step, and show in isolation in the photo for this step), you are officially a junior brain surgeon! Now let's move on to the base...
Open Up the Base
You are going to want to find a spot where you can lay the robot down on it's back with some room left at the front. After you remove all the screws, pull the top off the base and you will behold a number of different boards in the base, and also some more on the inside of the bust. Lets go through them one at a time.
First of all the main CPU board, or the "brain" of the bot is in the upper center of the base. Treat it with care!
Lower down and closer to the front are the power board (right) and sound board (left).
The two pink things on either side are part of the speaker enclosures.
Also in the front is a small audio input board with input jacks and three sets of wires- audio IN, Microphone IN, and "audio IN jack detected". We don't need any of these, so they can be repurposed if desired. However, the "audio IN jack detected" wire should be disconnected from the main CPU. If the "audio IN jack detected" wires are shorted, the bot will go into "sleep" mode (to prevent audio noise from the servos! BAD WowWee! Also means we can't use the internal sound board for our audio while running servos = noise).
Dealing With Audio Board- Option 1, Leave It Be.
The easiest thing to do with the internal sound board is to leave it in.
You need to, at the very least:
1.) Stop the bot from saying its canned audio bits while in alive mode. Do this by unplugging the Elvis audio wire from the CPU board.
2.) Unplug the speakers from the audio board, otherwise you may hear bleeding of unwanted motor noise.
Note that the 9v power to the audio board will be used to power our Arduino MC. We can piggy back on it, so no need to even unplug from audio board.
Dealing With Audio Board- Option 2, Remove It Entirely
Remove the Board!
This is my prefered option, because I simply have no use for it, and removing it frees up space in the base for other things.
Everything can be unplugged from the audio board, and the large connector going to the main CPU board can be disconnected as well without effect the Alive mode at all. 4 screws later and the audio board comes right out ready to be repurposed or trashed.
Now we also have the 9v power wires, and two pairs of speaker wires available.
Close It Up and Make Sure Everything Is Still Working!
Now is a good time to put the bust back on the base and make sure he still operates in Alive mode. No need to screw the base in, just make sure it sits level. Power up the Elvis and he should do a little start up movement and then go into alive mode.
At this point you are going to need the remote control thingy.
Press Alive mode button the the remote once. The bot should keep moving his eyes/head around, but not talk.
Try pressing the Alive mode button twice, the bot should center his head and eyes and then go into sleep mode.
If so, then everything is working still- HoOooooRAY!! The patient is ready for transplant.
If the bot is no longer working, check the the power adapter is connected, the switch is "on" and then finally, that no wires were pulled out by mistake. To review, the only wires that should have been messed with go the the jaw motor, position sensor, and the audio board.
Transplant: Parts
The previous steps have prepared our Elvis bot for transplantation of our Arduino/motor controller/spectrum analyzer!
The good news is that the spectrum analyzer breakout board is big enough for our Arduino MC and the motor controller.
Parts:
Arduino Pro Mini (couple of $ on ebay)
Pololu MD17a DC motor controller (couple of $ on ebay)
Sparkfun spectrum shield ($30 at Sparkfun)
Audio IN/OUT extension cables ($3 each)
MIsc wire, header pins, hot glue, shrink wrap for wires
Transplant: Assemble Controller
So we have our three components for our jaw controller. The Spectrum Shield is large enough to accommodate both the pro mini MC and the motor controller as shown in the photos. Time to break out the soldering iron and assemble these. You may be able to find an alternative layout, but this is how I did mine. Header pind extend through the board where they will get wired according to the wiring diagram. Heavier gauge wire may be used on the motor power wires (same gauge is on the 9v power wires in the Elvis Alive). The other wires can be smaller gauge. For connecting pins on the assembled board, I chose to use solid wire. Power (arduino, motor position sensor, and motor power) use stranding wire because the flex more without breaking. A detailed wiring diagram is provided.
Transplant: Meld Controller to Elvis Bot
The following connections need to be made:
- 9V power to Arduino (RAW, not Vcc!!!!): Raw takes 7-12 volts while Vcc requires 5v regulated, we are using 9v from Elvis power board so it goes to RAW on the Arduino.
- 9V power to motor power (on motor controller): On Elvis, power wires: black = negative, red = positive
- Jaw motor: from motor controller to jaw DC motor: On Elvis, power wires: black = negative, red = positive
- Jaw position sensor: On Elvis, 5v (red), gnd(black), and analog input(white) from jaw potentiometer to Arduino
- Audio IN and Audio OUT
Notes:
- Piggy backing off the motor power and audio power wires seems to work well, just strip a little of the red and black wires of insulation and solder the +/- power wires from Arduino or motor controller, cover with hot glue, done.
- Spot hot glue wires to base for neatness.
- For the motor and position sensor in the head, it is easy to solder some header pins to some wires and connect them nondestructively to the exposed connectors from Step 5.
Arduino Code, Part 1
Define some pins on the Arduino:
//digital pins
const int LEDPIN=13; // light up when audio detected
const int PIN_STROBE=4; // spectrum shield
const int PIN_RESET=5; // spectrum shield
const int PIN_MOTOR_L=3; //PWM to motor open mouth
const int PIN_MOTOR_R=6; //PWM to motor close mouth
const int PIN_MOTOR_SLEEP=7; //sleep fxn on motor board
const int PIN_MOTOR_STALL=8; //stall warning on motor board
//analog pins
const int PIN_LEFT=0; // L analog from spectrum shield
const int PIN_RIGHT=1; // R analog from spectrum shield
const int PIN_MOTOR_POT=3; //analog potentiometer on motor
It turns out you really do not need to "close" the mouth with the motor- the gear box appears to relax to the closed position by itself. This makes movement control even easier since we only need to "open" the mouth, that is, run the motor in one direction. Still, might as well wire it up and program for it just in case.
We need to set up two arrays to hold the signal from each of seven bands on both the L and R channels
// spectrum shield band arrays
int left[7];
int right[7];
Set the min and max for the jaw movement:
int minRotation = 400; //approximate reading when mouth closed
int maxRotation = 600; //approximate reading when mouth open
Initialize:
void setup() {<br> pinMode(LEDPIN, OUTPUT); // LED
//initialize spectrum board related pins
pinMode(PIN_RESET, OUTPUT); // reset
pinMode(PIN_STROBE, OUTPUT); // strobe
digitalWrite(PIN_RESET,LOW); // reset low
digitalWrite(PIN_STROBE,HIGH); //pin 5 is RESET on the shield
}
To read the spectrum analyzer, use call the following:
void readMSGEQ7()<br>{
//reset the data
digitalWrite(PIN_RESET, HIGH);
digitalWrite(PIN_RESET, LOW);
//loop thru all 7 bands
int sumRight = 0;
int sumLeft = 0;
for(int band=0; band < 7; band++) {
digitalWrite(PIN_STROBE,LOW); // go to the next band
delayMicroseconds(20); //gather some data
left[band] = analogRead(PIN_LEFT); // store left band reading
//right[band] = left[band]; //use this only for MONO!
right[band] = analogRead(PIN_RIGHT); // store right band reading
digitalWrite(PIN_STROBE,HIGH); // reset the strobe pin
sumRight = sumRight+right[band]; // get the sum from all bands
sumLeft = sumLeft+left[band]; // get the sum from all bands
if(left[band] > 100 || right[band] > 100) {
digitalWrite(LEDPIN,HIGH); // sound detected
}
else {
digitalWrite(LEDPIN,LOW); // reset low
}
}
}
This routine creates a 7x20 msec (140 millisec) delay. Just saying. When running motors, it is always good to keep any hard delays in mind (since you will have no control of the motor while delay active, it could be running at full speed).
After calling readMSGEQ7, we can set the motor to a position based on the audio signal. In this example I use the total signal from all 7 bands, but only the Left channel (so the mouth movement will not be affected by audio on right channel). The max signal from each channel is 1024, so the theoretical max sum is 7 channels x 1024 = 7168. Practically the max will not get over 5000-6000. You could get an average input signal and set min/max from that, but I prefer something simpler. First I will constrain the sum "sumLeft"
if (sumLeft > 1024) {sumLeft = 1024}; //constrain to 1024 max
And then I map sumLeft to the min and max of the jaw position. Simple.
int mouthPosition = map(sumLeft, 0, 1024, minRotation, maxRotation);
Set some bounds for the mouth position as target High and target Low (this prevents the motor from trying to get to the exact position and instead allows a range (+/- "posError").
targetH = target_mouthPosition + posError;<br>targetL = target_mouthPosition - posError;
Downloads
Arduino Code, Part 2
Open the mouth:
void motorForward(int Speed) {
if(current_mouthPosition < targetL) {
analogWrite(motor1Pin_O, Speed);
analogWrite(motor1Pin_C, 0);
currentSpeed = Speed; //save the current speed
}
else {
motorStop(0);
}
}
void motorReverse(int Speed) {
if(current_mouthPosition < 100) {
Speed = Speed/2;
}
if(current_mouthPosition > targetH) {
analogWrite(motor1Pin_O, 0);
analogWrite(motor1Pin_C, Speed);
currentSpeed = Speed; //save the current speed
}
else {
motorStop(0);
}
}
void motorStop(int Speed) {
analogWrite(motor1Pin_O, 0); //motor controller pin for opening mouth
analogWrite(motor1Pin_C, 0); //motor controller pin for closing mouth
}
Other Options for Audio to Jaw Control
Blue Point Engineering has a nice AutoTalk Controller ( Audio to Servo Control ), $65 plus shipping. http://www.bpesolutions.com/asoundeuip.html
Upside is it is already set up to do exactly what we have done- control a single motor.
Downside is it is custom made and designed to work with an RC servo, so some mods might be needed to make it work with the Elvis motor/position sensor. Cannot add additional features like motion sensing, additional motors, lights, etc. like we can with the Arduino (3-4 extra analog pins and 4-5 extra digital pins!).
The Final Talking Head...
A short video of the final product talking from audio generated by the computer text-to-speech. Note that I added a Mini Hi-Fi PAM8610 Audio Stereo Amplifier 2X10W Dual Channel D Class Module ($7/ebay) hooked the the original speakers and with the volume control knob right in front. Audio input comes from a splitter cable on the audio output from the Sparkfun spectrum board.