Aller au contenu


Photo
- - - - -

Robot roulant pousseur de ballon


21 réponses à ce sujet

#1 fralaric

fralaric

    Membre

  • Membres
  • 21 messages

Posté 31 mai 2023 - 06:11

Bonjour,

 

dans le but du fun et de la connaissance, je suis en train de créer un robot.

 

 

 

Ces un robot voiture qui a un moteur à l'essieu arrière pour la propulsion. C'est un moteur cc, je le contrôlerait en boucle ouverte (pour l'instant).

J'ai voulu faire une direction pour avec un moteur pas à pas. Sur la photot, le moteur pas à pas n'est pas sur l'axe qui sert à al direction, c'est en phase de test...

J'utilise une arduino pour orchestrer le tout.

Je veux d'abord utiliser le robot pour pousser un ballon en lui donnant les coordonnées du ballon. Je veux donc commander la direction et la vitesse pour arriver à un point donné.

 

J'ai d'abord un problème : comment faire pour que le robot sache à quel degrès commander le moteur pas à pas pour que le robot avance tout droit ? 

 

J'ai un encodeur incrémental mais je ne pense pas qu'il me soit utile pour la direction (je pense l'utiliser juste pour savoir à quelle vitesse je vais)

 

J'ai penser à utiliser un potentiomètre mais ça me semble un peu compliquer à mettre en place, je n'ai pas ça sous la main en plus.

Avez-vous des pistes pour résoudre ce problème ?

 

Pouvez vous me donner aussi des pistes pour réussir mon projet ? (emmener le robot à un endroit x y)

 

Merci :)



#2 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 969 messages
  • Gender:Male
  • Location:Anglet

Posté 31 mai 2023 - 09:55

Salut et bienvenu ! 

Pour commencer, super comme projet ! Je dis toujours que c'est en essayant de faire quelque chose qu'on apprend le plus ;)

Ensuite, par contre, quand tu veux poster des photo, merci de les mettre directement sur le forum : (Voir comment poster des photo et plus encore sur robot maker ) cela sera plus agréable pour tout le monde ;) Du coup tu peux éditer ton premier message pour intégrer les photo =) 

Concernant tes questions : 

+> Tu as choisis de faire un robot " direction + propulsion " comme nos voitures, c'est un choix intéressant mais pas forcément le plus simple ( en général on commence avec deux moteurs droite gauche comme les tanks ;) ) mais soit si c'est ce qui t'intéresse on va t'aider sur ce sujet ;) 

+> Deuxième remarque : tu as choisis un moteur pas à pas pour la direction, là aussi c'est un choix intéressant, en général on prend un servomoteur pour ce genre de chose, mais rassure toi ça peut quand même marcher si c'est ce que tu veux utiliser. 

comment faire pour que le robot sache à quel degrès commander le moteur pas à pas pour que le robot avance tout droit ?  " 
=> Il faut que tu fasses l'étude "cinématique" de ton robot. 
Avant de faire "des maths géométrique" il faut comprendre ce que tu vas chercher à faire :) 
Pour cela tu peux faire un schémas à l'échelle où tu mets ta roue motrice ( si tu as un seul moteur et pas de différentiel sur ton robot mieux vaut qu'il n'ait qu'une seule roue motrice ;) ) et ta roue directrice, et son point de pivot. ( je te recommande aussi d'avoir une seule roue directrice, ça sera plus simple pour ton étude cinématique )

Si tu veux aller tout droit, ta roue motrice et directrice doivent être parallèle, tu dois juste définir la distance à parcourir.

Si tu veux aller à un point qui n'est pas tout droit ( pour l'exercice " aller à un point = mettre le centre de ta roue motrice sur ce point ") alors sur ton schémas tu dois tracer un cercle qui est tangeant à ta roue directrice et qui arrive au point souhaité. 
une fois que tu as trouvé le centre de ce cercle il faut que tu trouves l'angle à donner à ta roue directrice pour quelle soit parallèle à la tangeante du cercle qui est elle même perpendiculaire à la droite qui passe par le centre de ta roue directrice et le centre de ta trajectoire... 

