/*=============== 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(); } //.......................................................................... } |