arret_urgence.ino

Arduino Opta (micro automate, STM32H747) · Fichier : arret_urgence.ino · Langage : Arduino · Usage : Gérer un arrêt d'urgence avec mémorisation et réarmement

La base de la sécurité machine : un contact à fermeture négatif (NF) sur IN1 coupe les relais dès que la boucle s'ouvre, l'état se mémorise et rien ne redémarre sans réarmement manuel sur IN2. Le fil de garde est surveillé en permanence.

Matériel requis

Une Opta PLC STMicroelectronics (STM32H747 temps réel + coprocesseur sécurisé i.MX RT1052) programmée avec l'environnement Arduino PLC, alimentée en 24 V DIN. Bouton coup de poing NF câblé en boucle de sécurité sur IN1, bouton à éjecteur RAZ sur IN2.

Câblage

Boucle AU : 24 V → bouton NF → IN1 ; les deux boutons se suivent en série. 0 V sur COM. Vérifier la continuité de boucle avant mise en service.

Fonctionnement

La boucle saine maintient IN1 à 1 ; toute ouverture (appui, fil coupé) déclenche la coupure totale mémorisée. Le réarmement exige boucle refaite + appui RAZ.

Exécution

Installez le gestionnaire de cartes Arduino PLC, sélectionnez « Opta PLC », câblez en USB/DFU puis téléversez. Le programme tourne sur le STM32H747 côté temps réel.

Variantes

Ajouter un contact auxiliaire de contrôle d'arc sur les relais (détection collage), ou journaliser les événements AU en EEPROM/SD.

arret_urgence.ino

// Opta PLC : arrêt d'urgence sur contact NF (IN1), mémorisé, réarmement manuel.
// Règle : contact NF actif = 24 V présent ; perte du 24 V = défaut = arrêt.
#include "PLCContainer.h"

PLCContainer PLC;

bool defautAU = false;        // état mémorisé de l'arrêt d'urgence
unsigned long tNF = 0;        // anti-rebond du contact NF
bool nfStable = true;

void setup() {
  Serial.begin(115200);
  PLC.begin();
  PLC.DigitalIn.setMode(OPTA_IN_1, PLCDigitalIn::PULL_UP);  // boucle AU
  PLC.DigitalIn.setMode(OPTA_IN_2, PLCDigitalIn::PULL_UP);  // réarmement
  Serial.println("Arret d'urgence actif (NF sur IN1, RAZ sur IN2)");
}

void coupure_totale() {
  PLC.Relay[0].off();
  PLC.Relay[1].off();
  defautAU = true;
  PLC.LedRgb.set(255, 0, 0);          // rouge = AU mémorisé
  Serial.println(">>> ARRET D'URGENCE — tout est coupé");
}

void loop() {
  bool nf = PLC.DigitalIn.read(OPTA_IN_1);   // true = boucle saine
  if (nf != nfStable && millis() - tNF > 50) { nfStable = nf; tNF = millis(); }

  if (!nfStable) coupure_totale();           // boucle ouverte -> coupure

  if (defautAU) {
    // Réarmement : boucle refaite ET bouton RAZ enfoncé (IN2, actif à 0)
    if (nfStable && !PLC.DigitalIn.read(OPTA_IN_2)) {
      defautAU = false;
      PLC.LedRgb.set(0, 255, 0);
      Serial.println("RAZ effectuee : redemarrage machine autorise");
    }
    return;                                  // verrou : rien ne redémarre seul
  }
  PLC.LedRgb.set(0, 0, 255);                 // bleu = machine armée
  // ... ici la logique machine normale, avec relais commandés par cycle ...
}

← Retour à la fiche