Une fois que tu as enfin calculé cet angle, il te reste plus qu'à connaitre la distance d'arc à parcourir ! =) ( pour ça il te faudra calcule l'angle entre les droites formée pas : a )  centre de trajectoire / point de départ roue motrice et  b ) centre de trajectoire / point d'arrivé... 

Donc ça fait pas mal de maths à faire =) 

Ci joint un petit dessin pour illustrer ce que j'ai écrit : 

cinematique.png

 

L'encodeur pourra te donner la distance linéaire parcourue ;)  Donc si tu connais exactement l'angle de ta roue directrice, tu peux précisément savoir où tu en es ( du moins " en théorie" quand tu as pas de glissements :)

Un fois que tu maîtriseras les lignes droites et les cercles , tous tes déplacements ne seront que des combinaisons de cercle et de ligne droite.
 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

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!

 

Les réalisations de Mike118  

 

 

 


#3 fralaric

fralaric

    Membre

  • Membres
  • 21 messages

Posté 01 juin 2023 - 08:09

Merci pour ta réponse,

 

pour l'image, j'ai essayé la méthode mais je n'ai pas la possibilité d'ajouter l'image au message... Je choisis l'image, je clique sur attacher, ça mouline un peu et rien... mon image est une jpg de 19mo donc je pense que c'est bon, j'ai essayé plusieurs navigateurs, toujours pareil.

 

Pour le robot, je comprends ton raisonement. Il faut donc que j'arrive à calculer l'angle former entre la tangente au cercle passant par les point (0,0) et (x,y), au point (0,0) qui est le poitn de contact de ma roue motrice , et le vecteur qui passe par l'avant de la voiture.

 

Mais une fois calculé, j'ai quand même besoin d'un capteur qui connait cet angle, non ? Pour que je puisse commander au moteur pas à pas de bien se mettre à l'angle spécifié.



#4 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 969 messages
  • Gender:Male
  • Location:Anglet

Posté 01 juin 2023 - 12:40

Alors pour ce qui est de l'image : 

Quand tu écris un message ou que tu modifies un message déjà posté, tu dois cliquer sur " utiliser l'éditeur compler / plus d'option de réponse ". 

Ensuite tu obtiens cette partie sous ton message qui permet de mettre les photo ... 
Capture image.JPG

Il te faut d'abord choisir le fichier. 
Puis joindre ce fichier
Puis ajouter dans le message   à l'endroit où tu veux que l'image soit. 

Pour ce qui est de mettre ton moteur pas à pas au bon angle, une fois que tu sais l'angle auquel tu veux mettre ton moteur, l'avantage du pas à pas c'est que tu lui dit exactement à l'angle auquel tu veux qu'il aille avec quelques "bémols" , l'angle qu'il peu atteindre est en multiple de pas et ça reste valable sous condition de pas avoir de pas qui sautent et de connaître ta position initiale ...

