// Sketch pour treuil modélisme valide pour ATtiny85 et 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


 
 
 int val1;                    //Valeur du signal recepteur
 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 moteur

 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 moteur
 int min;                     // variable pour la lecture de la valeur maxi nombre de tours moteur



#define LPWM                  0 // IN0  sur pin 0
#define RPWM                  1 // IN1 sur pin 1
#define signal                2 // Signal radio attaché au Pin 2
#define pot1                  3 // Potar asservissement attaché au Pin 3



 

 
void setup() 
{ 
  
   
  pinMode(signal, INPUT);    // Signal entrée 
  pinMode(pot1, INPUT);      // Potar asservissement entrée 
 
   
 
   }
 

void loop() 
{ 
 
  
 
  val3 = 440;                                 // Ici on défini le nombre de tours moteur, 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 moteur
  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 (val1 > (val2 + hyseteris))
  {
    // reverse rotation
    int reversePWM = 254 ;  // ordre de vitesse 
     
    analogWrite(LPWM, 0);
    analogWrite(RPWM, reversePWM);
     
  
  }
  else if (val1 < (val2 - hyseteris))
  {
    // forward rotation
    int forwardPWM = 254 ; // ordre de vitesse 
     
     
  
    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);
    
  
   
  }  


   
  
}