//***********************************************************************************************//
// Programme pour Arduino NANO
// Controle des aiguillages avec un L298N
// Un bouton poussoir est branché avec PULLUP sur le broche 2
// Deux LEDS sont montées tête-bêche sur le Pin 12 pour signaler le sens de passage
// La variable boutStae permet de connaitre l'état près appui
// la librairie Bounce2 permet d'élimoiner les rebonds
// Programme écrit par Denis le 23/10.2025 en utilsant tempo
//***********************************************************************************************//
// LIBRAIRIES
// DECLARATION
// Deux Boutons Poussoirs
#define PIN_BP2 2
#define PIN_BP6 6
// LEDS SIGNALISATION DIRECTE ET TOURNE
#define signalisationA 12
#define signalisationB 10
#define signalisationABarre 11
#define signalisationBBarre 9
// Moteur A aiguille coté extérieur
// le jumper EN1 est en place sur le carter L298N
#define in1 8
#define in2 7
// Moteur B aiguille coté intérieur
// le jumper EN2 est en place sur le carter L298N
#define in3 5
#define in4 4
// Anti Rebond
#define DELAI_SANS_REBOND 100000
const char Titre [] = "CMDE_Double_Aiguille_KATO_debounce_et_tempo";
const char Version[] = "5";
const char derModif[] = "25/10/2025";
// paramètres <outils.h>
const int nb_tempo = 5 ; // nombre de tempos utilisées + 1
const int nb_FM =1 ; // nombre de FM utilisé + 1
const int nb_visu = 6 ; // nombre de visu utilisées + 1
void setup() {
pinMode (PIN_BP2, INPUT_PULLUP);
pinMode (PIN_BP6, INPUT_PULLUP);
pinMode(signalisationA, OUTPUT);
pinMode(signalisationB, OUTPUT);
pinMode(signalisationABarre, OUTPUT);
pinMode(signalisationBBarre, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
// INITIALISATION DES LEDS en postion DIRECTE
digitalWrite(signalisationA, LOW);
digitalWrite(signalisationB, HIGH);
digitalWrite(signalisationABarre, HIGH);
digitalWrite(signalisationBBarre, LOW);
}
void loop() {
// Enumeration des &tats possibles pour chaque bouton poussoir BP2 et BP6
enum ModeEtat2 {ETAT2_OFF1,ETAT2_DIRECT,ETAT2_OFF2,ETAT2_TOURNE};
static ModeEtat2 etatAiguille2 = ETAT2_OFF1;
static ModeEtat2 etatSuivantAiguille2 = ETAT2_OFF1 ;
enum ModeEtat6 {ETAT6_OFF1,ETAT6_DIRECT,ETAT6_OFF2,ETAT6_TOURNE};
static ModeEtat6 etatAiguille6 = ETAT6_OFF1;
static ModeEtat6 etatSuivantAiguille6 = ETAT6_OFF1 ;
// Prise ecmpte de l'état suivant
// LECTURE DES ENTREES
static uint8_t dernierBP2 = HIGH ;
static unsigned long derniereTransition2 = 0;
unsigned long _micros2 ;
uint8_t BP2 = digitalRead (PIN_BP2);
etatAiguille2 = etatSuivantAiguille2 ;
/// CALCUL DES SORTIES
switch (etatAiguille2) {
case ETAT2_OFF1:
digitalWrite(signalisationA, LOW);
digitalWrite(signalisationABarre, HIGH);
digitalWrite(in1, LOW) ;
digitalWrite(in2, LOW) ;
break;
case ETAT2_DIRECT:
impulsion2_DIRECT();
break;
case ETAT2_OFF2:
digitalWrite(signalisationA, HIGH);
digitalWrite(signalisationABarre, LOW);
digitalWrite(in1, LOW) ;
digitalWrite(in2, LOW) ;
break;
case ETAT2_TOURNE:
impulsion2_TOURNE();
break;
}
/// CALCUL DE L'ETAT SUIVANT
switch (etatAiguille2) {
case ETAT2_OFF1:
if (dernierBP2 !=BP2){
_micros2 = micros();
if ((_micros2-derniereTransition2 ) >= DELAI_SANS_REBOND ) {
// présence d'un front descendant
if (BP2 == LOW) {
etatSuivantAiguille2 = ETAT2_DIRECT;
}
}
}
break;
case ETAT2_DIRECT:
etatSuivantAiguille2 = ETAT2_OFF2;
break;
case ETAT2_OFF2:
if (dernierBP2 !=BP2){
_micros2 = micros();
if ((_micros2-derniereTransition2 ) >= DELAI_SANS_REBOND ) {
// présence d'un front descendant
if (BP2 == LOW) {
etatSuivantAiguille2 = ETAT2_TOURNE;
}
}
}
break;
case ETAT2_TOURNE:
etatSuivantAiguille2 = ETAT2_OFF1;
break;
derniereTransition2 = _micros2;
dernierBP2 = BP2 ;
delay (500);
}
}
void impulsion2_DIRECT(){
digitalWrite(in1, HIGH) ;
digitalWrite(in2, LOW) ;
delay(10);
digitalWrite(in1, LOW) ;
digitalWrite(in2, LOW) ;
delay(100);
}
void impulsion2_TOURNE(){
digitalWrite(in1, LOW) ;
digitalWrite(in2, HIGH) ;
delay(10);
digitalWrite(in1, LOW) ;
digitalWrite(in2, LOW) ;
delay(100);
}