Go Down

Topic: Animation pilote maquette - code servos simultanés (Read 16222 times) previous topic - next topic

VincentB

Super, là c'est clair, je te remercie ;)

VincentB

Bonjour tout le monde
Je reviens vers vous car j'aurais besoin d'aide, j'ai essayé par moi même la modif mais pas réussi a intégrer le code
Je vous explique:
actuellement lorsque j'appui sur un bouton poussoir, je lance mon animation du pilote, j'aimerais avoir un 2eme bouton poussoir, afin de choisir de lancer une autre animation, basée sur le même principe, mais dont les synchro et delai seront differents puisque synchro avec une autre bande son
je met juste une partie de mon code actuel
Code: [Select]

#include <Servo.h> 


Servo bras;   
Servo tete;
Servo machoire; 
int bra = 0;
int tet = 0;
int tets = 0;
int mache = 0;
int bouton = 2;
int bouton2 = 7; //2eme bouton poussoir pour jouer scene 2
long randNumber;
int fm = 20; // facteur modulo tete/machoire

void setup()
{
  bras.attach(3);
  tete.attach(5);
  machoire.attach(6);

  Serial.begin(9600);
  pinMode(bouton, INPUT);
  pinMode(bouton2, INPUT);

}

void loop() {

  if (digitalRead(bouton) == HIGH) //scene 1 déclenchée par bouton poussoir 1

  {
    delay(1800); //pause avant commencer animation


    for(tet = 90; tet>=80; tet-=1) //bouge la tête à droite   
    {                                 
      tete.write(tet);               
      delay(15);
    }       

    for(bra = 90; bra>=50; bra-=1) //leve le bras   
    {                                   
      bras.write(bra);  //petits mouvements de tête pendant qu'il leve le bras
      if (bra % fm ==0) {
        randNumber = random(-5,5);
        tets=tet;
        tet=tet+randNumber;
        tete.write(tet); 
        tet=tets;   
      }       
      delay(30);

    }   
    delay(300);
    int compteur = 0;
    while (compteur < 14) //bras va et vient de 7° sur la trompette
    {

      for(bra = 50; bra < 57; bra += 1) 
      {                                   
        bras.write(bra);  //petits mouvements de tête
        if (bra % fm ==0) {
          randNumber = random(-5,5);
          tets=tet;
          tet=tet+randNumber;
          tete.write(tet);
          tet=tets;   
        }       
        delay(15);

      }

      for(bra = 57; bra>=50; bra-=1)   
      {                                   
        bras.write(bra);  //petits mouvements de tête
        if (bra % fm ==0) {
          randNumber = random(-5,5);
          tets=tet;
          tet=tet+randNumber;
          tete.write(tet);
          tet=tets;   
        }       
        delay(15);

      }

      compteur++;
    }
    {
      delay(300);

      for(bra = 50; bra < 90; bra += 1)  //baisse le bras

      {                                   
        bras.write(bra);  //petits mouvements de tête pendant qu'il baisse le bras
        if (bra % fm ==0) {
          randNumber = random(-5,5);
          tets=tet;
          tet=tet+randNumber;
          tete.write(tet);
          tet=tets;   
        }       
        delay(20);

      }

      delay(100);

      for(tet = 80; tet < 130; tet += 1)  //bouge la tete à gauche
      {                               
        tete.write(tet);             
        delay(15);                       

      }

      for(tet = 130; tet>=50; tet-=1) //bouge la tête à droite   
      {                                 
        tete.write(tet);               
        delay(15);

      } 

      delay(100); 

      for(tet = 50; tet < 110; tet += 1)  //bouge la tête à gauche
      {                               
        tete.write(tet);             
        delay(20);                       

      }

      delay(500);    //commence à parler

      int compteur = 0;
      while (compteur < 3) //dis son nom
      {

        for(mache = 90; mache < 120; mache += 1)
        {                                   
          machoire.write(mache);  //petits mouvements de tête pendant qu'il parle
          if (mache % fm ==0) {
            randNumber = random(-1,1);
            tets=tet;
            tet=tet+randNumber;
            tete.write(tet);
            tet=tets;   
          }       
          delay(4);

        }
        for(mache = 120; mache>=90; mache-=1)

        {                                   
          machoire.write(mache);  //petits mouvements de tête pendant qu'il parle
          if (mache % fm ==0) {
            randNumber = random(-1,1);
            tets=tet;
            tet=tet+randNumber;
            tete.write(tet);
            tet=tets;   
          }       
          delay(4);

        }
        compteur++;

      }

      }
    }
  }


