Introduction: Arduino BlinkyBall Project

I frequent a blog called hackaday.com which featured a project by "Nikolai", it was a 10cm LED ball that used shift registers. It seems like a really fun project to attempt but the cost of having the boards made & not having any experience sending eagle drawings to fab shops initially kept me from starting.  After some planning I decided to make my own boards by hand although because of that choice I would have to scale up the design dimension wise  & reduce the number of "slices". 

I started off with rectangular 2200 hole PCB's from RadioShack and using cutting dykes I made half circle boards with a cutout in the center to to fit the processing module, lipo battery & charger.  Each slice is comprised of 2 - 8-bit shift registers, 16 LED's & 16 resistors.   There are 8 slices in total so there are 128 LED's, I use and Arduino nano 3.1 from makershed.com along with a lipo batter & charger available at sparkfun.com.  In order to fit these slices together to form a sphere I used circular PCB's that I found at radioshack.  I used a dremel to cut slits every 45-degrees for each of the slices to slide into, the package comes with 3 sizes & 2 of each, I used the middle size.  I added a parallax mesmic 2125 accelerometer to the main board in the center to provide orientation to the sphere.  You charge the LiPo batter through a USB mini port located in the center, charging takes 1 Hour approximately and lasts for 45 minutes.

I wanted to thank Nikolai for the insperation & Null Space Labs HackerSpace for their take on the project.  I also wrote Charlie over there to get his input on the spiral animation & he was very nice & helpfull.  I am going to post all of the code that I used in case anyone is interested.  I wouldn't say that I am the most proficient programmer & am still learning so be kind.




Links: www.hackaday.com/2011/10/16/we-want-this-led-ball/          //Original 
          http://charliex2.wordpress.com/2012/02/11/the-blinky-ball-nullspacelabs/   //Null Space Labs In LA made a really cool version



Code:


int clockPin = 13; //IC Pin 11, Yellow Jumper
int dataPin = 11; //IC Pin 14, Blue Jumper
int latchPin = 8; //IC Pin 12, Green Jumper

const int xPin = 2;     // X output of the accelerometer
const int yPin = 3;     // Y output of the accelerometer

word patterns[176] = {
  0b1100000000000000,
  0b0110000000000000,
  0b0011000000000000,
  0b0001100000000000,
  0b0000110000000000,
  0b0000011000000000,
  0b0000001100000000,
  0b0000000110000000,
  0b0000000011000000,
  0b0000000001100000,
  0b0000000000110000,
  0b0000000000011000,
  0b0000000000001100,
  0b0000000000000110,
  0b0000000000000011,
  0b0000000000000001,
 
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b1010111010001101,
  0b0110101010011010,
  0b0101010010011100,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,

  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b1010111010001101,
  0b0110101010011010,
  0b0101010010011100,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
 
  0b1100000000000000,
  0b0110000000000000,
  0b0011000000000000,
  0b0001100000000000,
  0b0000110000000000,
  0b0000011000000000,
  0b0000001100000000,
  0b0000000110000000,
  0b0000000011000000,
  0b0000000001100000,
  0b0000000000110000,
  0b0000000000011000,
  0b0000000000001100,
  0b0000000000000110,
  0b0000000000000011,
  0b0000000000000001,
  0b0000000000000001,
  0b0000000000000011,
  0b0000000000000110,
  0b0000000000001100,
  0b0000000000011000,
  0b0000000000110000,
  0b0000000001100000,
  0b0000000011000000,
  0b0000000110000000,
  0b0000001100000000,
  0b0000011000000000,
  0b0000110000000000,
  0b0001100000000000,
  0b0011000000000000,
  0b0110000000000000,
  0b1100000000000000,
 
  0b1100000000000000,
  0b0110000000000000,
  0b0011000000000000,
  0b0001100000000000,
  0b0000110000000000,
  0b0000011000000000,
  0b0000001100000000,
  0b0000000110000000,
  0b0000000011000000,
  0b0000000001100000,
  0b0000000000110000,
  0b0000000000011000,
  0b0000000000001100,
  0b0000000000000110,
  0b0000000000000011,
  0b0000000000000001,
  0b0000000000000001,
  0b0000000000000011,
  0b0000000000000110,
  0b0000000000001100,
  0b0000000000011000,
  0b0000000000110000,
  0b0000000001100000,
  0b0000000011000000,
  0b0000000110000000,
  0b0000001100000000,
  0b0000011000000000,
  0b0000110000000000,
  0b0001100000000000,
  0b0011000000000000,
  0b0110000000000000,
  0b1100000000000000,

  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b1010100100111110,
  0b1010110100100101,
  0b1010101001101111,
  0b1100101111010101,
  0b1111011010101010,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000,
  0b0000000000000000

};

int index = 17;
int count = sizeof(patterns)/2;
unsigned int oldy = 0;

void setup()
{

// initialize serial communications:
Serial.begin(9600);
// initialize the pins connected to the accelerometer
// as inputs:
pinMode(xPin, INPUT);
pinMode(yPin, INPUT);
 
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);

}

void loop()
{

  accelorometer();

}

void accelorometer()
{
 
// variables to read the pulse widths:
int pulseX, pulseY;
// variables to contain the resulting accelerations
int accelerationX, accelerationY;

// read pulse from x- and y-axes:
pulseX = pulseIn(xPin,HIGH); 
pulseY = pulseIn(yPin,HIGH);

// convert the pulse width into acceleration
// accelerationX and accelerationY are in milli-g's:
// earth's gravity is 1000 milli-g's, or 1g.
accelerationX = ((pulseX / 10) - 500) * 8;
accelerationY = ((pulseY / 10) - 500) * 8;

// print the acceleration
Serial.print("X: ");
Serial.print(accelerationX);
// print a tab character:
Serial.print("\t");
Serial.print("Y: ");
Serial.print(accelerationY);
Serial.println();
 
if(accelerationY == oldy){
count = count + 1;
if(count >= 500){
   for(int times = 0; times <= 160; times++){
    idleTime();
   }
   count = count - 50;
}
}else{
  count = count - 1;
  if(count <= 0){
    count = 0;
  }
}


int ywordPos = map(accelerationY, -1023, 1023, 0, 16);

byte registerOne = highByte(patterns[ywordPos]);
byte registerTwo = lowByte(patterns[ywordPos]);


digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, registerOne);
shiftOut(dataPin, clockPin, MSBFIRST, registerTwo);
digitalWrite(latchPin, HIGH);
 
oldy = accelerationY;


 
}

void idleTime()
{
byte registerOne = highByte(patterns[index]);
byte registerTwo = lowByte(patterns[index]);

digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, registerOne);
shiftOut(dataPin, clockPin, MSBFIRST, registerTwo);
digitalWrite(latchPin, HIGH);
delay(65);
index++;
if (index >= count){
index = 17;
 
}
}
http://www.youtube.com/watch?v=r2yADpGnyyc