User login

Powered by Drupal, an open source content management system

Theory and Practice of Tangible User Interfaces

Lab 7

Submitted by davida on Wed, 10/22/2008 - 23:18

Assignment: Servo Motor: Actuation Assignment 2

Collaborators: tilman

Description:

The Bunny crawler has one servo attached to two bunny ears and a couple of special wires as legs. The two wires are connected to separate motor arms across from each other. The rear of the servo is attached to three paper clips that hold the balance of the beast. The servo gets input from a single potentiometer, and each wire arm swings opposite one another providing a forward motion. The motion is fairly controllable, the bunny can  move in a line across the floor.

 

Notes:
We started with the servo alone with wires, which resulted in off balance movements. We found that the method of using a wired crawler arm gripped the surface; Also length would not move very much with arms that were not equal in length. After trying various sizes and even experimentation with paper clips as arms intertwined in complex sliding configurations; we decided to go back to the wire arms which worked best, as the wires gave us better control.
The servo motors had enough juice to move the pieces, they were easy to attach to the servo star shaped arms. The best way to make a strong attachment was by using lots and lots of clear tape. The Bunny ears added some weight that came in handy on some surfaces.

We tried our original bunny on a kitchen table surface and it went fast and strong. Upon using the Bunny on other surfaces we discovered that it was not that easy to do.

 

Components:

wire, server motor,

tape and wires

One potentiometer

One 10-k ohm resistor

bunny ears

plastic lego

sun glasses

Board

usb cable

rubber bands


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
}
}