New Years Ball Drop Replica

I was asked to build a replica ball drop for a friend. I had 3 days to get this thing working. It was a fun build, and took a lot of headaches to get it setup. In the end it worked out great.

The ball itself is a Christmas ornament that has been cut in half and stuffed with 14 LEDs, a 9V and a switch. I hot glued the thing back together and cut a hole in the bottom for the rod to come through. My wife decorated it for me; she also decorated the building.

Parts used:

  • Christmas ornament
  • Pill bottle (base of rod)
  • 2 boxes
  • Spent soldier spool
  • Plastic clothes hanger (rod)
  • Yarn
  • Paperclip
  • Arduino
  • LCD shield (key pad)
  • LED’s
  • Components for relay circuit
  • Paint
  • Glitter
  • Tiny mirrors
  • Servo (mod for continues rotation)

The next thing was to make it go down the rod. There is several ways of doing this, the best in my opinion to use a screw like device and have the ball mounted on it for the linear motion. But I did not have the supplies or money for that. So I used a moded servo for a pulley type system.

I took a spent soldier spool and glued it to the horn of the servo. That’s where the yarn is tied. The yarn goes up the rod, through a looped paperclip and attached to the ball. When the servo “unwinds” the spool, the ball is lowered.

Besides the arduino and LCD shield, there is a circuit to control the servo. It is a simple 5V regulated relay transistor setup. I used the same schematics as the IRC controlled air freshener.

The trickiest part of the build was to lower the ball at a timed rate and have it hit the bottom on count 0. It took some trial and error with delay times in the code, but it worked out nicely.

<pre>
<pre>
//up == 130
//down == 306
//right == 0
//left == 480
#include <Servo.h>
#include <LCD4Bit_mod.h>
#include <stdlib.h>

Servo myservo;  // servo object
LCD4Bit_mod lcd = LCD4Bit_mod(2);

int key_in;

void setup()
{
 Serial.begin(9600);
 lcd.init();
 lcd.printIn(" Time Square    ");
 lcd.cursorTo(2,0);
 lcd.printIn("  New Years Eve ");
 myservo.attach(12);
 pinMode(3, OUTPUT);
 digitalWrite(3,HIGH);
}

void loop()
{
 lcd.cursorTo(1,0);
 key_in = analogRead(0);
 if (key_in == 0){
 lcd.clear();
 myservo.write(90);
 digitalWrite(3, LOW);
 lcd.printIn("Coming Down");
 key_in = 0;
 }

 else if (key_in == 480){
  lcd.clear();
  lcd.printIn("Going Up");
  myservo.write(0);
  digitalWrite(3,LOW);
  key_in = 0;
 }

 else if (key_in == 306){
  lcd.clear();
  lcd.printIn("Count Down Start");
  delay(3000);
  lcd.clear();
  lcd.printIn("***1:00***");
  delay(1000);
  count_down();
 }

 else {
  digitalWrite(3,HIGH);
 }

}

void count_down(){
 myservo.write(90);
 for (int i=59; i>0; i--){
  lcd.clear();
  char count [21];
  char* r;
  r = itoa(i,count,10);
  lcd.printIn("*****");
  lcd.printIn(r);
  lcd.printIn("*****");
  if (i <= 10){
   digitalWrite(3,LOW);
   delay(130);
   digitalWrite(3,HIGH);
   delay(870);
   continue;
   }
  delay(1000);

 }
 lcd.clear();
 lcd.printIn("      2011      ");
 delay(5000);
 lcd.clear();
 lcd.printIn("Happy New Year!!");
 lcd.cursorTo(2,0);
 lcd.printIn("_,~*`~2011~*`~,_");
 }