/*===============  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 x;                          // valeur à envoyer a ENABLE1 du L293D
int neutre = 1500;              // valeur du neutre
int plage_neutre = 50;          // 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
  digitalWrite(directionPin1, HIGH);   //  marche avant
  digitalWrite(directionPin2, LOW);   //  marche avant
  pinMode(directionPin1, OUTPUT);    // met le pin commande INPUT1 en sortie
  pinMode(directionPin2, OUTPUT);    // met le pin commande INPUT2 en sortie
    
}
//=========================================================================
void loop() 
{
    val = pulseIn(signal, HIGH);       //lit le signal récepteur et le stocke dans val
  if ( val > neutre - plage_neutre && val < neutre + plage_neutre )
  { 
    analogWrite(pinMoteur, 0);          // vitesse
    
    digitalWrite(directionPin1, LOW);    // marche avant
    digitalWrite(directionPin2, HIGH);    // marche avant
    }
  //..........................................................................  */  
  if ( val < neutre - plage_neutre && val > 50)
  { 
    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 )
  {
    int outputValue = map(val, (neutre + plage_neutre), 2000, 0, 255); //calibrage pour ENABLE1
    outputValue=constrain(outputValue, 0, 255);     
    digitalWrite(directionPin1, LOW);               // marche avant
    digitalWrite(directionPin2, HIGH);               // marche avant
    x=outputValue;
   vitesse();
  }
  //..........................................................................

}