Project : Voodoo

Overview

This page will cover the development process of my mini project: an Animatronic Teddy bear. The goal was to control a big teddy bear using another smaller scaled version of the teddy bear as a remote control. The big teddy bear should mimic what is done to the smaller one when activated. The concept of motion control will be discussed as well as a few other subjects such as animatronics and where this project can be applied.

Introduction

Jurassic park, Gremlins, Little shop of horrors, Aliens, Jaws, Terminator, E.T. – The extraterrestrial, King kong. If you haven’t been living under a rock your whole life – then I’m sure you’ve seen or at least familiar with the aforementioned titles. These films have a lot in common, first of all they’re all awesome(to me anyway), these are films that mean a lot to me because I watched them a lot growing up. I still remember how much these films blew me away back then, and they still do to this day. Another thing they have in common is that they feature fictional creatures, creatures that could not be put on film unless someone artificially puts them in the shot(yes, the infamous CGI), or someone put a rubber suit on and be filmed. I have no objections with rubber suits as I love practical effects, but what if it’s 3000 lb. shark? Or a 50ft Gorilla? How about a little furry creature the size of a rabbit? If you ask filmmakers nowadays they’ll most likely answer you with three letters – C G I. CGI is good when done correctly and in moderation, but it’s still not perfected and most CGI does not fool my eyes to thinking that the creature is real, it feels like it’s just drawn there. The films I mentioned above are brilliant in the sense that they used CGI sparingly and actually made physical models of these beasts. These robotic models move using motors and hydraulics just to mention a few actuators, and are controlled remotely by operators, this practice is called Animatronics. Building the models and having them infront of the camera to be filmed gets rid of that “intangible” feeling that one gets when watching a film with bad CGI. With animatronic robots infront of the screen: there’s actually something in there, you can nearly feel them and their movements does not look artificial – there’s flow to them and they look natural. The main drawback with animatronics is that building the robots can be quite expensive especially when you compare it to the costs if one is to do it with CGI. I’m biased as I love practical effects, plus I love robots and so there’s no question which method I’d choose.

Gremlins – Gizmo Cutaway

Jaws, yes his/her name is jaws I don’t care what people say

This post is going to be the about my mini project which is an animatronic teddy bear which is controlled via motion control. Please note that I call it “animatronic” loosely, it is a very base model, I have to admit that I did not have time to build what I originally planned as time was sparse(I wanted him to talk! and have voice recognition, and have a camera, and and…I’ll be here all night). The teddy bear head movements will be controlled by a gyroscope and the arms will be controlled by potentiometers and servo motors will act as the actuators – simple enough. The project will use Nintendo’s “Wii motion plus” accessory as it’s gyroscope as it’s the only one I have lying around. I wanted to get a teddy ruxpin as well for the teddy as it has motors in it already but my search was unfruitful. Oh and yes, Chucky – you’re thinking of chucky, I would love to make a chucky version but this certain project is meant to be a toy and aimed at children so I can’t freak them out, also I have to change that project name – it sounds too sinister.

Animatronics

Roots of animatronics:

The use of puppets to entertain people has been around for centuries. A great example would be back in the late 1400’s when Leonardo da Vinci built the Automata Lion to entertain the king of France. Stories say that it could walk and present you with flowers at the end of its performance. The automaton was meant to be programmable, nothing less from one of the greatest polymaths to ever have lived. The original robot has been lost, but a museum dedicated to Leonardo tried to recreate the robot using his design:

Another one of da Vinci’s inventions was an automaton people like to call “Leonardo’s robot”, again invented back in the late 1400’s. This time da Vinci wanted it to be as human-like as possible. With his work with the Vitruvian man he accomplished this goal to an extent:

Leonardo’s Robot

Modern animatronics:

