/*=================Sketch pour sous-marin compilant un interrupteur bistable à aimant et un fail-safe pour un ATtiny85 ======================== /*=================La fonction interrupteur reed bistable ATtiny85 ======================== Un interrupteur reed ils (magnétique) est cablé sur la Pin2 ainsi qu'une résistance de 10k (voir schéma). Un relais est cablé sur le Pin3 . Une présentation d'un aimant près de l'ils fait coller le relais (mise sous tension circuit RC) qui reste allumée en éloignant l'aimant. Une deuxième présentation de l'aimant fait retomber le relais. ================================================================================================*/ /*==============================La fonction FAIL-SAFE ==================================================== Permet en cas de coupure du signal radio de mettre le servo dans une position définie par l’utilisateur. La voie du récepteur concernée est relié au (pin 0). La valeur de réglage de la position de secours est valp, à définir selon vos besoin. Le servo au (pin 1). Une LED est cablée sur le pin 4, Led fixe= circuit RC sous tension, LED clignotante= perte de signal RC (fail-safe). le sketch d'origine est sur le site de Mr Alain CLLAVERIE : http://bateaux.trucs.free.fr/fail_safe.html ==============================================================================================*/ #include <SoftwareServo.h> // Appel de la librairie servo SoftwareServo monservo; // Déclare le servo monservo #define signal 0 // Déclare la variable ( signal ) int val = 0; // Déclare la variable (val) int valp = 2000; // Déclare la variable (valp) à modifier suivant la position désirée du servo en cas de perte de signal(entre 1000 et 2000). int neutre = 1500; // valeur du neutre à modifier suivant la radio utilisée int relpin3=3; // Relais int ledpin4 =4; // Led int inter=2; // interrupteur reed int etat=1; int mem=0; //============================================================================================ void setup(){ pinMode(relpin3,OUTPUT); pinMode(ledpin4,OUTPUT); pinMode(inter,INPUT); pinMode(signal, INPUT); // Déclare la variable (signal)en entrée monservo.attach(1); // Attache le servo (monservo) au pin 1 } //============================================================================================ void loop(){ noInterrupts(); //Désactive les interruptions val = pulseIn(signal, HIGH,30000); // Donne à la variable (val) la valeur de (signal) lue sur le pin4 interrupts(); //Réactive les interruptions int val1=digitalRead(inter); if((val1==HIGH) && (mem==LOW)){etat= 1 - etat; } mem=val1; if(etat==0){ digitalWrite(relpin3,HIGH); } else {digitalWrite(relpin3,LOW); } if(etat==0){ digitalWrite(ledpin4,HIGH); } else {digitalWrite(ledpin4,LOW); } if ((val < 10)&&(etat==0)){val = valp;} // Si le signal est inferieur à 10 alors le signal sera egale à la valeur de valp. val = map(val, neutre-500, neutre+450, 45, 135); val=constrain(val, 45, 135); // Calibre des valeurs de (val) pour le servo sur 90° if (etat==0) monservo.write(val); // Positionne le servo delay(15); // delai pour positionner le servo if(relpin3 == LOW && (val < 10)){ digitalWrite(ledpin4,HIGH); } else {digitalWrite(ledpin4,LOW); } if(relpin3 == LOW && (val < 10)){ digitalWrite(ledpin4,LOW); } SoftwareServo::refresh(); // Rafraîchissement bibliothèque servo } |