Bonjour et meilleurs vœux à tous,
J'ai un système automatique de portail dont la carte électronique est HS.
J'ai entrepris de la refaire avec un arduino nano pour ouvrir et fermer une porte cochère en ajoutant un verrouillage porte fermée en haut et en bas et une surveillance du courant moteur pour arrêter indépendamment chaque moteur en cas de surcharge.
Au départ avec des ponts H mosfet, mais mon programme n'étant pas encore au point, j'ai cramé plusieurs transistors. Du coups, je suis passé à une commande par relais.
Je surveille le courant par une résistance en série avec chaque moteur de 0,1 ohm. Comme le courant maximal est de 8 ampère, on mesure au maximum 0.8 V aux bornes de ces résistances et donc aux entrées du nano. Pourtant j'ai cramé 2 entrées.
A4 cramé, j'ai déplacé en A7, grillée aussi.
J'ai pensé à l'extracourant de rupture aux bornes du contact du relais que je n'avait pas protégé.
Je pense donc ajouter une diode de roue-libre plus une diode à pointe aux bornes de l'entrée (j'en ai qui commencent à conduire à 0.8 V), comme sur le schéma que j'ai griffonné, qu'en pensez vous ? (original à gauche, modification à droite)
Pour éviter les "delay()" incompatibles avec la surveillance des moteurs, j'ai utilisé une librairie séquenceur pour ne pas m'embrouiller avec millis(), ça facilite énormément à mon niveau de débutant tardif...
L'état actuel du programme :
//*
Porte droite ne s'arrete pas
*/
//#include <LowPower.h>
#include <Servo.h>
#include "simpleBouton.h"
#include <ScheduleTable.h>
SchedTable<8> ouvrePorte(5500);
SchedTable<5> fermePorte(4500);
//SchedTable<3> fermePorte(500);
//SchedTable<2> fermedroite(1000);
SchedTable<2> Signal(15, 80);//2 actions dans table de 10 unités de 100 ms
SchedTable<2> batFaible(40, 50);//2 actions dans table de 20 unités de 100 ms
SchedTable<4> verrouBas(1600);
// pins
simpleBouton boutonF(2);//contact fermeture télécommande
simpleBouton bouton(3); //contact ouverture + bouton porte
const int pinPF = 4 ;//contact fin de course porte fermée
const int pinLED = 5;
const int pinAs = 6; //alim des servos
Servo servoB; // pin 7 servo haut inversion erreur
Servo servoH; // pin 8 servo bas
const int pinF2 = 9; // relais inverseur gauche
const int pinD = 10; // moteur D
const int pinF1 = 11; // inverseur moteur D
const int pinG = 12; // moteurG
const int pinPO = 13; // contact fdc porte ouverte
const int pinbat = A6 ; // contrôle batterie
const int pinI2 = A5 ; // courant moteur 2
const int pinI1 = A7 ; // courant moteur droit
// états
bool demarreD = false; // rotation moteur 1
bool demarreG = false; // rotation moteur 2
bool action = false; // au repos
bool clos = false; // fermé
bool ouvert;
bool verrou; // 1 en fin de fermeture 0 après verouillage
bool fermeture;
bool ouverture;
// variables
unsigned long chrono; // temps intermédiaire
int iD; //courant moteur droit (résistance 0.1 ohm)
int iG; // gauche
int In = 100; // 4 A ; maxi plus de 7 A; normal=0.8 A;
int niveauBat;
int Vbat;
int Vn = 590; // tension < 23v, déchargée ou moteurs bloqués
int Vdem = 500;// démarrage 19.4 V protection batterie basse
void setup() {
Serial.begin(9600);
pinMode(pinLED, OUTPUT);
pinMode(pinF2, OUTPUT);
pinMode(pinG, OUTPUT);
pinMode(pinF1, OUTPUT);
pinMode(pinD, OUTPUT);
pinMode(pinAs, OUTPUT);
pinMode(pinPF, INPUT_PULLUP);// contact porte fermée
pinMode(pinPO, INPUT_PULLUP);// contact porte ouverte
ouvrePorte.at(1, [] { ouverture = true; Signal.start(); servoB.attach(7); servoH.attach(8); } );
ouvrePorte.at(100, [] { servoH.write(0); } );
ouvrePorte.at(100, [] { servoB.write(0); } );
ouvrePorte.at(1200, [] { digitalWrite(pinD, HIGH); demarreD = true; } );
ouvrePorte.at(1500, [] { demarreD = false; servoH.write(170); } );
ouvrePorte.at(2500, [] { servoB.detach(); servoH.detach(); } );
ouvrePorte.at(5000, [] { digitalWrite(pinG, HIGH); demarreG = true; } ); //
ouvrePorte.at(5400, [] { demarreG = false; } );
fermePorte.at(1, [] { digitalWrite (pinF2, 1); digitalWrite (pinF1, 1);});
fermePorte.at(100, [] { demarreG = false; digitalWrite (pinG, 1);}); //démarre moteur gauche
fermePorte.at(400, [] { demarreG = true;});
fermePorte.at(4100, [] { demarreD = false; digitalWrite (pinD, 1);}); //démarre moteur droit
fermePorte.at(4400, [] { demarreD = true;});
/*
fermePorte.at(1, [] { fermeture = true; Signal.start(); digitalWrite (pinF2, 1); digitalWrite (pinF1, 1);});
fermePorte.at(100, [] { digitalWrite (pinG, HIGH); demarreG = true;}); //démarre moteur gauche
fermePorte.at(500, [] { demarreG = false;});
fermedroite.at(300, [] { digitalWrite(pinD, HIGH); demarreD = true;}); //démarre moteur droit
fermedroite.at(700, [] { demarreD = false;});
*/
Signal.at(5, [] { digitalWrite(6, HIGH); });// pinAS
Signal.at(6, [] { digitalWrite(6, LOW); });
batFaible.at(5, [] { digitalWrite(6, HIGH); });// pinLED
batFaible.at(6, [] { digitalWrite(6, LOW); });
verrouBas.at(1, [] { servoB.attach(7); });
verrouBas.at(100, [] { servoB.write(170);}); //démarre moteur gauche
verrouBas.at(1000, [] { servoB.detach(); fermeture = false; Signal.stop();});
}
void loop() {
ScheduleTable::update();
static bool armement = false;
bouton.actualiser();
boutonF.actualiser();// bouton fermeture
clos = digitalRead(pinPF);
ouvert = digitalRead(pinPO);
niveauBat = analogRead(pinbat); //
iG = analogRead(pinI2);
if (!demarreG && (iG > 105))//5 A
{
digitalWrite (pinG, 0);// arrêt moteur 1
digitalWrite (pinF2, 0);// inverseur 1
demarreG = false;
fermePorte.start(1);
}
iD = analogRead(A7);
if ((iD > 90) && !demarreD)//3.4 A
{
digitalWrite (pinD, 0);// arrêt moteur 1
digitalWrite (pinF1, 0);// inverseur 1
demarreD = false;
}
if (!demarreD || !demarreG)// Surintensitée hors démarrage moteur
{
if (niveauBat < 590)arret(); // < 23 v = batterie défectueuse
}
if (!action) // au repos
{
if (boutonF.vientDEtreEnfonce())
{
action = true;
fermePorte.start(1);//via la télécommande
}
if (bouton.vientDEtreEnfonce())
{
action = true;
ouvrePorte.start(1);//via la télécommande et bouton
}
if (!clos) //porte fermée, verrous fermés
{
// niveauBat = analogRead(pinbat); // vérifié porte fermée
// if (niveauBat < 590)batFaible.start();// < 23 v = batterie défectueuse
}
}//fin !action
else if (action)// portes en action
{
if (bouton.vientDEtreEnfonce() || boutonF.vientDEtreEnfonce())
{
action = false;// retour au repos
arret();// arret d'urgence
//LowPower.powerDown(SLEEP_120MS, ADC_OFF, BOD_OFF);
}
if (iG > 20)
{
Serial.print(" iG : "); Serial.print(iG); Serial.print(" iD : "); Serial.print(iD);
Serial.println();
}
if (!clos && fermeture) // verrouillage porte fermée
{
verrouBas.start(1);
}
if (ouverture && !ouvert)// arrêt porte gauche ouverte
{
Signal.stop();
ouverture = false;
}
}// fin action
} // end of loop
void arret() {
ouvrePorte.stop();
fermePorte.stop();
digitalWrite (pinD, 0);// moteur 1
digitalWrite (pinF1, 0);// inverseur 1
digitalWrite (pinG, 0);// moteur 2
digitalWrite (pinF2, 0);// inverseur 2
Signal.stop();
}// fin stop()