Animatronics was developed by the Walt Disney company back in the 1960’s. An animatronic puppet is defined as a figure that can be animated using electromechanical devices. One of the earliest examples of animatronic puppets were found in the 1964 World fair in New York where a puppet of Abraham Lincoln was built and was animated to give the Gettysburg address. And of course if anyone has been to Disneyland; they have one of the oldest animatronic puppets on display.

The original Lincoln puppet

Animatronics in Film:

After the Walt Disney company paved the way for animatronics: it was utilised in many other ways by the entertainment industry. The invention of these puppets made such a huge wave in the movie industry, they could now express themselves more freely and make characters from their imaginations come to life. One of the greatest examples of this, as said above is a well-known film called Jurassic Park:

Jurassic Park – Animatronics

Project:Voodoo

Concept:

The main goal of the project was: Make a prototype of a toy that will entertain both children and their parent/s or guardian. I tried to achieve this by using the concept of “Voodoo” by which a small teddy bear will be used to control a bigger teddy bear. Whatever is done to the small teddy bear will be reflected onto the bigger teddy bear just like a voodoo doll. Motion control was the first choice of type of sensor as it has a novelty to it that I’m sure both kids and parents will love. This idea was lent to me by our Lecturer Dr. Ted Burke.

Materials used:

  1. Nintendo Wii Motion Plus
  2. dspic30f4011
  3. Pickit2 Programming kit
  4. Breadboard and small components i.e. resistors/wires
  5. Servo motors
  6. Potentiometers
  7. Teddy bears

Motion Control:

Wii Motion Plus

If one reads my pasts posts here and here: you’ll see that I’ve already dipped my toe in the world of accelerometers and gyroscopes. I don’t want to repeat myself and so if you want to read about gyroscopes and accelerometers: please click on the links above and there is a “so-so” in depth discussion about the aforementioned subjects above.

I decided to go with using a gyroscope rather than an accelerometer on this project. I feel that this is more suitable as one can always recalibrate(as it can be seen later) the system so that it can be operated at any position. Imagine trying to trick someone and hiding the small teddy behind you, if it uses an accelerometer then it will capture the current orientation of the device and so you cannot control it properly whilst hiding it, it will always take the center of the earth as reference. Gyroscopes on the other hand – can be recalibrated and take any orientation of the controller as a reference. So even if one is hanging from a tree upside down with the controller; if the recalibration button is pressed: then the system will think that the upside down orientation is the same as the orientation as the tedd bear being controlled whereas if it was an accelerometer then the teddy controlled will try to go upside down.

Also I shall be using Nintendo’s Wii motion Plus controller as head sensor. The wii motion plus has a 3 axis gyroscope which detects the pitch, yaw, and roll of the sensor. The pitch and the yaw values are used control the head movements of the big teddy bear. IIC or I2C is used to communicate with the Wii motion plus, again read my recent posts if you want to see how this works.

Calculations:

Gyroscope – Mechanics

It can be seen on the image above the concept of how a gyroscope works. I can be seen that when the wheel is stationary there is no velocity on the two axes but once the system is moved they gain some velocity and then goes statinary once more. The way I calculated for the orientation of the gyroscope is as follows:

  1. Calibrate the system for a “zero” i.e. take one point as your reference point
  2. Take readings from the axes and subtract it from the “zero” that was taken from above
  3. Scale it into degrees

The idea is that when the system isn’t moving then the values should be equal to the “zero” values or the reference values and so they should cancel out and therefore it can be said that there is no movement. One of the big problems with gyroscopes though as mentioned in my recent post is drift. These are really small and minute errors but accumulate especially when one is sampling at a very high frequency as I am. My way to compensate for this is having a “recalibrate button” which sets everything back to zero and sets the motors to their original state i.e. 90 degrees. By using the formulas below I was able to track the orientation of the head.

Gyroscope Readings

0˚ Reading 90˚ Reading 180˚ Reading
Yaw -6000 8054 22000
Pitch -6300 7744.6 21700
Roll -6400 7623 21500

calc

