Arduino Forum

International => Français => Topic started by: VincentB on Jan 07, 2012, 07:30 am

Title: Animation pilote maquette - code servos simultanés
Post by: VincentB on Jan 07, 2012, 07:30 am
Bonjour tout le monde

Je me présente, Vincent 48 ans, habitant Béziers, passionné de maquettes de planeurs anciens et webmaster du site et forum retroplane.

J'ai découvert il y a peu de temps  Arduino, mais je n'ai aucune connaissance en programmation. j'ai eu l'aide du forum robot-maker, mais je suis actuellement encore bloqué par un problème, et j'ai l'impression que je leur ai fait perdre patience. Donc si vous le voulez bien, ce serait sympa de m'aider a finir un code d'animation, sur lequel je bloque

ce code est destiné à animer le pilote de ma dernière maquette

vous pouvez voir une petite vidéo de l'animation ici
http://www.retroplane.net/mira3/animation_pilote2.wmv

et le détail de la construction est ici
http://www.retroplane.net/mira3/page2.htm

je vous explique ce que je souhaterais faire
actuellement j'ai 3 servos dans mon pilote, tete, bras, machoire

toutes mes actions se font les unes derrière les autres
mais je voudrais pouvoir faire de petits mouvements de tête pendant que le pilote parle ou bouge le bras. il faut donc modifier le code pour que 2 servos "tete et machoire" marchent simultanément.

C'est surement tout simple et pourtant je n'y arrive pas, je vous met un bout de mon code avec les servos les uns derriere les autres, je vous serais tres reconnaissant si vous pouviez m'aider


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


Servo bras;  
Servo tete;
Servo machoire;  
int bra = 0;
int tet = 0;  
int mache = 0;
int bouton = 2;

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

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


}

void loop() {

 if (digitalRead(bouton) == HIGH)

 {
   delay(2000); //pause 2s avant commencer animation

   for(bra = 90; bra>=50; bra-=1) //leve le bras    
   {                                
     bras.write(bra);                
     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)  //baisse le bras
     {                                
       bras.write(bra);              
       delay(15);  

     }

     for(bra = 57; bra>=50; bra-=1) //leve le bras    
     {                                
       bras.write(bra);                
       delay(15);

     }

     compteur++;
   }
   {
     delay(300);

     for(bra = 50; bra < 90; bra += 1)  //baisse le bras
     {                                
       bras.write(bra);              
       delay(20);  

     }

     delay(100);

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

     }

     for(tet = 130; tet>=50; tet-=1)    
     {                                
       tete.write(tet);                
       delay(15);

     }  

     delay(100);  

     for(tet = 50; tet < 110; tet += 1)  
     {                                
       tete.write(tet);              
       delay(20);                        

     }

     delay(500);    //commence à parler

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

       for(mache = 90; mache < 120; mache += 1)


       {                                  
         machoire.write(mache);              
         delay(4);

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

       {                                
         machoire.write(mache);              
         delay(4);

       }
       compteur++;

     }
   }
 }
}




et le bout de ce code modifié, mais qui ne marche pas sans que je comprenne pourquoi, (j'ai commenté les problemes sur le code)


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


Servo bras;  
Servo tete;
Servo machoire;  
int bra = 0;
int tet = 0;  
int mache = 0;
int bouton = 2;

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

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


}

void loop() {

 if (digitalRead(bouton) == HIGH)

 {
   delay(2000); //pause 2s avant commencer animation

   for(bra = 90; bra>=50; bra-=1) //leve le bras    
   {                                
     bras.write(bra);                
     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)  //baisse le bras
     {                                
       bras.write(bra);              
       delay(15);  

     }

     for(bra = 57; bra>=50; bra-=1) //leve le bras    
     {                                
       bras.write(bra);                
       delay(15);

     }

     compteur++;
   }
   {
     delay(300);

     for(bra = 50; bra < 90; bra += 1)  //baisse le bras
     {                                
       bras.write(bra);              
       delay(20);  

     }

     delay(100);

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

     }

     for(tet = 130; tet>=50; tet-=1)    
     {                                
       tete.write(tet);                
       delay(15);

     }  

     delay(100);  

     for(tet = 50; tet < 110; tet += 1)  
     {                                
       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)
             {
       for(tet = 110; tet>=90; tet-=1) //je voudrais que la tête bouge en même temps que la machoire marche, mais avec ce code la tete bouge en boucle rapidement et la machoire marche hyper lentement, en fait les delay ne sont pas pris en compte et gènent et seulement apres le reste de l'animation se joue

       {                                  
         machoire.write(mache);              
         delay(4); //ce sont ces delay qui genent l'anim, si je les enlève ça marcherait mais les servo s'actionnent trop rapidement
         
       tete.write(tet);                
       delay(15); //ce sont ces delay qui genent l'anim, si je les enlève ça marcherait mais les servo s'actionnent trop rapidement
       }
       }  
       for(mache = 120; mache>=90; mache-=1)

       {                                
         machoire.write(mache);              
         delay(4);

       }
       compteur++;

     }
   }
 }
}


Title: Re: Code servos simultanés
Post by: Super_Cinci on Jan 07, 2012, 09:15 am
Salut,

Pour commencer, je me permets de te féliciter pour ton boulot, c'est du grand art (j'en serais incapable!). Il te faut donc une animation qui va avec!

Je comprends bien ton programme, bien écrit et facile à lire, tu m'as l'air d'être quelqu'un de minutieux, encore bravo!

Actuellement, tu fais des mouvements les uns après les autres, et tu ne peux pas faire des mouvements simultanés, ce que tu voudrais faire si j'ai bien compris.

je vois deux possibilités, la seconde étant une extension de la première.

Solution 1 : une séquence d'animation à 3 listes...

On imagine trois tableaux de la même taille :
Code: [Select]

const Bra = 3    // numéro du servo Bras
const Tet = 5    // numéro du servo Tête
const Mac = 6    // numéro du servo Mâchoire

const MAX_ANIM = 256;
// tab_servo[n] contient le numéro du servo pour l'action n
volatile byte tab_servo[MAX_ANIM] = {Tet, Tet, Tet, Tet,  Bra, Bra, Tet, Mac, Tet, Mac, Tet};
// tab_valeur[n] contient la valeur à envoyer au servo N° tab_servo[n] pour l'action n
volatile byte tab_valeur[MAX_ANIM] = { 90,  85,  80,  75,  50,  57,  60,  90,  75, 120,  90};
// tab_tempo[n] contient le nombre de pas avant le passage à l'action suivante (n+1)
volatile byte tab_tempo[MAX_ANIM] = { 25,  25,  25,  25,  150, 150,  15,  60,  60,  60,  60};
volatile word tab_index;  // index de l'action en cours

