Découverte Arduino : Platine de test - programmation pour pilotage moteurs

Tout ce qu'il faut savoir pour radio-commander vos modèles de voitures, robots, tractopelle, etc..
Avatar du membre
marc80
Modérateur
Modérateur
Messages : 424
Enregistré le : 27 juil. 2020, 14:22
Localisation : 80500 Montdidier

Découverte Arduino : Utiliser un Joystik

Message par marc80 »

Ce programme a pour but de lire les valeurs en provenance du joystick et de créer les valeurs qui vont permettre de commander un moteur et/ou un servomoteur.
Pour contrôler le fonctionnement, l’affichage est fait sur le moniteur série de l’IDE Arduino.
 Le Joystick est constitué de 2 potentiomètres raccordés aux broches d’entrées analogiques A4 et A5 et d’un bouton poussoir raccordéé sur la broche 11 de la carte Roméo.
Chaque potentiomètre donne une tension comprise entre 0 et 5 Volts. Au repos, les potentiomètres sont en position médiane et la tension de sortie est d’environ 2,5 Volts. L’entrée analogique transforme cette tension en une valeur de 0 à 1023. La valeur au repos est donc d’environ 512 pour chaque entrée.Ces valeurs ne sont pas très précises. Il faut en tenir compte, en créant une « plage morte de -25 à +25 autour du 512 théorique.
 Un appui sur le bouton donne une valeur 0V. Au repos, l’entrée correspondante est forcée à +5 Volts. Dans ce programme, un appui sur le bouton allume la LED câblée en sortie 13.
Le programme :
 
