Welcome to Hackster!
Hackster is a community dedicated to learning hardware, from beginner to pro. Join us, it's free!
Doug Domke
Published © LGPL

Ping Pong Art

Artwork Using Solenoids and Ping Pong Balls!

IntermediateFull instructions provided15 hours408

Things used in this project

Hardware components

Arduino UNO
Arduino UNO
×1
12 volt solenoid
×10
12 inch Clear Plastic Rigid Pipe 41mm x 45mm
×10
30 mm Ping Pong balls
×10
2200 MFD electrolytic capacitors
×10
1N5408 Rectifier Diode 3A
×10
Through Hole Resistor, 470 ohm
Through Hole Resistor, 470 ohm
×10
Darlington High Power Transistor
Darlington High Power Transistor
×10
Power Supply 18 volts, 5 amps
I actually used a 10 amp variable voltage bench power supply
×1

Software apps and online services

Arduino IDE
Arduino IDE

Hand tools and fabrication machines

Soldering iron (generic)
Soldering iron (generic)
3D Printer (generic)
3D Printer (generic)

Story

Read more

Custom parts and enclosures

3D Printer files

all 4 objects, in both .obj and .stl format

Schematics

Schematic for Ping Pong Art

Code

Ping Pong Art

Arduino
// this is code for Ping Pong Art.  
// 10 solenoids are driven by pins 3-12,
// full demo is in loop

void setup() {
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  allOff();
  delay(3000);
}

void loop() {
  int mywait = 250;
  for (int count = 0; count < 4; count++) {
    for (int j = 0; j < 10; j++) {
      hitBall(j, mywait);
    }
  }
  delay(500);
  mywait = 250;
  for (int count = 0; count < 4; count++) {
    hitBall(0, 0);
    hitBall(9, mywait);
    hitBall(1, 0);
    hitBall(8, mywait);
    hitBall(2, 0);
    hitBall(7, mywait);
    hitBall(3, 0);
    hitBall(6, mywait);
    hitBall(4, 0);
    hitBall(5, mywait);
    delay(750);
  }
  delay(500);
  for (int count = 0; count < 2; count++) {
    for (int j = 0; j < 10; j++) {
      hitBall(j, mywait);
    }
    for (int j = 8; j > 0; j--) {
      hitBall(j, mywait);
    }
  }
  delay(500);
  for (int count = 0; count < 3; count++) {
    mywait = 85;
    for (int j = 0; j < 10; j++) {
      hitBall(j, mywait * (1 + abs(4.5 - j)));
    }
    for (int j = 8; j > 0; j--) {
      hitBall(j, mywait * (1 + abs(4.5 - j)));
    }
  }
  delay(500);
  mywait = 200;
  for (int count = 0; count < 3; count++) {
    hitBall(0,0);
    hitBall(9,mywait);
    hitBall(1,0);
    hitBall(8,mywait);
    hitBall(2,0);
    hitBall(7,mywait);
    hitBall(3,0);
    hitBall(6,mywait);
    hitBall(4,0);
    hitBall(5,mywait);
    delay(750);
    hitBall(4,0);
    hitBall(5,mywait);
    hitBall(3,0);
    hitBall(6,mywait);
    hitBall(2,0);
    hitBall(7,mywait);
    hitBall(1,0);
    hitBall(8,mywait);
    hitBall(0,0);
    hitBall(9,mywait);
    delay(750);
  }
  delay(500);
  mywait = 500;
  for (int k = 0; k < 2; k++) {
    for (int j = 0; j < 10; j++) {
      hitBall(j, mywait);
    }
    mywait = (mywait * 4) / 5;
    for (int j = 8; j > 0; j--) {
      hitBall(j, mywait);
    }
    mywait = (mywait * 4) / 5;
  }
  for (int k = 0; k < 2; k++) {
    for (int j = 0; j < 10; j++) {
      hitBall(j, mywait);
    }
    mywait = (mywait * 5) / 4;
    for (int j = 8; j > 0; j--) {
      hitBall(j, mywait);
    }
    mywait = (mywait * 5) / 4;
  }
  delay(500);
}

// select ball 0-9 and wait time in msec.
void hitBall(int myball, int mytime) {
  switch (myball) {
    case 0:
      digitalWrite(3, HIGH);
      delay(15);
      digitalWrite(3, LOW);
      delay(mytime);
      break;
    case 1:
      digitalWrite(4, HIGH);
      delay(15);
      digitalWrite(4, LOW);
      delay(mytime);
      break;
    case 2:
      digitalWrite(5, HIGH);
      delay(15);
      digitalWrite(5, LOW);
      delay(mytime);
      break;
    case 3:
      digitalWrite(6, HIGH);
      delay(15);
      digitalWrite(6, LOW);
      delay(mytime);
      break;
    case 4:
      digitalWrite(7, HIGH);
      delay(15);
      digitalWrite(7, LOW);
      delay(mytime);
      break;
    case 5:
      digitalWrite(8, HIGH);
      delay(15);
      digitalWrite(8, LOW);
      delay(mytime);
      break;
    case 6:
      digitalWrite(9, HIGH);
      delay(15);
      digitalWrite(9, LOW);
      delay(mytime);
      break;
    case 7:
      digitalWrite(10, HIGH);
      delay(15);
      digitalWrite(10, LOW);
      delay(mytime);
      break;
    case 8:
      digitalWrite(11, HIGH);
      delay(15);
      digitalWrite(11, LOW);
      delay(mytime);
      break;
    case 9:
      digitalWrite(12, HIGH);
      delay(15);
      digitalWrite(12, LOW);
      delay(mytime);
      break;
    default:
      break;
  }
}

void allOff() {
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  digitalWrite(12, LOW);
}

Credits

Doug Domke
39 projects • 111 followers
Contact

Comments

Please log in or sign up to comment.