Je suppose que je dois mettre pour ce 2eme bouton

int bouton2 = 7;
pinMode(bouton2, INPUT);

mais après?? comment integrer le code pour rejouer une autre animation?

ça il faut le mettre?
if (digitalRead(bouton2) == HIGH)

au début ou juste avant la 2eme anim?


j'ai essayé différente possibilité mais ça me met des erreurs, je mets surement le code au mauvais endroit
merci de votre aide

Artouste

bonjour
compilé mais pas testé
essaye ça , ce n'est pas beau, mais c'est surement plus pratique pour toi à intégrer

Code: [Select]
#include <Servo.h> 


Servo bras;   
Servo tete;
Servo machoire; 
int bra = 0;
int tet = 0;
int tets = 0;
int mache = 0;
int bouton = 2;
int bouton2 = 7; //2eme bouton poussoir pour jouer scene 2
long randNumber;
int fm = 20; // facteur modulo tete/machoire

void setup()
{
  bras.attach(3);
  tete.attach(5);
  machoire.attach(6);

  Serial.begin(9600);
  pinMode(bouton, INPUT);
  pinMode(bouton2, INPUT);

}

void loop() {

  if (digitalRead(bouton) == HIGH) //scene 1 déclenchée par bouton poussoir 1

  {
    delay(1800); //pause avant commencer animation


    for(tet = 90; tet>=80; tet-=1) //bouge la tête à droite   
    {                                 
      tete.write(tet);               
      delay(15);
    }       

    for(bra = 90; bra>=50; bra-=1) //leve le bras   
    {                                   
      bras.write(bra);  //petits mouvements de tête pendant qu'il leve le bras
      if (bra % fm ==0) {
        randNumber = random(-5,5);
        tets=tet;
        tet=tet+randNumber;
        tete.write(tet); 
        tet=tets;   
      }       
      delay(30);

    }   
    delay(300);
    int compteur = 0;
    while (compteur < 14) //bras va et vient de 7° sur la trompette
    {

      for(bra = 50; bra < 57; bra += 1) 
      {                                   
        bras.write(bra);  //petits mouvements de tête
        if (bra % fm ==0) {
          randNumber = random(-5,5);
          tets=tet;
          tet=tet+randNumber;
          tete.write(tet);
          tet=tets;   
        }       
        delay(15);

      }

      for(bra = 57; bra>=50; bra-=1)   
      {                                   
        bras.write(bra);  //petits mouvements de tête
        if (bra % fm ==0) {
          randNumber = random(-5,5);
          tets=tet;
          tet=tet+randNumber;
          tete.write(tet);
          tet=tets;   
        }       
        delay(15);

      }

      compteur++;
    }
    {
      delay(300);

      for(bra = 50; bra < 90; bra += 1)  //baisse le bras

      {                                   
        bras.write(bra);  //petits mouvements de tête pendant qu'il baisse le bras
        if (bra % fm ==0) {
          randNumber = random(-5,5);
          tets=tet;
          tet=tet+randNumber;
          tete.write(tet);
          tet=tets;   
        }       
        delay(20);

      }

      delay(100);

      for(tet = 80; tet < 130; tet += 1)  //bouge la tete à gauche
      {                               
        tete.write(tet);             
        delay(15);                       

      }

      for(tet = 130; tet>=50; tet-=1) //bouge la tête à droite   
      {                                 
        tete.write(tet);               
        delay(15);

      } 

      delay(100); 

      for(tet = 50; tet < 110; tet += 1)  //bouge la tête à gauche
      {                               
        tete.write(tet);             
        delay(20);                       

      }

      delay(500);    //commence à parler

      int compteur = 0;
      while (compteur < 3) //dis son nom
      {

        for(mache = 90; mache < 120; mache += 1)
        {                                   
          machoire.write(mache);  //petits mouvements de tête pendant qu'il parle
          if (mache % fm ==0) {
            randNumber = random(-1,1);
            tets=tet;
            tet=tet+randNumber;
            tete.write(tet);
            tet=tets;   
          }       
          delay(4);

        }
        for(mache = 120; mache>=90; mache-=1)

        {                                   
          machoire.write(mache);  //petits mouvements de tête pendant qu'il parle
          if (mache % fm ==0) {
            randNumber = random(-1,1);
            tets=tet;
            tet=tet+randNumber;
            tete.write(tet);
            tet=tets;   
          }       
          delay(4);

        }
        compteur++;

      }

      }
    } // fin animation 1
   
    //animation 2
   
    if (digitalRead(bouton2) == HIGH) //scene 2 déclenchée par bouton poussoir 2

  {
    delay(1800); //pause avant commencer animation


    for(tet = 90; tet>=80; tet-=1) //bouge la tête à droite   
    {                                 
      tete.write(tet);               
      delay(15);
    }       

    for(bra = 90; bra>=50; bra-=1) //leve le bras   
    {                                   
      bras.write(bra);  //petits mouvements de tête pendant qu'il leve le bras
      if (bra % fm ==0) {
        randNumber = random(-5,5);
        tets=tet;
        tet=tet+randNumber;
        tete.write(tet); 
        tet=tets;   
      }       
      delay(30);

    }   
    delay(300);
    int compteur = 0;
    while (compteur < 14) //bras va et vient de 7° sur la trompette
    {

      for(bra = 50; bra < 57; bra += 1) 
      {                                   
        bras.write(bra);  //petits mouvements de tête
        if (bra % fm ==0) {
          randNumber = random(-5,5);
          tets=tet;
          tet=tet+randNumber;
          tete.write(tet);
          tet=tets;   
        }       
        delay(15);

      }

      for(bra = 57; bra>=50; bra-=1)   
      {                                   
        bras.write(bra);  //petits mouvements de tête
        if (bra % fm ==0) {
          randNumber = random(-5,5);
          tets=tet;
          tet=tet+randNumber;
          tete.write(tet);
          tet=tets;   
        }       
        delay(15);

      }

      compteur++;
    }
    {
      delay(300);

      for(bra = 50; bra < 90; bra += 1)  //baisse le bras

      {                                   
        bras.write(bra);  //petits mouvements de tête pendant qu'il baisse le bras
        if (bra % fm ==0) {
          randNumber = random(-5,5);
          tets=tet;
          tet=tet+randNumber;
          tete.write(tet);
          tet=tets;   
        }       
        delay(20);

      }

      delay(100);

      for(tet = 80; tet < 130; tet += 1)  //bouge la tete à gauche
      {                               
        tete.write(tet);             
        delay(15);                       

      }

      for(tet = 130; tet>=50; tet-=1) //bouge la tête à droite   
      {                                 
        tete.write(tet);               
        delay(15);

      } 

      delay(100); 

      for(tet = 50; tet < 110; tet += 1)  //bouge la tête à gauche
      {                               
        tete.write(tet);             
        delay(20);                       

      }

      delay(500);    //commence à parler

      int compteur = 0;
      while (compteur < 3) //dis son nom
      {

        for(mache = 90; mache < 120; mache += 1)
        {                                   
          machoire.write(mache);  //petits mouvements de tête pendant qu'il parle
          if (mache % fm ==0) {
            randNumber = random(-1,1);
            tets=tet;
            tet=tet+randNumber;
            tete.write(tet);
            tet=tets;   
          }       
          delay(4);

        }
        for(mache = 120; mache>=90; mache-=1)

        {                                   
          machoire.write(mache);  //petits mouvements de tête pendant qu'il parle
          if (mache % fm ==0) {
            randNumber = random(-1,1);
            tets=tet;
            tet=tet+randNumber;
            tete.write(tet);
            tet=tets;   
          }       
          delay(4);

        }
        compteur++;

      }

      }
    } // fin animation 2   
   
  }