=> Le fait d'être en multiple de pas ne devrait pas trop t'impacter car on peut faire des micro pas ... ( un moteur pas à pas classique en pas complets c'est 200 pas / 360° ... Mais on peut faire du demi pas ( => 400 pas / 360° ) du quart de pas ( 800pas / 360° )  ... et certains drivers te permettent d'aller jusqu'à du 1/32 pas ... ( tu es beaucoup plus précis mais tu commences à perdre en vitesse max / et en couple )
=> Le fait de ne pas avoir de pas qui sautent, il faut juste correctement dimensionner le moteur 
=> Le fait de connaitre la position initial il te faudra une phase d'initialisation où tu mettre ta roue directrice en butée par exemple ...

Bref aucun problème d'insurmontable ;) 

Donc pas forcément besoin de capteur en plus ....

pour en revenir à ton étude cinématique je te propose de commencer par " trouver le centre cercle qui passe par le centre de ta roue et ton point d'arrivé et qui est tangent à ta roue. 
( si le centre de ta roue est en R (0,0) orienté alignée avec l'axe des x alors le centre de ce cercle est quelque part sur ton axe y ;)  de la forme O ( 0 , a )
+> Si on note A(x,y) le point d'arrivé une façon de calculer a serait de résoudre 
distance OA = distance OR 

OR c'est facile la distance c'est a ;) 
et OA = racine ( x² + (y-a)² ) 

Et je pense t'en avoir dit bien assez pour que tu puisses exprimer a en fonction de x et y ;)
 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

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!

 

Les réalisations de Mike118  

 

 

 


#5 fralaric

fralaric

    Membre

  • Membres
  • 21 messages

Posté 01 juin 2023 - 07:14

Alors pour ce qui est de l'image : 

Quand tu écris un message ou que tu modifies un message déjà posté, tu dois cliquer sur " utiliser l'éditeur compler / plus d'option de réponse ". 

Ensuite tu obtiens cette partie sous ton message qui permet de mettre les photo ... 

attachicon.gifCapture image.JPG

Il te faut d'abord choisir le fichier. 
Puis joindre ce fichier
Puis ajouter dans le message   à l'endroit où tu veux que l'image soit.
 

Oui, c'est bien au moment où je clique sur ajouter que ça ne marche pas, je peux pas te faire de capture d'écran pour te montrer du coup ^^

 

 

 

Pour ce qui est de mon problème, je trouve que a =(x²+y²)/2*y

 

En cherchant une relation entre a et l'angle de la direction, je trouve -atan(L/a)+pi/2. Avec L la dimension entre les deux roues (motrice et directrice). ça a l'air cohérent car déjà ça dépend de L et en plus si y tend vers 0 (ligne droite) alors alpha tend vers 0.

 

Qu'en pensez-vous ?



#6 fralaric

fralaric

    Membre

  • Membres
  • 21 messages

Posté 14 juin 2023 - 07:56

Bonjour, j'ai un peu avancé sur mon projet, du moins sur la partie "mécanique". Je suis en train de vouloir faire marcher le moteur mais celui ci ne veux pas tourner, ou alors de manière très aléatoire (j'ai l'impression).

 

Voilà le montage (à la place de la pile, j'ai une alim qui délivre un courant continu de 5v, la carte arduino est elle aussi alimenté)

 

Capture d’écran 2023-06-14 184727.png

 

Et le code :

#define moteur1_PWM 4
#define Moteur_sens1 3
#define Moteur_sens2 2

int PWM=0; // Variable PWM image de la vitesse

void setup() {
Serial.begin(9600); // Ouverture du port série et debit de communication fixé à 9600 bauds
pinMode(moteur1_PWM, OUTPUT); // Pin 10 Arduino en sortie PWM
pinMode(Moteur_sens1, OUTPUT); // Pin 4 Arduino en sortie digitale
pinMode(Moteur_sens2, OUTPUT); // Pin 5 Arduino en sortie digitale


}
void loop() {
  digitalWrite(Moteur_sens1,HIGH); // Activation de la broche A+ du L293D
  digitalWrite(Moteur_sens2,LOW); // Désactivation de la broche A- du L293
  digitalWrite(moteur1_PWM,HIGH); // Envoi du signal PWM sur la sortie analogique 10
  delay( 10000 ); // Attendre 1 secode avant le lancement de la fonction accélération
  Acceleration(); // Lance la fonction Acceleration()
}
// Le temps d'accélération est réglage avec le changement du delay
void Acceleration(){
for (PWM = 40; PWM <= 255; PWM++){ // Boucle pour augmenter PWM de 0 jusqu'à 255
delay( 10 ); // Attendre 10ms avant la prochaine incrémentation du PWM
digitalWrite(Moteur_sens1,HIGH); // Activation de la broche A+ du L293D
digitalWrite(Moteur_sens2,LOW); // Désactivation de la broche A- du L293
analogWrite(moteur1_PWM,PWM); // Envoi du signal PWM sur la sortie analogique 10
Serial.print("Valeur PWM : "); // Affichage sur le moninteur série du texte
Serial.println(PWM); // Affichage sur le moninteur série de la valeur PWM
}
delay( 3000 ); // Attente de 3 secondes
Deceleration();
}
// Le temps de décélération est réglage avec le changement du delay
void Deceleration(){
for (PWM = 255; PWM >= 0; --PWM){// Boucle pour dminuer PWM de 255 jusqu'à 0
delay( 10 ); // Attendre 10ms avant la prochaine décrémentation du PWM
digitalWrite(Moteur_sens1,HIGH); // Activation de la broche A+ du L293D
digitalWrite(Moteur_sens2,LOW); // Désactivation de la broche A- du L293D
analogWrite(moteur1_PWM,PWM); // Envoi du signal PWM sur la sortie analogique 10
Serial.print("Valeur PWM : "); // Affichage sur le moninteur série du texte
Serial.println(PWM); // Affichage sur le moninteur série de la valeur PWM
}
// Arrêt du moteur
digitalWrite(Moteur_sens1,LOW); // Désactivation de la broche A+ du L293D
digitalWrite(Moteur_sens2,LOW); // Désactivation de la broche A- du L293D
delay( 3000 ); // Attente de 3 secondes
Acceleration(); // On relance l'accélération du moteur
}

Mon problème, j'ai réussi à le faire tourner au début, les 3 premières lignes de la loop, mais ensuite la partie accélération, en jouant avec analogwrite, ne marche pas. Il y a un bruit provenant du moteur mais rien d'autre.... le moteur est un petit moteur 3-6V donc normalement il devrait tourner. Vous voyez quelque chose de choquant niveau montage ou code ? Sinon, peut-être que mon L293D ne marche plus trop, j'ai rien pour le tester (oscillo) 



#7 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 969 messages
  • Gender:Male
  • Location:Anglet

Posté 18 juin 2023 - 12:19

#define moteur1_PWM 4
#define Moteur_sens1 3
#define Moteur_sens2 2


void setup() {
  Serial.begin(9600); // Ouverture du port série et debit de communication fixé à 9600 bauds
  pinMode(moteur1_PWM, OUTPUT); // Pin 4 Arduino en sortie PWM
  pinMode(Moteur_sens1, OUTPUT); // Pin 3 Arduino en sortie digitale
  pinMode(Moteur_sens2, OUTPUT); // Pin 2 Arduino en sortie digitale
  digitalWrite(Moteur_sens1,HIGH); // Activation de la broche A+ du L293D
  digitalWrite(Moteur_sens2,LOW); // Désactivation de la broche A- du L293

  for (int PWM = 0; PWM <= 255; PWM++){ // Boucle pour augmenter PWM de 0 jusqu'à 255
    delay( 100 ); // Attendre 100ms avant la prochaine incrémentation du PWM
    analogWrite(moteur1_PWM,PWM); // Envoi du signal PWM 
  }
  for (int PWM = 255; PWM >= 0; PWM--){ // Boucle pour diminuer le PWM jusqu'à 0
    delay( 100 ); // Attendre 100ms avant la prochaine incrémentation du PWM
    analogWrite(moteur1_PWM,PWM); // Envoi du signal PWM 
  }


}
void loop() {
 
}

Comment se comporte ce code pour vous ? 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

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!

 

Les réalisations de Mike118  

 

 

 


#8 fralaric

fralaric

    Membre

  • Membres
  • 21 messages

Posté 19 juin 2023 - 07:17

Le moteur va accélérer et décélérer une fois (il y a rien dans la loop), en faisant évolué la periode du pwm qu'on envoie sur le pin 4.



#9 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 969 messages
  • Gender:Male
  • Location:Anglet

Posté 19 juin 2023 - 08:58

Je voulais dire : Comment ça se comporte en le testant sur votre montage?

Cela se comporte bien comme prévu?

 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

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!

 

Les réalisations de Mike118  

 

 

 


#10 fralaric

fralaric

    Membre

  • Membres
  • 21 messages

Posté 19 juin 2023 - 10:29

Ah pardon :D 

 

Plus rien ne se passe, mis à part un bruit au niveau du moteur, bruit du courant dans le stator j'imagine, mais il ne tourne pas. J'ai même essayé à vide mais ça ne tourne pas non plus. je ne sais pas comment mesurer le courant vu que déjà j'ai pas d"outil pour et ensuite c'est un pwm en entrée donc un multimètre pourrait pas donner de mesure de courant je pense.



#11 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 969 messages
  • Gender:Male
  • Location:Anglet

Posté 19 juin 2023 - 11:31

#define moteur1_PWM 4
#define Moteur_sens1 3
#define Moteur_sens2 2


void setup() {
  Serial.begin(9600); // Ouverture du port série et debit de communication fixé à 9600 bauds
  pinMode(moteur1_PWM, OUTPUT); // Pin 4 Arduino en sortie PWM
  pinMode(Moteur_sens1, OUTPUT); // Pin 3 Arduino en sortie digitale
  pinMode(Moteur_sens2, OUTPUT); // Pin 2 Arduino en sortie digitale
  digitalWrite(Moteur_sens1,HIGH); // Activation de la broche A+ du L293D
  digitalWrite(Moteur_sens2,LOW); // Désactivation de la broche A- du L293

}
void loop() {

  analogWrite(moteur1_PWM,255); // Envoi du signal PWM 

  delay(5000);

  analogWrite(moteur1_PWM,0); // Envoi du signal PWM 

  delay(5000);
 
}

Et ça ça donne quoi ? ( en test réel bien entendu ) 

Sinon tester ça : 


 

#define moteur1_PWM 4
#define Moteur_sens1 3
#define Moteur_sens2 2


void setup() {
  Serial.begin(9600); // Ouverture du port série et debit de communication fixé à 9600 bauds
  pinMode(moteur1_PWM, OUTPUT); // Pin 4 Arduino en sortie PWM
  pinMode(Moteur_sens1, OUTPUT); // Pin 3 Arduino en sortie digitale
  pinMode(Moteur_sens2, OUTPUT); // Pin 2 Arduino en sortie digitale
  digitalWrite(moteur1_PWM,HIGH); // PWM à fond



}
void loop() {

  digitalWrite(Moteur_sens1,HIGH);
  digitalWrite(Moteur_sens2,LOW); 

  delay(5000);

  digitalWrite(Moteur_sens1,LOW); 
  digitalWrite(Moteur_sens2,HIGH); 

  delay(5000);
 
}

En fonction des résultats il faudra peut être bien revérifier les branchements ...


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

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!

 

Les réalisations de Mike118  

 

 

 


#12 fralaric

fralaric

    Membre

  • Membres
  • 21 messages

Posté 20 juin 2023 - 07:16

Non, rien ne se passe, j'ai vérifié mes branchements également... j'ai commandé un module l293d, je verrais bien :) Merci pour tes réponses en tout cas



#13 fralaric

fralaric

    Membre

  • Membres
  • 21 messages

Posté 08 août 2023 - 05:50

Bonjour,

 

il y a quelques jours, j'ai donc acheté un nouveau module l293D comme ça : 

1912.jpg

 

 

 

 

ça a marché au début mais depuis aujourd'hui il y a un comportement que j'arrive pas à expliquer :

 

 

Pour ce bout de code, le moteur marche, il va un coup en avant, un coup en arrière mais des fois il a des oublis, durant certaines phases il bouge pas, puis recommence à tourner.


const int PinIN1 = 6;
const int PinIN2 = 5;
const int PinEN = 7;


void setup ()  {
pinMode(PinIN1,OUTPUT);
pinMode(PinIN2,OUTPUT);
pinMode(PinEN,OUTPUT);
  
Serial.begin(9600);

analogWrite(PinEN,0);
digitalWrite(PinIN1,LOW);
digitalWrite(PinIN2,LOW);

}

void loop ()  {
analogWrite(PinEN,255);
delay(2000);
digitalWrite(PinIN1,LOW);
digitalWrite(PinIN2,HIGH);
delay(2000); 
digitalWrite(PinIN1,HIGH);
digitalWrite(PinIN2,LOW);

}



Mais pour ce code là : 


const int PinIN1 = 6;
const int PinIN2 = 5;
const int PinEN = 7;


void setup ()  {
pinMode(PinIN1,OUTPUT);
pinMode(PinIN2,OUTPUT);
pinMode(PinEN,OUTPUT);
  
Serial.begin(9600);

analogWrite(PinEN,0);
digitalWrite(PinIN1,LOW);
digitalWrite(PinIN2,LOW);

}

void loop ()  {
analogWrite(PinEN,255);
digitalWrite(PinIN1,HIGH);
digitalWrite(PinIN2,LOW);

}

Le moteur ne tourne pas du tout.

 

 J'utilise le même montage qu'ici :

post-22192-0-63247400-1686768488.png

 

Sauf que le composant L293D est remplacé par le shield que j'ai acheté mais ça ne change pas grand chose. (j'ai connecté EN1, IN1, IN2)

