Lab 7: Servo Cradle
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
Code:
/*
* 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 ");
Serial.println(pulseWidth,DEC);
}
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
}
}
- Login to post comments