VincentB

Merci Artouste, c'est bon ça marche
c'est comme ça que j'essayais de faire, mais je ne savais pas detecter la fin de scene1, donc avant la dernière accolade, là maintenant j'ai compris

Artouste


Merci Artouste, c'est bon ça marche
c'est comme ça que j'essayais de faire, mais je ne savais pas detecter la fin de scene1, donc avant la dernière accolade, là maintenant j'ai compris

Tant mieux si ça te convient,  ça t'évitera de perdre du temps sur la construction proprement dite !   XD
Artouste
admiratif de ton sens du détail   :smiley-slim:


VincentB

#35
Jan 24, 2012, 02:45 pm Last Edit: Jan 24, 2012, 02:50 pm by VincentB Reason: 1
Perdre du temps, ça je sais faire :smiley-mr-green:
entre 2 collages, j'aurais bien essayé de voir s'il était possible de remplacer mon actuel lecteur MP3 que je déclenche manuellement (ainsi que l'animation déclenchée manuellement via bouton poussoir en me calant sur un bip de départ, donc vraiment bricolo comme soluc. pour l'instant) par une carte mp3 branché sur l'arduino et avec du code pouvoir déclencher mes fichiers sons et l'animation synchro qui correspond au fichier son.
J'avais acheté ce petit truc "WTV020-SD" mais comment ça se brancherait sur l'arduino?
il y a bien des schemas sur http://emartee.com/product/41540/MP3%20Sound%20Module%20Mini%20SD%20Card mais je n'y comprend pas grand chose, pour ne pas dire rien