The arms were simple enough as they were only two potentiometers or voltage dividers. Different positions of the arms will give different resistances and in turn: will give different voltage outputs. The potentiometer was just scaled 1:1 with the angle of the servo motor used to control the arms. The full reference voltage was fed into the potentiometers and so the values expected out of them would be from 0-1023 in digital units when passed through the analog to digital module of the dspic30f4011.

Potentiometer

Construction:

finalvoodoo

Final Circuit Diagram – Click to view full size

The controller

The first thing that was constructed was the controller. The Wii motion plus was stuffed inside the little teddy bear’s head and below it is a cut up piece of breadboard that will be inserted onto the body of the small teddy. On the breadboard: the potentiometers that control the arms are mounted. Below the potentiometers are two LEDs which will indicate whether the system is online or not. One LED means that the system is on but not activated and two lamps on means that you are online and moving the small teddy will move the big teddy as well. The two toggle buttons on the controller are for recalibration and activating the teddy. If the recalibrate button is pressed: the program will recalibrate the wii motion plus sensor and will also move the servo motors on the big teddy to go on its “neutral” position, this solves the problem of drift of the gyroscope. The other button helps with the drift as well as the controller will only be turned on if one wants to move the teddy bear.

20121128-000330.jpg

Frankenteddy

The next step is the body construction. I would like to take this opportunity to give credit to Colin Boyce from the same robotics class as me as he is the one who built the timber frame with the slots for the big teddy bear body, go and pay his blog a visit. As it can be seen below the frame is made of wood with holes cut in to slot the two servo motors that will control the arms. The materials used are just scrap that we found one night around DIT.

Body

Arms made from an old exit sign

The motors for the head are the exact same as the one used for Blue the pan and tilt robot. finally the frame and the head motors were slotted on a teddy which I bought and ripped apart with the help of Mike Ward and Colin Boyce. Below is a decapitated teddy bear and the circuit encased in a box so that it would be a bit more durable.

20121128_163057

Head’s up

Final Circuit

Final Circuit

Voodoo BearAnd without further ado, here’s the first ever test of the whole system. The arms aren’t moving in this demonstration as this was the first test, and I’m afraid this is the only video I can show you demonstrating the teddy bear as I encountered numerous problems when testing out the teddy bear. But yes here’s Voodoo Teddy Run #1 and below it is the code:

