arret_urgence.ino
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 ...
}