Vous auriez une idée d'où peut venir mon soucis ?



#14 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 969 messages
  • Gender:Male
  • Location:Anglet

Posté 08 août 2023 - 06:49

Si tu essayes ça : 

 

const int PinIN1 = 6;
const int PinIN2 = 5;
const int PinEN = 7;


void setup ()  {
pinMode(PinIN1,OUTPUT);
pinMode(PinIN2,OUTPUT);
pinMode(PinEN,OUTPUT);
  

analogWrite(PinEN,255);
digitalWrite(PinIN1,HIGH);
digitalWrite(PinIN2,LOW);

}

void loop ()  {


}

ça te donne quoi ? 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

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!

 

Les réalisations de Mike118  

 

 

 


#15 fralaric

fralaric

    Membre

  • Membres
  • 21 messages

Posté 09 août 2023 - 06:40

Alors ça a marché un temps...puis ça s'est arrêté. Il y a une led rouge qui indique le sens de rotation et qui a peu à peu perdu en intensité, puis le moteur s'est éteint. J'ai changé la pile et maintenant ça marche... il faudrait que je m'équipe d'un multimètre.

 

En tout cas voilà mon montage :

 

robot.png.jpeg

 

Je suis pas arriver à trouver dans les docs si je dois cabler le vcc et gnd du driver moteur, étant donné que j'alimente déjà ce driver pour le moteur.



