User login

Powered by Drupal, an open source content management system

Theory and Practice of Tangible User Interfaces

Crawling Bug

Submitted by sohyeong on Thu, 10/23/2008 - 00:02

Assignment: Servo Motor: Actuation Assignment 2

Collaborators: sohyeong

Description

I created a "Crawling Bug" for this lab using a single servo motor.  I tried with different things from baby shoes, playdo, small rubber ball, and so on.  I found the paper clips worked quite well when I attached them to servo motor to mimic a bug's two legs.  I had 6 legs originally, but it didn't work well.  So, I went through few iterations and found out 2 legs work fine.  Since paper clips are quite thin, it is not that stable but it shows crawling motion enough.   

Components Used

  • Servo motor (1)
  • Paper Clips (2)
  • Wires
  • Arduino board (1) 
 Codes
/*
 * 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
  }
}