Description
The servo motor is used to help a Jesus statue walk on shallow waters. The base consists of a tin car, with wheels but not autonomous power. On top of the car, there is the servo motor, kept in place by a shell of styrofoam, covered with aluminum (to give the impression of water). The plastic Jesus is perched on top of the contruction.
The servo motor is attached to a 'leg' made of 2 pieces of balsa wood, joined together through flexible wire so that they can bend. At the end of the longest piece of wood, there's a toothpick that provides traction on the floor. When the motor starts, the toothpick grips the floor (works better on carpet), and the leg of the motor moves forward. When the motion is completed, the wood bends and can start over again. It is slow, but it does move forward (note: not guaranteed to work in water, even shallow water)!
Components
1 tin car
1 plastic Jesus
1 servo motor
white styrofoam and aluminim sheet to cover it
2 pieces of balsa wood, attached to the servo motor and to each other with wire
1 toothpick (to provide traction), attached to the balsa wood with duct tape
1 pot, to control the servo motor speed
various wires
Code
Unvaried from the example used in class
/*
* 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 rhe refresh time (20 ms) have 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
}
}
Photos

components

The walk begins

and goes forward