Aller au contenu


Photo
- - - - -

Animation pilote dans une maquette


109 réponses à ce sujet

#61 VincentB

VincentB

    Membre

  • Membres
  • 50 messages
  • Gender:Male
  • Location:Beziers - France

Posté 27 décembre 2011 - 06:53

Bonjour tout le monde, merci pour votre travail
-alors en ce qui concerne le code de Seb, il marche, mais à la fin de l'anim je ne peux pas la relancer à la telecommande, certainement à cause du while(1) que j'avais mis pour l'arrêt, et si je l'enlève j'ai le dernier servo bouche qui tourne en boucle sans pouvoir a^rrêter l'annim

-pour ce qui est du code de Yves, ça marche impec, content, juste 2 bricoles, a la fin compteur++; que j'ai reactivé, il y avait // devant. et le code telecommande que t'as mis FF30CF qui correspond a la touche1, ne marche pas, par contre en mettant le code de la touche play/pause FFC23D ça marche, vraiment bizarre, mais bon pas grave puisque c'est justement la touche dont je voulais me servir

Par contre, j'ai un gros problème à la mise en marche, que j'avais aussi constaté avant le code telecommande. Quand je mets sous tension la carte/annimation, j'ai les 3 servos qui partent d'au moins 30° vers la gauche et qui reviennent à 0 lorsqu'ils sont appelés par le code. Pour moi c'est un problème, ils ne doivent pas du tout bouger, car là ça tirerait sur les tringlerie hors de leur course et ça casserait tout.
Vous avez une idée de quoi ça peut provenir et comment résoudre?

#62 VincentB

VincentB

    Membre

  • Membres
  • 50 messages
  • Gender:Male
  • Location:Beziers - France

Posté 27 décembre 2011 - 08:00

en fait quand je dis que mes servos partent, c'est par rapport aux palonier que j'avais positionné pour jouer l'anim. mais je me suis rendu compte qu'en fait ils partent à leur veritables positions de neutre (que j'ai aussi pu controler en les branchant sur mon recepteur rc) et c'est ensuite qu'ils se positionnent a un autre endroit lorsqu'ils sont appellé par le code de l'anim. Donc faut que je regarde pourquoi l'anim ne les fait pas partir de 0. A ce propos, j'ai remarqué que les commentaires des codes servo parlent de position en °, mais mes servo ne bougent pas d'autant, si je code pour 180 ça doit bouger de 90° pas plus :blink:

#63 Astondb8

Astondb8

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 111 messages
  • Gender:Male
  • Location:Paris

Posté 27 décembre 2011 - 08:34

Bon alors plussieurs choses à repondre.

Tout dabord le while
Qui veut dire en Anglais "Tant que" et voila comment l'utiliser

while(expression){ // tant que l'expression est vraie

  // instructions à effectuer

}



Et je ne comprend pas pourquoi vous avez utiliser cette expression.
aparament, vous essayez de faire faire une action 6 fois

  int compteur = 0;
  while (compteur < 6)
{
  
  for(pos3 = 0; pos3 < 45; pos3 += 1)  
{                                  
  machoire.write(pos3);            
  delay(5);                      
} 
  for(pos3 = 40; pos3>=1; pos3-=1)     
{                                
  machoire.write(pos3);              
  delay(5);                    
}  
  compteur++;
} 
  while(1);  
} 
 

en incrémentant le compteur
et vous sortez du while apres 6 boucles.
I est bien plus simple de je faire avec une boucle simple.

Le while vas bloquer l’exécution du code tant que la condition du while n'est pas remplie.

Mais bon comme je ne connais pas vos discussions en MP je jne sais pas ce qui a été demandé et il y a donc une raison.
Idem pour le while suivant
wihile(1)
et presenté comme une fonction
Mais cette fonction est vide.

Je ne comprend pas cette instruction.

