Je voulais ajouter un bouton poussoir qui permette d’arrêter instantanément la locomotive en cours de pilotage avec la télécommande sans avoir besoin de remettre le potentiomètre au neutre ceci en cas d’urgence sur le réseau.

Cet arrêt d’urgence n’est valable que pour la loco en cours de commande est n’est pas un arrêt global de toutes les locos sur le réseau.

J’ai donc utilisé un bouton poussoir avec un condensateur et une résistance en pull down

Voici comment j’ai programmé cet arrêt d’urgence. Ce sont des extraits de mon code globale. Le code global sera disponible dans un prochain article quand j’aurais expliqué l’ensemble des fonctionnalités dans des articles différents

Code de la télécommande :

Dans la partie définition des variables avant le void setup() j’ai défini 3 variables de type integer:

int bpAru = 0;      // variable pour le bouton d'arret d'urgence
int bpAruMem = 0;   // variable pour la memoire du bouton arret d'urgence
int ARU = 0;        // variable pour l'etat de l'arret d'urgence à transmettre

Dans le void setup() j’ai défini la broche 9 de l’arduino Mega2560 comme entrée pour le bouton d’arrêt d’urgence:

 pinMode(9, INPUT);   // pin pour le bouton d'arret d'urgence

J’ai ensuite créé une fonction qui est appelée dans la boucle principale void loop()

  ArretUrgence();  // verification de l'arret d'urgence

Voici le code de cette fonction commenté :

// ************** Fonction Arret d'Urgence *************************************

void ArretUrgence() {
  bpAru = digitalRead(9);  // on lit l'etat du bouton en D9

  if (bpAru != bpAruMem)  // si l'etat actuel du bouton poussoir est different de l'etat precedent
  {
    bpAruMem = bpAru;  // on memorise le nouvel etat dans la memoire
    if (bpAru == 1)    // si ce nouvel etat est passe a 1,on a donc un front montant
    {
      ARU = !ARU;  // on change l'etat de la variable arret d'urgence
    }
  }

  if (ARU == 1)  // si arret d'urgence ON
  {
    Serial.println("Etat arret urgence : ON");
    lcd.setCursor(16, 3);
    lcd.print("STOP");
  } else {
    Serial.println("Etat arret urgence : OFF");
    lcd.setCursor(16, 3);
    lcd.print("    ");
  }
}

Les Serial print me servent à voir si l’appui sur le bouton poussoir est bien pris en compte par la télécommande.

La valeur de la variable ARU est ensuite envoyée au récepteur par la transmission radio et ce dernier arrête la locomotive.

Voici la partie de code concernée pour le récepteur :

Définition de la variable ARU avant le setup :

int ARU = 0; // variable arret d urence

Dans le void setup() sont défini les pin de sorties pour le pilotage du L298N

void setup()
{
    pinMode(4, OUTPUT); // pin 4 sortie pour in1 
    pinMode(3, OUTPUT); // pin 3 sortie pour in2
    pinMode(5, OUTPUT); // pin 5 sortie ENA PWM moteur

Dans la boucle principale void loop()

void loop()
{
    while (_radio.hasData()) // Attente de réception d'un caractère
    {
        _radio.readData(&_radioData); // lecture variable radioData comprenant la structure des 2 variables POT_Value et ARU 

        ARU = _radioData.ARU; // recuperation des variables dans la structure recue dans la variable radioData
        POT_Value = _radioData.POT_Value;

        if(ARU == 1) // Si arret d urgence
        {
          digitalWrite(in1, LOW); // frein en coupant l'alimentation
          digitalWrite(in2, LOW);
          Serial.println("Etat arret urgence : ON");
        }

// ****  si pas d'arret d'urgence on pilote le moteur ****

Après avoir récupéré les données par radio, si la variable ARU est à 1 alors on stop le moteur en mettant à LOW les 2 entrées in1 et in2 sur le L298N ce qui a pour effet de couper l’alimentation du moteur. Ainsi ce dernier ne “grogne” pas. Si j’avais mis les 2 broche in1 et in2 à High cela aurait fait un frein plus important avec je suppose un risque de casse des pignons.

Le code se poursuit ensuite sur le pilotage du moteur Avant/Arrière comme déjà décrit dans un précédent article.