#16 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 969 messages
  • Gender:Male
  • Location:Anglet

Posté 10 août 2023 - 10:38

d'après le schémas que tu as toi même présenté plus haut :

 

Bonjour,

 

il y a quelques jours, j'ai donc acheté un nouveau module l293D comme ça : 

1912.jpg

 

 

 

 

Connecte gnd au gnd de ton système et VCC au 5V de ton arduino... ce manque peut peut être expliqué les problèmes bizarre rencontré ... 

Au passage le fait que tu utilisais des piles qui n'avaient peut être plus assez de jus peut également expliquer les problèmes rencontrés...
 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

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!

 

Les réalisations de Mike118  

 

 

 


#17 fralaric

fralaric

    Membre

  • Membres
  • 21 messages

Posté 13 août 2023 - 02:31

Super, merci pour tes conseils !



#18 fralaric

fralaric

    Membre

  • Membres
  • 21 messages

Posté 14 août 2023 - 05:06

Voilà, j'ai réussi à faire ce que je voulais, le robot va où il veut.

 

J'ai une question :



void loop ()  {
  if(distToRun <= 0)
  {
    analogWrite(PinEN,0);
    digitalWrite(PinIN1,LOW);
    digitalWrite(PinIN2,LOW);    
  }  
  if(TurnDetected)
  {
    distToRun -= 0.00946;
    TurnDetected = false;
    Serial.println(distToRun);
  }    
}



