Description:
The goal of this lab was to learn to control a Servo motor. In part 1 of the lab, I learned to connect the Servo motor to the Arduino and control it using a potentiometer.
For part 2 of the lab, I created a crawler. Learning to create forward motion for the crawler was very difficult for me. I tried a number of techniques before something really worked. In the end, the crawler uses a hook mechanism to grab the carpet and pull itself forward. There are two batteries on the bottom of the crawler that reduce the amount of friction resisting the forward motion. The batteries are spaced as far apart as possible to ensure stability. There were other additions made to this design to prevent it from tipping over; there is a weight on the top and a strip of carboard on the bottom. The hook is made up of a paper clip attached to a piece of wood which is connected to the Servo motor using a pipecleaner. I used the code provided to the class to control the angle of rotation of the Servo motor using a potentiometer.
Components Used:
1 - Arduino Uno
1 - Breadboard
1 - Servo motor
1 - Potentiometer
wires
materials for the crawler:
small box, wooden arm, paper clip (for a hook), 2 small batteries, pipecleaner, weight, strip of cardboard, and tape
Code:
/*
* Servo Control Serial
* 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 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(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() {
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);
}
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
}
}
- Login to post comments