User login

Powered by Drupal, an open source content management system

Theory and Practice of Tangible User Interfaces

Lab 7: Servos

Submitted by katalene on Tue, 12/30/2008 - 10:09
Assignment: Servo Motor: Actuation Assignment 2
Collaborators:

Assignment: Servo Motor: Actuation Assignment 2
Collaborators:

Assignment: To make a creepie-crawlie thing using a servo. I only had one servo, so my options were slightly limited. I tried a few different combinations of household objects, but had difficulty getting it to move forward until this final version. I call my final creation "Servo Man!". It moves forward - for a few steps - and then falls over. I didn't modify the servo program that was provided for the homework - my Servo Man walks forward while I alternately pushed 4 and 6 on the keyboard.

 

Materials:

arduino/breadboard/resistors/wires

1 servo

cardboard

cellophane tape

hot glue

wire from a wire hanger

 

Photos:

 

Video Link:

http://video.google.com/videoplay?docid=-3156213854951618868&hl=en

 

Code:

/*
* Servo Control Serial
* modified for TUI October 2007
* Servo Serial Better
* -------------------
*
* Created 18 October 2006
* copyleft 2006 Tod E. Kurt <tod@todbot.com>
* http://todbot.com/
*
* adapted from "http://itp.nyu.edu/physcomp/Labs/Servo"
*/

int servoPin = 7; // Control pin for servo motor

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 serial port

int minPulse = 500; // minimum pulse width
int maxPulse = 2250; // maximum 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 control program ready");
}

void loop() {
val = Serial.read(); // read the serial port
if (val >= '1' && val <= '9' ) {
val = val - '0'; // convert val from character variable to number variable
val = val - 1; // make val go from 0-8
pulseWidth = (val * (maxPulse-minPulse) / 8) + minPulse; // convert val to microseconds
Serial.print("Moving servo to position ");
Serial.println(pulseWidth,DEC);
}
updateServo(); // update servo position
}

// called every loop().
// uses global variables servoPi, pulsewidth, lastPulse, & refreshTime
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
}
}