Announcements

November 24, 2007
Reading for November 27th, are now posted. Enjoy!

October 2, 2007
To upload your thoughtless acts, create a new assignment page like any other lab. You'll see "Thoughtless Acts" listed as one of the assignment options.

May 24, 2008
This site has been archived and is no longer editable. Stay tuned for the next version, coming in the fall!


Walking on (shallow) water

Project Members: 
Elisa Oreglia

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
components

The walk begins
The walk begins

and goes forward
and goes forward


Powered by Drupal - Design by Artinet