La variable TurnDetected est volatile et mise à true dans la procédure de l'interruption. A la base, j'avais mis la ligne distToRun -= 0.00946; dans la procédure d'interruption mais le robot s'arrêtait plus tôt que prévu. Vous pouvez m'expliquer ce comportement et pourquoi il faut utiliser des variables volatiles dans les interruptions ?



#19 Sandro

Sandro

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 262 messages
  • Gender:Male

Posté 14 août 2023 - 10:02

Bonsoir,

pour la question pourquoi mettre distToRun dans la procédure d'interruption change le comportement : sans voir ton code complet, on aura du mal à t'aider.

 

Pour les variables volatile, ce n'est pas intrinsèquement qu'il faut les utiliser dans les interruptions (je penses que si elle sert uniquement dans une seule interruption (ni dans une autre, ni dans le code principal), ça devrait marcher sans).

La signification de volatile est "attention, cette variable peut changer de valeur à tout moment".

Si tu ne mets pas volatile, le compilateur a le droit de faire l'hypothèse que la valeur ne change pas de manière imprévue. Par exemple, si tu faits 3 opérations d'affilé sur la variable, il peut la laisser dans un registre (ie une variable internet du processeur, beaucoup plus rapide d'accès, mais il y en a très peu) sans vérifier si la valeur en RAM a changée. Le compilateur est même autorisé à changer l'ordre des opérations ou à en faire plusieurs d'un coup (par exemple si tu écrits i++; j--; i++;, le compilateur a tout à fait le droit de le remplacer par i=i+2; j--;

 

Lorsque tu as une routine d'interruption qui peut te changer la valeur à tout moment, ce comportement n'est pas acceptable (tu risques de continuer à utiliser une vieille valeur de la variable, sans te rendre compte qu'elle a changée en RAM).

 

Si tu dis que la variable est volatile, alors tu forces au compilateur d'aller la lire dans la RAM à chaque fois que tu l'utilises, et à écrire la nouvelle valeur immédiatement en RAM : ça permet de résoudre ces problèmes "d'incohérence" de la valeur. L’inconvénient est que ça empêche pas mal d'optimisations de la part du compilateur : donc mettre une variable volatile qui n'a pas besoin de l'être ralentira inutilement le programme (pas de beaucoup s'il s'agit d'une ou 2 variables en trop, mais je te déconseille vivement de mettre toutes tes variables en volatile "juste au cas où").

 

 

Donc pour résumer, si 2 bouts de programmes (ie 1 interruption et le programme principal, 2 interruptions, le programme principal et un timer, ...) peuvent modifier une variable "partagée" à tout moment, alors il faut la mettre en volatile. Si en revanche l'ordre d'exécution est clairement définit (par exemple 2 fonctions ordinaires appelées depuis loop), alors c'est pas nécessaire.


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#20 fralaric

fralaric

    Membre

  • Membres
  • 21 messages

Posté 15 août 2023 - 01:42

Merci pour ta réponse !

#include <Stepper.h>

#define L 0.215 // Empattement robot

#define consigneX 2
#define consigneY 1

volatile boolean TurnDetected;  // need volatile for Interrupts
volatile boolean rotationdirection;  // CW or CCW rotation

const int PinCLK=2;   // Generating interrupts using CLK signal
const int PinDT=3;    // Reading DT signal

// Moteur propulsion 
const int PinIN1 = 6;
const int PinIN2 = 5;
const int PinEN = 7;

double distToRun;      // How much to move (meters)

// Stepper motor, pour la direction
float  consigneAngleRoue;
const int stepsPerRevolution = 2048;  // change this to fit the number of steps per revolution
const int rolePerMinute = 15;         // Adjustable range of 28BYJ-48 stepper is 0~17 rpm
Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11);

// Interrupt routine runs if CLK goes from HIGH to LOW
void isr ()  {
  delay(4);  // delay for Debouncing
  TurnDetected = true; 
}

void setup ()  {
pinMode(PinIN1,OUTPUT);
pinMode(PinIN2,OUTPUT);
pinMode(PinEN,OUTPUT);
pinMode(PinCLK,INPUT);
pinMode(PinDT,INPUT);  
myStepper.setSpeed(rolePerMinute);
Serial.begin(9600);
attachInterrupt (0,isr,FALLING); // interrupt 0 always connected to pin 2 on Arduino UNO
InitDistToRun(consigneX,consigneY, &distToRun);
InitAngleConsigneRoue(consigneX, consigneY, &consigneAngleRoue);
analogWrite(PinEN,0);
digitalWrite(PinIN1,LOW);
digitalWrite(PinIN2,LOW);
InitPositionRoue();
analogWrite(PinEN,255);
digitalWrite(PinIN1,HIGH);
digitalWrite(PinIN2,LOW);
}

void loop ()  {
  if(distToRun <= 0)
  {
    analogWrite(PinEN,0);
    digitalWrite(PinIN1,LOW);
    digitalWrite(PinIN2,LOW);    
  }  
  if(TurnDetected)
  {
    distToRun -= 0.00946;
    TurnDetected = false;
    Serial.println(distToRun);
  }    
}

void InitDistToRun(int x, int y, double* distToRun)
{
  float a = (pow(x,2)+pow(y,2))/(2*y);
  *distToRun = (3.14/2 - sin((a-y)/(sqrt(pow(x,2)+pow((a-y),2))))) * a;
  Serial.println(*distToRun);
}

