Here’s a demo of my execution of “Rocking and Rolling”:

Brainstorming and Initial Ideas

Initially, I wanted to create rocking motion that could move a ball bearing from a higher level to a lower level back to a higher level and so on. To clarify, here’s a diagram:

I soon realized that producing such a product was not feasible given how much I had to do this project. So, I came up with the idea to use the rocking motion to move the ball bearing over little “hills,” as shown below:

Final Result

I ended up using two semicircles of radius 4.5 inches as my rocking body and 4 short, 1-2 inches long pieces of wood for my “hills.” I also attached a curved arm to the servo arm to add more of a push to the rocking motion. I added paper towel to the shared bottom of the two hills to increase friction so the ball bearing would be able to come to a stop in that area.

Overall, I’m happy with how my project turned out. However, I found it very hard to make the ball bearing consistently stop at the shared bottom of the two hills. If I were to take a go at this project again, I’d probably spend more time looking into how to get the ball bearing to consistently stay put at the bottom of the hills.

Code

#include <Servo.h&gt;

Servo ser;  // create servo object to control a servo
// twelve servo objects can be created on most boards

int pos = 95;    // variable to store the servo position

void setup() {
  Serial.begin(9600);
  ser.attach(9);  // attaches the servo on pin 9 to the servo object
  ser.write(pos);
}

void loop() {
  for(pos = 95; pos <= 180; pos += 2){
    ser.write(pos);
    delay(50);
  }
  delay(500);
  for(pos = 180; pos &gt;= 95; pos -= 12){
    ser.write(pos);
    delay(50);
  }
  delay(2000);
  for(pos = 95; pos <= 180; pos += 2){
    ser.write(pos);
    delay(50);
  }
  delay(2000);
  for(pos = 180; pos &gt;= 95; pos -= 2){
    ser.write(pos);
    delay(50);
  }
  delay(2000);
  for(pos = 95; pos &gt;= 50; pos -= 2){
    ser.write(pos);
    delay(50);
  }
  delay(2000);
  for(pos = 50; pos <= 95; pos += 2){
    ser.write(pos);
    delay(50);
  }
}