Description
This lab was a joint effort by Naya Loumou and Olivia Bigazzi. They manipulated the 180O motion of the servo motors to make a dancing robot.
It was a complicated task involving weights and counterweights to make sure the robot did not fall and did in fact dance.
See it dance here (http://youtu.be/xdQ-evNzr_4).
Components Used
1 – Arduino Uno
1 – Breadboard
2 – Servos
2 – Wooden Sticks
1 – Tennis Ball Holder
Code
/*
* The dancing android
* Created 29 October 2013
* by Olivia and Naya
* adapted from "http://itp.nyu.edu/physcomp/Labs/Servo"
*/
int servoPin1 = 7; // Control pin for 1st servo motor
int servoPin2 = 8; // Control pin for 2nd 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(servoPin1, OUTPUT); // Set servo pin as an output pin
pinMode(servoPin2, 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);
}
updateServo1(); // update servo position
updateServo2();
}
// called every loop().
// uses global variables servoPi, pulsewidth, lastPulse, & refreshTime
void updateServo1() {
// pulse the servo again if rhe refresh time (20 ms) have passed:
if (millis() - lastPulse >= refreshTime) {
digitalWrite(servoPin1, HIGH); // Turn the motor on
delayMicroseconds(pulseWidth); // Length of the pulse sets the motor position
digitalWrite(servoPin1, LOW); // Turn the motor off
lastPulse = millis();
// save the time of the last pulse
}
}
void updateServo2() {
// pulse the servo again if rhe refresh time (20 ms) have passed:
if (millis() - lastPulse >= refreshTime) {
digitalWrite(servoPin2, HIGH); // Turn the motor on
delayMicroseconds(pulseWidth); // Length of the pulse sets the motor position
digitalWrite(servoPin2, LOW); // Turn the motor off
lastPulse = millis();
// save the time of the last pulse
}
}
- Login to post comments