/* ======================= VARIATEUR SANS RELAIS ========================== CARASTERISTIQUES Marche avant marche arrière avec mémorisation du neutre A la première utilisation ou un changement de télécommande une initialisation est nécessaire. Cette opération n’est à faire qu’une fois si nous utilisons toujours la même radio. INITIALISATION Ne pas mettre le cavalier du récepteur en place (pin 3) Brancher le variateur au récepteur Allumer l’émetteur Mettre le manche et le trim au neutre Allumer le récepteur ( l’ATTiny mémorise le neutre, mais le variateur ne fonctionne pas encore) Mettre le cavalier en place (le variateur est maintenant en état de marche) Tant que le cavalier reste en place (sur le pin 3) le neutre reste en mémoire. BRANCHEMENT RPWM sur pin 0 LPWM sur pin 1 Récepteur sur pin 2 Cavalier sur pin 3 ============================================================================== */ #include // Appel de la librairie avr /eeprom #define MOY_SUR_2_VALEURS 1 #define MOY_SUR_4_VALEURS 2 #define MOY_SUR_8_VALEURS 3 #define MOY_SUR_16_VALEURS 4 #define MOY_SUR_32_VALEURS 5 #define TAUX_DE_MOYENNAGE MOY_SUR_16_VALEURS /* Choisir ici le taux de moyennage parmi les valeurs precedentes possibles listees ci-dessus */ /* Plus le taux est élevé, plus le système est stable (diminution de la gigue), mais moins il est réactif */ #define MOYENNE(Valeur_A_Moyenner,DerniereValeurRecue,TauxDeMoyEnPuissanceDeDeux) Valeur_A_Moyenner=(((Valeur_A_Moyenner)*((1<<(TauxDeMoyEnPuissanceDeDeux))-1)+(DerniereValeurRecue))/(1<<(TauxDeMoyEnPuissanceDeDeux))) #define M_AV 0 // RPWM sur pin 0 #define M_AR 1 // LPWM sur pin 1 #define signal 2 // Signal radio attaché au Pin 2 #define cavalier 3 // Cavalier attaché au Pin 3 int neutre; // Valeur du neutre int plage_neutre = 50; // Plage du neutre, ne pas descendre en dessous de 20 par securité int val; // Valeur du signal récepteur //========================================================================= void setup() { pinMode(cavalier, INPUT); // Déclare le pin "detecteur" en entrée digitalWrite(cavalier, HIGH); // Activation du pull-up interne //========================================================================= if (digitalRead(cavalier)) { delay(1000); neutre= pulseIn(signal, HIGH); // supprimer (digitalWrite(led, HIGH);) eeprom_write_word(0,neutre); // Sauvegarde Valeur dans l’eeprom à l’adresse 0 } neutre = eeprom_read_word(0); // Recupere le neutre mis en memoire } //========================================================================= void loop() { static int ValMoyennee; val = pulseIn(signal, HIGH); //lit le signal récepteur et le stocke dans val ValMoyennee=MOYENNE(ValMoyennee,val,TAUX_DE_MOYENNAGE); val = ValMoyennee; if (digitalRead(cavalier)) { val= neutre; } //.............................. ARRET ............................................ if ( val > neutre - plage_neutre && val < neutre + plage_neutre ) { analogWrite(M_AV, 0); // Vitesse avant= 0 analogWrite(M_AR, 0); // Vitesse arriere= 0 delay(20); } //............................ MARCHE AR.............................................. if ( val < neutre - plage_neutre && val > 50) { analogWrite(M_AR, 0); analogWrite(M_AV, 0); // vitesse avant= 0 int Vitesse = map(val, (neutre-350), (neutre - plage_neutre), 254, 0); //calibrage pour le transistor Vitesse=constrain(Vitesse, 0, 254); analogWrite(M_AR, Vitesse); // vitesse arriere=x } //............................ MARCHE AV.............................................. if ( val > neutre + plage_neutre ) { analogWrite(M_AR, 0); // vitesse arriere= 0 analogWrite(M_AV, 0); int Vitesse = map(val, (neutre + plage_neutre), (neutre+350), 0, 254); //calibrage pour le transistor Vitesse=constrain(Vitesse, 0, 254); analogWrite(M_AV, Vitesse); // vitesse avant=x } } //========================== FIN DE PROGRAMME ============================================