Arduino Nano + Relais 4 canaux : Pilotage stores et moteurs AC
Composants et fournitures
| Composant | Quantité | Notes |
|---|---|---|
| Arduino Nano R3 | 1 | |
| Contrôleur 4 canaux relais I2C (ControlEverything.com) | 1 | |
| Carte 4 canaux relais état solide (SSR) | 1 | |
| Moteur de store | td>1Jusqu'à 4 moteurs par Arduino | |
| Condensateur 100 nF 630 V | 1 par moteur | |
| Résistance 100 Ω (0,5 W min) | 1 par moteur | Pas de résistance de précision (bleues) ! |
| Varistance 275 VAC | 1 par moteur | |
| Diode (signal ou puissance) | 3 par store | |
| Raspberry Pi 3 Model B (optionnel) | 1 | Pour contrôle à distance |
| Module nRF24L01+ (optionnel) | 2 | Pour contrôle à distance |
Outils nécessaires
- Fer à souder
Applications et services en ligne
- Arduino IDE
- Domoticz (optionnel, pour contrôle à distance)
À propos de ce projet
Introduction
Nouvelle maison, envie d'automatiser les stores. Ce qui semblait simple est devenu un cauchemar : les moteurs puissants (150 W) détruisaient mes relais et triacs, le choix de la communication sans fil et du contrôleur n'était pas évident, des parasites sur les lignes provoquaient des activations aléatoires (flippant la nuit...). J'ai fini par tout résoudre avec des composants très peu chers. J'espère vous épargner ces maux de tête et beaucoup de temps.
Vous n'aimez pas programmer mais vous soudez ? Lisez quand même le tutoriel : à la fin, vous trouverez un circuit discret qui fait la même chose, sans intelligence.
Explication technique
Le problème principal avec les moteurs est leur inductance : à l'ouverture du circuit, le courant tente de continuer à circuler, créant une surtension importante. Avec un petit relais, les contacts se soudent (collent). Avec un triac (relais statique), la surtension (j'ai mesuré des pics > 1600 V) détruit le semiconducteur.
Beaucoup contournent en prenant de gros relais (chers, volumineux), nécessitant encore les petits relais pour les commander, avec contacts qui finissent par lâcher. En ingénieur, je voulais la solution la plus efficace. Le schéma ci-joint montre qu'il suffit d'ajouter une résistance, un condensateur et une varistance pour protéger les triacs bon marché.
- La varistance protège le triac des surtensions.
- La résistance + condensateur forment un circuit RC snubber qui absorbe l'énergie lors de la coupure.
PS : En relisant mon tutoriel écrit bien après le montage, j'ai remarqué que sur mon circuit réel, j'avais placé le RC snubber entre les fils marron et gris de chaque moteur (selon les couleurs du schéma) plutôt qu'aux bornes du triac. Les deux fonctionnent, mais l'avantage de cette variante est que le snubber n'est pas en permanence connecté au secteur.
PS2 : SebDominguez a aussi fait un schéma clair de la configuration réelle :
Au lieu d'utiliser 2 broches par store (montée/descente), les interrupteurs partagent une ligne commune indiquant le sens. On utilise donc 5 entrées au lieu de 8. Pas de filtrage matériel nécessaire, le débouncing est logiciel.
Séquence de commande :
- L'Arduino active le module relais pour sélectionner le sens du moteur.
- Après un court délai (contact relais en place), il active le triac → alimente le moteur en 230 VAC via les relais et triacs bon marché sans souci.
- Pour couper : d'abord les triacs, puis les relais → les relais ne subissent jamais de coupure sous tension.
De 1 à 4 moteurs peuvent être pilotés sans modifier le code. Si vous n'en utilisez pas 4, la logique pour les autres ne gêne pas (sauf si vous avez besoin des broches).
Chez moi, deux étages = deux circuits. Comme les commandes radio doivent être uniques, le code gère les deux en commentant une ligne à l'upload. Si un seul circuit, rien à changer. En fait j'ai trois circuits pour 8 stores : un circuit avec 4 moteurs, les 4 autres répartis sur deux Arduinos (3 entrées sur l'un, 1 sur l'autre). Les circuits dupliqués réagissent aux mêmes commandes radio, mais là où rien n'est connecté, rien ne s'active. Avec la version MySensors, jusqu'à 256 nœuds × 4 stores chacun sans changer une ligne de code.
L'IDE web Arduino trouve automatiquement les bibliothèques nécessaires.
Contrôle à distance (optionnel)
Le code inclut deux modes radio nRF24L01+ : MySensors (recommandé), ou envoi direct d'un entier (numéro store + commande 0/1).
Dans les deux cas, j'utilise un Raspberry Pi maître avec nRF24L01+ branché directement, et Domoticz comme contrôleur.
Option 1 : MySensors
Installer la passerelle MQTT MySensors (guide officiel). Ma config :
sudo ./configure --my-gateway=mqtt --my-controller-ip-address=127.0.0.1 \
--my-mqtt-publish-topic-prefix=domoticz/in/MyMQTT \
--my-mqtt-subscribe-topic-prefix=domoticz/out/MyMQTT \
--my-mqtt-client-id=mygateway1 --my-transport=rf24 \
--my-port=1883 --my-rf24-irq-pin=15
Intégration Domoticz : ajouter matériel « MySensors MQTT Gateway », alimenter le nœud, il apparaît automatiquement.
Option 2 : Application custom (sans MySensors)
Un interrupteur virtuel exécute la commande console :
./remote -m XY
(X = n° store, Y = action).
Le code Raspberry est basé sur ce tutoriel (section « The Lamp Switch Application » uniquement). Il faut adapter les paramètres radio à ceux de l'Arduino, et faire en sorte que le code n'envoie la commande qu'une seule fois (pas de retry 5x), sinon les stores font « action-stop-action-stop » en cas de perte d'ACK.
Code final pour Raspberry (compilé pour Pi 3) :
#include <unistd.h>
#include <string>
#include <getopt.h>
#include <cstdlib>
#include <sstream>
#include <iostream>
#include <RF24/RF24.h>
using namespace std;
RF24 radio(RPI_V2_GPIO_P1_22, RPI_V2_GPIO_P1_24, BCM2835_SPI_SPEED_8MHZ);
const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };
unsigned long got_message;
void setup(void){
printf("\nPreparing interface\n");
radio.begin();
radio.setRetries(15, 15);
radio.setChannel(0x70);
radio.setDataRate(RF24_250KBPS);
radio.setPALevel(RF24_PA_MAX);
radio.printDetails();
radio.openWritingPipe(pipes[0]);
radio.openReadingPipe(1,pipes[1]);
}
bool sendMessage(int action){
radio.stopListening();
unsigned long message = action;
printf("Now sending %lu...", message);
bool ok = radio.write(&message, sizeof(unsigned long));
if (!ok) printf("failed...\n\r");
else printf("ok!\n\r");
radio.startListening();
unsigned long started_waiting_at = millis();
bool timeout = false;
while ( ! radio.available() && ! timeout ) {
if (millis() - started_waiting_at > 1000 ) timeout = true;
}
if( timeout ){
printf("Puta mierda, no me responde nadie...\n\r");
return false;
}else{
radio.read(&got_message, sizeof(unsigned long));
printf("Yeah, me han respondido > %lu.\n\r",got_message);
return true;
}
}
int main(int argc, char **argv){
char choice;
setup();
bool switched = false;
int counter = 0;
while((choice = getopt(argc, argv, "m:")) != -1){
if (choice == 'm'){
printf("\n Talking with my NRF24l01+ friends out there....\n");
while(switched == false && counter < 1){
switched = sendMessage(atoi(optarg));
counter++; sleep(1);
}
}else{
printf("\n\rIt's time to make some choices...\n");
printf("\n\rTIP: Use -m idAction for the message to send.");
printf("\n\rExample (id 12, action 1):\nsudo ./remote -m 121\n");
}
}
return (counter < 5) ? 0 : 2;
}
Archive complète (sources modifiées, libs, binaire Pi 3) : https://goo.gl/ocCwk3. Décompressez sur le Pi, lancez ./remote -m XY.
Le résultat
Vidéo de démo rapide disponible sur la page originale.
Dites-moi si ce tutoriel vous a aidé !
Cordialement,
gomecin
Bonus : Solution discrète sans intelligence (pour les allergiques au code)
Avant de connaître Arduino, j'ai essayé une solution purement hardware :
Je l'ai construit, ça marche, mais l'Arduino est plus flexible et fiable. Je ne l'explique pas en détail (hors sujet), mais le schéma est là si ça vous intéresse. Je le déconseille néanmoins.
Code
Sketch Arduino
(Le code complet est disponible sur la page originale du projet)
Schémas
Processus de fabrication
- Circuits de permission et d'interverrouillage dans les systèmes de commande industriels
- Circuits de commande moteur avancés : verrouillage, arrêt et techniques à temporisation
- Calculer la dissipation de puissance dans les circuits résistifs
- Technologie des Bulldozers : Conception, Fabrication et Innovations Futures
- Infineon Présente la Série TLE985x Embedded Power pour Contrôle Moteur Automobile
- Contrôle qualité : La pierre angulaire de la fiabilité des moteurs
- Panneaux de contrôle électriques : Essentiels de conception pour la sécurité et le ROI
- Locations fiables d'énergie et CVC pour un contrôle climatique sans faille
- Contrôler la vitesse d'un moteur hydraulique : PWM, commande à distance et bonnes pratiques