Announcements

November 24, 2007
Reading for November 27th, are now posted. Enjoy!

October 2, 2007
To upload your thoughtless acts, create a new assignment page like any other lab. You'll see "Thoughtless Acts" listed as one of the assignment options.

May 24, 2008
This site has been archived and is no longer editable. Stay tuned for the next version, coming in the fall!


Rube Harp (working title)

Project Members: 
Andrew McDiarmid
cjgoetz
Eun Kyoung Choe
Sheng-Ying Pao
Description


For the synthesis lab, we designed a string instrument actuated by two servo motors and two dc motors.  Three POT's and one FSR are used to manipulate the instrument, which spins pick-like coffee straws around striking rubber bands stretched across various acoustic resonators.  The sound produced is somewhat amelodic, and surprisingly variable, given the variable speed of rotation offered by the FSR and POT.  One servo motor extends the main dc motor to the main resonator (a tissue box), while the other servo motor slides the tissue box along a track, bringing the spinning pick higher or lower on the box's scale.  The other dc motor is on a stand which benefits from being handled directly, and this motor is also controlled by an FSR, which offers more direct control over the speed.  Different percussive patterns can be forged as a result.

Components Used


For this project, we use two breadboards, two arduino boards, two dc motors, two servo motors, three POT's, one FSR, a large cardboard base, a small paper plate, a tissue box, many rubber bands, several sticks/blocks of wood, push-pins, and an exorbitant amount of tape.

Code


Breadboard 1 (main)
/*
 * one pot fades one motor
 * modified version of AnalogInput
 * by DojoDave <http://www.0j0.org>
 * http://www.arduino.cc/en/Tutorial/AnalogInput
 * Modified again by dave
 * modified again by Andrew McDiarmid to control two servos as well
 * (pasted code from lab 7 and changed variable names)
 */

int pickPotPin = 0;   // select the input pin for the potentiometer
int motorPin = 9;     // select the pin for the Motor
int pickVal = 0;      // variable to store the value coming from the sensor

int servoPin = 7;     // Control pin for servo motor
int potPin   = 2;     // select the input pin for the potentiometer
int secondPotPin = 1;
int secondServoPin = 8;

int pulseWidth = 0;    // Amount to pulse the servo
int secondPulseWidth = 0;
long lastPulse = 0;    // the time in millisecs of the last pulse
long secondLastPulse = 0;
int refreshTime = 20;  // the time in millisecs needed in between pulses

int val;               // variable used to store data from potentiometer
int secondVal;

int minPulse = 500;   // minimum pulse width

void setup() {
  pinMode(servoPin, OUTPUT);  // Set servo pin as an output pin
  pinMode(secondServoPin, OUTPUT);
  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
  secondVal = analogRead(secondPotPin);
 
  if (val > 0 && val <= 999 ) {
    pulseWidth = val*2 + minPulse;  // convert angle to microseconds
 
    Serial.print("moving servo to");
    Serial.println(secondPulseWidth,DEC);
  }
 
  if (secondVal > 0 && secondVal <= 999) {
    secondPulseWidth = secondVal * 2 + minPulse; 
    Serial.print("moving second servo to ");
    Serial.println(secondPulseWidth,DEC);
  }
 
  pickVal = analogRead(pickPotPin);    // read the value from the sensor, between 0 - 1024
  Serial.println(pickVal);
  analogWrite(motorPin, pickVal/4); // analogWrite can be between 0-255

  updateServo();   // update servo position
  secondUpdateServo();
}

// called every loop().
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
  }
}

void secondUpdateServo() {
  // pulse the servo again if rhe refresh time (20 ms) have passed:
  if (millis() - secondLastPulse >= refreshTime) {
    digitalWrite(secondServoPin, HIGH);   // Turn the motor on
    delayMicroseconds(secondPulseWidth);  // Length of the pulse sets the motor position
    digitalWrite(secondServoPin, LOW);    // Turn the motor off
    secondLastPulse = millis();           // save the time of the last pulse
  }
}


 

Breadboard 2


/*
* one pot fades one motor
* modified version of AnalogInput
* by DojoDave <http://www.0j0.org>
* http://www.arduino.cc/en/Tutorial/AnalogInput
* Modified again by dave
*/

int potPin = 0;   // select the input pin for the potentiometer
int motorPin = 9; // select the pin for the Motor
int val = 1024;      // variable to store the value coming from the sensor
void setup() {
  Serial.begin(9600);
}
void loop() {
  val = analogRead(potPin);    // read the value from the sensor, between 0 - 1024
  Serial.println(val);
  analogWrite(motorPin, 255-val/4); // analogWrite can be between 0-255
}

 

Video

http://www.youtube.com/watch?v=ZnXytw3DsTA

http://www.youtube.com/watch?v=pgu-ZI5m0IQ

Images

instrument1

instrument2

instrument3

 

 


Powered by Drupal - Design by Artinet