Robotic Newton's Cradle

by JimRD in Circuits > Robots

995 Views, 15 Favorites, 0 Comments

Robotic Newton's Cradle

Robotic Newtons Cradle 2.JPG
Robotic Newtons Cradle

Here is my second attempt to automate the Newton's Cradle. This one doesn't require any modifications to the cradle itself. It uses 3 servos, an Arduino Uno , scrap wood, and some chop sticks plus a kitchen utensil hanger slider rod. Watch the video, ifun.t's

Slider Servo

Robotic Newtons Cradle 1.JPG
Robotic Newtons Cradle 4.JPG

This picture shows the while rail at the bottom that I got from a kitchen utensil hanger thingy. I mounted an aluminum bracket on two of the sliders, connected that to a standard size servo via another aluminum bracket and a chopstick linkage bar. This pushes the claw mechanism to and from the Newton's Cradle.

Forward and Backward Tilting Servo

Robotic Newtons Cradle 5.JPG

On the slider bar you see a vertically mounted servo to which the claw is attached. This servo tilts the claw forward towards the cradle and backwards from it.

The Claw

Robotic Newtons Cradle 3.JPG

The claw or gripper is just a servo mounted on a piece of wood and connected to two chopsticks via wire linkage. It doesn't close exactly equally with both grippers but gets close enough to get the job done.

Arduino Sketch

Finally here is the arduino program that controls the servos: (has a little garbage in it - need to clean it up)

#include
Servo servo1,servo2,servo3;

//int potPin = 2;

// select the input pin for the potentiometer

int servangle = 0; // servo angle variable int potPin = 4;

// select the input pin for the potentiometer

int potPin2 = 0;

// select the input pin for the potentiometer

int ledPin = 13;

// select the pin for the LED int val = 0;

// variable to store the value coming from the sensor

int valPot2 = 0;

int valInc = 4;

int currAngle = 0;

int newAngle = 0;

int delayTime = 0; //Analog read pins const

int buttonPin = 2;

void myServo(int curAngle,int newAngle,int angleInc,int incDelay,int servoNum)

{ if (curAngle < newAngle) { for(int angle=curAngle;angle < newAngle;angle += angleInc) {

if (servoNum == 1) servo1.write(angle);

if (servoNum == 2) servo2.write(angle); delay(incDelay); } }

else if (curAngle > newAngle) { for(int angle=curAngle;angle > newAngle;angle -= angleInc) {

if (servoNum == 1) servo1.write(angle);

if (servoNum == 2) servo2.write(angle); delay(incDelay); } } }

void setup() {

Serial.begin(9600);

pinMode(ledPin, OUTPUT);

// declare the ledPin as an OUTPUT

//pinMode(buttonPin,INPUT);

servo1.attach(9);

delay(10);

servo1.write(145);

servo2.attach(11);

delay(10);

servo2.write(90);

servo3.attach(13);

delay(10);

servo3.write(90);

delay(2000); }

void loop() {

//Serial.print(" buttonpin= ");

Serial.println(digitalRead(buttonPin));

val=1000;

Serial.print(" delay val= ");

Serial.print(val);

Serial.print(" angle val= ");

Serial.println(valPot2);

digitalWrite(ledPin,HIGH);

//servo1.write(30); //150 to 30

myServo(145,30,1,10,1);

servo2.write(145); //90 to 150

delay(1000);

servo3.write(109); //80 to 110 - clamp

delay(1000);

//servo3.write(100); //80 to 110

//servo1.write(145); //150 to 30

servo2.write(130); //90 to 150

int y = 131; for (int x=30;x<146;x=x+2) {

//myServo(30,145,1,10,1);

servo1.write(x); //90 to 150

delay(30);

y = y-1;

if(y > 89) { servo2.write(y);

delay(30); }

//myServo(130,90,1,10,2); }

delay(7000);

servo3.write(80); //90 to 150 - open clamp

// myServo1(172,90,1,15);

delay(val);

//servo1.write(172);

//myServo1(valPot2,175,1,1);

digitalWrite(ledPin,LOW);

//cli();

delay(5000); }