The electric giraffe (aka 'Rave Raffe') is a shy, nocturnal creature of the Playa. It can sometimes be found roaming the streets of suburbia where it elicits awe amongst the spectators. Native of Southern California, the 'Raffe can sometimes be coaxed further afield for special occasions.
Enter now the world of the Electric Giraffe, and behold the beauty of its design, marvel at its engineering and revel in the presence of the World's first robotic giraffe.
Each joint calls for a two channel servo driver, and I decided to add current sensing capability to this. By continuously monitoring the current drawn by the motor, the circuit should be able detect the increase in current that occurs when the motor is stalled - because the neck has hit an obstruction or the mechanism has jammed - and shut down the servo drive before too much damage is done.
The circuit is split into three parts: Firstly, a current sensing resistor; second, a low-pass filter; thirdly, an amplifier. The output from this is then fed into a standard CAN (Controller Area Network) circuit driven by a PIC chip.
The principle of measuring current with a current sense resistor is very simple: you put a low-value resistor in series with the power supply, and measure the voltage across it. The resistor can be placed either at the power supply's positive terminal ("high-side"), or negative terminal ("low-side"). Using the low side is slightly simpler as one end of the resistor is grounded. It has some disadvantages (the ground voltage level for the circuit being sensed is raised up by the voltage across the resistor, and it cannot measure if the load is shorted to ground), however those aren't a problem for this application.
The current flowing through the motor passes through the current sense resistor, developing a small voltage of V = IR. I have estimated the maximum servo current to be 5A (this will be confirmed when I get the actual servo specifications). With a resistance of 0.05 ohms, this will give a voltage range of 0 - 0.25V for a current of 0 - 5A.
The power rating of the resistor is important here. Power is calculated as P = I2R, so at 5A this would give me a power rating of 5*5*0.05 = 1.25W. This is the minimum wattage for the current sense resistor.
Before being amplified, the signal passes through a 7Hz low-pass RC filter. This is simply a 220 ohm resistor and a 100uF capacitor arranged so as to block any high frequency noise that may be present on the sensor, for example voltage spikes caused by the servo motor's operation. The motor will only need to be sampled a few times per second, so I chose 7Hz as the cut-off frequency for the filter to avoid any aliasing effects when sampling. Aliasing occurs when signals are sampled more slowly than half their maximum frequency component, and causes the high frequencies to appear as if they were low frequency changes, giving you an erroneous result.
The next stage is a non-inverting amplifier. An amplifier is necessary here because the chip's analogue to digital converter is not especially precise, so amplifying the signal from 0 - 0.25V into the range 0 - 2.5V allows me to use more of its range, giving a more precise current measurement.
Because the amplifier output needs to operate down to zero volts, I chose the LM358 dual operational amplifier. This 8-pin IC contains two amplifiers with an output swing of 0V to Vcc -1.5V. Normal amplifiers cannot drive their output to the power rails, so a "rail to rail" amplifier is needed for an application like this - however in this instance I only need to include the 0V rail, so the LM358 will do the job just fine.
The two feedback resistors are arranged to give me an amplifier gain of 10.
Finally, the signal passes through a 20 ohm resistor before being fed into the PIC chip's analogue to digital converter. The 20 ohm resistor is recommended to ensure the amplifier remains stable when driving a capacitive load.
Even though neither of these things are a problem (the CPU is plenty powerful enough, and the UI functions perfectly) I still wanted to make the changes because, well, I'm a bit of a perfectionist.
I decided that it was finally time to bite the bullet. I have split the frame generation off into its own thread so it can now be run on a separate core to the UI, keeping the UI nice and responsive. The difficulty here was ensuring everything is synchronised and thread-safe, but a sprinkling of critical sections here and there have got it covered.
Replacing the rendering engine is a much harder prospect. At the moment everything is written using Windows controls (they're owner drawn so that they have their own visual style, but they're still standard components.) I'm going to use OpenGL for the rendering, and scrap all the Windows controls. This means that I have to write from scratch all my own UI widgets like buttons, checkboxes, edit boxes, list views... the works. It's a huge task. I also have to do all my own message handling, creating the whole windowing framework, processing mouse and keyboard messages - everything.
I've been working on it for a few months now and it's starting to take shape. I have implemented the basic OpenGL rendering engine, texture loading and drawing. I've implemented a small number of the basic UI widgets: buttons, drop-down lists and scroll bars. There is still a long long way to go, but I'm getting there.
We managed to make it to Maker Faire 2012 and have a great time. I was almost destroyed on the road when my trailer became unhitched from the car, and what followed was a lot of crashing about and swaying until we got to the side of the road. A very close call for me indeed!
Once at Maker Faire, we were on the news again, and had lots of fun with all the people there, selling shirts and models and having a wonderful time.
But what really took me by suprise was when a representative from the Tech Museum of San Jose stopped by, and informed me that I was one of the top exhibits ever seen at the faire, and that I was being invited to be installed at the museum for a month long exhibit! Wow, what a wonderful compliment!
And with Maker Faire out of the way, my summer schedule is more busy than ever before! Here is where I will be.
Monday, May 28th at 10am. "Memorial day parade" in Kensington.
Saturday, June 2nd at 2pm. "Art Around Adams Ave." (An artwalk on the streets of Adams. Ave. Will be at the carwash since that gives me space to walk around!)
Saturday, June 16th at 8pm to midnight. "Feast of Hammer's Ball" at Queen Bees art and performances studio, a Steam Punk oriented event. http://www.queenbeessd.com/
Friday, June 22nd thru June 24th. "Elysium Festival" A Burning Man inspired event for the local San Diego Burner's crowd. This will be a MAJOR event and I strongly suggest you attend if you can! http://elysiumfestival.org/
Saturday June 30th to Wed. July 4th. "Del Mar Fair" See the giraffe at the famous Del Mar Fairgrounds. We'll be out in the carnival ride area in the horse race arena.
After that, we'll be taking a break and hoping to get ready for heading back up to San Jose for a stay at the Tech Museum. Wish me luck!