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