Go Down

Topic: Troble reading Arduino in SuperCollider (Read 495 times) previous topic - next topic

rdf107

Hey I am having trouble getting a consistent reading in SuperCollider from my Arduino.

Basically I have a pressure mat attatched, and it should read the numbers 1023 when no one is on it, and 0 when some one is on it.
I have connected everything perfectly, but SuperCollider seems to read the values from the Arduino smoothly for a few seconds and then pauses for a few minutes and then spits all the values it missed out at once.

I would really appreciate anyone's help as this has been bugging me for months.
[size=20]
SuperCollider Coding:[/size]


s.boot; //boot server

( //one time evaluation!! please....
p = Routine(
{
"recordings/Diss/Coding/01SynthDef.rtf".loadPaths;
1.wait;
 "recordings/Diss/Coding/02ReadBuf.rtf".loadPaths;
1.wait;
"recordings/Diss/Coding/03Buffers.rtf".loadPaths;
4.wait;
"recordings/Diss/Coding/04StructureOfEnvironments.rtf".loadPaths;
4.wait;
"recordings/Diss/Coding/05Environments.rtf".loadPaths;
1.wait;
"recordings/Diss/Coding/06Transition.rtf".loadPaths;
1.wait;
"recordings/Diss/Coding/05Environments.rtf".loadPaths;
});
p.reset.play;      
)

//wait for 20 seconds

( //evaluate composition
c =[~environment01, ~environment02,  ~environment03,                         
                       ~environment04, ~environment05, ~environment06,                   
                       ~environment07, ~environment08, ~environment09,
                       ~environment10, ~environment11].choose;
)

p = ArduinoSMS("/dev/tty.usbserial-A4001nK8", 115200);
p.action = { |... msg| ~a = msg[1].postln; };


(

fork {
     10000.do {
           p.send($r, $a);
           1.wait;
     }
};

~rout1 = Routine ({inf.do {if (~a<10, {"start the sound".postln; c.play;~rout2.reset.play; nil.alwaysYield;}); 0.5.wait;}});


~rout2 = Routine ({inf.do {if (~a>10, {"stop the sound".postln; SystemClock.clear;s.freeAll; ~rout1.reset.play; nil.alwaysYield;} ); 0.5.wait;}});


~rout1.reset.play;
)
p.close; //to close Arduino coding


[size=20]Arduino Coding:
[/size]

/*  
*  Arduino2Max
*  Send pin values from Arduino to MAX/MSP
*  
*  Arduino2Max.pde
*  ------------  
*  Latest update: September 2007
*  ------------
*  Copyleft: use as you like
*  by djmatic
*  Based on a sketch and patch by Thomas Ouellet Fredericks  tof.danslchamp.org
*  
*
*
* Don't worry about the LED (which you can connect to digital 13 if you want) as it doesn't contribute anything new.
* Attach a potentiometer to 5v and Ground (two outer connections), and the sensor (central connection) to Analogue in 5.
*
* In fact, the code below reads ALL the analogue pins, so you can use any...
*/


     int x = 0;                              // a place to hold pin values
     int led1Pin = 12;               // LED #1 is connected to pin 12
     int led2Pin[] = { 3, 4 };                // LED is connected to pin 12
     int timer = 55;                   // The higher the number, the slower the timing.
     int num_pins = 2;                  
     int switchPin1 = 1;
     int switchPin2 = 2;              // switch is connected to pin 2
     int val1;                    // variable for reading the pin status
     int val2;

     void setup() {
       Serial.begin(115200);
               int i;
for (i = 0; i < num_pins; i++)   // the array elements are numbered from 0 to num_pins - 1
               pinMode(led2Pin, OUTPUT);      // set each pin as an output
               pinMode(led1Pin, OUTPUT);     // Set the LED #1 pin as output
               pinMode(switchPin1, INPUT);    // Set the switch pin as input
               pinMode(switchPin2, INPUT);
    }




void loop()

{
 val1 = analogRead(switchPin1);
               if (val1 == HIGH) {               // check if the button is pressed
         digitalWrite(led1Pin, HIGH);  
         delay(4000);
         digitalWrite(led1Pin, LOW);    // turn LED #1 of
         delay(90000);  
     }
 val2 = digitalRead(switchPin2);
               if (val2 == LOW) {               // check if the button is pressed
         digitalWrite(led1Pin, HIGH);  
         delay(800);
         digitalWrite(led1Pin, LOW);    // turn LED #1 of
         
       }
     


  int i;

 for (i = 0; i < num_pins; i++) { // loop through each pin...
   digitalWrite(led2Pin, HIGH);   // turning it on,
   delay(timer);                  // pausing,
   digitalWrite(led2Pin, LOW);    // and turning it off.
 }
 for (i = num_pins - 1; i >= 0; i--) {
   digitalWrite(led2Pin, HIGH);
   delay(timer);
   digitalWrite(led2Pin, LOW);
 }


if (Serial.available() > 0){         // Check serial buffer for characters
       
   if (Serial.read() == 'r') {       // If an 'r' is received then read the pins
   
for (int pin= 0; pin<=5; pin++){      // Read and send analog pins 0-5
   x = analogRead(pin);
   sendValue (x);
   }

for (int pin= 2; pin<=13; pin++){     // Read and send digital pins 2-13
   x = digitalRead(pin);
   sendValue (x);
   }
 
   Serial.println();                 // Send a carriage returnt to mark end of pin data.
   delay (5);                        // add a delay to prevent crashing/overloading of the serial port
 
   }
   

}
}

void sendValue (int x){              // function to send the pin value followed by a "space".
Serial.print(x);
Serial.print(32, BYTE);
}


rdf107

can no one help??
does no one use Arduino with SuperCollider???

Go Up