Bien sûr, tu seras limité avec la taille de la ram de ton nano (je ne sais pas quel proc est monté dessus...) à MAX_ANIM actions, ici 256.
Code: [Select]

volatile boolean animation = false;

volatile word compteur;

ISR(TIMER1){
  compteur++;  // on incrémente le compteur de pas.
  if (compteur >= tab_tempo[tab_index]) { // le compteur a atteint le nombre de pas désiré, on passe à l'action suivante
    compteur = 0;
    tab_index++;
    if (tab_index > MAX_ANIM) tab_index = 0; // dans le cas où l'animation tourne en boucle.
    servo.Write(tab_servo[tab_index], tab_valeur[tab_index]);  //envoie l'action suivante
  }
}

setup(){
//  Préparer le timer1 de façon à ce qu'il appelle l'ISR ci-dessus toutes les x milliseconde quand on l'y autorisera.
}

loop{
  lecture_télécommande();
//  si lancement ou reprise après pause de la séquence, alors autoriser l'interruption du timer1
//  si pause de la séquence, interdire l'interruption du timer1
//  si stop, interdire l'interruption du timer1, faire servo.Write() sur les trois servos pour les remettre en position 0 et mettre tab_index à 0;
}

Explication :
La fonction loop() tourne en continu, donc on va l'utiliser pour détecter les commandes IR par exemple.
Ensuite, on définit le timer à 10ms, cela veut dire que toutes les 10ms, l'ISR sera appelée sans qu'on ait rien à programmer, ça se fait vraiment tout seul (le principe des timers)! ta séquence programmée dans les tableaux aura donc un pas de 10ms. Dans mon exemple, pour les 4 premières actions (la tête tourne), il faudra que l'ISR soit appelée 25 fois pour passer à l'action suivante, soit 250ms entre deux actions, la tête tournera de 90 à 75 en 750 millisecondes, puis le bras commencera à bouger vers 50° une seconde après le lancement de la séquence.
1500ms plus tard (150 appels de l'ISR), le bras ira à 57°,
1500ms plus tard, la tête va à 60,
150 ms après, la mâchoire va sur 90,
600 ms après, la tête va sur 75,
600 ms après, la mâchoire va sur 120,
600 ms après, la tête va sur 90,
600 ms après, c'est la fin de ma séquence, mais on peut en rajouter...

Bref, en 11 instructions, j'ai fait une séquence de 6,55 secondes... En plus, on n'a juste à changer les 10ms du timer en 5ms par exemple pour que la séquence se déroule 2 fois plus vite...

la solution 2 reprend celle-là, mais en utilisant le tableau tab_servo[] qui contient des octets (dont seuls les 4 premiers bits servent) pour rajouter des codes sr les 4 derniers bits de chaque octet qui permettraient par exemple de répéter 3 fois de la séquence 124 à 197... mais là, ça commence à faire compliquer (mais dans le cas de séquences répétitives, ça fait gagner de la mémoire...)

Le seul inconvénient de ma (mes) méthode(s), c'est que c'est incompatible avec la librairie servo (car cette librairie coupe les interruptions dans tous les sens, et rendrait la lecture de séquence très peu précise). J'ai une solution pour palier à ça en utilisant en direct les sorties PWM, et tu vas finir par me dire que c'est beaucoup trop compliqué... Mais je te garantis que c'est faisable (d'autant plus faisable avec un mega2560, car on peut contrôler jusqu'à 12 servos sans que ça se voit), je l'ai fait plusieurs fois! Voir aussi avec la mémoire dispo, peut-être passer par ProgMem...

sinon, désolé d'avoir dit des gros mots :smiley-mr-green: :D
Title: Re: Code servos simultanés
Post by: VincentB on Jan 07, 2012, 11:33 am
Merci de t'interresser à mon problème, mais je rapelle que je n'ai aucune connaissance en programmation, et ton code je ne sais pas l'intégrer et est-ce que ça maitrise la vitesse de rotation des servos, j'ai l'impression que non?
C'est pas possible de modifier/compléter le code que je donne au départ? car celui là je commençais a le maitriser pour l'adapter a mon anim. d'autant que toute ma synchro avec la bande son est faite et j'aurais aimé ne pas avoir à la refaire, c'est pour ça je pensais pouvoir intégrer du code au mien pour que des actions de servo marchent simultanément sans que ça dérègle ma base de synchronisation
Title: Re: Code servos simultanés
Post by: Artouste on Jan 07, 2012, 02:04 pm

Bonjour tout le monde

Je me présente, Vincent 48 ans, habitant Béziers, passionné de maquettes de planeurs anciens et webmaster du site et forum retroplane.

J'ai découvert il y a peu de temps  Arduino, mais je n'ai aucune connaissance en programmation. j'ai eu l'aide du forum robot-maker, mais je suis actuellement encore bloqué par un problème, et j'ai l'impression que je leur ai fait perdre patience. Donc si vous le voulez bien, ce serait sympa de m'aider a finir un code d'animation, sur lequel je bloque

ce code est destiné à animer le pilote de ma dernière maquette

vous pouvez voir une petite vidéo de l'animation ici
http://www.retroplane.net/mira3/animation_pilote2.wmv

et le détail de la construction est ici
http://www.retroplane.net/mira3/page2.htm

je vous explique ce que je souhaterais faire
actuellement j'ai 3 servos dans mon pilote, tete, bras, machoire

toutes mes actions se font les unes derrière les autres
mais je voudrais pouvoir faire de petits mouvements de tête pendant que le pilote parle ou bouge le bras. il faut donc modifier le code pour que 2 servos "tete et machoire" marchent simultanément.



Bonjour
déjà, clap clap ! c'est très sympa et bien fait comme réalisation  :smiley-mr-green:
et puis tout ce qui vole ou a volé , j'aime bien !  8)

Si j'ai bien compris, vous avez scénarisé l'animation ? (durée et actions ? )
en theorie votre "probleme" revient donc à connaitre/envoyer l'ordre de positionnement des (3) servos à chaque étape ?
le taux de rafraichissement est donc au mini equivalent au taux d'actualisation du servo le plus rapidement sollicité en changement de position.

Il semblerait que là ce soit la mâchoire ?

C'est aussi dépendant du temps de transfert mécanique entre les positions extrêmes des servos.

personnellement à ce stade réflexion et si je devais faire , je me dirigerais vers une solution lecture table d'événements :
1 - détermination de la durée du pas (fréquence de réactualisation Fr)
2 - remplissage de la table fonction de Fr et du scenario.

en "production"
lire et appliquer fonction de  Fr  le positionnement lu des x servos.

défauts :  masse d'info de position "relativement" importante à coder/engranger (mais voir calcul d'occupation en fonction de la durée).