Partie Déclaration :
Définition des broches entrées/ sorties utilisées (il suffit de changer les valeurs #define en fonction du cablge réalisé
Définition des variables ( x = N° de potentiomètre) :
  • marche (valeur 1 si bouton relaché, valeur 0 si Appui sur le bouton)
  • ValeurPx      valeur lue en entrée de la carte sur le potentiomètre x ( 0 à 1023 )
  • joystickx     valeur ( -512 à + 511), 0 correspondant à la position centrale théorique du joystick
  • vitessex       vitesse du moteur commandé (0 à 255)
  • sensx           Sens de rotation du moteur commandé valeurs -1, 0, 1
  • positionx      angle demandé au servomoteur (0 à 180)
  • posx             Valeur de commande du servomoteur (0 à 255)
  • mémoirex     mémoire de la valeur précédente pour n’afficher que s’il y a un changement de valeur
Setup() :
  • déclarer le bouton en entrée et définir sa résistance de pull-up
  • déclarer la led en sortie
  • déclarer la liaison vers le moniteur série
ex1-debut.png
 
Loop() :
  • Lire les entrées analogiques
Pour commander des moteurs :
  • Calculer les variables Joystick (-512 à +511)
  • Calculer la vitesse moteur : 3 fonctions imbriquées :
    • abs : prendre la valeur absolue de la variable Joystick
    • constrain : borner cette valeur entre 25 et 450 (si joystick < 25, alors forcer à 25 – Si joystick > 450 alors forcer à 450)
    • map convertir l’intervalle 25 – 450 en intervalle 0 -254 (voir un des messages précédents qui pr)
  • Calculer le sens
    • si la valeur joystick est entre -25 et + 25 : Arret moteur
    • SI > 25 : sens Avant
    • si < 25 : sens arrière
Pour commander des servomoteurs :
  • utiliser la fonction map() pour transformer les valeurs (0 à 1023) aux angles souhaités (ici 0 à 180 °, mais on peut choisir l’angle mini et l’angle maxi en modifiant les 2 derniers paramètres de la fonction MAP (Exemple: si je veux que mon servo évolue entre 15° et 135° : map (valeurPx,0,1023,15,135). pour les valeurs posx – faire une petite règle de 3 pour la valeur de sortie).
Contrôler la Led avec le bouton poussoir
ex1-calculs.png
 
afficher es valeurs à l’écran (fonctions déjà étudiées dans les messages précédents).
ex1-affichage.png
 
La fonction Delay() permet de ralentir l’affichage. Exemple d’affichage :
ex1-moniteur.png

Le programme et téléchargeable ici :  
Lecture_JoyStick.zip
 
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Bon Meccano à tous ! :020:  Marc
 

Avatar du membre
marc80
Modérateur
Modérateur
Messages : 424
Enregistré le : 27 juil. 2020, 14:22
Localisation : 80500 Montdidier

Re: Découverte Arduino : téléchargement programmes

Message par marc80 »

Je viens de modifier tous les messages de ce sujet contenant un programme. Chaque programme de test est maintenant téléchargeable.

Décompresser le dossier, double cliquer sur le fichier avec l'extension .ino.
Si l'IDE Arduino est sur votre poste, il devrait s'ouvrir automatiquement.

 
Bon Meccano à tous ! :020:  Marc
 

Avatar du membre
Suzimentvotre
Membre Expérimenté
Membre Expérimenté
Messages : 265
Enregistré le : 10 oct. 2020, 20:30

Re: Découverte Arduino : Platine de test - programmation pour pilotage moteurs

Message par Suzimentvotre »

Vraiment passionnant ! Merci beaucoup pour ce travail et pour votre talent !   :002:

Avatar du membre
marc80
Modérateur
Modérateur
Messages : 424
Enregistré le : 27 juil. 2020, 14:22
Localisation : 80500 Montdidier

Découverte Arduino : 2 moteurs commandés par Joystick

Message par marc80 »

Pas de notion nouvelle.Ce programme reprend le programme précédant au quel on a ajouter les  2 commandes de moteurs (proches de celui déjà présenté et d’un affichage de contrôle (déjà présentés en détail plus haut.
Déclaration :
ajout de  :
  • 4 #define pour définir les sorties moteurs utilisées sur la carte Romeo
  • 2 mémoires Vitesse utilisées pour l’affichage
Setup() :ajout : initialisation des 2 sorties de contrôle du sens Moteur (les sorties analogiques n »ont pas besoin de l’être)
ex2-debut.png
 loop() :
La première partie reprend le programme précédant et permet de calculer les variables qui vont piloter les moteurs.
ex2-lecture.png
 
La deuxième partie contrôle les moteurs :
  • en fonction du sens moteur positionner la sortie correspondante du moteur (1 : avant – 0 : arrêt ou arrière)
  • forcer la consigne à 0 si sens = 0
ex2-moteurs.png
 La troisième partie permet un affichage de contrôle que l’on peut mettre en commentaire quand tout fonctionne correctement. Ci dessous l’affichage pour le premier moteur (son fonctionnement a déjà été expliqué plus haut.
ex2-affichage.png
 
Voilà le résultat de l’affichage :
ex2-moniteur.png
 Si le câblage est conforme, les 2 moteurs tournent en fonction de la position des joysticks

Pour télécharger le programme :
Commande_2_moteurs_Joystick.zip
 
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Bon Meccano à tous ! :020:  Marc
 

yvespetit86
Membre Expérimenté
Membre Expérimenté
Messages : 389
Enregistré le : 30 août 2020, 17:37
Localisation : Migné-Auxances

Re: Découverte Arduino : Platine de test - programmation pour pilotage moteurs

Message par yvespetit86 »

Merci Marc, je regarde tout ça ce soir-
Yves

yvespetit86
Membre Expérimenté
Membre Expérimenté
Messages : 389
Enregistré le : 30 août 2020, 17:37
Localisation : Migné-Auxances

Re: Découverte Arduino : Platine de test - programmation pour pilotage moteurs

Message par yvespetit86 »

Bonsoir Marc,
Pas de miracle un beau message d'erreur en rouge qui ne se copie pas. Mais j'ai sans doute deux erreurs:
1) port série mal formaté
2) branchement mal faits.
Pour l'instant juste le fichier  "ino" modifié car je n'ai si servo moteur, ni led.
Merci d'avance pour ton aide.
Yves

erreur Arduino.docx
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

yvespetit86
Membre Expérimenté
Membre Expérimenté
Messages : 389
Enregistré le : 30 août 2020, 17:37
Localisation : Migné-Auxances

Re: Découverte Arduino : Platine de test - programmation pour pilotage moteurs

Message par yvespetit86 »

Copie de Erreur Arduino:

Le script

//#define bouton 2     // Bouton Joystick sur broche 11   
//#define led 2
int marche;

#define potar1 0     // 2 potentiomètres, branchés sur broches analogiques 4 et 5
#define potar2 1
int valeurP1;        // valeur lue (0 à 1023)
int valeurP2;
int joystick1;       // ValeurJoystick (-512 à +511)
int joystick2;
int vitesse1;            //vitesse calculée pour moteur (0 à 255)
int vitesse2;
int sens1;                //sens de marche calculé pour moteur (-1, 0, 1)
int sens2;

int position1;           //positionnement d'un servo moteur 0 à 180°
int pos1;                //Valeur de sortie correspondante
int position2;
int pos2;

#define E1 5             //Moteur1 Controle de vitesse PWM
#define M1 4             //Moteur1 Controle du sens de rotation
#define E2 6             //Moteur2 Controle de vitesse PWM
#define M2 7             //Moteur2 Controle du sens de rotation

int memoire1 = 0;        //mémoires pour affichage
int memoire2 = 0;
int mem_vitesse1 =0;
int mem_vitesse2 =0;

void setup()
{
//  pinMode(bouton, INPUT);
//  digitalWrite(bouton, HIGH);  //bouton avec resistance de pull-up
//  pinMode(led, OUTPUT);
  Serial.begin(9600);
  pinMode(M1, OUTPUT);        //sorties tout ou rien
  pinMode(M2, OUTPUT);
 
}

void loop()
{
//chaque axe du joystick est un potentionmetre.
//Le point milieu au repos donne donc environ 2,5 V, soit la valeur 512

valeurP1 = analogRead(potar1);    //Lecture potentiometres Joystick (0 à 1023)
valeurP2 = analogRead(potar2);
joystick1 = valeurP1 - 512;       //convertir en valeur Joystick (-512 à + 511)
joystick2 = valeurP2 - 512;

//Calcul vitesse et sens moteur
//le point 0 est situé entre -25 et + 25. la valeur maxi est de 450.
//constrain() permet de neutraliser le point 0 non stable
//map permet de normaliser la valeur entre 0 et 255 pour piloter un moteur CC

vitesse1 = map(constrain(abs(joystick1),25,450),25,450,0,254);
if (joystick1 >= 25) {sens1 = 1;}
else if (joystick1 <= -25) {sens1 = -1;}
else {sens1 = 0;}

vitesse2 = map(constrain(abs(joystick2),25,450),25,450,0,254);
if (joystick2 >= 0) {sens2 = 1;}
else if (joystick2 <= -25) {sens2 = -1;}
else {sens2 = 0;}

//commande pour un servomoteur

pos1 = map(valeurP1,0,1023,0,255);        //valeur pour servo
position1 = map(valeurP1,0,1023,0,180);   //angle Servo

pos2 = map(valeurP2,0,1023,0,255);
position2 = map(valeurP2,0,1023,0,180);

//marche =  digitalRead(bouton);       // allumage de la led avec le BP du joystick
if (marche == HIGH)
  //{digitalWrite(led, LOW);}
//else
//  {digitalWrite(led, HIGH);}
 
//Moteur 1  
  if (sens1 == 1)      
  {     
   digitalWrite(M1,HIGH);
  }
else if (sens1 == -1)
  {
  digitalWrite(M1,LOW);
  }
else  
  {     
  vitesse1 = 0;
  digitalWrite(M1,LOW);
  }
analogWrite (E1,vitesse1);                    //envoi consigne

//Moteur 2  
  if (sens2 == 1)           
  {     
   digitalWrite(M2,HIGH);
  }
else if (sens2 == -1)
  {
  digitalWrite(M2,LOW);
  }
else  
  {     
  vitesse2 = 0;             //si arret, forcer la vitesse à 0
  digitalWrite(M2,LOW);
  }
analogWrite (E2,vitesse2);                    //envoi consigne

//Affichage pour controle
if (sens1 != 0)
  {
  if (memoire1 == 0)                      //si le moteur vient de démarrer
    {
    if (sens1 == 1)
      {
      Serial.print("M1 avant      ");        // afficher l'état marche
      Serial.println(vitesse1);
      }
    else
      {
      Serial.print("M1 arriere      ");    
      Serial.println(vitesse1);
      }
    memoire1 = 1;
    }
  }
else
  {
  if (memoire1 == 1)
    {
    Serial.println("M1 arret");                // afficher l'état arret
    memoire1 = 0;
    }
  }
 
//si la vitesse varie, mettre la mémoire à 0 pour forcer l'affichage
//affichage possible toutes les 500 ms

if ((memoire1 == 1) && (vitesse1 != mem_vitesse1) && (millis() % 500 < 1))  
  {
  mem_vitesse1 = vitesse1;
  memoire1 = 0;
  }

if (sens2 != 0)
  {
  if (memoire2 == 0)                      //si le moteur vient de démarrer
    {
    if (sens2 == 1)
      {
      Serial.print("M2 avant      ");        // afficher l'état marche
      Serial.println(vitesse2);
      }
    else
      {
      Serial.print("M2 arriere      ");    
      Serial.println(vitesse2);
      }
    memoire2 = 1;
    }
  }
else
  {
  if (memoire2 == 1)
    {
    Serial.println("M2 arret");                // afficher l'état arret juste après l'arret
    memoire2 = 0;
    }
  }
 
if ((memoire2 == 1) && (vitesse2 != mem_vitesse2) && (millis() % 500 < 1))
  {
  mem_vitesse2 = vitesse2;
  memoire2 = 0;
  }

}

Le message
Arduino : 1.8.6 (Windows 7), Carte : "Arduino Leonardo"


Le croquis utilise 5830 octets (20%) de l'espace de stockage de programmes. Le maximum est de 28672 octets.
Les variables globales utilisent 257 octets (10%) de mémoire dynamique, ce qui laisse 2303 octets pour les variables locales. Le maximum est de 2560 octets.
Found programmer: Id = ""; type = à
    Software Version =
Found programmer: Id = ""; type = à
    Software Version =

Software Version = .à; Hardware Version = à.à

Avatar du membre
marc80
Modérateur
Modérateur
Messages : 424
Enregistré le : 27 juil. 2020, 14:22
Localisation : 80500 Montdidier

Re: Découverte Arduino : Platine de test - programmation pour pilotage moteurs

Message par marc80 »

Il n'y a pas d'autre message d'erreur ?
Déjà 2 anomalies :
"
//marche =  digitalRead(bouton);       // allumage de la led avec le BP du joystick
if (marche == HIGH)
  //{digitalWrite(led, LOW);}
//else
//  {digitalWrite(led, HIGH);}
"
if (marche == HIGH)   n'est pas mis en commentaire.

Sur la Leonardo V2, il vaut mieux ne pas utiliser l'entrée A0, qui est par défaut utilisée pour les boutons poussoirs intégrés à la carte. Si c'est une V1 il faut la définir en tant que UNO.

Idéalement, il faudrait utiliser le script en ne changeant que les valeurs de #define en fonction du câblage.
 
Bon Meccano à tous ! :020:  Marc
 

yvespetit86
Membre Expérimenté
Membre Expérimenté
Messages : 389
Enregistré le : 30 août 2020, 17:37
Localisation : Migné-Auxances

Re: Découverte Arduino : Platine de test - programmation pour pilotage moteurs

Message par yvespetit86 »

Merci- Je regarde tout ça demain.
Bonne fin de soirée
Yves

yvespetit86
Membre Expérimenté
Membre Expérimenté
Messages : 389
Enregistré le : 30 août 2020, 17:37
Localisation : Migné-Auxances

Re: Découverte Arduino : Platine de test - programmation pour pilotage moteurs

Message par yvespetit86 »

Bonjour Marc,

ça marche; pour moi, c'est toujours un petit miracle, car je ne comprends pas tout!!!
Merci et bonne journée.
Yves

Répondre