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