avantages : les positionnements ne sont plus "code dépendant", en dehors de ce que peut absorber un arduino en EE, je vois bien un shield SD embarquant plusieurs scénarios.

mais .. ce n'est là que ma réflexion :smiley-roll-sweat:










 
Title: Re: Code servos simultanés
Post by: Super_Cinci on Jan 07, 2012, 02:36 pm
Quote
personnellement à ce stade réflexion et si je devais faire , je me dirigerais vers une solution lecture table d'événements :
1 - détermination de la durée du pas (fréquence de réactualisation Fr)
2 - remplissage de la table fonction de Fr et du scenario.

en "production"
lire et appliquer fonction de  Fr  le positionnement lu des x servos.

défauts :  masse d'info de position "relativement" importante à coder/engranger (mais voir calcul d'occupation en fonction de la durée).

avantages : les positionnements ne sont plus "code dépendant", en dehors de ce que peut absorber un arduino en EE, je vois bien un shield SD embarquant plusieurs scénarios.
c'est ce que fait le code que j'ai proposé... mais voilà, je sais bien que pour Vincent, c'est que des gros mots (ISR, timer...) et donc soit on lui colle un truc tout fait, mais s'il veut le modifier, y arrivera-t-il? ou sinon on trouve un intermédiaire... et là, pas facile.

sinon, une autre idée :

il garde son code tel qu'il est, mais vire tout ce qui touche au servo de la mâchoire. les valeurs envoyées au servo mâchoire pourraient être gérées par (oui, je sais, c'est inévitable) un timer :

On fait passer la bande son par un détecteur de crête moyenne (circuit passe-bas diode + RC) puis sur l'entrée analogique 0.
Toutes les x millisecondes (250 par exemple), on fait un analogRead (A0), et si ça dépasse un seuil (par exemple un potar via analogRead(A1), plus facile à régler), on ouvre la bouche, sinon, on la ferme.

Le corps du pilote continuera à bouger sur le scénario actuel, la bouche suivra le volume sonore de la parole...
Title: Re: Code servos simultanés
Post by: VincentB on Jan 07, 2012, 07:29 pm
Bon, ben je crois que mon animation va rester comme elle est, ce que vous me proposez est trop compliqué pour moi

Je reexplique simplement  ce que je veux obtenir:
-actuellement mon pilote bouge la machoire synchro avec une bande son qui est externe à la programation puisque joué par un lecteur mp3
mais pendant qu'il parle, sa tête ne bouge pas, donc je trouve que ça fait un peu figé

je voulais donc juste faire des petits mouvements de tête de quelques degrés (servo tete) pendant qu'il parle (servo machoire) rien de plus

je pensais que ça aurait été tout simple avec un code facile de même type que celui que j'ai dejà, et que ça s'intègrerait dans mon code existant sans que ça modifie toute ma synchro, puisque le servo tête serait censé  bouger en même temps que le servo machoire

j'imaginais que mon 2eme code, (que je montre dans mon 1er message) était très proche du but, juste quelques parentheses a modifier pour que ça marche
Title: Re: Code servos simultanés
Post by: Artouste on Jan 07, 2012, 09:14 pm

Bon, ben je crois que mon animation va rester comme elle est, ce que vous me proposez est trop compliqué pour moi

Je reexplique simplement  ce que je veux obtenir:
-actuellement mon pilote bouge la machoire synchro avec une bande son qui est externe à la programation puisque joué par un lecteur mp3
mais pendant qu'il parle, sa tête ne bouge pas, donc je trouve que ça fait un peu figé

je voulais donc juste faire des petits mouvements de tête de quelques degrés (servo tete) pendant qu'il parle (servo machoire) rien de plus

je pensais que ça aurait été tout simple avec un code facile de même type que celui que j'ai dejà, et que ça s'intègrerait dans mon code existant sans que ça modifie toute ma synchro, puisque le servo tête serait censé  bouger en même temps que le servo machoire

j'imaginais que mon 2eme code, (que je montre dans mon 1er message) était très proche du but, juste quelques parentheses a modifier pour que ça marche


ok
alors j'essaierai : à chaque modif de machoire, d'appliquer un random de qq° à la position tête :
dans le 1er code
machoire.write(mache);
randNumber = random(-5,5); //exemple attention au type et aux bornes
tet=tet+randnumber
tete.write(tet);
Title: Re: Code servos simultanés
Post by: VincentB on Jan 08, 2012, 07:10 am
Bonjour, en ajoutant ton code, j'ai une erreur

Code: [Select]
randNumber = random(-5,5);

In function 'void loop()':
error: 'randNumber' was not declared in this scope


il ne faut pas en remettre un morceau ailleurs? si oui où et quoi? j'ai essayé plusieurs trucs a taton dans le void setup mais ça me met d'autres erreurs
et que veux dire ton commentaire  //exemple attention au type et aux bornes
Title: Re: Code servos simultanés
Post by: Artouste on Jan 08, 2012, 10:47 am

Bonjour, en ajoutant ton code, j'ai une erreur

Code: [Select]
randNumber = random(-5,5);

In function 'void loop()':
error: 'randNumber' was not declared in this scope


il ne faut pas en remettre un morceau ailleurs? si oui où et quoi? j'ai essayé plusieurs trucs a taton dans le void setup mais ça me met d'autres erreurs
et que veux dire ton commentaire  //exemple attention au type et aux bornes

bonjour
c'etait juste un exemple d'insertion
il faut declarer la variable randNumber
essaie ce code testé compilé ok

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


Servo bras;   
Servo tete;
Servo machoire; 
int bra = 0;
int tet = 0; 
int mache = 0;
int bouton = 2;
long randNumber;
void setup()
{
  bras.attach(3);
  tete.attach(5);
  machoire.attach(6);

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


}

