We knew that we wanted to boots to light up and make a robotic clanking sound while walking. I figured the easiest way to trigger this effect was to use a distance sensor on the underside of the boot- in this case the Sharp GP2D120XJ00F IR sensor. The sensor reads the distance from the boot to the ground and then a threshold value is set in the code so when the value exceeds the threshold the sensor tells the Arduino to turn on the light and activate the sound. Simple!
CASE 2: Animatronics Survival Activation Code [hacked]
Note that you will need to change the name of the hip pod flare audio file to "SOUND1.WAV" for the Wave Shield to play it. You also need to reverse the servo rotation direction for three of the hip pod servos since they are grouped in pairs that receive an identical signal.Here's the code- #include #include "Servo.h" // include the servo library Servo podServo; // servo to move hip pods Servo leverServo; // servo to move hip pod levers Servo rotateServo; // servo to rotate hip pods Servo leftflapServo; // servo to move left back flap Servo rightflapServo; // servo to move right back flap NewSoftSerial mySerial = NewSoftSerial(2, 3); int RFIDResetPin = 13; int ledPin1 = 6; // control pin for left hip pod LEDs int ledPin2 = 5; // control pin for right hip pod LEDs int servoPin1 = 10; // control pin for left flap servo int servoPin2 = 11; // control pin for right flap servo int servoPin3 = 9; // control pin for pod servo int servoPin4 = 8; // control pin for lever servo int servoPin5 = 7; // control pin for rotate servo int soundPin = 12; // control pin for flare sound //Register your RFID tags here char tag1[13] = "440085E77452"; // you will need to change this for your own tag char tag2[13] = "440085FC330E"; char tag3[13] = "440085F97840"; char tag4[13] = "4400863914EF"; void setup() Serial.begin(9600); mySerial.begin(9600); podServo.attach(servoPin3); // attaches the servo on pin 9 to the servo object leverServo.attach(servoPin4); // attaches the servo on pin 8 to the servo object rotateServo.attach(servoPin5); // attaches the servo on pin 7 to the servo object leftflapServo.attach(servoPin1); // attches the servo on pin 10 to the servo object rightflapServo.attach(servoPin2); // attaches the servo on pin 11 to the servo object podServo.write(155); // rotate the pod servo to 135 degrees leverServo.write(145); // rotate the lever servo to 135 degrees rotateServo.write(165); // rotate the pod rotation servo to 170 degrees leftflapServo.write(170); // rotate the left flap servo to 170 degrees rightflapServo.write(10); // rotate the right flap servo to 10 degrees pinMode(ledPin1, OUTPUT); // sets the LED pin as an output pinMode(ledPin2, OUTPUT); // sets the LED pin as an output digitalWrite(ledPin1, LOW); // turn off LEDs digitalWrite(ledPin2, LOW); // turn off LEDs pinMode(soundPin, OUTPUT); // sets the sound pin as output digitalWrite(soundPin, LOW); // turn off sound pin pinMode(RFIDResetPin, OUTPUT); digitalWrite(RFIDResetPin, HIGH); void loop() char tagString[13]; int index = 0; boolean reading = false; while(Serial.available()) int readByte = Serial.read(); //read next available byte if(readByte == 2) reading = true; //begining of tag if(readByte == 3) reading = false; //end of tag if(reading && readByte != 2 && readByte != 10 && readByte != 13) //store the tag tagString[index] = readByte; index ++; checkTag(tagString); // check if it is a match clearTag(tagString); // clear the char of all value resetReader(); // reset the RFID reader void checkTag(char tag[]) /////////////////////////////////// //Check the read tag against known tags /////////////////////////////////// if(strlen(tag) == 0) return; // empty, no need to continue if(compareTag(tag, tag1)) // if matched tag1, do this mySerial.print('A'); // sends tag read over XBee else if(compareTag(tag, tag2)) // if matched tag2, do this podServo.write(90); // rotate the pod servo to 90 degrees delay(500); // wait half a second leverServo.write(95); // rotate the lever servo to 90 degrees delay(1000); rotateServo.write(5); // rotate the pod rotation servo to 10 degrees delay(1500); leverServo.write(145); delay(500); digitalWrite(soundPin, HIGH); // turn sound on delay(10); // wait ten milliseconds digitalWrite(soundPin, LOW); // turn sound off digitalWrite(ledPin1, HIGH); // turn on LEDs digitalWrite(ledPin2, HIGH); // turn on LEDs delay(50); // wait 50 milliseconds digitalWrite(ledPin1, LOW); // turn off LEDs digitalWrite(ledPin2, LOW); // turn off LEDs delay(50); digitalWrite(ledPin1, HIGH); // turn on LEDs digitalWrite(ledPin2, HIGH); // turn on LEDs delay(50); digitalWrite(ledPin1, LOW); // turn off LEDs digitalWrite(ledPin2, LOW); // turn off LEDs delay(50); digitalWrite(ledPin1, HIGH); // turn on LEDs digitalWrite(ledPin2, HIGH); // turn on LEDs delay(50); digitalWrite(ledPin1, LOW); // turn off LEDs digitalWrite(ledPin2, LOW); // turn off LEDs delay(50); digitalWrite(ledPin1, HIGH); // turn on LEDs digitalWrite(ledPin2, HIGH); // turn on LEDs delay(50); digitalWrite(ledPin1, LOW); // turn off LEDs digitalWrite(ledPin2, LOW); // turn off LEDs delay(50); digitalWrite(ledPin1, HIGH); // turn off LEDs digitalWrite(ledPin2, HIGH); // turn off LEDs delay(50); digitalWrite(ledPin1, LOW); // turn off LEDs digitalWrite(ledPin2, LOW); // turn off LEDs delay(50); digitalWrite(ledPin1, HIGH); // turn on LEDs digitalWrite(ledPin2, HIGH); // turn on LEDs delay(50); digitalWrite(ledPin1, LOW); // turn off LEDs digitalWrite(ledPin2, LOW); // turn off LEDs delay(50); digitalWrite(ledPin1, HIGH); // turn on LEDs digitalWrite(ledPin2, HIGH); // turn on LEDs delay(50); digitalWrite(ledPin1, LOW); // turn off LEDs digitalWrite(ledPin2, LOW); // turn off LEDs delay(50); digitalWrite(ledPin1, HIGH); // turn on LEDs digitalWrite(ledPin2, HIGH); // turn on LEDs delay(50); digitalWrite(ledPin1, HIGH); // turn off LEDs digitalWrite(ledPin2, HIGH); // turn off LEDs delay(50); digitalWrite(ledPin1, LOW); // turn off LEDs digitalWrite(ledPin2, LOW); // turn off LEDs delay(50); digitalWrite(ledPin1, HIGH); // turn on LEDs digitalWrite(ledPin2, HIGH); // turn on LEDs delay(50); digitalWrite(ledPin1, LOW); // turn off LEDs digitalWrite(ledPin2, LOW); // turn off LEDs delay(50); digitalWrite(ledPin1, HIGH); // turn on LEDs digitalWrite(ledPin2, HIGH); // turn on LEDs delay(50); digitalWrite(ledPin1, LOW); // turn off LEDs digitalWrite(ledPin2, LOW); // turn off LEDs delay(50); digitalWrite(ledPin1, HIGH); // turn on LEDs digitalWrite(ledPin2, HIGH); // turn on LEDs delay(50); digitalWrite(ledPin1, LOW); // turn off LEDs digitalWrite(ledPin2, LOW); digitalWrite(ledPin1, HIGH); // turn on LEDs digitalWrite(ledPin2, HIGH); // turn on LEDs delay(50); digitalWrite(ledPin1, LOW); // turn off LEDs digitalWrite(ledPin2, LOW); // turn off LEDs delay(50); digitalWrite(ledPin1, HIGH); // turn on LEDs digitalWrite(ledPin2, HIGH); // turn on LEDs delay(50); digitalWrite(ledPin1, HIGH); // turn off LEDs digitalWrite(ledPin2, HIGH); // turn off LEDs delay(50); digitalWrite(ledPin1, LOW); // turn off LEDs digitalWrite(ledPin2, LOW); // turn off LEDs delay(50); digitalWrite(ledPin1, HIGH); // turn on LEDs digitalWrite(ledPin2, HIGH); // turn on LEDs delay(50); digitalWrite(ledPin1, LOW); // turn off LEDs digitalWrite(ledPin2, LOW); // turn off LEDs delay(50); digitalWrite(ledPin1, HIGH); // turn on LEDs digitalWrite(ledPin2, HIGH); // turn on LEDs delay(50); digitalWrite(ledPin1, LOW); // turn off LEDs digitalWrite(ledPin2, LOW); // turn off LEDs delay(50); digitalWrite(ledPin1, HIGH); // turn on LEDs digitalWrite(ledPin2, HIGH); // turn on LEDs delay(50); digitalWrite(ledPin1, LOW); // turn off LEDs digitalWrite(ledPin2, LOW); digitalWrite(ledPin1, HIGH); // turn on LEDs digitalWrite(ledPin2, HIGH); // turn on LEDs delay(50); digitalWrite(ledPin1, HIGH); // turn off LEDs digitalWrite(ledPin2, HIGH); // turn off LEDs delay(50); digitalWrite(ledPin1, LOW); // turn off LEDs digitalWrite(ledPin2, LOW); // turn off LEDs delay(50); digitalWrite(ledPin1, HIGH); // turn on LEDs digitalWrite(ledPin2, HIGH); // turn on LEDs delay(50); digitalWrite(ledPin1, LOW); // turn off LEDs digitalWrite(ledPin2, LOW); // turn off LEDs delay(50); digitalWrite(ledPin1, HIGH); // turn on LEDs digitalWrite(ledPin2, HIGH); // turn on LEDs delay(50); digitalWrite(ledPin1, LOW); // turn off LEDs digitalWrite(ledPin2, LOW); // turn off LEDs leverServo.write(95); // rotate the lever servo to 90 degrees delay(1500); rotateServo.write(165); // rotate the pod servo to 135 degrees delay(1000); leverServo.write(145); delay(500); podServo.write(155); // rotate the pod servo to 135 degrees delay(2000); leftflapServo.write(125); // rotate the left flap servo to 125 degrees- full up rightflapServo.write(55); // rotate the right flap servo to 55 degrees- full up delay(500); leftflapServo.write(170); // rotate the left flap servo to 170 degrees- full down rightflapServo.write(10); // rotate the right flap servo to 10 degrees- full down delay(500); leftflapServo.write(125); // left flap full up delay(500); leftflapServo.write(170); // left flap full down delay(500); rightflapServo.write(55); // right flap full up delay(500); rightflapServo.write(10); // right flap full down else Serial.println(tag); //read out any unknown tag void lightLED(int pin) /////////////////////////////////// //Turn on LED on pin "pin" for 250ms /////////////////////////////////// Serial.println(pin); digitalWrite(pin, HIGH); delay(250); digitalWrite(pin, LOW); void resetReader() /////////////////////////////////// //Reset the RFID reader to read again. /////////////////////////////////// digitalWrite(RFIDResetPin, LOW); digitalWrite(RFIDResetPin, HIGH); delay(150); void clearTag(char one[]) /////////////////////////////////// //clear the char array by filling with null - ASCII 0 //Will think same tag has been read otherwise /////////////////////////////////// for(int i = 0; i one[i] = 0; boolean compareTag(char one[], char two[]) /////////////////////////////////// //compare two value to see if same, //strcmp not working 100% so we do this /////////////////////////////////// if(strlen(one) == 0) return false; //empty for(int i = 0; i if(one[i] != two[i]) return false; return true; //no mismatches Here's the code for the WaveShield, courtesy of Adafruit- #include #include #include #include "WaveUtil.h" #include "WaveHC.h" SdReader card; // This object holds the information for the card FatVolume vol; // This holds the information for the partition on the card FatReader root; // This holds the information for the filesystem on the card FatReader f; // This holds the information for the file we're play WaveHC wave; // This is the only wave (audio) object, since we will only play one at a time #define DEBOUNCE 100 // button debouncer // this handy function will return the number of bytes currently free in RAM, great for debugging! int freeRam(void) extern int __bss_end; extern int *__brkval; int free_memory; if((int)__brkval == 0) free_memory = ((int)&free_memory) - ((int)&__bss_end); else free_memory = ((int)&free_memory) - ((int)__brkval); return free_memory; void sdErrorCheck(void) if (!card.errorCode()) return; putstring("\n\rSD I/O error: "); Serial.print(card.errorCode(), HEX); putstring(", "); Serial.println(card.errorData(), HEX); while(1); void setup() { // set up serial port Serial.begin(9600); putstring_nl("WaveHC with 6 buttons"); putstring("Free RAM: "); // This can help with debugging, running out of RAM is bad Serial.println(freeRam()); // if this is under 150 bytes it may spell trouble! // Set the output pins for the DAC control. This pins are defined in the library pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); // pin13 LED pinMode(13, OUTPUT); // enable pull-up resistors on switch pins (analog inputs) digitalWrite(14, HIGH); digitalWrite(15, HIGH); digitalWrite(16, HIGH); digitalWrite(17, HIGH); digitalWrite(18, HIGH); digitalWrite(19, HIGH); // if (!card.init(true)) //play with 4 MHz spi if 8MHz isn't working for you if (!card.init()) //play with 8 MHz spi (default faster!) putstring_nl("Card init. failed!"); // Something went wrong, lets print out why sdErrorCheck(); while(1); // then 'halt' - do nothing! // enable optimize read - some cards may timeout. Disable if you're having problems card.partialBlockRead(true); // Now we will look for a FAT partition! uint8_t part; for (part = 0; part if (vol.init(card, part)) break; // we found one, lets bail if (part == 5) // if we ended up not finding one :( putstring_nl("No valid FAT partition!"); sdErrorCheck(); // Something went wrong, lets print out why while(1); // then 'halt' - do nothing! // Lets tell the user about what we found putstring("Using partition "); Serial.print(part, DEC); putstring(", type is FAT"); Serial.println(vol.fatType(),DEC); // FAT16 or FAT32? // Try to open the root directory if (!root.openRoot(vol)) putstring_nl("Can't open root dir!"); // Something went wrong, while(1); // then 'halt' - do nothing! // Whew! We got past the tough parts. putstring_nl("Ready!"); void loop() //putstring("."); // uncomment this to see if the loop isnt running switch (check_switches()) case 1: playcomplete("SOUND1.WAV"); break; case 2: playcomplete("SOUND2.WAV"); break; case 3: playcomplete("SOUND3.WAV"); break; case 4: playcomplete("SOUND4.WAV"); break; case 5: playcomplete("SOUND5.WAV"); break; case 6: playcomplete("SOUND6.WAV"); byte check_switches() static byte previous[6]; static long time[6]; byte reading; byte pressed; byte index; pressed = 0; for (byte index = 0; index reading = digitalRead(14 + index); if (reading == LOW && previous[index] == HIGH && millis() - time[index] > DEBOUNCE) // switch pressed time[index] = millis(); pressed = index + 1; break; previous[index] = reading; // return switch number (1 - 6) return (pressed); // Plays a full file from beginning to end with no pause. void playcomplete(char *name) // call our helper to find and play this name playfile(name); while (wave.isplaying) // do nothing while its playing // now its done playing void playfile(char *name) // see if the wave object is currently doing something if (wave.isplaying) // already playing something, so stop it! wave.stop(); // stop it // look in the root directory and open the file if (!f.open(root, name)) putstring("Couldn't open file "); Serial.print(name); return; // OK read the file and turn it into a wave object if (!wave.create(f)) putstring_nl("Not a valid WAV"); return; // ok time to play! start playback wave.play(); 2ff7e9595c
Comments