Je trouve tout cela tres bien Seb
Mais un pouil compiquépar raport a la demande.
Le Auto / Manu ???
Quel interret, Vincent ne va pas lancer les servos a la main. Donc un play suffis (enfin si j'ai bien suivie non ?)

Concernant mon code.
J'ai simplement repris le code que tu avais donné en pensant que tu l'avais testé et qu'il correspondait au nmbre de boucle que tu desirais.
Idem pour les positions.

Mais je ne vois pas tres utile d'utiliser des boucles (sauf peut être pour ralentir les mouvements

Donc peut tu me donner ta séquence.
bras de tant a tant (en tant de seconde)
tète de tant a tant (en tant de seconde)
mâchoire de tant a tant (en tant de seconde)

combien de fois tu veux que le bras bouge et si il doit le faire en m^me temps que le reste)
combien de fois tu veux que la tête bouge et si il doit le faire en m^me temps que le reste)
combien de fois tu veux que la mâchoire bouge et si il doit le faire en m^me temps que le reste)

Je t'ai donné un code qui faisais fonctionner ton animation avec un bouton
On peut très bien ajouter un bouton stop
On peut très bien ajouter d'autres boutons pour d'autres séquences (dans ce cas, donne moi aussi les autres séquences)

Mais un code se teste en voyant ce que cela fait et en corrigeant en fonction de ce que nous voyons
c'est pourquoi, j'ai préféré t'expliquer chaque ligne de code
pour que tu puisse l'adapter en fonction de ce que tu vois.

Mais si tu préféres, nous pouvons travailler autrement

Cdlt
Yves

 


#64 VincentB

VincentB

    Membre

  • Membres
  • 50 messages
  • Gender:Male
  • Location:Beziers - France

Posté 27 décembre 2011 - 08:40

non ce qu'on a fait en privé avec seb c'était juste pour lancer l'anim avec la telecommande, rien de plus, tout le code et erreurs avec while viennent de moi qui l'ai fait en tatonnant pour essayer d'avoir l'anim désirée.
Ok je vais te donner mon scenario de départ et je pourrais comme ça repartir d'un code propre, je l'adapterais ensuite a mon scenario complet que je ne connais pas encore, car il me faudra l'essayer a chaque fois sur le pilote pour voir si c'est realiste.

#65 Astondb8

Astondb8

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 111 messages
  • Gender:Male
  • Location:Paris

Posté 27 décembre 2011 - 08:52

OK
C'est plus simple comme ca
Je te commenterais chaque bloc pour que tu puisse jouer sur les valeurs en sachant sur quoi tu agis a chaque fois
Et nous reprendrons les bouts complets qui ne correspondent pas à tes attentes ou qui en sont trop éloignés.

Cdlt
Yves

 


#66 VincentB

VincentB

    Membre

  • Membres
  • 50 messages
  • Gender:Male
  • Location:Beziers - France

Posté 27 décembre 2011 - 08:53

je branche la carte arduino

j'appuie sur le bouton play (FFC23D) de la telecommande

servo bras se lève de 50°

servo bras reste en position levé sans bouger pendant 4s

servo bras baisse de 50°

pause de l'animation pendant 1s

servo tete bouge a gauche de 90°

servo tete revient au neutre puis bouge a droite de 60°

servo tete reste dans cette position à droite

servo machoire monte et descend de 45° pendant 10 fois

servo tete qui était à droite revient au neutre 0

l'animation s'arrête toute seule


**********
possibilité de relancer l'animation avec le bouton play de la télécommande

****************************


Voilà donc la base du scénario, je pense qu'après m'avoir fait un code propre, j'arriverais a rescenariser une animation complète,
merci

#67 Astondb8

Astondb8

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 111 messages
  • Gender:Male
  • Location:Paris

Posté 27 décembre 2011 - 09:00

Parfaitement clair

