Go Down

Topic: Communication MAX/MSP=>Arduino via Serial, envoyer une liste ? (Read 4084 times) previous topic - next topic

Neizr

Avec spell ça communique bien, merci !

par contre, la communication Serial fait planter MAX au bout de quelques secondes de transfert ! J'ai essayé plusieurs methodes : envoyer la liste toutes les 10ms 20, envoyer la liste que quand elle change et ce tout les 10 ou 20ms.. Rien n'y fait, le problème n'a pas l'air de venir de MAX...

Je vais continuer à faire quelques test, mais ca a l'air prometteur !

Encore merci de ton aide preciseuse

Neizr

#16
Mar 31, 2014, 06:11 pm Last Edit: Mar 31, 2014, 06:27 pm by Neizr Reason: 1
Bonjour,

j'ai fais quelques test et le résultat a l'air prometteur ( :D)!

Ca communique bien, mais il y a un soucis de répartitions des channel. Le fait de changer la valeur d'un channel peut en affecter un autre, assez chaotiquement. Je pense que cela est du à la conversion int => ASCII via spell.
En effet, la longeur du message envoyé varie beaucoup vu que j'envoie 6 valeures numériques de 0 à 255, valeure qui peux prendre la place d'un, deux ou trois character ASCII. Je me retrouve donc avec une liste qui peux faire de 11 à 23 caractères (en comptant les espaces)

Exemple de message envoyé:

0 0 0 0 0 0 => spell => 48 32 48 32 48 32 48 32 48 32 48 => Serial

0 0 255 0 0 0 => spell=> 48 32 48 32 50 53 53 32 48 32 48 32 48 => Serial

le code arduino

Code: [Select]

// include the SPI library:
#include <SPI.h>

// set pin 10 as the slave select for the digital pot:
#define CS_1 10

// const int CS_1 = 10;
char Buffer[50];
char *pEnd;
long Channel[6];
int i;

void setup() {
 // set the slaveSelectPin as an output:
 pinMode(CS_1, OUTPUT);
 // initialize SPI:
 Serial.begin(9600);
 SPI.begin();
}

void loop() {
 
 if(Serial.available()){

ReceptionSerie();
TransferSPI();

           }

}

void ReceptionSerie() {

delay(20);

for(i=0;i<50;i++) Buffer[i]=NULL;

i=0;

while (Serial.available()) Buffer[i++]=Serial.read();

//Serial.print("J'ai reçu : ");

Channel[0] = strtol (Buffer,&pEnd,10);
//Serial.print(Channel[0]);

for (i=1;i<6;i++)  {
//Serial.print(",");
Channel[i] = strtol (pEnd,&pEnd,10);
//Serial.print(Channel[i]);
}

//Serial.println("");

}


void TransferSPI() {

for(int i=0;i<6;i++) {

digitalWrite(CS_1,LOW);
SPI.transfer(i);
SPI.transfer(Channel[i]);
digitalWrite(CS_1,HIGH);

//delayMicroseconds(10); // à décommenter si jamais ça ne marche pas

}
delayMicroseconds(100);
}



Je pense qu'il serait peut être plus pratique de convertir les entiers en ASCII dans Arduino plutôt que dans MAX. Comment peut on faire ça ?

Merci de votre aide !




B@tto

Salut,

Il faut utiliser les espaces pour séparer les différentes consignes
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

Neizr

Ok, ça me semblait aussi être la piste à emprunter. Cela dit, de la à coder ça en C, c'est une autre paire de manche pour moi !

Pourrais tu m'indiquer les fonctions à utiliser ?

Merci encore de ton aide précieuse !

B@tto

En reprenant un des premiers code que je t'avais donné :

Code: [Select]
char Buffer[50];
char *P;
long Channel[6];
int i;
....

if(Serial.available()){

delay(20);

for(int i=0;i<50;i++) Buffer[i]={'\0'};

int y=0;

while (Serial.available()) Buffer[y++]=Serial.read();

for (int g=0;g<6;g++)   {

P = strtok (BufferSerie, " ");
Channel[g] = strtol (P,NULL,10);

}


}
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

Go Up