Arm movement code(dspic#2):


//
// Arm movements -Project:Voodoo
// Program written by Gian Lorenzo
// Last edited 26/11/2012 1:39AM
//

#include <libpic30.h>
#include <p30f4011.h>
#include <stdio.h>
#include <xc.h>

// Configuration settings
_FOSC(CSW_FSCM_OFF & FRC_PLL16);  // Fosc=16x7.5MHz, Fcy=30MHz
_FWDT(WDT_OFF);                   // Watchdog timer off
_FBORPOR(MCLR_DIS);               // Disable reset pin

// Function prototypes
void setup();								// Configure pins etc
unsigned int read_analog_channel(int n);	// Reading analog channel
void pause(unsigned int ms);				// Pause function(in ms)
void checkbuttons(void);					// Check toggle buttons
int status=0, statusflag=0;
int leftvoltage,rightvoltage;
void updateservos(void);

int main()
{
	setup();				// Set up which pins are which and set up i2c and configs
	pause(1000);			// 1 second startup delay

	while(1)
	{
		online = 1;
		checkbuttons();
		if(status)
		{
			updateservos();
		}
		else if(!status)	active=0;
	}

    return 0;
}

void setup()
{
    // Setup UART
	__C30_UART=2;			// Use secondary UART
    U2BRG = 48;            	// 38400 baud @ 30 MIPS
    U2MODEbits.UARTEN = 1; 	// Enable UART

    // Configure D ports as a digital outputs
    LATD = 0;
    TRISD = 0b11110000;

    // Configure analog inputs
    TRISB = 0x01FF;      /* Port B all inputs */
    ADPCFG = 0xFF00;     /* PORTB 0-7 are analog inputs */
    ADCON1 = 0;          /* Manually clear SAMP to end sampling, start conversion*/
    ADCON2 = 0;          /* Voltage reference from AVDD and AVSS */
    ADCON3 = 0x0005;     /* Manual Sample, ADCS=5 -> Tad = 3*Tcy = 0.1us */
    ADCON1bits.ADON = 1; /* Turn ADC ON */

    // Configure PWM
    // PWM period = Tcy * prescale * PTPER = 0.33ns * 64 * 9470 = 20ms
    PWMCON1 = 0x00FF; // Enable all PWM pairs in complementary mode
    PTCON = 0;
    _PTCKPS = 3;      // prescale=1:64 (0=1:1, 1=1:4, 2=1:16, 3=1:64)
    PTPER = 9470;     // 20ms PWM period (15-bit period value)
    PDC1 = 0;         // 0% duty cycle on channel 1 (max is 65536)
    PDC2 = 0;         // 0% duty cycle on channel 2 (max is 65536)
    PDC3 = 0;         // 0% duty cycle on channel 3 (max is 65536)
    PTMR = 0;         // Clear 15-bit PWM timer counter
    _PTEN = 1;        // Enable PWM time base
}

// Analogue input reading
unsigned int read_analog_channel(int channel)
{
    ADCHS = channel;          // Select the requested channel
    ADCON1bits.SAMP = 1;      // start sampling
    __delay32(30);            // 1us delay @ 30 MIPS
    ADCON1bits.SAMP = 0;      // start Converting
    while (!ADCON1bits.DONE); // Should take 12 * Tad = 1.2us
    return ADCBUF0;
}
void pause(unsigned int ms)
{
	__delay32(30000L*ms);	// 1ms Pause = (ms * FCY/1000)
}
void checkbuttons(void)
{
	// Check toggle button status
	if(status==0 && read_analog_channel(0) >500)	statusflag=1;
	if(statusflag==1 && read_analog_channel(0) <500)	status =1;
	if(status==1 && read_analog_channel(0)>500)	statusflag = 0;
	if(statusflag ==0 && read_analog_channel(0) <500)	status=0;
}

void updateservos(void)
{
	leftvoltage = read_analog_channel(1);
	rightvoltage = read_analog_channel(2);
	PDC1 = 550+(1.6*leftvoltage);
	PDC2 = 550+(1.6*rightvoltage);
	pause(5);
}

head movement code(dspic#1):


//
// Head movements Project:Voodoo
// Program written by Gian Lorenzo
// Last edited 26/11/2012 1:39AM
//

#include <libpic30.h>
#include <p30f4011.h>
#include <stdio.h>
#include <xc.h>
#include <i2c.h>
#include <math.h>

#define servomin	550
#define servomax	2200
#define active	_LATD0
#define online	_LATD2
#define	left _LATD1
#define	right _LATD3

// Configuration settings
_FOSC(CSW_FSCM_OFF & FRC_PLL16);  // Fosc=16x7.5MHz, Fcy=30MHz
_FWDT(WDT_OFF);                   // Watchdog timer off
_FBORPOR(MCLR_DIS);               // Disable reset pin

// Function prototypes
void setup();								// Configure pins etc
unsigned int read_analog_channel(int n);	// Reading analog channel
void wiimp_init();							// wiimp initialisation/Handshake
void calibrate();							// Calibrate for zeros
void wiimp_read(unsigned char*);			// Reading data from the Wii wiimp
void pause(unsigned int ms);				// Pause function(in ms)
void checkbuttons(void);					// Check toggle buttons
void updatehead(void);					// Update servo angles

double yawzero,pitchzero,rollzero;
double yaw,roll,pitch, deltayaw, deltaroll,deltapitch;
unsigned char  wii_data[20],c; 				// Nunchuk data array
int status=0, statusflag=0, recalibrate=0;

int main()
{
	unsigned int ax,ay,az;  // Data containers
	setup();				// Set up which pins are which and set up i2c and configs
	pause(1000);			// 1 second startup delay
	wiimp_init();			// Initialise wii motion plus
	pause(1000);
	calibrate();			// Calibrate for 0

	while(1)
	{
		online = 1;
		checkbuttons();
		if(status)
		{
			active=1;
			wiimp_read(wii_data);                   	    // Read data from nunchuk

			ax = ((wii_data[3] & 0xFC) << 6) + wii_data[0];	// Extract gyroscope yaw byte
			ay = ((wii_data[4] & 0xFC) << 6) + wii_data[1];	// Extract gyroscope roll byte
			az = ((wii_data[5] & 0xFC) << 6) + wii_data[2];	// Extract gyroscope pitch byte

			yaw = ax - yawzero;
			roll = ay - rollzero;
			pitch = az - pitchzero;

			deltayaw = deltayaw + yaw;
			deltaroll = deltaroll + roll;
			deltapitch = deltapitch + pitch;

			updatehead();
			printf("%1f\r %1f\r %1f\r\r\n", deltayaw, deltaroll, deltapitch);
		}
		else if(!status)	active=0;

		if(recalibrate)
		{
			deltayaw =0;
			deltapitch =0;
			deltaroll =0;
			updatehead();
		}

	}

    return 0;
}

void setup()
{
    // Setup UART
	__C30_UART=2;			// Use secondary UART
    U2BRG = 48;            	// 38400 baud @ 30 MIPS
    U2MODEbits.UARTEN = 1; 	// Enable UART

    // Configure D ports as a digital outputs
    LATD = 0;
    TRISD = 0b11110000;

    // Configure analog inputs
    TRISB = 0x01FF;      /* Port B all inputs */
    ADPCFG = 0xFF00;     /* PORTB 0-7 are analog inputs */
    ADCON1 = 0;          /* Manually clear SAMP to end sampling, start conversion*/
    ADCON2 = 0;          /* Voltage reference from AVDD and AVSS */
    ADCON3 = 0x0005;     /* Manual Sample, ADCS=5 -> Tad = 3*Tcy = 0.1us */
    ADCON1bits.ADON = 1; /* Turn ADC ON */

    // Configure PWM
    // PWM period = Tcy * prescale * PTPER = 0.33ns * 64 * 9470 = 20ms
    PWMCON1 = 0x00FF; // Enable all PWM pairs in complementary mode
    PTCON = 0;
    _PTCKPS = 3;      // prescale=1:64 (0=1:1, 1=1:4, 2=1:16, 3=1:64)
    PTPER = 9470;     // 20ms PWM period (15-bit period value)
    PDC1 = 0;         // 0% duty cycle on channel 1 (max is 65536)
    PDC2 = 0;         // 0% duty cycle on channel 2 (max is 65536)
    PDC3 = 0;         // 0% duty cycle on channel 3 (max is 65536)
    PTMR = 0;         // Clear 15-bit PWM timer counter
    _PTEN = 1;        // Enable PWM time base
	// Configure I2c
	I2CCONbits.I2CSIDL = 1;	// Stop module in idle mode
	I2CCONbits.A10M = 0;	// 7-bit address
	I2CCONbits.DISSLW = 0;	// slew rate control. Required to be on for 400kHZ
	I2CBRG = 272;			// 272 for 100kHz at FCY = 30MHz formula next line
							// I2CBRG = (((1/rate)-900ns)*FCY)-1
	I2CCONbits.I2CEN = 1;	// Enable i2c
}

void calibrate(void)
{
	int o = 0;
	if(o == 0)	// Get rid of bad readings
	{
		wiimp_read(wii_data);
		wiimp_read(wii_data);
		wiimp_read(wii_data);
		wiimp_read(wii_data);
		wiimp_read(wii_data);
		wiimp_read(wii_data);
		wiimp_read(wii_data);
		pause(2000);
		o++;
	}
	int i=0;		//flag
	yawzero=0;
	rollzero=0;
	pitchzero=0;

	// Average 20 readings to get zeros

	for (i=0;i<20;i++)
	{
		wiimp_read(wii_data);
		yawzero=(((wii_data[3] & 0xFC)<<6)+wii_data[0])+yawzero;
		rollzero=(((wii_data[4] & 0xFC)<<6)+wii_data[1])+rollzero;
		pitchzero=(((wii_data[5] & 0xFC)<<6)+wii_data[2])+pitchzero;
	}
	yawzero=yawzero/20;
	rollzero=rollzero/20;
	pitchzero=pitchzero/20;
	printf("calibrated \nyawzero = %f rollzero=%f pitchzero=%f", yawzero,rollzero,pitchzero);
	pause(1000);
}
void wiimp_init(void)
{
	StartI2C();			// Open I2C bus
	IdleI2C();			// Wait for last command to finish
	MasterWriteI2C(0xA6);// Call device adress 53(Wii wiimp)
	MasterWriteI2C(0xFE);// Handshake protocol for wii wiimp
	MasterWriteI2C(0x04);
	StopI2C();
	printf("connected\r\n");
}

void wiimp_read(unsigned char* array)
{
	int idx;	// Counter

	// ---- Request measurement ---- //
	StartI2C();		// Open I2C bus
	IdleI2C();		// Wait for last command to finish
	MasterWriteI2C(0xA4); // Call the adress you want to read from
	MasterWriteI2C(0x00);
	StopI2C();		// Stop I2C
	pause(10); 	// 3 ms or more required or acquisition goes wrong

	 //Request reading
  	StartI2C();	// Open I2C bus
	IdleI2C();	// Wait for last command to finish
	MasterWriteI2C(0xA5);	// 0XA5 is the read adress of the wii wiimp(52+1)
	IdleI2C();	// Wait for last command to finish
	 //Bytes reception
	for(idx = 0; idx < 5; idx++)
	{
		array[idx] = MasterReadI2C(); 	// Store the values into an array
		AckI2C(); 						// Send an ACK to notify wiimp to send next byte
		IdleI2C();						// Wait for last command to finish
	}
	pause(1);
	array[5] = MasterReadI2C(); 		// Last byte to be read
	NotAckI2C(); IdleI2C();				// Send a NACK to tell wiimp that reading is done
	StopI2C();							// Stop I2C
}

// Analogue input reading
unsigned int read_analog_channel(int channel)
{
    ADCHS = channel;          // Select the requested channel
    ADCON1bits.SAMP = 1;      // start sampling
    __delay32(30);            // 1us delay @ 30 MIPS
    ADCON1bits.SAMP = 0;      // start Converting
    while (!ADCON1bits.DONE); // Should take 12 * Tad = 1.2us
    return ADCBUF0;
}
void pause(unsigned int ms)
{
	__delay32(30000L*ms);	// 1ms Pause = (ms * FCY/1000)
}
void checkbuttons(void)
{
	// Check toggle button status
	if(status==0 && read_analog_channel(0) >500)	statusflag=1;
	if(statusflag==1 && read_analog_channel(0) <500)	status =1;
	if(status==1 && read_analog_channel(0)>500)	statusflag = 0;
	if(statusflag ==0 && read_analog_channel(0) <500)	status=0;
	// Check Recalibrate button status
	recalibrate=0;
	if(read_analog_channel(1)>500)	recalibrate=1;
	//Recalibration using uart
	if (U2STAbits.URXDA == 1)
	{
		c = U2RXREG;
		if (c == 'y')	deltayaw = 0;
		else if(c == 'p')	deltapitch =0;
		else if(c =='r')	deltaroll =0;
		else if(c == 'a')	deltayaw =0;deltapitch=0;deltaroll=0;
		updatehead();
	}

}
void updatehead(void)
{
	leftvoltage=read_analog_channel(3);
	PDC3 = 550+((leftvoltage/1023)*1650);
	PDC2 = 1410-(deltapitch*0.06083333333333/2);
	PDC1 = 1280-(deltayaw*.06083333333333/2);
	if(PDC1<servomin)	PDC1 =servomin;
	if(PDC1>servomax)	PDC1 =servomax;
	if(PDC2<servomin)	PDC2 = servomin;
	if(PDC2>servomax)	PDC2 = servomax;
}

Problems encountered

Drift

As mentioned above and in my old post about gyroscopes: there is a problem with drift on the Wii motion plus gyroscope. This is very apparent specially in systems that has a high sampling rate such as my one. The way I handled this problem was to add a recalibrate button and an on and off toggle button. By doing this: the drift wont affect the system if it’s not in use all the time, and the system can be corrected by turning the system off and repositioning yourself. The recalibrate function is a much better way of doing this though.

Motors drawing too much power

The next problem is the motors drawing too much power. When I was developing the bear I was using an old nokia phone charger with an output rating of 4.7V and 700mA. This was enough to drive two servo motors but when I had to add two more for the arms it just kept on going haywire. This was solved by getting a beefier power supply – a 12V/3.3A unit. I had to regulate the voltages down to 5V for the motors and 3.3V for the dspics and the Wii motion plus as this is the operating voltage of the Wii Motion Plus. Going any much higher will damage the sensor.

I blew up both my dspics(D’OH!)

The reason why I don’t have a demo with the arms working is because I accidentally blew both my dspics. As said above: I had to switch to a new power supply. And I decided to do it at 3 in the morning, one is bound to make a mistake working that late at night: and I did. I forgot to take out one tiny pin, just one pin that used to power my dspics from the 3.3V rail which I now used for the 12V rail. Every connection was perfect except for that one little wire, the reason why I didn’t see it was because the wire was white-ish and so was my breadboard, it blended in. But yes so I plugged in  my 12V supply and watched as nothing happened and then smell something burning. The dspic30f4011’s operating voltage is from 2.5V-5.5V according to the datasheet. And so I accidentally pumped in more than double it’s rated operating voltage. I tested to see if it’s working using a simple “blinking LED” test but to no avail. If I had 2 more dspics the project would have been complete, but life is cruel and it doesn’t want me to get good marks.

Conclusion

So in conclusion, this is the culmination of all that I’ve worked at these past couple of months and I feel that it worked out pretty well. It would have been great to see the arms moving, but I’m confident that if the dspics are replaced that the system will do what it’s meant to do. With the time constraints, I was only able to do so much but I personally think that it’s quite good. The sensors worked perfectly and the servos responded in a lifelike manner(I was afraid it’s look very artificial but it didn’t). I would have loved to put extra stuff in it such as a speaker so it could speak and cameras and microphones for interaction, machine vision would have been great so it can track people and follow them around, but there just wasn’t enough time and it wasn’t worth it for its payload.

I can see a toy like this in production, and it would sell. One can just imagine a parent giving this to a child. I would have loved this toy as a child and it would mean hours of entertainment for both the child and the parent. Motion control has that novelty that cant be denied(just ask Nintendo!). And it doesn’t just have to be for children, I can imagine the pranks grown ups can come up with this. I would love to put this in the corner of the room and just hide somewhere and just freak people out, I know it’s a bit sick for some, but it seems funny to me.

From turning an LED on and off to motion control, this has been quite a journey.

4 comments on “Project : Voodoo

  1. Stevo says:

    Gian(mwahahaha) you’re deadly, Have ya a vid of the arms movin an stuff aswell?

    • Gian Lorenzo says:

      Nah I blew both my dspics! You’ll see the story here tomorrow haha. accidentally fed 12v to the dspics. That’s what happens when you solder and clean up stuff at half 3 in the morning. I’m devastated!

  2. batchloaf says:

    Brilliant work Gian. I hope Voodoo Bear lives to fight another day! This has so much potential as a product.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s