Je te fais ca
Mai déjà
si l'animation d'arret toute seule, elle ne doit pas être dand void loop
void loop (comme sont nom l'indique permet de boucler sans fin.

il faut donc lettre en dehors de loop une fonction qui s'appellerait par exemple void play()
et la seule chose qui serait dans void loop serait l'instruction qui appelle void play()
Donc le code de la télécommande.
Tout le reste doit être à l'extérieur

Je te fais ca

 


#68 Astondb8

Astondb8

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 111 messages
  • Gender:Male
  • Location:Paris

Posté 27 décembre 2011 - 09:03

Mais avant d'aller plus loin, j'ai oublié de te demander une chose

Ce que tu appelles position neutre (donc position de départ des 3 servos) est bien 0 pour les 3 ?
Car si ce n'est pas le cas, il faut initialiser les servos avec cette valeur
C'est sans doute pourquoi tu avais un truc bizarre au début

 


#69 VincentB

VincentB

    Membre

  • Membres
  • 50 messages
  • Gender:Male
  • Location:Beziers - France

Posté 27 décembre 2011 - 09:12

oui pour moi, position neutre, c'est départ des servos à 0, mais disons que pour le bras le 0 est en position basse, mais ça je positionne mecaniquement le bras là ou je veux, disons qu'il monte de 50° a partir de 0 qui est en position basse, et quand le bras est complétement baissé, en fait il retourne à 0, je ne fais pas bouger le bras plus vers le bas que 0, j'espère que tu comprends ce que je veux dire

pour la tete, 0 c'est bien le neutre, tête centrée

#70 Astondb8

Astondb8

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 111 messages
  • Gender:Male
  • Location:Paris

Posté 27 décembre 2011 - 09:16

Oui ça va c'est clair

ce que je fais,
Je laisse les 3 servos initialisés à 0
Et si tu devais bouger leur position de départ (donc d'initialisation)
Soit tu les déplaces mécaniquement (qui est pour toi certainement la solution la plus simple)
soit tu changes les valeurs de
int pos1 = 0;
int pos2 = 0;
int pos3 = 0;

 


#71 Astondb8

Astondb8

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 111 messages
  • Gender:Male
  • Location:Paris

Posté 27 décembre 2011 - 09:45

Bon voila

Mais attention
Je t'ai mis les valeur correspondante a ce que tu m'as donné
Mais comme tu me les a donné en degrés et pas en position, il est fort possible que tu doives réajuster.
Idem pour les delay, je les ai mis très grossièrement à toit de voir se cela te convient.

Pour la bouche, j'ai mis une boucle de 1 a 10 si tu voulais changer le nombre de fois que cette boucle s’exécute, il te suffirait d'augmenter le 10 ou de le diminuer



#include <IRremote.h> // Déclaration de la Librairie IPemote.h
#include <Servo.h> // Declaration de la Librairie Servo.h 

int RECV_PIN = 11; // declaration de la Pin 11 xpour le receveur
IRrecv irrecv(RECV_PIN);
decode_results results;
Servo bras;  // Declare un onjet Servo ce qui est assez pratique puiseque tu n'aura qu'a appeler ce cervo pour agir dessus 
Servo tete; // Voila, nous avons desormais 2 servos un que tu appellera par l'objet servo1 et l'autre que tu appellera par servo2
Servo machoir; 


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

  Serial.begin(9600); // Ouvre le Port serie
  irrecv.enableIRIn(); // Start the receiver
 

}

void loop() {
  if (irrecv.decode(&results)) {
    //Serial.println(results.value, HEX);
    if(results.value == 0xFFC23D) // Code pour la touche Play FFC23D
    {
   Toucheplay(); // Appel de la fonction play
    irrecv.resume(); // Receive the next value
    delay(10);
  }

  }
}

void Toucheplay()  // fonction appelée par la touche Play
{
  bras.write(50);             // Nous envoyons bras à 50
  delay(4000);                // Nous attendons 4s
   bras.write(0);             // Nous envoyons bras à 0
   delay(1000);             // attente de 1s
  tete.write(90);             // Nous envoyons tete à 90
  tete.write(60);             // Nous envoyons tete à 60
  int x = 1;                   // initialisation d'une variable pour la poucle de 10
  for(x = 1; x>=10; x++)     // execution d'une boucle 1à fois
  {                                
   machoir.write(45);             // Nous envoyons tete à 40
delay(200);
machoir.write(0);             // Nous envoyons tete à 0
delay(200);
  } 
}


Dit moi comment ça marche

Cdlt
Yves

 


#72 VincentB

VincentB

    Membre

  • Membres
  • 50 messages
  • Gender:Male
  • Location:Beziers - France

Posté 27 décembre 2011 - 10:04

ben là ça ne marche pas vraiment

le bras va bien en haut, le delai de 4s s'ecoule mais il reste a sa position, il ne revient pas
ensuite la tete tourne d'un côté et puis c'est tout, il n'y a rien d'autre qui se passe, la tete ne revient pas et la machoire ne bouge pas

#73 VincentB

VincentB

    Membre

  • Membres
  • 50 messages
  • Gender:Male
  • Location:Beziers - France

Posté 27 décembre 2011 - 10:08

je viens de me rendre compte d'une chose, je travaille avec la version du logiciel d'arduino francisée 0018, ton code passe bien la verification et c'est avec cette version que j'upload la carte
mais si je colle ton code dans la version anglaise d'arduino 1.0 là, la verification de code donne des erreurs

#74 Astondb8

Astondb8

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 111 messages
  • Gender:Male
  • Location:Paris

Posté 27 décembre 2011 - 10:21

je t'ai dit qu'il fallait convertir en position et pas en degres

Que rien ne bouge c'est surprenant
surtout que la fonction a l'ait de marcher puisque au moins 1 sevo avance et il n'y a que dans la fonction qu'e cette commande existe


Pour la version j'utilise une 0023 pour éviter ce genre de PB
j'ai désactivé les lignes en rapport avec le serial

#include <IRremote.h> // Déclaration de la Librairie IPemote.h
#include <Servo.h> // Declaration de la Librairie Servo.h 

int RECV_PIN = 11; // declaration de la Pin 11 xpour le receveur
IRrecv irrecv(RECV_PIN);
decode_results results;
Servo bras;  // Declare un onjet Servo ce qui est assez pratique puiseque tu n'aura qu'a appeler ce cervo pour agir dessus 
Servo tete; // Voila, nous avons desormais 2 servos un que tu appellera par l'objet servo1 et l'autre que tu appellera par servo2
Servo machoir; 


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


  irrecv.enableIRIn(); // Start the receiver
 

}