c'est faisable avec cette petite carte? ou il vaut mieux acheter un shield MP3 ou wav... plus "sérieux" si oui lequel? quelque chose que vous connaissez bien et qui marche sans soucis et "facile" à mettre en oeuvre

Artouste


Perdre du temps, ça je sais faire :smiley-mr-green:

... faisable avec cette petite carte? ou il vaut mieux acheter un shield MP3 ou wav... plus "sérieux" si oui lequel? quelque chose que vous connaissez bien et qui marche sans soucis et "facile" à mettre en oeuvre

On gagne souvent à perdre un peu de temps  :smiley-mr-green:

Dans ton application et compte tenu du fait que tu est minutieux, je me tournerais vers une solution hybride :
j'utiliserais un petit lecteur mp3 "apacher" (du genre de celui de ta video) et je ferais un hack en recuperant la connection du bouton passage au morceau suivant (voir d'autre si tu veux plus "luxe" et ensuite à charge pour ton programme arduino de simuler l'appui au bon moment dans ton animation.

un exemple de hack auquel je pense ici :
http://www.instructables.com/id/Super-IPod-1/step4/Super-IPod-How-to-hack-MP3-player/

VincentB

mouais, là je ne le sens pas trop, en plus c'est un bouton central pour l'allumage sur lequel il faut appuyer 2s pour mettre en marche, et c'est le même bouton pour lire le fichier son, je ne m'y connait pas assez pour improviser quoi que ce soit dans des branchements
Sinon je pensais au waveshield d'adafruit, https://www.adafruit.com/products/94  ça je pense que ce serait plus simple pour moi

Artouste


