Lab 7: Servo Cradle

Submitted by m-craig on Tue, 03/19/2013 - 15:38

For this lab, I wanted to create a simple motion that both rocks the "cradle" (made from a paper clip box) atop the servo motor and moves it slowly around the room.  My (perhaps fuzzy) inspiration was to create a cradle that could rock a baby to sleep without confining him/her to the same area of his/her room all night.  Perhaps this could help acclimate small children to movement and change; or perhaps the movement would just create gentle breeze effects to help the baby fall asleep.

Unfortunately, since the only "doll baby" available was the Freud puppet I used for the previous lab, what I've made may look less like a cradle and more like...something else.

Movement is created by a paper clamp attached to leg #2 of the servo motor.  The metal wings of the clamp, only slightly longer than the motor legs themselves, create a rocking motion while pushing the cradle slowly forward.

Components Used:

1 - Arduino UNO
1 - Solderless Breadboard
1 - Servo Motor
1 - Potentiometer (to control movement of motor)
1 - Empty Paper Clip Box
1 - Paper Clamp
1 - Sigmund Freud Finger Puppet
Duct Tape


 * Servo with Potentiometer control
 * Theory and Practice of Tangible User Interfaces
 * October 11 2007

int servoPin = 7;      // Control pin for servo motor
int potPin   = 0;      // select the input pin for the potentiometer

int pulseWidth = 0;    // Amount to pulse the servo
long lastPulse = 0;    // the time in millisecs of the last pulse
int refreshTime = 20;  // the time in millisecs needed in between pulses
int val;               // variable used to store data from potentiometer

int minPulse = 500;   // minimum pulse width

void setup() {
  pinMode(servoPin, OUTPUT);  // Set servo pin as an output pin
  pulseWidth = minPulse;      // Set the motor position to the minimum
  Serial.begin(9600);         // connect to the serial port
  Serial.println("servo_serial_better ready");

void loop() {
  val = analogRead(potPin);    // read the value from the sensor, between 0 - 1024
  if (val > 0 && val <= 999 ) {
    pulseWidth = val*2 + minPulse;  // convert angle to microseconds
    Serial.print("moving servo to ");
  updateServo();   // update servo position

// called every loop().
void updateServo() {
  // pulse the servo again if the refresh time (20 ms) has passed:
  if (millis() - lastPulse >= refreshTime) {
    digitalWrite(servoPin, HIGH);   // Turn the motor on
    delayMicroseconds(pulseWidth);  // Length of the pulse sets the motor position
    digitalWrite(servoPin, LOW);    // Turn the motor off
    lastPulse = millis();           // save the time of the last pulse

Your rating: None
Drupal theme by Kiwi Themes.