Servo-Rocker

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>

* http://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