mouais, là je ne le sens pas trop, en plus c'est un bouton central pour l'allumage sur lequel il faut appuyer 2s pour mettre en marche, et c'est le même bouton pour lire le fichier son, je ne m'y connait pas assez pour improviser quoi que ce soit dans des branchements
Sinon je pensais au waveshield d'adafruit, https://www.adafruit.com/products/94  ça je pense que ce serait plus simple pour moi

ok, c'était juste une suggestion
le waveshield à l'air intéressant (pas mal d'exemples) et pas compliqué d'integration
http://www.ladyada.net/make/waveshield/examples.html

il te faut surtout à ce stade faire un bilan d'occupation des pin et aussi simuler l'intégration du code sur ton existant, pour voir si ça passe en taille.

les pin utilisés par le waveshield :

Pins 13, 12, 11 are always used by the SD card (they are the only pins that have a high speed SPI interface). Then there are 5 other pins used to talk to the DAC and SD card, but they can be set to connect to any arduino pin. However, by default, the library is configured to use pins 10 (for SD card) and pins 2, 3, 4 and 5 for the DAC. To chanage these pins requires modifying the library - the pins are referenced by their 'hardware' pin names (ie PORTD, etc) not by arduino pins.

That means pins 6, 7, 8, 9 and the 6 analog in pins (also known as digital i/o pins 14-20) are available

VincentB

oki, avant de commander, j'essayerais d'integrer le code de ce waveshield, actuellement mon code avec les 2 scènes à jouer ça fait 20400bytes sur les 30000

Artouste


oki, avant de commander, j'essayerais d'integrer le code de ce waveshield, actuellement mon code avec les 2 scènes à jouer ça fait 20400bytes sur les 30000


oui, parce que déjà avec les librairies à ajouter (hors code specifique) ne semblent pas si légère que ça (reste - de 10K)


Artouste


mouais, là je ne le sens pas trop, ...

Juste pour le fun et à suivre plus tard (semaine prochaine)
j'ai "décapsulé"  :smiley-mr-green: un vieil archos (encore avec son protecteur d'écran) qui fonctionne bien, je ne renonce pas à l'interfacer en commande avec qq pin d'arduino !
Speciale dedicace à nos amis suisse  :P






VincentB



je pensais au waveshield d'adafruit, https://www.adafruit.com/products/94

il te faut surtout à ce stade faire un bilan d'occupation des pin


Les servos doivent obligatoirement être branchés sur les pins PWM? dans ce cas il n'y aurait que la 6 et la 9 de libre, et comme j'ai 3 servos, ça n'irait pas?

et encore pour la pin 9 libre?? 
Je vois sur la FAQ à propos de ce shield
"How come I cant use the PWM output on pin 9?
Timer 1 is used by the wave shield for timing, if you want to use a servo, you can use ServoTimer2 or a 'softservo' library

Artouste



Les servos doivent obligatoirement être branchés sur les pins PWM? dans ce cas il n'y aurait que la 6 et la 9 de libre, et comme j'ai 3 servos, ça n'irait pas?



bonjour
Non les servos peuvent être sur une pin I/O (voir descriptif
http://arduino.cc/fr/Main/LibrairieServo )
pour tes animations sonores commandées par arduino
regarde du coté de ça, sur le papier l'interfaçage avec arduino est leger et il y a du code qui traine
un lien avec de la doc
http://emartee.com/product/41540/MP3%20Sound%20Module%20Mini%20SD%20Card

une image (pour respecter le reglement) vers un vendeur ebay (qui fête actuellement son nouvel an  :smiley-mr-green:  )




VincentB

C'est justement ce petit module que j'avais acheté
si je veux essayer ce module en suivant ce schema, les branchements sonts représentés comme si on regardait le module par dessus?

sur leur site il y a un pdf data, mais il y a différents schemas avec différentes representation d'affectation des pins, c'est pour ça que je n'ai jamais osé essayer. En fait comme je n'y connais rien, je n'ose jamais faire un branchement si pas sûr à 200% car j'ai toujours peur de griller quelque chose

Go Up