Introduction: Big Egg + Arduino +IR Sensor = EasterEgguino
Step 1: Stuff Needed
The main items used are:
1. Ardweeny - a small Arduino compatible Microcontroller from Solarbotics .. This is inexpensive but you are required to solder the pieces to the included PCB.
2. A small hobby servo - I used a Futaba GWS03n
3. an IR sensor - I used a Sharp GP2Y0A -
4. you will need the cable that goes to the sensor also
5. 8 Leds
6. 74HC595 shift register to do the LED chasing.
7. 7805 voltage regulator
8. AC adapter to provide the 9 volt current required
9. A big egg(and some smaller ones) - from the Hobby Lobby.
Also
1. hot glue
2. some decorative items - the ears,eyes from a hobby shop or a toy store
3. wire, soldering iron
Step 2: Build the Egg Part
1. hot glued 3 of the smaller eggs to the bottom to form a base. Using tape to hold in place worked well.
2. added a hinge to attach the top part to the bottom part.
3. Cut a piece of scrap wood to fit inside the egg. This is screwed to the egg and will be used to mount the servo.
4. glue a smaller piece of wood to the semi-circular piece. Attach the servo to the smaller piece with a zip tie.
5. cut another scrap piece of wood into a circle which fits nicely near the bottom of the egg. The bread board and battery will be mounted on this. Hot glue this in place .
6. Make an arm for the servo. This will depend on where you place the servo, size of egg. I cut a pice out of an old CD case and spray painted it black.
7. attached the IR sensor to what would become the front .
8. need to cut a piece which fits in the egg but just a couple of inches down. This becomes the shelf upon which the candy will be placed.
Step 3: The Electronics Part
1. The Ardweeny
This comes as a kit from Solarbotics. It includes instructions on how to assemble.
Once assembled it can be used right on the bread board which is what I did.
Connections that need to be made to the Arduino are:
IR sensor
black wire to gnd
red wire to 5v
yellow wire to analog pin 0
Servo
- I have tried to power the servo in various ways but it seems it needs its own power so I
provided 3 AA batteries for power
black wire to gnd
red wire to batteries
white wire to digital pin 9 on ardweeny
74HC595 shift register
- I wanted to have the LEDs chase but did not know how to do this. I found the following
http://www.arduino.cc/en/Tutorial/ShiftOut
I followed the instructions there and it worked.
I must admit I am not completely sure how it works but it does work.
Some other issues:
- had to play around with the servo locations to get it to open but not open too far or not enough
- used a routine" millis" to give the appearance of the chaser working continuously as the lid opens.
(first video was before this refinement and you will see the chasing does not work but once)
- I power the Ardweeny with an AC adapter . I had hoped I could use it to avoid all batteries but when I try to include the servo , it just is not enough power to open the lid. I do not know how long the batteries will last.
-
Step 4: The Code
Below is the code I used :
I started with the servo sweep example and added to it .
// Sweep
// by BARRAGAN <http://barraganstudio.com>
// This example code is in the public domain.
// modified 4/11 c. dubois
// Made a candy server from a big plastic egg
// idea:
// IR sensor will tell when a hand reaches for the egg and will
// signal servo to open the egg.
// shift register is used to do a LED chase when the egg opens
//
// updates
// v3 - 4/24/11 add routines to get LEDS to chase continually
#include <Servo.h>
// distance sensor
int sensePin = 0;
// Servo
Servo myservo; // create servo object to control a servo
// a maximum of eight servo objects can be created
int pos = 0; // variable to store the servo position
// 74HC595 shift register
//Pin connected to ST_CP of 74HC595
int latchPin = 8;
//Pin connected to SH_CP of 74HC595
int clockPin = 12;
////Pin connected to DS of 74HC595
int dataPin = 11;
// other variables
int ledToDisplay;
int posServo;
long previousMillis = 0; // will store last time Chase was updated
// the follow variables is a long because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long interval = 1000; // interval at which to blink (milliseconds)
void setup()
{
//set pins to output so you can control the shift register
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
// Serial.begin(9600);
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}
void loop()
{
// read the sensor
// if getting close , thwn want to open the egg and start the leds.
// Leds will continue to chase until egg closes
int val = analogRead(sensePin);
// Serial.println(val, DEC);
// map the val to a servo position - pos
// int val = analogRead(0);
// pos = map(val, 0, 1023, 0, 100);
// open egg and turn on LEDs if close
if(val > 225)
{
// 2. open egg
posServo = 0;
for(posServo = 0; posServo < 24; posServo += 1) // goes from 0 degrees to 65 degrees
{
// keep chase going
runChase();
// move servo
myservo.write(posServo); // open top, wait 4 secs, close top and wait 5 secs
delay(25);
}
// run a loop for 3 seconds to avoid using delay
for (long xx=0; xx <= 200000; xx++){
// keep chase going
runChase();
}
// close the lid
for(posServo = 24; posServo >=0; posServo -= 1) // goes from 0 degrees to 65 degrees
{
// keep chase going
runChase();
// move servo
myservo.write(posServo); // then can read again
delay(25);
}
}
else
{
myservo.write(0); // tell servo to go to position in variable 'pos'
delay(25);
}
}
// my Functions
void ledChase ()
{
// 1. chase leds
for (int n = 1; n < 9; n++ ) {
ledToDisplay = pow(2,n) ;
// take the latchPin low so
// the LEDs don't change while you're sending in bits:
// Serial.println(n);
// Serial.println(ledToDisplay);
// delay(1500);
digitalWrite(latchPin, LOW);
// shift out the bits:
shiftOut(dataPin, clockPin, MSBFIRST, ledToDisplay);
//take the latch pin high so the LEDs will light up:
digitalWrite(latchPin, HIGH);
// pause before next value:
delay(50);
}
// now chase back in other direction
for (int n = 1; n < 9; n++ ) {
ledToDisplay = pow(2,n) ;
// take the latchPin low so
// the LEDs don't change while you're sending in bits:
// Serial.println(n);
// Serial.println(ledToDisplay);
// delay(1500);
digitalWrite(latchPin, LOW);
// shift out the bits:
shiftOut(dataPin, clockPin, LSBFIRST, ledToDisplay);
//take the latch pin high so the LEDs will light up:
digitalWrite(latchPin, HIGH);
// pause before next value:
delay(50);
}
}
void runChase ()
{
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
ledChase();
previousMillis = currentMillis;
}
}
Step 5: All Done - Another Video
This shows the insides and the LED chase working.

Participated in the
Egg-Bot Challenge

Participated in the
MakerBot Challenge
5 Comments
8 years ago
Hi! I'm gonna make this as my project. can i use Arduino uno in this? If I'm gonna buy materials, where can i order? Is this available in Philippines??
12 years ago on Introduction
Very nice project. Any plans to include a wiring drawing or schematics? Thanks
12 years ago on Introduction
This bunny is funny! Great Idea, nice work.
12 years ago on Introduction
This is soooo awesome! Perfect for Easter and lots of other holidays.
How do you like the stuff from Solarbotics? I've used the Ardweeny before but found it's to be pretty flimsy. Have you had better luck with them?
Reply 12 years ago on Introduction
Thanks.
I have put together 3 Ardweenys and 2 of them worked. So based on that very small sample, I, too, am a little vary of them. But I still have 3 to use so will see.
Other items from Solarbotics have been fine. No problem.