Servo Motor: Baller Crawler

Posted by raghavchandra

raghavchandra's picture

Baler Crawler

Lab:

For this week's lab, we used a Servo Motor. Unlike a DC Motor, a Servo Motor usually is not supposed to spin fast. It is used for precise angular rotation. In lab, we experimented with it by using different input sensors and rotating its arms.

Components Used:
 
  • Arduino Micro-controller
  • Wires
  • Potentiometer
  • Servo Motor
  • Elastic Rubber Bands
  • Wooden sticks
 Description:
As a homework assignment, we were supposed to use Servo Motor to make a simple mechanical Crawler which could move forwards. I use a single Servo Motor and have given it arms. It uses one arm (attached to the Motor arm) to propel it self forwards and the other one to keep balance and direction. This way, it more-or-less, goes straight. 
I make use of rubber bands also. They are like shoes for the limbs, providing grip and friction. While experimenting, using that at the tip of the arms did make a difference. Without the grip, the Crawler sometimes slipped, and stayed at the same position.
 

Click Here to see the video.

Crawler 1                        Crawler 2

 
 
Arduino Code:
I use the code from the lab itself, which uses a Pot to control the rotation. This way, you can control the speed of the crawler so a certain extent.
The problem with controlling the Pot yourself is that you sometimes over shoot the amount and so the crawler ends up flipping. So I automated the rotation to get a smoother 'crawl'. I did this by simply looping and alternating between the values I wanted.

 

/*
* Servo with Potentiometer control
*/
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
  }
}
 

 

Crawler 2
Crawler 1
5
Your rating: None Average: 5 (1 vote)