// 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)
}
|