/*===============  Variateur pour petits moteurs   ===============================
Ce sketch utilise un ATtiny85 et un pont en H : L293D et pilote des moteurs ne consommant pas plus de 500mA.
Il est inspiré du sketch de Mr Alain CLAVERIE: http://bateaux.trucs.free.fr/variateurv1.html
Pour adapter ce programme à une autre radio il sera nécessaire d’ajuster le trim  ou  
de modifier la valeur du neutre dans le programme. 

 =========================================================================*/

const int pinMoteur = 0;        // connection a ENABLE1 du L293D
const int directionPin1 = 3;     // connection a la commande INPUT1 du L293D
const int directionPin2 = 4;     // connection a la commande INPUT2 du L293D
int signal = 2;                 // signal récepteur
int val;                        // valeur du signal récepteur
int mini = 1000;  // 
int maxi = 2000;  // 

int x = 0;                          // valeur à envoyer a ENABLE1 du L293D
int neutre = 1500;              // valeur du neutre, à définir selon votre radio
int plage_neutre = 30;          // plage du neutre, ne pas descendre en dessous de 20 par securité
//.........................................................................
void vitesse(){
  analogWrite( pinMoteur, x ); 
}
//=========================================================================
void setup() {
  pinMode(signal, INPUT);             // pin signal du récepteur en entrée
  pinMode(directionPin1, OUTPUT);    // met le pin commande INPUT1 en sortie
  pinMode(directionPin2, OUTPUT);    // met le pin commande INPUT2 en sortie

  analogWrite(pinMoteur, 0);      // initialise le moteur à l'arret au démarrage
  digitalWrite(directionPin1, LOW);   //  initialise le moteur à l'arret au démarrage
  digitalWrite(directionPin2, LOW);   //  initialise le moteur à l'arret au démarrage
  
}
//=========================================================================
void loop() 
{
    val = pulseIn(signal, HIGH), 30000; //Lire pulse1 et de le stocker en tant que val
    val = map(val, mini, maxi, 1000, 2000);
    val = constrain(val, 1000, 2000);
    
    if (val < 1000 || val > 2000){val = neutre;}       // Si le signal n'est pas correct alors le signal sera egale à la valeur du neutre.   
    if ( val > neutre - plage_neutre && val < neutre + plage_neutre ) // Si le signal est compris dans la plage de neutre
  { 
   
    analogWrite(pinMoteur, 0);          // vitesse = arret
    
    digitalWrite(directionPin1, LOW);    // arret
    digitalWrite(directionPin2, LOW);    // arret
   
   
    
    }
    

  //..........................................................................  */  
  if ( val < neutre - plage_neutre && val > 1000)
  { 
   
    digitalWrite(directionPin2, LOW);               // marche arriere
    digitalWrite(directionPin1, HIGH);               // marche arriere
   
    int outputValue = map(val, 1000, (neutre - plage_neutre), 255, 0); //calibrage pour ENABLE1
    outputValue=constrain(outputValue, 0, 255);     
    x=outputValue;
    
    vitesse();
  }
  //..........................................................................
  if ( val > neutre + plage_neutre && val < 2000)
  {
    
    digitalWrite(directionPin1, LOW);               // marche avant
    digitalWrite(directionPin2, HIGH);               // marche avant
    int outputValue = map(val, neutre, 2000, 0, 255); //calibrage pour ENABLE1
    outputValue=constrain(outputValue, 0, 255);     
    x=outputValue;
 
    vitesse();
  }
  //..........................................................................

}