Bonjour bonjour,
Cela fait quelques semaines que je bosse sur la motorisation de mes deux volets roulants.
Le code marche, mais au bout de quelques aller-retour, cela tue 2 des 4 relais utilisés, et cela systématiquement ...
Je me demande bien d'où peut venir le problème...
J'explique mon code : un bouton sur la télécommande infrarouge permet d'inverser l'état des volet, donc les fermer s'il sont montés et inversement.
J'ai aussi pour chaque volet : un bouton permettant de le decendre, un pour le monter et un pour le stopper.
Les moteurs sont des moteurs tubulaires courts de diametre 35mm filaire de 10Nm. (Avosdim)
Le fonctionnement des relais :
Lorsque que l'on envoie une commande "HIGH", cela les désactive et le courant ne passe pas.
J'ai donc pour chaque volet, un relais qui permet de l'alimenter ou non ( fonctionne comme un interrupteur ) , et un relais qui permet de chosir entre la direction Haute ou la direction Basse.
Le volet obeit a mes injonctions quelques aller-retour puis tue systématiquement les relais qui controlent la direction. ( fils en rouge sur la photo plus bas)
J'ai pas pu faire asser de test pour préciser davantage, j'avais 8 relais, il ne m'en reste plus que 2, impossible pour l'instant de refaire fontionner mon système ...
Voici les relais utilisés :
http://www.ebay.fr/itm/5V-4-Channel-Relay-Shield-Module-optocoupler-For-PIC-AVR-DSP-ARM-Arduino-TE180-/262072607142?hash=item3d04bea1a6
Ce sont des relais "SRD-05VDC-SL-C"
Il peuvent théoriquement sortir 10A ce qui devrait être suffisant pour des moteurs de Volets.
Je précise que j'alimente les Vin avec le 5 V de l'arduino nano, et les In1 , In2 , ... avec les Pin digitales.
Le fait de ne pas utiliser d'alimentation externe pourrait griller les relais ?
Voici le code utilisé :
#include <IRremoteInt.h>
#include <IRremote.h>
//TEMPS
#define TEMPSMONTEEG 30000
#define TEMPSDESCENTEG 30000
#define TEMPSMONTEED 30000
#define TEMPSDESCENTED 30000
//PIN
int IR_PIN = 10;
IRrecv irrecv(IR_PIN);
int ALIMMOTG_PIN = 2;
int DIRMOTG_PIN = 3;
int ALIMMOTD_PIN = 4;
int DIRMOTD_PIN = 5;
//VARIABLES
int etatMotG = 0; // bas
int etatMotD = 0; // bas
int dirMotG = 0; // haut
int dirMotD = 0; // haut
unsigned long timeSavedG = 0;
unsigned long timeSavedD = 0;
decode_results results;
void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
pinMode(ALIMMOTG_PIN, OUTPUT);
pinMode(DIRMOTG_PIN, OUTPUT);
pinMode(ALIMMOTD_PIN, OUTPUT);
pinMode(DIRMOTD_PIN, OUTPUT);
digitalWrite(ALIMMOTG_PIN, HIGH);
digitalWrite(DIRMOTG_PIN, HIGH);
digitalWrite(ALIMMOTD_PIN, HIGH);
digitalWrite(DIRMOTD_PIN, HIGH);
}
void loop()
{
if(etatMotG == 1 && dirMotG == 0 && ((millis() - timeSavedG) > TEMPSMONTEEG)) //Volet Gauche en transition et direction vers le haut
{
etatMotG = 2; // Volet gauche en haut
digitalWrite(ALIMMOTG_PIN, HIGH);
digitalWrite(DIRMOTG_PIN, HIGH);
}
if(etatMotG == 1 && dirMotG == 1 && ((millis() - timeSavedG) > TEMPSDESCENTEG))//Volet Gauche en transition et direction vers le bas
{
etatMotG = 0; // Volet gauche en bas
digitalWrite(ALIMMOTG_PIN, HIGH);
digitalWrite(DIRMOTG_PIN, HIGH);
}
if(etatMotD == 1 && dirMotD == 0 && ((millis() - timeSavedD) > TEMPSMONTEED))//Volet Droit en transition et direction vers le haut
{
etatMotD = 2; // Volet droit en haut
digitalWrite(ALIMMOTD_PIN, HIGH);
digitalWrite(DIRMOTD_PIN, HIGH);
}
if(etatMotD == 1 && dirMotD == 1 && ((millis() - timeSavedD) > TEMPSDESCENTED))//Volet Droit en transition et direction vers le bas
{
etatMotD = 0; // Volet droit en bas
digitalWrite(ALIMMOTD_PIN, HIGH);
digitalWrite(DIRMOTD_PIN, HIGH);
}
if (irrecv.decode(&results))
{
Serial.println(results.value);
switch (results.value) {
case 2060 : //Bouton inverser tous les volets.
case 12 :
if (etatMotG == 0) //Si volet gauche en bas
{
etatMotG = 1;
digitalWrite(DIRMOTG_PIN, LOW);
dirMotG = 0;
delay(100);
timeSavedG = millis();
digitalWrite(ALIMMOTG_PIN, LOW);
delay(50);
}
if (etatMotG == 2) //Si volet gauche en haut
{
etatMotG = 1;
digitalWrite(DIRMOTG_PIN, HIGH);
dirMotG = 1;
delay(100);
timeSavedG = millis();
digitalWrite(ALIMMOTG_PIN, LOW);
delay(50);
}
if (etatMotD == 0) //Si volet droit en bas
{
etatMotD = 1;
digitalWrite(DIRMOTD_PIN, LOW);
dirMotD = 0;
delay(100);
timeSavedD = millis();
digitalWrite(ALIMMOTD_PIN, LOW);
delay(50);
}
if (etatMotD == 2) //Si volet droit en haut
{
etatMotD = 1;
digitalWrite(DIRMOTD_PIN, HIGH);
dirMotD = 1;
delay(100);
timeSavedD = millis();
digitalWrite(ALIMMOTD_PIN, LOW);
delay(50);
}
break;
case 2080 : //Bouton montée moteur gauche
case 32 :
if (etatMotG == 0 || etatMotG == 1) // Si Volet gauche en bas ou en transition
{
etatMotG = 1;
digitalWrite(DIRMOTG_PIN, LOW);
dirMotG = 0;
delay(100);
timeSavedG = millis();
digitalWrite(ALIMMOTG_PIN, LOW);
delay(50);
}
break;
case 2081 : //Bouton descente moteur gauche
case 33 :
if (etatMotG == 2 || etatMotG == 1) // Si Volet gauche en haut ou en transition
{
etatMotG = 1;
digitalWrite(DIRMOTG_PIN, HIGH);
dirMotG = 1;
delay(100);
timeSavedG = millis();
digitalWrite(ALIMMOTG_PIN, LOW);
delay(50);
}
break;
case 2061 : //Bouton STOP moteur gauche
case 13 :
digitalWrite(ALIMMOTG_PIN, HIGH);
digitalWrite(DIRMOTG_PIN, HIGH);
break;
case 2065 : //Bouton Montée moteur droit
case 17 :
if (etatMotD == 0 || etatMotD == 1) // Si Volet droit en bas ou en transition
{
etatMotD = 1;
digitalWrite(DIRMOTD_PIN, LOW);
dirMotD = 0;
delay(100);
timeSavedD = millis();
digitalWrite(ALIMMOTD_PIN, LOW);
delay(50);
}
break;
case 2064 : //Bouton Descente moteur droit
case 16 :
if (etatMotD == 2 || etatMotD == 1) // Si Volet droit en haut ou en transition
{
etatMotD = 1;
digitalWrite(DIRMOTD_PIN, HIGH);
dirMotD = 1;
delay(100);
timeSavedD = millis();
digitalWrite(ALIMMOTD_PIN, LOW);
delay(50);
}
break;
case 2059 : //Bouton STOP moteur droit
case 11 :
digitalWrite(ALIMMOTD_PIN, HIGH);
digitalWrite(DIRMOTD_PIN, HIGH);
break;
}
irrecv.resume(); // Receive the next value
}
delay(50);
}
J'ai vraiment besoin d'aide, j'en ai marre d'être dans le noir ... ^^
Merci d'avance.
Quentin