I’ve got a tiny 9g servo from sparkfun, and decided to control this with
 a PD patch. There are some things you need to know about this 
patch/sketch. First off keep in mind that your arduino programmer, and 
your patch can not control the same comport. Also (on win7) I’ve 
occasionally had problems with one or the other refusing to release the 
com port resulting in having to restart both programs (I blame PD, 
sometimes it doesn’t like to let me switch GPU’s after it closes 
either.) Another interesting quirk deals with types of Data. As we 
learned Pd puts out x values in terms of  0-1 (in the case of this 
patch) so what I did (blatantly so there wasn’t any magic in my patch) 
was to multiply by 100, then modulus 100 to give me an integer. I don’t 
know about the Arduino specifically, but I avoid floats with 
uproccessors in general. Bad juju for a beginner IMHO. Then out to the 
comport. There may be a more elegant solution for the comport selection 
process, but I simply used device manager to find out what comport my 
arduino was on, (you need to know to program it anyway which is 
annoying) then simply put that as the argument for the patch. on the 
arduino side, you have to start serial communications, then read that 
value into some variable. It seems like I did a little magic in the 
sketch, but not really the map function is an awesome function to use (I
 found it when I was outputting sounds through the arduino) and the 
servo library is a huge help in something like this. For the sketch I 
modified the examples->servo->knob. I just replaced the 
potentiometer bit with the incoming serial values.
and the sketch...
/*
So this sketch will control a servo from data sent from PD
if I keep this up I'm likely to find my self halfway to jupider arguing with my spaceship as to whether or not it will let me back in.
 */
#include 
Servo myservo;
int val;
void setup() {
  // initialize serial comms 
  Serial.begin(9600);
 myservo.attach(9); //Servo is going to be controlled on pin 9 
}
void loop() {
  if (Serial.available()){//check to see if something is coming in 
  val = map(Serial.read(),0,99,0,179);//this maps the in comeing value to a value that the arduino can send to a servo. 
  }
    myservo.write(val); // this 'writes' the value to the servo
    delay(15);  // servos don't work instantaniously.
}//abandon all hope ye who enter here....

 

No comments:
Post a Comment