// controle moteur DC avec valeur cible fixé par un signal rc et lecture sur un potentiometre de la position // Ce sketch pilote un pont en H L298N (maximum 2 ampères) // Avec potentiomètre (10K) pour définir le nombre de tours moteur // Et potentiomètre (10k) pour définir la vitesse du moteur // Sketch valide pour Arduino UNO et NANO // Pour la mise au point choisir une petite vitesse à cause du temps de lecture moniteur série agissant sur le programme // Après mise au point supprimer les lignes concernant l'affichage moniteur série int signal = 4; // Signal recepteur int val1; //Valeur du signal recepteur int pot1 = A1; //pin analogique A1 pour le potentiometre asservissement int pot2 = A2; //pin analogique A2 pour le potentiometre nombre de tours moteur int pot3 = A3; //pin analogique A3 pour le potentiometre vitesse moteur int val2; // variable pour la lecture de la valeur analogique du potentiomètre asservissement int val3; // variable pour la lecture de la valeur analogique du potentiomètre nombre de tours moteur int val4; // variable pour la lecture de la valeur analogique de la vitesse moteur int hyseteris = 20; // 10 stoppe déjà les tremblement moteur mais dépend de l'ordre de vitesse int max; // variable pour la lecture de la valeur maxi nombre de tours moteur int min; // variable pour la lecture de la valeur maxi nombre de tours moteur int dir1PinA = 2; int dir2PinA = 3; int speedPinA = 9; // PWM pour le L298N void setup() { Serial.begin(9600); // Vitesse de transmission pour le moniteur série (ligne à supprimer après mise au point) pinMode(signal, INPUT); // Signal entrée pinMode(pot1, INPUT); // Potar asservissement entrée pinMode(pot2, INPUT); // Potar nombre de tours moteur entrée pinMode(pot3, INPUT); // Potar vitesse moteur entrée pinMode(dir1PinA,OUTPUT); pinMode(dir2PinA,OUTPUT); pinMode(speedPinA,OUTPUT); } void loop() { val4 = analogRead(pot3); // lis la valeur du potentiometre pour définir la vitesse du moteur entre 0 et 1023 val4 = map(val4, 1, 1023, 50, 255); // limite la valeur entre 100 et 255 val4 = constrain(val4, 50, 255); Serial.print("Valeur potar vitesse = "); // Ecrit sur l’écran "Valeur potar vitesse= " (ligne à supprimer après mise au point) Serial.println(val4); // Ecrit sur l’écran le contenu de val4 (ligne à supprimer après mise au point) delay (100); // Attente pour affichage (ligne à supprimer après mise au point) val3 = analogRead(pot2); // lis la valeur du potentiometre pour définir le nombre de tours moteur entre 0 et 1023 val3 = map(val3, 1, 1023, 60, 440); // limite la valeur entre 60 et 440 val3 = constrain(val3, 60, 440); max = (500 + val3); min = (500 - val3); Serial.print("Valeur potar tours moteur = "); // Ecrit sur l’écran "Valeur potar tour moteur= " (ligne à supprimer après mise au point) Serial.println(val3); // Ecrit sur l’écran le contenu de val3 (ligne à supprimer après mise au point) delay (100); // Attente pour affichage (ligne à supprimer après mise au point) val1 = pulseIn(signal, HIGH); //Alors stocker la valeur du signal dans Val1 val1 = map(val1, 1000, 2000, min, max); // min et max définnissent le nombre de tours moteur val1 = constrain(val1,min, max); // ici on limite le signal Serial.print("Valeur signal = "); // Ecrit sur l’écran "Valeur signal= " (ligne à supprimer après mise au point) Serial.println(val1); // Ecrit sur l’écran le contenu de Val1 (ligne à supprimer après mise au point) delay (100); // Attente pour affichage (ligne à supprimer après mise au point) val2 = analogRead(pot1); // lis la valeur du potentiometre d'asservissement entre 0 et 1023 val2 = map(val2, 1, 1023, 1, 1023); val2 = constrain(val2, 1, 1023); Serial.print("Valeur potar asservissement = "); // Ecrit sur l’écran "Valeur potar asservissement= " (ligne à supprimer après mise au point) Serial.println(val2); // Ecrit sur l’écran le contenu de val2 (ligne à supprimer après mise au point) delay (100); // Attente pour affichage (ligne à supprimer après mise au point) if (val1 > (val2 + hyseteris)) { // reverse rotation analogWrite(speedPinA, val4); digitalWrite(dir1PinA, HIGH); digitalWrite(dir2PinA, LOW); } else if (val1 < (val2 - hyseteris)) { // forward rotation analogWrite(speedPinA, val4); digitalWrite(dir1PinA, LOW); digitalWrite(dir2PinA, HIGH); } else if (val1 < (val2 + hyseteris) && val1 > (val2 - hyseteris)) { // stop rotation analogWrite(speedPinA, 0); digitalWrite(dir1PinA, LOW); digitalWrite(dir2PinA, HIGH); } delay (100); // Attente pour affichage (ligne à supprimer après mise au point) } |