Contrôler le sens et la vitesse d'un moteur à courant continu (CC) par réception d'une valeur entière sur le port Série depuis la fenêtre Terminal.Par X. HINAULT - Page créée le : 5/2/2011.
On this page... (hide) 1. Présentation
Ce programme utilise les fonctionnalités suivantes :
Ressources utiles associées à ce programme :
2. Matériel Nécessaire2.1 L'espace de développement Arduino
![]() 2.2 Le matériel suivant pour réaliser le montage associé
![]()
![]()
![]()
![]()
![]() Disponible ici (6 Euros) : http://www.watterott.com/index.php?page=product&info=1339 3. Instructions de montage
4. Le schéma théorique du montageLe schéma théorique du montage (cliquer pour agrandir) 5. Le circuit du montageLe schéma du montage à réaliser (cliquer pour agrandir) 6. Fonctionnement du programme6.1 Structure globale du programmeCe programme simple comprend :
6.2 Déroulement du programmeLe programme se déroule de la façon suivante :
![]() Le déroulement du programme 7. Explication du programme7.1 Au niveau de la fonction d'initialisation setup( ) :
7.2 Au niveau de la boucle principale, la fonction loop ( ) :
8. Mise en oeuvre du programme8.1 Préparation du montage et programmation de la carte Arduino :
8.2 Préparation du Terminal côté PC dans le logiciel Arduino
![]()
![]()
![]() 8.3 Fonctionnement
9. Le programme complet en langage ArduinoA copier/coller directement dans l'éditeur Arduino // --- Programme Arduino --- // Trame de code générée par le générateur de code Arduino // du site www.mon-club-elec.fr // Auteur du Programme : X. HINAULT - Tous droits réservés // Programme écrit le : 5/2/2011. // ------- Licence du code de ce programme ----- // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, // or any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. // //////////////////// PRESENTATION DU PROGRAMME //////////////////// // -------- Que fait ce programme ? --------- /* Ce programme permet de contrôler le sens de rotation et la vitesse de rotation d'un moteur à courant continu (CC) par une valeur entière reçue sur le port série. Ce programme utilise la génération PWM : la valeur reçue devra être comprise entre 0 et 255. Le signe de la valeur reçue déterminera le sens de rotation : + vers l'avant et - vers l'arrière. Ce programme commande le moteur par 3 broches (1 sens AV, 1 sens AR et 1 vitesse (PWM)) et utilise une interface de puissance basée sur le CI tb6612 fng. */ // --- Fonctionnalités utilisées --- // Utilise la connexion série vers le PC // -------- Circuit à réaliser --------- // La connexion série vers le PC utilise les broches 0 et 1 (via le câble USB) // Broche 3 : la broche PWM de l'interface moteur // Broche 4 : la broche IN2 de l'interface moteur // Broche 5 : la broche IN1 de l'interface moteur // /////////////////////////////// 1. Entête déclarative /////////////////////// // A ce niveau sont déclarées les librairies incluses, les constantes, les variables, les objets utiles... // --- Déclaration des constantes --- // --- Inclusion des librairies --- // --- Déclaration des constantes utiles --- // --- Déclaration des constantes des broches E/S numériques --- const int VITESSE_MOT1=3; // Constante pour la broche 3 const int AVANT_MOT1=4; // Constante pour la broche 4 const int ARRIERE_MOT1=5; // Constante pour la broche 5 // --- Déclaration des constantes des broches analogiques --- // --- Déclaration des variables globales --- int octetReception=0; // variable de stockage des valeurs reçues sur le port Série long nombreReception=0; // variable de stockage du nombre reçu sur le port Série long nombreReception0=0; // variable de stockage du dernier nombre reçu sur le port Série String chaineReception=""; // déclare un objet String vide pour reception chaine // --- Déclaration des objets utiles pour les fonctionnalités utilisées --- // ////////////////////////// 2. FONCTION SETUP = Code d'initialisation ////////////////////////// // La fonction setup() est exécutée en premier et 1 seule fois, au démarrage du programme void setup() { // debut de la fonction setup() // --- ici instructions à exécuter 1 seule fois au démarrage du programme --- // ------- Initialisation fonctionnalités utilisées ------- Serial.begin(115200); // initialise connexion série à 115200 bauds // IMPORTANT : régler le terminal côté PC avec la même valeur de transmission // ------- Broches en sorties numériques ------- pinMode (VITESSE_MOT1,OUTPUT); // Broche VITESSE_MOT1 configurée en sortie pinMode (AVANT_MOT1,OUTPUT); // Broche AVANT_MOT1 configurée en sortie pinMode (ARRIERE_MOT1,OUTPUT); // Broche ARRIERE_MOT1 configurée en sortie // ------- Broches en entrées numériques ------- // ------- Activation si besoin du rappel au + (pullup) des broches en entrées numériques ------- // ------- Initialisation des variables utilisées ------- // ------- Initialisation des broches utilisées ------- digitalWrite(VITESSE_MOT1,HIGH); // PWM haut = transparent à l'état des broches IN1/IN2 //---- +/- test des moteurs ---- //digitalWrite(AVANT_MOT1,HIGH), digitalWrite(ARRIERE_MOT1,LOW);; // Test marche avant //delay (1000); //digitalWrite(AVANT_MOT1,LOW), digitalWrite(ARRIERE_MOT1,HIGH);; // Test marche arriere //delay (1000); digitalWrite(AVANT_MOT1,LOW), digitalWrite(ARRIERE_MOT1,LOW);; // ARRET } // fin de la fonction setup() // ******************************************************************************** ////////////////////////////////// 3. FONCTION LOOP = Boucle sans fin = coeur du programme ////////////////// // la fonction loop() s'exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension void loop(){ // debut de la fonction loop() // --- ici instructions à exécuter par le programme principal --- //---- code type réception valeur sur le port série --- //--- réception valeur sur port Série par fonction dédiée --- if (Serial.available()==true) nombreReception=recevoirNombre(); // si caractères présents sur port Série appel de la fonction recevoirNombre if (nombreReception!=nombreReception0) { // si un nombre a été reçu nombreReception=constrain(nombreReception,-255,255); // oblige valeurs entre -255 et +255 Serial.print("Arduino a recu : "); Serial.println(nombreReception); nombreReception0=nombreReception; // RAZ nombreReception0 // gestion des moteurs en fonction de la valeur recue if (nombreReception>0) { // si nombre positif digitalWrite(AVANT_MOT1,HIGH), digitalWrite(ARRIERE_MOT1,LOW);; // Marche avant analogWrite(VITESSE_MOT1,nombreReception); // impulsion PWM vitesse } if (nombreReception==0) { // si nombre =0 digitalWrite(AVANT_MOT1,LOW), digitalWrite(ARRIERE_MOT1,LOW);; // Arret moteur digitalWrite(VITESSE_MOT1,LOW); // broche PWM au niveau bas = pas d'impulsion PWM } if (nombreReception<0) { // si nombre négatif digitalWrite(AVANT_MOT1,LOW), digitalWrite(ARRIERE_MOT1,HIGH);; // Marche arriere analogWrite(VITESSE_MOT1,abs(nombreReception)); // impulsion PWM vitesse - attention valeur positive } } // fin si nombreReception } // fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin // ******************************************************************************** // ////////////////////////// FONCTIONS DE GESTION DES INTERRUPTIONS //////////////////// // ////////////////////////// AUTRES FONCTIONS DU PROGRAMME //////////////////// //---- fonction de réception valeur entière sur le port série --- long recevoirNombre() { // fonction de reception d'un nombre sur le port série int octetRecu=0; // variable pour octet recu int compt=0; // variable locale comptage caractères reçus boolean signe=true; // variable locale signe nombre recu long nombreRecu=0; // variable locale nombre recu while (Serial.available()>0) { // tant qu'un octet en réception octetRecu=Serial.read(); // Lit le 1er octet reçu et le met dans la variable if (octetReception==10) { // si Octet reçu est le saut de ligne break; // sort de la boucle while } else { // si le caractère reçu n'est pas un saut de ligne if ((octetRecu=='-') && (compt==0))signe=false; // si Octet reçu est le - et si c'est le 1er caractère reçu - signe négatif compt=compt+1; // incrémente compt octetRecu=octetRecu-48; // transfo valeur ASCII en valeur décimale // calcul du nombre à partir des valeurs reçues if ((octetRecu>=0)&&(octetRecu<=9)) nombreRecu = (nombreRecu*10)+octetRecu; } // fin else if delay(1); // pause pour laisser le temps à la fonction available de recevoir octet suivant } // fin tant que octet réception //----- une fois que le saut de ligne est reçu, on sort du While et on se positionne ici if (signe==false) nombreRecu=nombreRecu*(-1); // prise en compte signe négatif return(nombreRecu); // renvoie le nombre calculé - type long } // fin fonction recevoirNombre // ////////////////////////// Fin du programme //////////////////// // ////////////////////////// Mémo instructions //////////////////// // ////////////////////////// Fin Mémo instructions //////////////////// |