Assignment: Servo Motor: Actuation Assignment 2
Collaborators:
Assignment: Servo Motor: Actuation Assignment 2
Collaborators:
This device rocks back and forth using an upside down pendulum and a servo motor. You can modify the speed of the rocking to fine-tune the forward motion.
The Code
/*
* Servo Controls Rocking Pendulum
* Modifications by Jessica Voytek, October, 2009
*
* modified for TUI October 2007
* Servo Serial Better
* -------------------
*
* Created 18 October 2006
* copyleft 2006 Tod E. Kurt <tod@todbot.com>
*
* adapted from "http://itp.nyu.edu/physcomp/Labs/Servo"
*/
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 = '1'; // variable used to store data from serial port
float pot;
int minPulse = 500; // minimum pulse width
int maxPulse = 2250; // maximum pulse width
int old_time = millis();
int new_time = millis();
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() {
pot = analogRead(potPin);
float theDelay = float((pot/1023)*1000);
Serial.println(pot);
new_time = millis();
if ((new_time - old_time) > theDelay) {
old_time = new_time;
if (val == '1') {
val = '2';
pulseWidth = 2020; // convert val from character variable to number variable
Serial.print("Moving servo to position ");
Serial.println(pulseWidth,DEC);
} else if (val == '2') {
val = '1';
pulseWidth = 1400;
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
}
}
Photos & Video