Pour la première fois, j'essaie de communiquer entre MAX et arduino sans passer par firmata, car j'ai besoin de commander un servo avec la librairie adaptée.
Le code arduino pour la commande fonctionne : si je l'exécute de façon autonome ça tourne.
MAIS
Dès que j'essaie d'envoyer une valeur cible par MAX, ça arrête le programme arduino
La diode rx clignote, donc la carte doit bien recevoir des valeurs, mais ça bloque quelque part.
Voilà les codes :
ARDUINO
#include <Servo.h>
#define INCR 1
// on déclare le servomoteur comme une variable typée
Servo servo1;
int val=0;
int angle=0;
int sens=0;
/**
* Initialisation du programme
*/
void setup()
{
servo1.attach(9); // le servomoteur est sur une patte PWM
Serial.begin(9600);
}
/**
* Boucle infinie qui va gérer la rotation et faire alterner le sens de rotation
*/
void loop()
{
if ( Serial.available() ) {
char lebyte=Serial.read();
val = (int)lebyte;
}
// faire tourner le servomoteur
if (sens == 0)
{
angle += INCR;
}
else {
angle -= INCR;
}
// si on est arrivé à une extremité
if (angle <= val)
{
sens = 1;
}
if (angle >= val) {
sens = 0;
}
servo1.write(angle);
delay(10);
}
Je suppose que c'est pas compliqué, mais ça fait deux jours que je m'arrache les cheveux dessus, à essayer tous les scripts d'exemples et à tenter de les adapter...
...help !
Salut gael-l
Je me permet de te poser cette question,as-tu une raison particuliere d'utiliser MAX ??
Je faisais allusion à Processing.
je sais ,c'est une question idiote mais :-/: car le code MAX que tu as donné me parrait imbitable or mis le fait de le tester avec Max.
J'espère que tu auras la soluce à ton problème.
Cordialement
William
Euh... oui, j'utilise max parce que c'est un logiciel que je connais, et que tout le reste de mon installation est déjà programmée dans Pure Data.
Alors la repasser dans Max, que je pense utiliser de plus en plus, c'est simple, mais refaire tout ça en Processing (et au passage, apprendre Processing)... aie aie !
Cela dit, tout ce code en gros c'est juste un objet Serial avec un slider pour lui envoyer une valeur, hein.
Quant au code Max imbitable, oui c'est du code compressé, ça n'est effectivement pas lisible comme ça - Max permet de retransformer ça en patch.
Re-salut
Merci pour l'info,j'ai vaguement vu ce que Max peut faire (très bon soft) surtout pour celui ou celle qui tape dans la musique ,le prix m'a stoppé,d'ou l'avantage de Processing (plus orienté graphisme et gratuit) pas mal de sketchs voici un exemple réalisé par mes soins.
Re-re salut
je viens d'avoir une lueur, j'ai voulu tester ton truc mais mon max msp etait une version démo (expirée) ,bref j'ai recherché une app max pour arduino .
je ne sais pas si c'est volontaire de ta part ou pas, mais il me semble qu'il te manque qq chose comme çà !!
a toi de modifier les variables
en esperant que c'est bien çà.
void loop()
{
byte val;
// check if data has been sent from the computer
if (Serial.available()) {
// read the most recent byte (which will be from 0 to 255)
val = Serial.read();
// set the brightness of the LED
analogWrite(ledPin, val);
}
}
Grrrrr
J'ai bien un truc équivalent dans mon code, mais à tout hasard je viens de retester en remplaçant la sortie analogique de la LED par un angle de servo...
...et toujours rien. La carte semble bien recevoir des choses (la Rx clignote quand je bouge mon slider) mais ça ne tourne pas !
Le pire c'est que je suis convaincu que c'est une connerie qui coince.
#include <Servo.h>
// on déclare le servomoteur comme une variable typée
Servo servo1;
void setup()
{
servo1.attach(9); // le servomoteur est sur une patte PWM
Serial.begin(9600);
}
void loop()
{
byte val;
// check if data has been sent from the computer
if (Serial.available()) {
// read the most recent byte (which will be from 0 to 255)
val = Serial.read();
// set the brightness of the LED
servo1.write(val);
}
}
...et sur max, un slider sur la première entrée d'un objet [serial a 9600]
salut
on se rapproche de la soluce, je suppose que c'est un servo ordinaire avec + - et entrée PWM
remplace la ligne
byte val; par
int val;
et visualise Val avec Serial.println(Val); pour voir si tu as bien l'info par Max
et met analogWrite(servo1, val);
si tu met une led a la place de la servo tu dois voir l'intensité de la led bouger :o
je me trompe peut-etre ,mais on ne sait jamais
william
P.S:normalement avec servo1.write(val);ça devrai fonctionner :-/ :-?
Cela dit, j'ai fait autrement, et de façon plus simple, car la dernière version de Firmata permet d'utiliser des servos !
Du coup, ça va me permettre d'utiliser une seule carte pour piloter le servo et pour récupérer des données de capteurs.
Cool.
Donc si jamais d'autres arrivent ici : ce qui a fonctionné pour moi, c'est Firmata 2.1 sur la Arduino, et l'objet [arduino] de Maxuino dans max/msp.
Merci zener57 de t'être intéressé à mon problème (et cela dit, sur un plan théorique, je ne comprends toujours pas pourquoi ces manips n'ont pas marché : apparemment la carte ne recevait pas les données... même si j'essaye de les afficher, nada)
Salut
ouai ,c'est dommage,de plus je n'avais plus Max5 ,j'aurai bien voulu faire des essais de mon coté.je pense que ça m'aurai énervé de ne pas trouver ;D
je n'avais pas eu ce probleme avec Processing :-[
juste une petite question tu travail avec quelle Arduino ??
@+
et bon boulot pour l'avenir
William