void loop() {

  if (digitalRead(bouton) == HIGH)

  {
    delay(2000); //pause 2s avant commencer animation

    for(bra = 90; bra>=50; bra-=1) //leve le bras   
    {                                 
      bras.write(bra);               
      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)  //baisse le bras
      {                               
        bras.write(bra);             
        delay(15); 

      }

      for(bra = 57; bra>=50; bra-=1) //leve le bras   
      {                                 
        bras.write(bra);               
        delay(15);

      }

      compteur++;
    }
    {
      delay(300);

      for(bra = 50; bra < 90; bra += 1)  //baisse le bras
      {                               
        bras.write(bra);             
        delay(20); 

      }

      delay(100);

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

      }

      for(tet = 130; tet>=50; tet-=1)     
      {                                 
        tete.write(tet);               
        delay(15);

      } 

      delay(100); 

      for(tet = 50; tet < 110; tet += 1) 
      {                               
        tete.write(tet);             
        delay(20);                       

      }

      delay(500);    //commence à parler

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

        for(mache = 90; mache < 120; mache += 1)


        {                                   
          machoire.write(mache);
          randNumber = random(-5,5);
          tet=tet+randNumber;
          tete.write(tet);         
          delay(4);

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

        {                                 
          machoire.write(mache); 
          randNumber = random(-5,5);
          tet=tet+randNumber;
          tete.write(tet);         
          delay(4);

        }
        compteur++;

      }
    }
  }
}



Title: Re: Code servos simultanés
Post by: Artouste on Jan 08, 2012, 02:12 pm
re

j'ai testé ce code en réel avec 2 servos (machoire, tete)
ça fonctionne
maintenant à voir si cela est un rendu réaliste :
j'ai mis -15 +15 en debattement et retour en position origine entrée tête

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;
long randNumber;
void setup()
{
  bras.attach(3);
  tete.attach(5);
  machoire.attach(6);

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


}

void loop() {

  if (digitalRead(bouton) == HIGH)

  {
    delay(2000); //pause 2s avant commencer animation

    for(bra = 90; bra>=50; bra-=1) //leve le bras   
    {                                 
      bras.write(bra);               
      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)  //baisse le bras
      {                               
        bras.write(bra);             
        delay(15); 

      }

      for(bra = 57; bra>=50; bra-=1) //leve le bras   
      {                                 
        bras.write(bra);               
        delay(15);

      }

      compteur++;
    }
    {
      delay(300);

      for(bra = 50; bra < 90; bra += 1)  //baisse le bras
      {                               
        bras.write(bra);             
        delay(20); 

      }

      delay(100);

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

      }

      for(tet = 130; tet>=50; tet-=1)     
      {                                 
        tete.write(tet);               
        delay(15);

      } 

      delay(100); 

      for(tet = 50; tet < 110; tet += 1) 
      {                               
        tete.write(tet);             
        delay(20);                       

      }

      delay(500);    //commence à parler

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

        for(mache = 90; mache < 120; mache += 1)


        {                                   
          machoire.write(mache);
          randNumber = random(-15,15);
          tets=tet;
          tet=tet+randNumber;
          tete.write(tet);
          tet=tets;         
          delay(4);

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

        {                                 
          machoire.write(mache); 
          randNumber = random(-15,15);
          tets=tet;
          tet=tet+randNumber;
          tete.write(tet);
          tet=tets;       
          delay(4);

        }
        compteur++;

      }
    }
  }
}


Title: Re: Code servos simultanés
Post by: VincentB on Jan 08, 2012, 02:43 pm
Ton 1er code m'envoyait le servo tete en butée à 180° après l'avoir fait gigoter
mais ton second pourrait convenir, ce qui est dommage c'est que le servo tete gigote trés vite tout le temps de durée de la machoire, j'ai mis 2° sinon ça bouge trop, mais bon le compteur machoire n'est pas de 20 comme dans mon exemple, je peux mettre ton code juste sur les scènes où le compteur de machoire est de 4 ou 5, et je suis pas obligé d'appliquer le mouvement de tete a chaque fois que la machoire bouge

le delay(4) de machoire correspond a sa vitesse de mouvement, ça il ne me faut pas y toucher, mais avec ton code ce serait pas possible d'appliquer une modif pour que le servo tete gigote moins vite?

en tout cas je te remercie déjà pour ce que t'as fait
Title: Re: Code servos simultanés
Post by: Bernarduino on Jan 08, 2012, 03:49 pm
Bonjour,

Voici un exemple d'utilisation de l'excellente librairie  qui permet la gestion quasi simultanée des servos.

Je pense que cet exemple une fois adapté à vos besoins, pourra vous aider à résoudre  votre problème.

Il faudra bien sur modifier celui-ci en fonction des séquences souhaitées.

Code: [Select]
//
Test de la Lib ServoTimer2 IDE 0023
// Library by Mems ( Thank you mems )

#include <ServoTimer2.h>  // the servo library

// define the pins for the servos
#define tetePin 2
#define brasPin 3
#define machoirePin 4

ServoTimer2 servoTete;    // Jusqu'à 8 servos
ServoTimer2 servoBras;
ServoTimer2 servoMachoire;

void setup() {
  servoTete.attach(tetePin);     
  servoBras.attach(brasPin);
  servoMachoire.attach(machoirePin);
}

int incPulse(int val, int inc){
  if( val + inc  > 2000 )    // 2000
      return 1000 ;          // 1000
  else
    return val + inc;
}

void loop()
{
  int val;

  val = incPulse( servoTete.read(), 1);
  servoTete.write(val);

  val =  incPulse( servoBras.read(), 2);
  servoBras.write(val);

  val = incPulse(servoMachoire.read(), 8);
  servoMachoire.write(val);

  delay(10);
}


En espérant que cela vous soit utile.

Salutations
Title: Re: Code servos simultanés
Post by: VincentB on Jan 08, 2012, 04:12 pm
"Artouste" finalement ton code est impec, en mettant des tous petits mouvements de 1° tout le long de l'anim, ça lui donne un air plus vivant, ça me va bien comme ça
"Bernarduino" j'essayerais par curiosité, mais je ne pense pas tout refaire, par contre je suppose qu'il faut télécharger cette librairie?
Title: Re: Code servos simultanés
Post by: Artouste on Jan 08, 2012, 04:19 pm

