Go Down

Topic: Troble reading Arduino in SuperCollider (Read 515 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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy