Aller au contenu


Photo
- - - - -

Code pour pilotage du moteur courant continu en fonction du driver utilisé


17 réponses à ce sujet

#1 thermo_nono

thermo_nono

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 820 messages

Posté 04 août 2018 - 11:51

C'est ici que nous publierons tout ce qui touche à le programmation de l'arduino nano. 

Mike118 a proposé exemple de bout de code pour la gestion du sens de rotation du moteur issu du projet cocotix : 

Spoiler

 



#2 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 018 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 05 août 2018 - 03:58

Le code ci dessus va avec un driver du type L9110 qui a uniquement 2 entrées A et B pour piloter le moteur fonctionnant tel que : 

 

Si tu mets un PWM de 100% sur A et  un 0 sur B ça tourne à fond dans un sens. 
Si tu mets un PWM de 0% sur A et un 1 sur B ça tourne à fond dans l'autre sens. 

 

Si tu mets 1 et 1 sur A et B  ou 0 et 0 ça tourne pas.

 

comme expliqué dans cette discussion sur comment piloter le driver

 

 

Par contre en remplaçant les fonctions par : 


// Code pour PWM + dir sur 2 pins

void avancerMoteur(uint8_t a) // En avant
{
analogWrite (PINPWM, a); // Contrôle de vitesse en PWM, moteur 1
digitalWrite(PINDIRA, HIGH);
digitalWrite(PINDIRB, LOW);
}


void reculerMoteur (uint8_t a) // En arrière
{
analogWrite (PINPWM, a);
digitalWrite(PINDIRA, LOW);
digitalWrite(PINDIRB, HIGH);
}




// Code pour PWM + DIR sur 1 seul pin

void avancerMoteur(uint8_t a) // En avant
{
analogWrite (PINPWM, a); // Contrôle de vitesse en PWM, moteur 1
digitalWrite(PINDIR, HIGH); 
}


void reculerMoteur (uint8_t a) // En arrière
{
analogWrite (PINPWM, a);
digitalWrite(PINDIR, LOW);
}

et on pourra adapter ces fonctions au besoin ... si jamais il y a encore d'autres spécificité, et on pourra même mettre toute les fonctions ci dessus dans le code et charger la fonction qui nous intéresse en fonction des #define qu'on met dans le code =) ( directives préprocesseur )


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 !

 

Les réalisations de Mike118  

 

 

 


#3 thermo_nono

thermo_nono

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 820 messages

Posté 11 mai 2019 - 11:04

salut, j'ai un souci pour placer une instruction "delay()" dans une boucle for pour mes tests de démarrage progressif (accélération)... 

 

void accelererMoteur2(int16_t vitesseDebut, int16_t vitesseFin) {
  for (int16_t vitesseMoteur2=vitesseDebut; vitesseMoteur2=vitesseFin; vitesseMoteur2++) {
    bcl = constrain(vitesseMoteur2, 0, 255);
      setVitesseMoteur2(vitesseMoteur2);
      delay(100);
  }
}

c'est comme si le "delay()" n'était pas du tout pris en compte.... merci d'avance pour votre aide. 
 



#4 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 018 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 11 mai 2019 - 02:36

salut, j'ai un souci pour placer une instruction "delay()" dans une boucle for pour mes tests de démarrage progressif (accélération)... 

 

void accelererMoteur2(int16_t vitesseDebut, int16_t vitesseFin) {
  for (int16_t vitesseMoteur2=vitesseDebut; vitesseMoteur2=vitesseFin; vitesseMoteur2++) {
    bcl = constrain(vitesseMoteur2, 0, 255);
      setVitesseMoteur2(vitesseMoteur2);
      delay(100);
  }
}

c'est comme si le "delay()" n'était pas du tout pris en compte.... merci d'avance pour votre aide. 
 

 

 

Est il possible d'avoir l'ensemble du programme ? Si le timer qui gère le délais pour autre chose est utilisé ailleurs / déréglé ça peur ne pas marcher ... 


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 !

 

Les réalisations de Mike118  

 

 

 


#5 thermo_nono

thermo_nono

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 820 messages

Posté 11 mai 2019 - 05:20

oui, c'est possible mais c'est brouillon... je fais des essais. ^^

 

int PINMOTEURA = 10; 
int PINMOTEURB = 11; 
int PINMOTEURC = 3; 
int PINMOTEURD = 6; 

void setup()
{
  
  pinMode(PINMOTEURA, OUTPUT);
  pinMode(PINMOTEURB, OUTPUT);
  pinMode(PINMOTEURC, OUTPUT);
  pinMode(PINMOTEURD, OUTPUT);
  setVitesseMoteur1(0);
  setVitesseMoteur2(0);
  int16_t vitesseDebut=0;
  int16_t vitesseFin=255;
  accelererMoteur2(vitesseDebut, vitesseFin);
}

void loop(){

}

void accelererMoteur2(int16_t vitesseDebut, int16_t vitesseFin) {
  for (int16_t vitesseMoteur=vitesseDebut; vitesseMoteur=vitesseFin; vitesseMoteur++) {
    vitesseMoteur = constrain(bcl, 0, 255);
      setVitesseMoteur2(bcl);
      delay(100);
  }
}



void setVitesseMoteur1(int16_t vitesseMoteur) {
  vitesseMoteur = constrain( vitesseMoteur, -255, 255);
  if (vitesseMoteur >= 0) {
    avancerMoteur1(vitesseMoteur);
  }
  else {
    reculerMoteur1(-vitesseMoteur);
  }
}

void setVitesseMoteur2(int16_t vitesseMoteur) {
  vitesseMoteur = constrain( vitesseMoteur, -255, 255);
  if (vitesseMoteur >= 0) {
    avancerMoteur2(vitesseMoteur);
  }
  else {
    reculerMoteur2(-vitesseMoteur);
  }
}

void avancerMoteur1(uint8_t a) // En avant
{
  analogWrite (PINMOTEURA, 255 - a); // Contrôle de vitesse en PWM, moteur 1
  digitalWrite(PINMOTEURB, HIGH); // sens de marche avec HIGH
}

void reculerMoteur1(uint8_t a) // En arrière
{
  analogWrite (PINMOTEURA, a);
  digitalWrite(PINMOTEURB, LOW);
}

void avancerMoteur2(uint8_t a) // En avant
{
  analogWrite (PINMOTEURC, 255 - a); // Contrôle de vitesse en PWM, moteur 1
  digitalWrite(PINMOTEURD, HIGH); // sens de marche avec HIGH
}

void reculerMoteur2(uint8_t a) // En arrière
{
  analogWrite (PINMOTEURC, a);
  digitalWrite(PINMOTEURD, LOW);
}

merci. 
 



#6 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 018 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 11 mai 2019 - 05:30

Mea culpa j'aurais du voir directement le problème sans demander plus d'info ... J'étais resté sur l'indication donné autour du delay alors que le problème est là : 

 

for (int16_t vitesseMoteur=vitesseDebut; vitesseMoteur=vitesseFin; vitesseMoteur++)

 

 

=> il faut corriger par : 

for (int16_t vitesseMoteur=vitesseDebut; vitesseMoteur <= vitesseFin; vitesseMoteur++) {

 


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 !

 

Les réalisations de Mike118  

 

 

 


#7 thermo_nono

thermo_nono

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 820 messages

Posté 11 mai 2019 - 05:50

ha oui, merci beaucoup...



#8 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 4 486 messages
  • Gender:Male

Posté 11 mai 2019 - 08:00

il faut corriger par :

T'as l'oeil !
Ma chaine vidéo YouTube : https://www.youtube....wMz-IzZqyvqEUek

#9 thermo_nono

thermo_nono

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 820 messages

Posté 13 mai 2019 - 11:11

salut, je poursuit mes essais : j'ai maintenant mis un moteur avec codeur, sur un arduino mega (qui est plus facile à bidouiller que le nano pour les essais).. les roues codeuses sont sur les entrées analogiques 2 et 3).. par contre je me demande comment programmer ça : il faut que je crée deux variables (type int) pour l'incrémenter à chaque front montant des deux retours qui viennent du codeur ? (il y a aussi une histoire d'interruptions si je ne veux pas une lecture foireuse mais je ne sais pas ce que c'est)



#10 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 018 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 14 mai 2019 - 08:18

J'ai déjà beaucoup traité ce sujet sur le forum... Une simple recherche dans la barre de recherche avec le mot cled encodeur devrait t'indiquer plusieurs articles / Tuto / Sujets sur le forum... 

Hésite pas à linker ici les résultats qui t'ont le plus aidé ;) . Si tu as des questions tu pourras directement les poser dans le sujet concerné =) 

Tu verras c'est chouette les codeurs ;)


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 !

 

Les réalisations de Mike118  

 

 

 


#11 thermo_nono

thermo_nono

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 820 messages

Posté 14 mai 2019 - 09:02

merci, j'ai trouvé un tuto sur un autre site... je n'avais jamais entendu parler de ces "interruptions".. si j'ai bien compris ça va permettre de compter les passages d'un état à un autre sur les pins ainsi déclarés et ainsi m'affranchir de la contrainte du temps d’exécution de la boucle de mon programme qui aurait gêné le comptage. 
 



#12 thermo_nono

thermo_nono

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 820 messages

Posté 14 mai 2019 - 11:00

c'est encore moi... ^^ 
j'ai suivi ce tuto ( https://www.robot-ma...-encodeurs.html ).. 
j'ai juste remplacé le uno par un arduino mega "ATmega1280" (je n'ai que ça sous la main. ^^ )
tout me semble bien cablé, j'ai injecté le code dans l'arduino mega, la commande du moteur réponds bien, par contre la vitesse retournée est toujours de "0.00"... j'ai cherché un peu et je pense que ça pourrait venir du masque pour ne regarder que les pins 2 et 4 : 
 

  state|=B11101011;  // mask pour ne regarder que les changements sur 2 et 4 
  // Modifier le MASK  B01111011 par BXXXXXXXX mettre des 0 là où sont les pins utilisés par l'encodeur

1ere chose : ce masque me semble indiquer les pins 3 et 5 (à moins qu'on ne lise le masque de droite à gauche). j'ai tenté un "state|=B11010111;" qui n'a pas fonctionné non plus. 
seconde chose.. j'ai pris un arduino mega... :-/ ... est ce que ça change quelque chose vis a vis du masque ou des pins d'interruption ? 
 

merci d'avance. 



#13 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 4 486 messages
  • Gender:Male

Posté 14 mai 2019 - 01:05

Il y a ce fil qui parle des interruptions, https://www.robot-ma...-interruptions/
J'espère que cela pourra t'aider.
Ma chaine vidéo YouTube : https://www.youtube....wMz-IzZqyvqEUek

#14 thermo_nono

thermo_nono

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 820 messages

Posté 14 mai 2019 - 02:11

merci, je vais lire ça tout de suite.. 



#15 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 018 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 14 mai 2019 - 03:50

c'est encore moi... ^^ 
j'ai suivi ce tuto ( https://www.robot-ma...-encodeurs.html ).. 
j'ai juste remplacé le uno par un arduino mega "ATmega1280" (je n'ai que ça sous la main. ^^ )
tout me semble bien cablé, j'ai injecté le code dans l'arduino mega, la commande du moteur réponds bien, par contre la vitesse retournée est toujours de "0.00"... j'ai cherché un peu et je pense que ça pourrait venir du masque pour ne regarder que les pins 2 et 4 : 
 

  state|=B11101011;  // mask pour ne regarder que les changements sur 2 et 4 
  // Modifier le MASK  B01111011 par BXXXXXXXX mettre des 0 là où sont les pins utilisés par l'encodeur

1ere chose : ce masque me semble indiquer les pins 3 et 5 (à moins qu'on ne lise le masque de droite à gauche). j'ai tenté un "state|=B11010111;" qui n'a pas fonctionné non plus. 
seconde chose.. j'ai pris un arduino mega... :-/ ... est ce que ça change quelque chose vis a vis du masque ou des pins d'interruption ? 
 

merci d'avance. 

 

 

le code d'exemple que tu  as utilisé est fait pour une uno. le "PIND" utilisé  pour l'acquisition ne va pas avec la mega.


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 !

 

Les réalisations de Mike118  

 

 

 


#16 thermo_nono

thermo_nono

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 820 messages

Posté 14 mai 2019 - 04:55

 

 

le code d'exemple que tu  as utilisé est fait pour une uno. le "PIND" utilisé  pour l'acquisition ne va pas avec la mega.

oui, je suis passé sur les ports 2 et 3 qui correspondent (me semble t-il) aux ports d'interruption 0 et 1 du mega_1280.. 
par contre impossible de trouver les pins du "port D", n'ayant le nombre de pins du port D je ne sais pas combien de bits indiquer pour l'instruction "state|..." et quand bien même je connaîtrais le port D, je n'ai rien compris à ce mask : 
 

  state|=B11101011;  // mask pour ne regarder que les changements sur 2 et 4 
  // Modifier le MASK  B01111011 par BXXXXXXXX mettre des 0 là où sont les pins utilisés par l'encodeur

voici donc le nombre binaire du cache pour les ports 2 et 4 de l'exemple du tuto : 11101011
les indications semblent dire que ce port de 8bits comporte des 0 sur les pins de l'encodeur (2 et 4 dans le tuto pour un arduino uno)... 
mais.... 
11101011 me semble indiquer les pins 3 et 5 et non pas 2 et 4 (j'ai tenté B11010111 mais ça ne change rien)

peut être faut il lire le nombre binaire de droite à gauche ce qui correspondrait bien aux pins 2 et 4 mais qui ne fonctionne pas. 

... j'ai donc huit bits (sur un arduino uno)... comment savoir à quoi ils correspondent ?
si je devais répondre à cette question je dirais : 

B         pin

1  =>   D1
1  =>   D2
1  =>   D3

0  =>   D4

1  =>   D5

0  =>   D6

1  =>   D7

1  =>   D8

mais visiblement c'est pas ça... 

(si j'comprends ça je vais demain me payer un uno et je remet le mega dans sa boite... ça évitera que je vous gonfle avec le portD du mega1280 ^^ )


 



#17 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 018 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 14 mai 2019 - 08:41

Alors, en fait, la on passe dans le domaine des microcontrôleurs et pas juste du monde " arduino" .

Un microcontrôleurs a des registres. Ces registres il y en a plein et ils permettent de faire plein de choses... 
Arduino a simplifié tout ça en créant des fonctions qui manipulent les registres pour toi. Mais tu peux toujours les utiliser quand même si tu sais ce que tu fais =) . 


Quand on est sur une architecture 8 Bit comme l'arduino uno, les pins sont mappé sur des registres, qui permettent de lire l'état de ports entiers. 


Sur une uno, le port D est mappé sur les pins digitale, 0 1 2 3 4 5 6 et 7.  ( Oui le trick c'est qu'on commence à compter à partir de 0 avec les microcontrôleurs ) . 
Du coup le mask B11101011 porte bien sur les pins 2 et 3 ( le bit de poids fort, correspondant au pin 7 ) 

 

Pour plus d'info voir cette référence pour les uno https://www.arduino....ortManipulation

 

 

Sur une mega voici comment sont mappé les pins : https://www.arduino..../PinMapping2560 

Il est possible de changer PIND par PINC par exemple, et brancher le codeur sur les pins du port C par exemple ... en vérifiant avec le tableau donné ci dessus la correspondance entre le pin x d'un port de le numéro Arduino d'un pin. 


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 !

 

Les réalisations de Mike118  

 

 

 


#18 thermo_nono

thermo_nono

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 820 messages

Posté 14 mai 2019 - 08:57

merci beaucoup ! ça y est je pense avoir bien tout saisi (en ce qui concerne le UNO).. 
Pour le Mega je vais y jeter un oeil dans la soirée, mais je pense que je ne vais pas me compliquer la vie, je vais me payer un uno demain...  (d'autant que la finalité du truc est de le porter sur Nano). 
Merci pour ces explications (merci aussi à Oracid pour son lien très intéressant). 
 





Répondre à ce sujet



  


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

0 members, 0 guests, 0 anonymous users