void InitAngleConsigneRoue(int x, int y, float* consigneAngleRoue)
{
  float a = (pow(x,2)+pow(y,2))/(2*y);
  float consigneAngleRoueRad = - atan(a/L) + 3.14/2; 
  *consigneAngleRoue = (consigneAngleRoueRad * 180)/(3.14/2);
  Serial.println(*consigneAngleRoue);
}

void InitPositionRoue()
{
      delay(5000);
      myStepper.step(440);
      myStepper.step(-220);
      float consigneStep = (consigneAngleRoue * 2048)/ 360;
      myStepper.step(consigneStep);
      Serial.println(consigneStep);
      Serial.println("fin Init");
}

Voilà tout mon code.

 

Et avant j'avais :

#include <Stepper.h>

#define L 0.215 // Empattement robot

#define consigneX 2
#define consigneY 1

volatile boolean TurnDetected;  // need volatile for Interrupts
volatile boolean rotationdirection;  // CW or CCW rotation

const int PinCLK=2;   // Generating interrupts using CLK signal
const int PinDT=3;    // Reading DT signal

// Moteur propulsion 
const int PinIN1 = 6;
const int PinIN2 = 5;
const int PinEN = 7;

double distToRun;      // How much to move (meters)

// Stepper motor, pour la direction
float  consigneAngleRoue;
const int stepsPerRevolution = 2048;  // change this to fit the number of steps per revolution
const int rolePerMinute = 15;         // Adjustable range of 28BYJ-48 stepper is 0~17 rpm
Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11);

// Interrupt routine runs if CLK goes from HIGH to LOW
void isr ()  {
  delay(4);  // delay for Debouncing
  distToRun -= 0.00946;
  Serial.println(distToRun);
}

void setup ()  {
pinMode(PinIN1,OUTPUT);
pinMode(PinIN2,OUTPUT);
pinMode(PinEN,OUTPUT);
pinMode(PinCLK,INPUT);
pinMode(PinDT,INPUT);  
myStepper.setSpeed(rolePerMinute);
Serial.begin(9600);
attachInterrupt (0,isr,FALLING); // interrupt 0 always connected to pin 2 on Arduino UNO
InitDistToRun(consigneX,consigneY, &distToRun);
InitAngleConsigneRoue(consigneX, consigneY, &consigneAngleRoue);
analogWrite(PinEN,0);
digitalWrite(PinIN1,LOW);
digitalWrite(PinIN2,LOW);
InitPositionRoue();
analogWrite(PinEN,255);
digitalWrite(PinIN1,HIGH);
digitalWrite(PinIN2,LOW);
}

void loop ()  {
  if(distToRun <= 0)
  {
    analogWrite(PinEN,0);
    digitalWrite(PinIN1,LOW);
    digitalWrite(PinIN2,LOW);    
  }     
}

void InitDistToRun(int x, int y, double* distToRun)
{
  float a = (pow(x,2)+pow(y,2))/(2*y);
  *distToRun = (3.14/2 - sin((a-y)/(sqrt(pow(x,2)+pow((a-y),2))))) * a;
  Serial.println(*distToRun);
}

void InitAngleConsigneRoue(int x, int y, float* consigneAngleRoue)
{
  float a = (pow(x,2)+pow(y,2))/(2*y);
  float consigneAngleRoueRad = - atan(a/L) + 3.14/2; 
  *consigneAngleRoue = (consigneAngleRoueRad * 180)/(3.14/2);
  Serial.println(*consigneAngleRoue);
}

void InitPositionRoue()
{
      delay(5000);
      myStepper.step(440);
      myStepper.step(-220);
      float consigneStep = (consigneAngleRoue * 2048)/ 360;
      myStepper.step(consigneStep);
      Serial.println(consigneStep);
      Serial.println("fin Init");
}

distToRun était dans loop mais il était uniquement lu. Cela suffisait à rendre sa valeur incohérente ? Si j'avais mis distToRun en volatile ça aurait pu marcher ?

 

Le comportement incohérent était : distToRun diminué plus que prévu.





Répondre à ce sujet



  


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

0 members, 0 guests, 0 anonymous users