Description
For this week's lab, we created our version of the “Cuckoo Clock”. We modified the typical version of the clock so that our "trap door" was implemented by two curtains that were pulled to the side and our "bird" was a phantom-looked mechanism that leaped forward and backward. The curtain mechanics operated through the use of two pulleys that draw the curtains to the side. The phantom mechanism used a linkage system to propel the phantom forward and backward. Each group member contributed holistically to the system as a whole but initially, Stuart and Naya worked on the curtain mechanics and Cindy and Ben worked on the phantom mechanics.
You can see our simple mechanic version of the phantom clock here:
http://youtu.be/SubIye6hvaQ
For Wednesday's showcase, however, we've added two servo motors to control the curtain and the phantom.
Components
1 Arduino Uno
1 Breadboard
2 Servomotors
Posterboard
Wood sticks
2 Plastic Pulleys
Plastic Sticks
Thread
Paperclips
Tape (Scotch and Duct)
Cloth
Plastic Bags
Metal Weights (nickels)
Flashlight
Code
/*
* Code for the phantom clock
* Created 29 October 2013
* 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