In this lab, a crawler that rocks back and forth to move was created. First, a base was made out of Legos to make a foundation that the servo motor could be mounted onto. Once the servo motor was attached to the base, a beam of wood attached to the servo motor to create an arm. At the end of the arm, metal brackets were used to create a weight on one side, and rubber bands were wrapped around where the metal brackets touch the ground in order to provide friction and grip.
This setup allows the crawler to rock back and forth as the servo motor rotates between two specified angular positions, thus generating slow but steady movement. The movement is very little at the moment, but tuning of the crawler's weight on the arm as well as the amount and position of rubber grip could greatly improve the motion generated.
I had a little trouble writing a loop to alternate between two specified angular positions of the servo motor using the Arduino code, so I chose to write a Python script instead that writes to the Arduino's serial. This allows me to use the provided serial-control servo motor Arduino code and simulate the task of inputting alternating positions by hand.
Components
1 - Arduino Uno
1 - breadboard
1 - servo motor
1 - beam of wood
2 - metal brackets
3 - rubber bands
Multiple - Pieces of Legos
Code
Arduino:
/*
* 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 = 1812; // 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
}
}
Python:
# i262 Lab 7 Script for Crawler
# 3/19/13
import serial
import time
ser = serial.Serial('/dev/tty.usbmodemfd121', 9600)