void loop() {
 bras.write(50);             // Nous envoyons bras à 50
  delay(4000);                // Nous attendons 4s
   bras.write(0);             // Nous envoyons bras à 0
   delay(1000);             // attente de 1s
  tete.write(90);             // Nous envoyons tete à 90
  tete.write(60);             // Nous envoyons tete à 60
  int x = 1;                   // initialisation d'une variable pour la poucle de 10
  for(x = 1; x>=10; x++)     // execution d'une boucle 1à fois
  {                                
   machoir.write(45);             // Nous envoyons tete à 40
delay(200);
machoir.write(0);             // Nous envoyons tete à 0
delay(200);
}


}

essaie ce code
Il n'y a pas la télécommande et ca devrait faire ce que tu as demandé en boucle
une fois chaque position réglée
nous mettrons ce code dans une fonction et le débrancherons avec la télécommande

avançons pas à pas ca je ne suis pas devant,t et je travail en aveugle

 


#75 VincentB

VincentB

    Membre

  • Membres
  • 50 messages
  • Gender:Male
  • Location:Beziers - France

Posté 27 décembre 2011 - 10:54

désolé, ça ne marche pas plus, mais en plus de temps en temps j'ai le servo bras qui se leve, mais ne revient pas, puis délai et servo tete qui ne bouge qu'une fois d'un côté et rien d'autre, mais toujours pas de machoir qui marche
mais presque a chaque remise en marche, comme sur la video tu verras que ça envoie direct les 2 servo bras et tete et rien d'autre
http://www.retroplane.net/data/test1.wmv
j'ai verifié et revérifié les branchement, tu penses que si j'utilises la même version du soft d'arduino que toi ça changera?