"Artouste" finalement ton code est impec, en mettant des tous petits mouvements de 1° tout le long de l'anim, ça lui donne un air plus vivant, ça me va bien comme ça
"Bernarduino" j'essayerais par curiosité, mais je ne pense pas tout refaire, par contre je suppose qu'il faut télécharger cette librairie?

bien tant mieux si cela te conviens
je finissais de tester un code avec un peu de modulo   :smiley-mr-green:
en jouant là,
int fm = 20; // facteur modulo pour tete/machoire 20 juste pour voir
à l'œil cela semble encore plus doux
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;
long randNumber=0;
int fm = 20; // facteur modulo pour tete/machoire 20 juste pour voir
void setup()
{
  bras.attach(3);
  tete.attach(5);
  machoire.attach(6);

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


}

void loop() {

  if (digitalRead(bouton) == HIGH)

  {
    delay(2000); //pause 2s avant commencer animation

    for(bra = 90; bra>=50; bra-=1) //leve le bras   
    {                                 
      bras.write(bra);               
      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)  //baisse le bras
      {                               
        bras.write(bra);             
        delay(15); 

      }

      for(bra = 57; bra>=50; bra-=1) //leve le bras   
      {                                 
        bras.write(bra);               
        delay(15);

      }

      compteur++;
    }
    {
      delay(300);

      for(bra = 50; bra < 90; bra += 1)  //baisse le bras
      {                               
        bras.write(bra);             
        delay(20); 

      }

      delay(100);

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

      }

      for(tet = 130; tet>=50; tet-=1)     
      {                                 
        tete.write(tet);               
        delay(15);

      } 

      delay(100); 

      for(tet = 50; tet < 110; tet += 1) 
      {                               
        tete.write(tet);             
        delay(20);                       

      }

      delay(500);    //commence à parler

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

        for(mache = 90; mache < 120; mache += 1)


        {                                   
          machoire.write(mache);
         
         if (mache % fm ==0) {
          randNumber = random(-2,2);
          tets=tet;
          tet=tet+randNumber;
          tete.write(tet);
          tet=tets;   }     
          delay(4);

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

        {                                 
          machoire.write(mache); 
           if (mache % fm ==0) {
          randNumber = random(-2,2);
          tets=tet;
          tet=tet+randNumber;
          tete.write(tet);
          tet=tets;   }     
          delay(4);

        }
        compteur++;

      }
    }
  }
}
Title: Re: Code servos simultanés
Post by: jfs on Jan 08, 2012, 04:41 pm

"Artouste" finalement ton code est impec, en mettant des tous petits mouvements de 1° tout le long de l'anim, ça lui donne un air plus vivant, ça me va bien comme ça
"Bernarduino" j'essayerais par curiosité, mais je ne pense pas tout refaire, par contre je suppose qu'il faut télécharger cette librairie?


Des photos... ou mieux, une petit vidéo ?   XD
Title: Re: Code servos simultanés
Post by: VincentB on Jan 08, 2012, 05:08 pm
Ha oui, là c'est encore mieux, je l'ai mis sur toute mon anim, c'est nickel

Jean-François, photos, video il y a les liens dans mon 1er message du sujet
mais demain je ferais une nouvelle vidéo du pilote avec ce petit mouvement de tête
je vous remercie beaucoup de votre aide, c'est passionnant ces cartes, quand on maitrise ça doit être génial
Title: Re: Code servos simultanés
Post by: VincentB on Jan 09, 2012, 12:25 pm
Voilà j'ai refait une petite vidéo de l'animation, même url que la précédente
http://www.retroplane.net/mira3/animation_pilote2.wmv
les mouvements de tête sont petits, mais suffisants pour lui donner un air moins figé qu'auparavant
Encore merci Artouste et à ceux qui m'ont aidé
Title: Re: Code servos simultanés
Post by: Artouste on Jan 09, 2012, 12:35 pm

Ha oui, là c'est encore mieux, je l'ai mis sur toute mon anim, c'est nickel


Alors tant mieux, ce n'est pas vraiment beau ni optimisé comme code, mais ça à au moins le mérite d'être efficace et facilement integrable.

Quote
Jean-François, photos, video il y a les liens dans mon 1er message du sujet
mais demain je ferais une nouvelle vidéo du pilote avec ce petit mouvement de tête
je vous remercie beaucoup de votre aide, c'est passionnant ces cartes, quand on maitrise ça doit être génial

effectivement c'est bien sympathique comme cartes, avec un peu de pratique la maitrise du "général" vient assez vite.
En tout cas même sans la tête qui bouge !    :smiley-mr-green:  votre réalisation est bien sympa, vous faites des présentations dans le cadre des rencontres de modélisme ?
Title: Re: Code servos simultanés
Post by: VincentB on Jan 09, 2012, 12:42 pm

  votre réalisation est bien sympa, vous faites des présentations dans le cadre des rencontres de modélisme ?

Oui chaque été on organise la rencontre Retroplane dédiée uniquement aux maquettes de planeurs anciens, c'est l'aboutissement du travail qu'on a effectué toute l'année et détaillé sur notre forum, l'an dernier près de Cherbourg http://www.retroplane.net/retroplane2011/ et cet été ce sera en Autriche http://www.retroplane.net/retroplane2012/
Title: Re: Code servos simultanés
Post by: john_lenfr on Jan 09, 2012, 02:15 pm
Très beau travail en tout cas.  :smiley-eek:
Title: Re: Code servos simultanés
Post by: patsol on Jan 09, 2012, 06:44 pm
Et en plus... Ça vole???? :smiley-eek:
Title: Re: Code servos simultanés
Post by: VincentB on Jan 09, 2012, 06:56 pm
Oui bien sûr, c'est fait pour voler. Entre autre curiosité, mon dernier, un triplan en tubes acier et dural comme son ancêtre, planeur Français de 1922
http://www.retroplane.net/triplan-clement/page4.htm
En tout cas je suis content d'avoir découvert les cartes Arduino, ça m'ouvre des perspectives pour des animations
Title: Re: Code servos simultanés
Post by: patsol on Jan 09, 2012, 07:32 pm
C'est magnifique!
Quote
...Arduino, ça m'ouvre des perspectives pour des animations

Oui, et un peu d'aide au pilotage, ça fait rêver, non?
Title: Re: Code servos simultanés
Post by: VincentB on Jan 09, 2012, 07:42 pm
Non là pas vraiment pour ce type de machines, mais sinon ça se fait
Title: Re: Code servos simultanés
Post by: john_lenfr on Jan 09, 2012, 09:17 pm

