A Colorful Creature of the Future

This lab presented unique challenges that I hadn’t met in earlier assignments. Because of the servo motor’s limited range of movement, I had to find a way to distribute weight in such a way that would encourage the motor to move forward. I researched how bugs and other animals move and the only animals that move in side-to-side fashions (like the servo motor) are sea creatures. That wouldn’t work for this project. I ultimately came up with a creature of the future whose feet are made of tack glides for furniture, a paper towel roll, a chip clip, and a plastic beam and hairclip to help distribute the weight. The creature of the future moves by turning the potentiometer left and right.

Components:

  1. 1 Arduino board
  2. 1 Breadboard
  3. Jumper wires
  4. 1 potentiometer
  5. 1 servo motor
  6. 1 USB cable
  7. 2 tack glides for furniture
  8. several hairclips
  9. 1 chip clip
  10. 1 paper towel roll
  11. Duct tape
  12. small plastic beam
  13. Pipe cleaners to create a Quidditch hoop to tie this back to Harry Potter.

Code:

/*
 * 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
 }
}

 

Leave a Reply