ça va venir t'inquiète tu t'approches doucement du casses tête..........Désolé pour ton post.
Olivier nous continuerons cette conversation sur Glenn ou HumaOne....
Posté 05 septembre 2017 - 10:08
ça va venir t'inquiète tu t'approches doucement du casses tête..........Désolé pour ton post.
Olivier nous continuerons cette conversation sur Glenn ou HumaOne....
Posté 05 septembre 2017 - 10:49
Posté 05 septembre 2017 - 11:29
Posté 05 septembre 2017 - 11:49
Posté 05 septembre 2017 - 02:32
@ Telson : pas de soucis, mais là déjà, cela peut donner des pistes à Amhnemus pour plus tard.
@ Amhnemus : ooooohhhhhh que si tu vas bien te prendre la tête par moment, es tu n'a pas fini, en même temps, si tout était simple il n'y aurait aucune satisfaction personnel à réaliser un robot après un dur travail effectué dessus
Posté 05 septembre 2017 - 03:14
Posté 08 septembre 2017 - 09:51
Posté 08 septembre 2017 - 10:24
Posté 08 septembre 2017 - 10:38
Posté 08 septembre 2017 - 12:53
Posté 08 septembre 2017 - 03:17
Sinon au lieu d'utiliser millis, et de faire une boucle infinie pour compter le temps, tu devrais te pencher sur la librairie simpleTimer, c'est fait exprès pour ça.
Tu peux appeller une fonction au bout de x millisecondes, ou toutes les y millisecondes, et le mieux, c'est que ça utilise les interruptions timer, donc ton programme est pas planté a attendre un temps et peut faire autre chose en même temps.
Posté 09 septembre 2017 - 06:14
L'utilisation du Timer est une très bonne solution...Il me semble que j'avais abordé le sujet dans ce topic :: http://www.robot-maker.com/forum/topic/10815-defis-comment-commander-la-vitesse-dun-servomoteur-avec-arduino/?p=75055
https://learn.adafru...o-part-2/timers
Posté 10 septembre 2017 - 09:07
Je te propose mon point de vue (que j'ai pu voir dans l'étude de developement de jeu vidéo), je n'ai pas encore essayé par moi-même, mais je vais essayer ce weekend.Donc ma théorie :Vu que millis correspond au temps écoulé, et ton programme est une boucle sans fin.Dans ta boucle tout ce qui dépend du temps doit être une formule qui représente un ratio entre le point de départ le point d'arrivée et le temps que tu veux que dure l'action avec le temps déjà écoulé. Cela te permet de garantir que ton action sera terminé à temps même si tu rajoute de nouvelles instructions dans la boucle. (Dans la limite bien qu'il y ai pas un traitement plus long que le temps voulu d'un action (je ne sais pas si c'est très clair)) D'un point de vue extérieur les mouvements devraient être fluide, même si par exemple d'un tour à l’autre de la boucle la delta est légèrement différent.
Voilà, si quelqu'un veux rectifier, confirmer, détruire, ... ce que je viens de dire pas de soucis
voici l'exemple de code qui illustre que je disais, après il vaut ce qu'il vaut.
Pour le faire fonctionner, avec la console arduino il faut entrer une des commande suivante :
stop : detache les servos
start : attache les servos
zero : met les 2 servos en position zéro (à faire avant de lancer chaque commande de mouvement (je n'ai pas gérer le mouvement retour))
180 : met les 2 servos en position 180
avant1 : cas exemple où les deux servos parcours deux angles différents sur le même laps de temps
avant2 : cas exemple , comme avant1 mais sur une période plus courte
avant3 : cas exemple où les deux servos parcours le même angle mais avant un temps différent
delais : simule un traitement bloquant.
Ceci fonctionne dans la limite de la vitesse des servos.
En espérant que ça réponde aussi à la demande lol.
Le code : (j'aurai pu le simplifier mais là je trouve que pour la lecture c'est plus facile pour d'éventuels novices)
#include <Servo.h> //Constantes qui définissent le numéro des broches des servomoteurs #define MONSERVO1 9 #define MONSERVO2 10 //les variable qui correspondent aux servomoteurs Servo monServomoteur; Servo monServomoteur2; //Constantes d'information d'angle et de temps pour les deux servomoteurs. //Pourrai être un tableau à deux dimensions s'il y a plus de servomoteurs. int angle; int angleCourrant; int temps; int angle2; int angleCourrant2; int temps2; long tempsPrecedent = 0; /* * Enumeration des différents état du système */ enum Etat : byte { Arret, Pause, MiseAZero, MiseA180, Marche, Avant }; //Initialise l'état courant Etat etatCourant = Arret; /* * indique l'état dans lequel est le système * en fonction de ce qui est envoyé dans la console */ void ObtenirEtat(); void setup() { Serial.begin(9600); } void loop() { ObtenirEtat(); switch (etatCourant) { case Arret: monServomoteur.detach(); monServomoteur2.detach(); break; case Marche: if (!monServomoteur.attached()) { monServomoteur.attach(MONSERVO1); } if (!monServomoteur2.attached()) { monServomoteur2.attach(MONSERVO2); } break; case MiseAZero: monServomoteur.write(0); monServomoteur2.write(0); break; case MiseA180: monServomoteur.write(180); monServomoteur2.write(180); break; case Avant: angleCourrant = (millis()- tempsPrecedent)*angle/temps; if(angleCourrant >= angle) { angleCourrant = angle; } angleCourrant2 = (millis()- tempsPrecedent)*angle2/temps2; if(angleCourrant2 >= angle2) { angleCourrant2 = angle2; } if(angleCourrant == angle && angleCourrant2 == angle2) { etatCourant = Pause; } monServomoteur.write(angleCourrant); monServomoteur2.write(angleCourrant2); break; case Pause: // ne rien faire break; } } /* * indique l'état dans lequel est le système * en fonction de ce qui est envoyé dans la console */ void ObtenirEtat() { if (Serial.available() > 0) { String cmd = Serial.readString(); if (cmd == "stop") { etatCourant = Arret; } else if(cmd == "start") { etatCourant = Marche; } else if(cmd == "zero") { etatCourant = MiseAZero; } else if(cmd == "180") { etatCourant = MiseA180; } else if(cmd == "avant1") { etatCourant = Avant; angle = 180; temps = 10000; angle2 = 90; temps2 = 10000; tempsPrecedent = millis(); } else if(cmd == "avant2") { etatCourant = Avant; angle = 90; temps = 1000; angle2 = 180; temps2 = 1000; tempsPrecedent = millis(); } else if(cmd == "avant3") { etatCourant = Avant; angle = 60; temps = 10000; angle2 = 60; temps2 = 1000; tempsPrecedent = millis(); } else if(cmd == "delais") { delay(200); } } }
Une photo du montage :
Posté 10 septembre 2017 - 02:52
#include <Servo.h> //Constantes qui définissent le numéro des broches des servomoteurs #define MONSERVO1 9 #define MONSERVO2 10 //les variable qui correspondent aux servomoteurs Servo monServomoteur; Servo monServomoteur2; //Constantes d'information d'angle et de temps pour les deux servomoteurs. //Pourrai être un tableau à deux dimensions s'il y a plus de servomoteurs. int angle; int angleCourrant; int temps; int angle2; int angleCourrant2; int temps2; long tempsPrecedent = 0; /* * Enumeration des différents état du système */ enum Etat : byte { Arret, Pause, MiseAZero, MiseA180, Marche, Avant }; //Initialise l'état courant Etat etatCourant = Arret; /* * indique l'état dans lequel est le système * en fonction de ce qui est envoyé dans la console */ void ObtenirEtat(); void setup() { Serial.begin(9600); } void loop() { ObtenirEtat(); switch (etatCourant) { case Arret: monServomoteur.detach(); monServomoteur2.detach(); break; case Marche: if (!monServomoteur.attached()) { monServomoteur.attach(MONSERVO1); } if (!monServomoteur2.attached()) { monServomoteur2.attach(MONSERVO2); } break; case MiseAZero: monServomoteur.write(0); monServomoteur2.write(0); break; case MiseA180: monServomoteur.write(180); monServomoteur2.write(180); break; case Avant: angleCourrant = (millis()- tempsPrecedent)*angle/temps; if(angleCourrant >= angle) { angleCourrant = angle; } angleCourrant2 = (millis()- tempsPrecedent)*angle2/temps2; if(angleCourrant2 >= angle2) { angleCourrant2 = angle2; } if(angleCourrant == angle && angleCourrant2 == angle2) { etatCourant = Pause; } monServomoteur.write(angleCourrant); monServomoteur2.write(angleCourrant2); break; case Pause: // ne rien faire break; } } /* * indique l'état dans lequel est le système * en fonction de ce qui est envoyé dans la console */ void ObtenirEtat() { if (Serial.available() > 0) { String cmd = Serial.readString(); if (cmd == "stop") { etatCourant = Arret; } else if(cmd == "start") { etatCourant = Marche; } else if(cmd == "zero") { etatCourant = MiseAZero; } else if(cmd == "180") { etatCourant = MiseA180; } else if(cmd == "avant1") { etatCourant = Avant; angle = 180; temps = 10000; angle2 = 90; temps2 = 10000; tempsPrecedent = millis(); } else if(cmd == "avant2") { etatCourant = Avant; angle = 90; temps = 1000; angle2 = 180; temps2 = 1000; tempsPrecedent = millis(); } else if(cmd == "avant3") { etatCourant = Avant; angle = 60; temps = 10000; angle2 = 60; temps2 = 1000; tempsPrecedent = millis(); } else if(cmd == "delais") { delay(200); } } }Une photo du montage :
Le code d'arobasseb est très propre et il utilise
=> une " machine à état " dans un switch case,
=> 0 code bloquant ( = pas de delay )
=> Des enum
=> Des #define
=> Des commentaires
Fref un bel exemple pour faire du beau code
le seul truc que je pourrais redire (et encore c'est un détail ) ... c'est l'utilisation du " int " et "long "
j'ai une préférence pour l'utilisation des variables adaptées =)
Si mon commentaire vous a plus laissez nous un avis !
Nouveau sur Robot Maker ?
Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope aux articles, à la boutique et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être !
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!
Posté 10 septembre 2017 - 05:08
Posté 19 septembre 2017 - 09:02
Posté 20 septembre 2017 - 12:08
Posté 21 septembre 2017 - 10:29
Posté 21 septembre 2017 - 11:33
Posté 21 septembre 2017 - 01:47
Tu y es presque !Tu les alimente comment tes servos ?
Ma chaine YouTube : https://www.youtube..../oracid1/videos
0 members, 1 guests, 0 anonymous users