Oui bien sûr, c'est fait pour voler. Entre autre curiosité, mon dernier, un triplan en tubes acier et dural comme son ancêtre, planeur Français de 1922
http://www.retroplane.net/triplan-clement/page4.htm
En tout cas je suis content d'avoir découvert les cartes Arduino, ça m'ouvre des perspectives pour des animations


ça doit faire mal quand ça se crash!
Title: Re: Code servos simultanés
Post by: VincentB on Jan 10, 2012, 04:40 pm
Oui, c'est relativement fréquent, mais on arrive toujours à réparer facilement.

Pour en revenir à Arduino, maintenant que le code est au point
-est-ce que je peux récupérer mon shield et brancher mes 3 servos, batterie 12v et 5v directement sur ma carte nano?
-ou même racheter une nano mini? sur les nano mini pour y brancher l'adaptateur usb il y a des broches? ou bien il faut souder des fils?
-le code fait 12160 bytes, je suppose que ça passe sur une nano mini 168?
Title: Re: Code servos simultanés
Post by: Artouste on Jan 10, 2012, 07:58 pm

Oui, c'est relativement fréquent, mais on arrive toujours à réparer facilement.

Pour en revenir à Arduino, maintenant que le code est au point
-est-ce que je peux récupérer mon shield et brancher mes 3 servos, batterie 12v et 5v directement sur ma carte nano?
-ou même racheter une nano mini? sur les nano mini pour y brancher l'adaptateur usb il y a des broches? ou bien il faut souder des fils?
-le code fait 12160 bytes, je suppose que ça passe sur une nano mini 168?

bonsoir
pour la nano
c'est ce modele ?
http://www.selectronic.fr/carte-arduino-nano.html

