It definitely took me quite a bit of trial and error to be able to get the crawler to move forward. I had originally hoped to be able to have the crawler move its legs with a scissoring motion and have a piece of string attached to the motor that also lifted one leg off of the ground at a time. Unfortunately this was beyond my ability. What resulted was a crawler that inches forward, rotating two separate leg pieces. The tail is a functional accessory that counterbalances the crawler and prevents it from tipping over. What looks like eyes from above are beads that anchor the two legpieces to the front of the servo motor. Without these beads, the legs swung wildly and failed to move the crawler. Movements are controlled by rotating the pot back and forth.
I experienced the most difficulty with the rotation of the molecule kit pieces. The kit is intended to learn about molecules and many of the pieces rotate, so that the user can explore possible angles. This attribute was unfortunate when I found a good position and wanted to keep it. Oftentimes, I had a bead pop off and was unable to replicate the original conformation. It was, however, helpful for trying out different forms and moving things around.
VIDEO:
http://www.youtube.com/watch?v=ALI35U9nM8k
http://www.youtube.com/watch?v=LzZ5lEpV3wM
Materials:
1 Arduino Uno
1 Solderless Breadboard
1 Molecule Kit
1 pot
Jumper wires
1 Servo Motor
Code: (Reused from lab)
/*
* Servo with Potentiometer control
* Theory and Practice of Tangible User Interfaces
* October 11 2007
*/
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; // variable used to store data from potentiometer
int minPulse = 500; // minimum 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_serial_better ready");
}
void loop() {
val = analogRead(potPin); // read the value from the sensor, between 0 - 1024
if (val > 0 && val <= 999 ) {
pulseWidth = val*2 + minPulse; // convert angle to microseconds
Serial.print("moving servo to ");
Serial.println(pulseWidth,DEC);
}
updateServo(); // update servo position
}
// called every loop().
void updateServo() {
// pulse the servo again if the refresh time (20 ms) has 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
}
}
- Login to post comments