Besoin d'aide arduino & max tout simple

Bonjour,

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 :frowning:
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);
}

...et MAX

----------begin_max5_patcher----------
1055.3ocyXszaiaCD9r8uBBc10fujrYuEroEXAZO0E8RyhBZIFY1JQZPwzMY
Wr+2KeHknjH63GxN6EIyQin9327MCG5uMcRxJ88hlDvOC9KvjIea5jIASdCS
ZGOIoleedEuI3VRsnogWJRlEelUbuMX+KFoU.Pc1uUqrMxuJ7OCgmCaMqtqV
emsRXCSFp05FtMesTU92FQtMBFLi3dI.MKyeKE5uhVNGB9b66DmF6CaDwWHI
4wGIKBHRu5e9IVe7n30AmStxH4UIOAIopCQXusuOcp+xriiQN4UNd4XrxoWf
UdtttVnruRKbszY2bi5F0mVKa.gEInQnJZ.bvJohad.393qDFvsFcM.BrZ.N
ME3VZ.6ZgyWONAazFq+QbE3JSwcRkFjqUJGUIJ718t58YN.7QKnPV23c829k
qAbqkmu9IuZe84dLkaDb+DfgvraTqd.bM++jEfqlC9cQUkr4FUstPdqz4BhB
tZiw6IK34ejqsVvuJsesTX3UEtOWA3StUvGK0OJ.pjNDpuSE3BD7PjEvcHKf
rfdH0ekPoAYg+1PAeB9.i9nQL5mulqJEw3XkrvEj8gvJq+GNaqLxx0VkKoAn
uMXwEvFj6HiD0wB4PXRf5PnEgzqkCybKt.DWT5OX8B3VVc3cHLPQIwxzd0KX
6pdgzGz.IqbgoAKcjMHG7mBSAWwGMVHpMR1Y4wNdAmlMG9lTPaDFGo.Jb+pY
tpLWWoMQ6v4LJChmM3OFTvfFOYg3KtI7UoSMhJ2B0Ui7v1akrc5hPwAECLPW
Y3NRa6rUPpL6o6CJaHv2yhNUx7+ErVXD9pM4U5FwK2IIYjJmPh0SHrrHwk8J
9qGofy9ggTzaDpyEmPaKBs.tObxknH615SMHMFqd05xjhRAB6H6UCit7so9H
gDZxhOZLRFsmPfhNRFAwdGae8COKsoT3nGfquPquekd4NMiVxCoeScX3hcl7
bAxcr5xxJQxQlMfyBGfIVQvec2chLX3Gc1qCrwHU1QS0uj1KBRxNVUO4Bn52
ZaFAgMGvxfvChW1UuoogRhzXKYKoucmFs8lNL8PeG2KMVTvUOnwxGwdIxX8S
YP6L0GcI12bCWIdb1JM7BbWmwoP1RHc1f+B0CwCu3ccNVE6keA7.5kOtABgM
LirrCntSrK5mi5ANJNgwYn+k9HcXxJ3Q3vnu3+FK.Xu8myfM56L4cR31iPAd
56THZrRE2J0pd93ky8bZsrnPn5SY0xhMZWBQS2eLDcdpeOUj+lWxzMB74ACz
6KXQ6AXyNLrdpHhbF3OBi3YLRVZO9KL5TQK6bf1EQzFAcGZ8iNQzhQmCzlhh
pwrmoMyNYz5OT4ah1WrjN2py.lPuECxtrYL6ST8Ej4dEU8EgaOdSLFGFcpnk
tGnk9LV9rSfz8HnxNAH4F78o+OPiEvGD
-----------end_max5_patcher-----------

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.

bon courage
William

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 :-/ :-?

Bon, ben pas réussi avec cette méthode :frowning:

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

Je travaille avec une Duemilanove Atmega168

(et j'y retourne !! maintenant que j'ai décoincé, je suis à fond !)