il peut etre alimenté en 12V , les servos en 5V (ne pas oublier la masse commune servos/arduino)
pour la nano mini, je ne connais pas , c'est quel modele ?, mais le code doit passer .
Il y a surement des specialsites de ces petites cartes qui repondront !
Title: Re: Code servos simultanés
Post by: VincentB on Jan 10, 2012, 08:10 pm
Oui c'est celle ci exactement
(http://www.retroplane.net/data/arduino-nano.jpg)
donc actuellement je l'ai sur un shield, ce qui m'a facilité la tâche pour la mise au point et la découverte, donc je suppose qu'on met les signals des servos sur les pins correspondantes marqués D et tous les + et - en commun. Pour l'alimentation ce sont les  grandes broches qu'on voit dépasser sur le dessus?  que je ne fasse pas de bétise. C'était surtout pour être sûr que la carte nano supporte l'intensité des 3 servos?
Nano mini finalement je laisse tomber, ça coute pratiquement le même prix que la nano avec l'usb, et moins pratique pour moi si j'ai besoin de renvoyer vite fait une modif de code dessus
Title: Re: Code servos simultanés
Post by: Artouste on Jan 10, 2012, 08:38 pm

Oui c'est celle ci exactement
(http://www.retroplane.net/data/arduino-nano.jpg)
donc actuellement je l'ai sur un shield, ce qui m'a facilité la tâche pour la mise au point et la découverte, donc je suppose qu'on met les signals des servos sur les pins correspondantes marqués D et tous les + et - en commun. Pour l'alimentation ce sont les  grandes broches qu'on voit dépasser sur le dessus?  que je ne fasse pas de bétise. C'était surtout pour être sûr que la carte nano supporte l'intensité des 3 servos?
Nano mini finalement je laisse tomber, ça coute pratiquement le même prix que la nano avec l'usb, et moins pratique pour moi si j'ai besoin de renvoyer vite fait une modif de code dessus

stop pour l'instant !  :smiley-mr-green:
le 12V c'est pour alimenter la nano avant le regulateur
les servos eux doivent etre alimentés directement en 5 V sans passer par le 5V de la nano
les masses (servos,nano,alim) doivent être communes !
pour faire simple seules les sorties de la nano doivent etre reliées directement aux servos .

je regarde le schema de la nano et je reposte plus tard le schema de connection.

Title: Re: Code servos simultanés
Post by: Artouste on Jan 10, 2012, 09:30 pm
c'est pas beau
mais je suis allé au plus simple
(http://cjoint.com/12jv/BAkvBZNoD4x_pabonano.jpg)
Title: Re: Code servos simultanés
Post by: VincentB on Jan 11, 2012, 05:55 am
Super, là c'est clair, je te remercie ;)
Title: Re: Animation pilote maquette - code servos simultanés
Post by: VincentB on Jan 24, 2012, 08:45 am
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
Title: Re: Animation pilote maquette - code servos simultanés
Post by: Artouste on Jan 24, 2012, 10:32 am
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   
   
  }

Title: Re: Animation pilote maquette - code servos simultanés
Post by: VincentB on Jan 24, 2012, 11:08 am
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
Title: Re: Animation pilote maquette - code servos simultanés
Post by: Artouste on Jan 24, 2012, 01:21 pm

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:

Title: Re: Animation pilote maquette - code servos simultanés
Post by: VincentB on Jan 24, 2012, 02:45 pm
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
Title: Re: Animation pilote maquette - code servos simultanés
Post by: Artouste on Jan 25, 2012, 10:57 am

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/
Title: Re: Animation pilote maquette - code servos simultanés
Post by: VincentB on Jan 25, 2012, 11:25 am
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
Title: Re: Animation pilote maquette - code servos simultanés
Post by: Artouste on Jan 25, 2012, 12:05 pm

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
Title: Re: Animation pilote maquette - code servos simultanés
Post by: VincentB on Jan 25, 2012, 12:46 pm
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
Title: Re: Animation pilote maquette - code servos simultanés
Post by: Artouste on Jan 25, 2012, 01:34 pm

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)

Title: Re: Animation pilote maquette - code servos simultanés
Post by: Artouste on Jan 25, 2012, 04:16 pm

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
(http://cjoint.com/12jv/BAzqmwbc0AN_archcann01.jpg)




Title: Re: Animation pilote maquette - code servos simultanés
Post by: VincentB on Jan 25, 2012, 05:33 pm


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
Title: Re: Animation pilote maquette - code servos simultanés
Post by: Artouste on Jan 26, 2012, 01:15 pm


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:  )
(http://cjoint.com/12jv/BAAnmvUQC06_mp3ard.jpg)


Title: Re: Animation pilote maquette - code servos simultanés
Post by: VincentB on Jan 26, 2012, 02:11 pm
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?
(http://www.retroplane.net/data/MP3.jpg)
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
Title: Re: Animation pilote maquette - code servos simultanés
Post by: Artouste on Jan 26, 2012, 02:25 pm

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?
(http://www.retroplane.net/data/MP3.jpg)
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

bon ok !  :)
déjà reçu avant de l'avoir commandé   :smiley-mr-green:

-fait qq photos du module que tu a déjà en main  ( avant arrière) pour éventuelle levée de doute.
faire un simple test sur breadboard , ne devrait pas être trop compliqué (en plus ça urge pas trop ? )
mais en ce qui me concerne, "pas de fer à souder" avant début semaine prochaine  :smiley-mr-green:
donc au mieux réflexion à l'aveugle (et ... à l'oreille) sur les codes qui trainent.


Title: Re: Animation pilote maquette - code servos simultanés
Post by: VincentB on Jan 26, 2012, 02:40 pm
actuellement j'ai ça sous la main, donc ça devrait suffire pour suivre le schema?
(http://www.retroplane.net/data/carte_mp3.jpg)
Title: Re: Animation pilote maquette - code servos simultanés
Post by: Artouste on Jan 26, 2012, 02:43 pm

actuellement j'ai ça sous la main, donc ça devrait suffire pour suivre le schema?

et photo "par l'arrière" ?   :smiley-mr-green:
Title: Re: Animation pilote maquette - code servos simultanés
Post by: VincentB on Jan 26, 2012, 03:00 pm
(http://www.retroplane.net/data/carte_mp3arriere.jpg)
Title: Re: Animation pilote maquette - code servos simultanés
Post by: Artouste on Jan 26, 2012, 03:26 pm
ok
pour la qualité de ton projet global et eventuellement,te décharger de la (première) gestion d'interfaçage de ce module 
et surtout si tu es intéressé :

Tu m' envoie le module (pas besoin des contacts,résistance  et led)

pour que cela soit clair ici :

envoi du module en lettre suivie à mon adresse à ta charge.

Je regarde quand j'ai le temps, je joue avec idem, je ne garantis aucun résultat, et on fait un petit point d'avancement régulièrement ici et si besoin plus souvent en MP pour détails.

Le retour sera à ma charge (comme  d'hab  , même si d'habitude c'est l'envoi :smiley-mr-green:  )

Si cela te convient, les détails d'ordres privés sont à faire suivre en MP   8)

Artouste



Title: Re: Animation pilote maquette - code servos simultanés
Post by: VincentB on Jan 26, 2012, 05:22 pm
C'est très sympa de ta part, je te contact en privé
Title: Re: Animation pilote maquette - code servos simultanés
Post by: Artouste on Jan 27, 2012, 02:08 pm

C'est très sympa de ta part, je te contact en privé

ok (le privé ayant été évacué en privé )  :smiley-mr-green:

Dans l'attente de réception et après petite plongée dans les profondeurs d'internet sur ce module pour m'avancer  :) (Cis référence) :
constat 1er :
le module ne gère pas le MP3 en natif (ni d'ailleurs du format quasi "raw" style .wav ), mais gère "seulement" du 4bits en  ADPCM (même si In fine c'est du RAW ) , obligation donc de convertir les formats d'origine en .AD4) pour injection sur la SD, les outils pour convertir existent .
- Donc déjà à voir ce que cela donne  IRL à l'oreille comme qualité ressentie en "restitution sonore" 

- Sur ta video :
http://www.retroplane.net/mira3/animation_pilote2.wmv
Tu amplifie la sortie de ton lecteur MP3 vers le  HP (dans la boite à clous  8)   ) ? si oui avec quoi comme ampli  ?
Title: Re: Animation pilote maquette - code servos simultanés
Post by: VincentB on Jan 27, 2012, 02:19 pm
c'est parti ce matin ;)
Oui c'est un petit ampli en kit à quelques euros, on le voit vissé, sur le côté gauche de la caisse
(http://www.retroplane.net/mira3/75.jpg)
bon je regarderais pour convertir mon fichier son en AD4
Title: Re: Animation pilote maquette - code servos simultanés
Post by: Artouste on Jan 27, 2012, 02:35 pm

c'est parti ce matin ;)
Oui c'est un petit ampli en kit à quelques euros, on le voit vissé, sur le côté gauche de la caisse
(http://www.retroplane.net/mira3/75.jpg)
bon je regarderais pour convertir mon fichier son en AD4


ok
Avant d'en arriver là, "on"  va déjà jouer avec du basique "led blink" , faire déjà "causer dans le poste" le module drivé par arduino   :smiley-mr-green:

pour les softs de conversions , pas de soucis  :smiley-mr-green:
Entre l'incontournable audacity et http://www.4dsystems.com.au/prod.php?id=74 , ce n'est pas de ce coté là qu'il y aura éventuellement soucis  ;)

OK aussi pour l'ampli
Title: Re: Animation pilote maquette - code servos simultanés
Post by: DragonsNoirs77 on Jan 27, 2012, 10:56 pm
Je voulais juste dire que le boulot réalisé est magnifique :smiley-eek-blue:, j'aimerais bien savoir faire pareil  :smiley-red:
Title: Re: Animation pilote maquette - code servos simultanés
Post by: skywodd on Jan 28, 2012, 11:09 am
Woo :smiley-eek: Je viens de voir ta vidéo, c'est trop bien fait, la petite boite militaire (8)), l'automate ... M a g n i f i q u e ! Beau travail !
Title: Re: Animation pilote maquette - code servos simultanés
Post by: VincentB on Jan 28, 2012, 11:30 am
Merci pour vos compliments :smiley-red:
j'avais donné les liens en page1, mais je vous les remet pour ceux qui ne les avaient pas vu
le détail de la construction est ici http://www.retroplane.net/mira3/page2.htm
et maintenant j'attaque les ailes http://www.retroplane.net/mira3/page3.htm
Title: Re: Animation pilote maquette - code servos simultanés
Post by: Artouste on Jan 28, 2012, 06:43 pm

c'est parti ce matin ;)

bonsoir
reçu ce jour.  :)
Je regarde tout ça à partir de lundi
Title: Re: Animation pilote maquette - code servos simultanés
Post by: Artouste on Jan 30, 2012, 02:30 pm
Début du débroussaillage sur le module son  :smiley-mr-green:
ça s'annonce assez sportif  8)
le module était donné ici ou là  "pin compatible" avec le somo14D
http://www.lextronic.fr/P5732-micro-module-de-restitution-de-fichiers-audio.html
sauf que 14 pins et 16 pins ce n'est pas ce que j'appelle etre pin compatible.
J'ai ressorti les correspondances entre le CI (DIP 20) et le board (pseudo DIP 16)
A partir de là , on retrouve (+/-) ses petits  :smiley-mr-green:

pour ceux que ça intéresse
http://cjoint.com/12jv/BAErCU56lon_WTV20corr01ca.jpg

et le plus sportif dans l'histoire va être surement  de trouver une µSD card de 1GB (ou moins)  8)
Ce board ne semble pas apprécier ce qui est au dessus de 1GB ... et mes "fournisseurs" facile d'accès rapide ne font plus rien au dessous de 2GO.  XD


Au passage si l'un d'entre vous dispose d'un outil de formatage/partition  de SD, je prend , mais mes rapides recherches me renvoient "papossible"  8)



To be continued
One step beyond  :)



http://www.youtube.com/watch?v=N-uyWAe0NhQ





Title: Re: Animation pilote maquette - code servos simultanés
Post by: VincentB on Jan 30, 2012, 04:04 pm
zut ma micro sd fait 2 go aussi
Title: Re: Animation pilote maquette - code servos simultanés
Post by: Artouste on Jan 31, 2012, 03:08 pm
Trouvé une 1GB
format en FAT16
Le son est tout juste acceptable sur sortie HP
un peu mieux sur sortie DAC amplifiée
mais bourré de glitches/clics (à l'oscillo c'est impressionnant)
Son très métallique.

Vincent, je sais déjà que tu serais déçu d'utiliser ça  :smiley-mr-green:

je mettrais demain en ligne une petite video
Title: Re: Animation pilote maquette - code servos simultanés
Post by: VincentB on Jan 31, 2012, 03:40 pm
Ha zut, he ben tant pis alors, ça lit le format wave ou juste le ad4?
Title: Re: Animation pilote maquette - code servos simultanés
Post by: Artouste on Jan 31, 2012, 04:21 pm

Ha zut, he ben tant pis alors, ça lit le format wave ou juste le ad4?

que du AD4 (ADPCM)
il faut convertir les sons d'origine  en AD4,  et même à échantillonnage max, c'est pas top 
Title: Re: Animation pilote maquette - code servos simultanés
Post by: Artouste on Feb 02, 2012, 02:09 pm
Bonjour
je sentais bien que cela  allait  être sportif  :smiley-mr-green:

en dehors de la qualité de restitution qui n'est pas vraiment pas top (en PWM HP ou en sortie DAC )

Le module ne veut plus toutes les 5/6 reset lire la carte, c'est résolu par un nouveau formatage en FAT et reinjection des 0xxx.AD4
donc pas très "confortable" en ce qui concerne l'utilisation sur site.
J'ai lu ici ou là que ce probleme peut survenir avec certaines cartes et je n'en ai exhumé/retrouvé qu'une.

Sur la construction du module lui-même , le support de µSD est un modèle à clapet cheap , pas un modèle à encliquetage plus "secure".
il n'a pas résisté à mes manips pourtant douces  :smiley-mr-green:  ,  pas très important pour du prototypage , j'ai réglé le probleme d'insertion.

Mais comme je suis du genre "teigneux"  8)
je ne m'avoue pas vaincu  :smiley-mr-green:

Je fais un appel du pied à la communauté :
Si l'un d'entre vous dispose d'une carte µSD de 1GO inutilisée voir même moins (512MO serait là idéal) me faire signe en MP.

Autre solution envisagée un adaptateur SD vers µSD , là c'est plus simple de trouver en petite capacité de la SD que de la µSD.

attention c'est "l'inverse" de ça que l'on trouve partout , genre ça :
http://media.ldlc.com/ld3/zoom/2008/LD0000670531.jpg

je crois en avoir vu passer sur certains sites, mais impossible de remettre la main dessus.

merci à tous


Title: Re: Animation pilote maquette - code servos simultanés
Post by: VincentB on Feb 02, 2012, 04:23 pm
Je ne savais pas qu'un adaptateur dans ce sens là existait, et en soudant directement des fils sur la carte, relié à un socket de sd?
Title: Re: Animation pilote maquette - code servos simultanés
Post by: Artouste on Feb 02, 2012, 05:35 pm

Je ne savais pas qu'un adaptateur dans ce sens là existait, et en soudant directement des fils sur la carte, relié à un socket de sd?


si si , ça existe
(re)trouvé là
http://www.dealextreme.com/p/sd-to-microsd-transflash-card-converter-module-27001
bon j'ai qq trucs à acheter chez dealex semaine prochaine , je vais en mettre un dans le panier, ça evitera de souder sur le module pour ressortir sur un socket Femelle de SD.
Title: Re: Animation pilote maquette - code servos simultanés
Post by: Artouste on Feb 03, 2012, 01:51 pm
commande partie
to be continued  :smiley-mr-green:
Title: Re: Animation pilote maquette - code servos simultanés
Post by: ced_french on Jul 19, 2012, 09:51 pm

Bonjour
je sentais bien que cela  allait  être sportif  :smiley-mr-green:

en dehors de la qualité de restitution qui n'est pas vraiment pas top (en PWM HP ou en sortie DAC )

Le module ne veut plus toutes les 5/6 reset lire la carte, c'est résolu par un nouveau formatage en FAT et reinjection des 0xxx.AD4
donc pas très "confortable" en ce qui concerne l'utilisation sur site.
J'ai lu ici ou là que ce probleme peut survenir avec certaines cartes et je n'en ai exhumé/retrouvé qu'une.


Bonjour à tous,

j'aimerai un peu d'aide au sujet du module WTV020-SD.

Je souhaiterai connaitre le schéma d'utilisation de ce dernier et surtout si vous l'utiliser en 5V. Si vous l'utilisez avec des poussoirs ou commander en mode série (2fils)?

J'ai pour projet de m'amuser avec un basicstamp mais avant j'aimerais le faire fonctionner pour après me consacrer à la programmation.

Alors biensûr j'ai une carte sd de 2Go formater en FAT16 pour 990Mo. J'utilise le logiciel du module SOMO pour les fichiers en AD4.

un grand merci.