Rocking Crawler

Submitted by bmcrae on Tue, 03/19/2013 - 20:42
bmcrae's picture

Description

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)
 
while 1:
 
ser.write('5')
print '5'
 
time.sleep(0.5)
 
ser.write('9')
print '9'
 
time.sleep(0.5)
photo1.JPG
photo2.JPG
photo3.JPG
photo4.JPG
0
Your rating: None
Drupal theme by Kiwi Themes.