#76 Sani300

Sani300

    Habitué

  • Membres
  • PipPip
  • 150 messages
  • Gender:Male

Posté 27 décembre 2011 - 11:21

Petite vérification, vos servos sont des servos 0° vers 90° ou -45° 0 45°?

#77 Astondb8

Astondb8

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 111 messages
  • Gender:Male
  • Location:Paris

Posté 27 décembre 2011 - 11:37

Desolé mais je fais plusieurs choses en m^me temps

http://www.robot-maker.com/forum/topic/5964-bras-de-suspension-pour-codeur/

pour que tu puisse voir ce que je fais tout en essayant de regler ton probleme ;)

Bon je me charge de toi ;)

Cdlt
Yves

 


#78 VincentB

VincentB

    Membre

  • Membres
  • 50 messages
  • Gender:Male
  • Location:Beziers - France

Posté 27 décembre 2011 - 11:44

Petite vérification, vos servos sont des servos 0° vers 90° ou -45° 0 45°?

aucune idée, ce sont des servo pour moi dit standards que j'utilise en modelisme, a la main on arrive a les faire bouger de butée a butée sur 180°, en général sur les catalogues ils sont donnés pour des courses de -/+60°

#79 Astondb8

Astondb8

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 111 messages
  • Gender:Male
  • Location:Paris

Posté 27 décembre 2011 - 11:49

Oui oui, pas de problme c'est bien ca

0 correspond a toit a gauche
90 au milieu
180 a tout a droite

Bien sur le 0 et le 180 dépend de quel coté tu les regarde.

Mais je ne me suis pas posé la question puisque tu avais déjà testé tes positions.

Pour les MP
Il est préférable que nos galères soient suivie par tous afin qu'elles servent à d'autres ;)

 


#80 Astondb8

Astondb8

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 111 messages
  • Gender:Male
  • Location:Paris

Posté 27 décembre 2011 - 12:45

essais deja avec ce code pour voir si tes servos font bien la totalité de leur course
de 0 a 180puis de 180 a 0 chacun leur tour

je l'ai testé cela marche sur une Nano avec ton shield pour nono

#include <Servo.h> // Declaration de la Librairie Servo.h 




Servo bras;  // Declare un onjet Servo ce qui est assez pratique puiseque tu n'aura qu'a appeler ce cervo pour agir dessus 
Servo tete; // Voila, nous avons desormais 2 servos un que tu appellera par l'objet servo1 et l'autre que tu appellera par servo2
Servo machoir; 


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


 

}

void loop() {
   bras.write(0);             // Nous envoyons bras à 50
   delay(5000);
    bras.write(180);             // Nous envoyons bras à 50
     delay(5000);
     tete.write(0);             // Nous envoyons bras à 50
      delay(5000);
       tete.write(180);             // Nous envoyons bras à 50
        delay(5000);
         machoir.write(0);             // Nous envoyons bras à 50
          delay(5000);
         machoir.write(180);             // Nous envoyons bras à 50
          delay(5000);
  /*
 bras.write(50);             // Nous envoyons bras à 50
  delay(4000);                // Nous attendons 4s
   bras.write(0);             // Nous envoyons bras à 0
   delay(1000);             // attente de 1s
  tete.write(90);             // Nous envoyons tete à 90
  tete.write(60);             // Nous envoyons tete à 60
  int x = 1;                   // initialisation d'une variable pour la poucle de 10
  for(x = 1; x>=10; x++)     // execution d'une boucle 1à fois
  {                                
   machoir.write(45);             // Nous envoyons tete à 40
delay(200);
machoir.write(0);             // Nous envoyons tete à 0
delay(200);
}
*/

}

 




Répondre à ce sujet



  


0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users