// Sketch pour treuil modélisme valide pour Arduino Nano et module H-bridge IBT_4
// 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 IBT_4 (maximum 50 ampères)
// La recopie position se fait avec un potentiomètre multitours (10) de 10K.
// juste 2 sorties PWM pour piloter le pont en H
// Il faut positionner le potentiomètre en position milieu soit 5 Kohms (indiqué par la led) avant d'accoupler au moteur.
// Le nombre de tours possible pour le potentiomètre est limité à huit dans le sketch (val3) (à définir entre 60 et 440)
// La vitesse moteur est défini dans le sketch (val4) (à définir entre 0 et 254)
 
 
 int val1;                    // Valeur du signal récepteur
 int val2;                    // variable pour la lecture de la valeur analogique du potentiomètre asservissement
 int val3;                    // variable pour la valeur analogique du nombre de tours potentiomètre
 int val4 = 200;              // variable pour paramétré la vitesse moteur (à définir entre 0 et 254)

 int hyseteris = 15;          // 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 potentiomètre
 int min;                     // variable pour la lecture de la valeur mini nombre de tours potentiomètre



#define LPWM                  5 // IN1  sur pin 5
#define RPWM                  6 // IN2 sur pin 6
#define signal                2 // Signal radio attaché au Pin 2
#define pot1                 A0 // Potar asservissement attaché au Pin A0
#define led13                13 // Led indiquant que le potar est en position milieu = 5 Kohms


 

 
void setup() 
{ 

  
  pinMode(signal, INPUT);    // Signal entrée 
  pinMode(pot1, INPUT);      // Potentiomètre asservissement position moteur 
  pinMode(led13, OUTPUT);    // Led allumée quand potentiomètre calibré à 5 Kohms (position milieu)
  pinMode(RPWM, OUTPUT);
  pinMode(LPWM, OUTPUT);
   }
 

void loop() 
{ 
 
  
 
  val3 = 440;                                 // Ici on défini le nombre de tours potentiomètre, limiter la valeur entre 60 et 440 
  val3 = constrain(val3, 60, 440);
  max = (500 + val3);
  min = (500 - val3);
   
  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 potentiomètre
  val1 = constrain(val1,min, max);            // ici on limite le signal
  
   
  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);
 
  
   if ((val2 > 495) && (val2 < 505))
   {
   digitalWrite(led13, HIGH); 
      }
   else if ((val2 < 495) || (val2 > 505))
    {
   digitalWrite(led13, LOW); 
      }

  
 
 
   if (val1 > (val2 + hyseteris))
  {
    // reverse rotation
    int reversePWM = val4 ;  // ordre de vitesse   (à définir entre 0 et 254)
     
    analogWrite(LPWM, 0);
    analogWrite(RPWM, reversePWM);
     
  
  }
  else if (val1 < (val2 - hyseteris))
  {
    // forward rotation
    int forwardPWM = val4 ; // ordre de vitesse    (à définir entre 0 et 254)
     
     
  
    analogWrite(LPWM, forwardPWM);
    analogWrite(RPWM, 0);
      

   
  }  
    else if (val1 < (val2 + hyseteris) && val1 > (val2 - hyseteris))
  {
   
    int forwardPWM = 0; // stop
    int reversePWM = 0;  // stop 
     
  
    analogWrite(LPWM, forwardPWM);
    analogWrite(RPWM, reversePWM);
    
  
   
  }  

}