Dans cette série de tutoriels, nous allons voir comment piloter une multitude de relais avec un microcontrôleur NodeMCU32S et des registres à décalages 74HC595. Nous allons ensuite voir comment adresser chaque relais individuellement. Enfin, nous allons créer une interface Web pour piloter chaque relais par internet. Ce projet est une bonne base pour développer un système domotique pour chez vous.
Ce tutoriel peut être appliqué à n’importe quel microcontrôleur. Il faudra faire attention à modifier le schéma de connexion et le code pour qu’ils correspondent à votre usage.
Matériel
- NodeMCU 32S
- Breadboard
- Jumper cable
- Module 8 relais
- Registre à décalage 74hc595
Principe
Pour piloter le module 8 relais, il faut réserver 8 sorties digitales du microcontrôleur. Afin d’économiser le nombre d’entrée/sortie du microcontrôleur, différent circuit intégrés peuvent être utilisé. Notamment, le registre à décalage (ou shift register). Le registre à décalage 74HC595 possède 8 sorties programmables, pouvant prendre comme valeur 0 ou 5V et ne nécessite que 3 entrées digitales. Cette solution est donc idéale pour nous permettre de piloter les relais et garder les sorties du microcontrôleur pour d’autres fonctionnalités.
Schéma
Pour piloter le registre à décalage, le NodeMCU se connecte de la manière suivante:
- GND masse du circuit intégré
- Vcc broche d’alimentation. Généralement connecté à 5V
- SH_CP ou RCLK relié à la broche 33
- ST_CP ou SRCLK reliée à la broche 32
- DS ou SER reliée à la broche 25
Les sorties du circuit intégré 74HC595 (Q0-Q7) sont directement connectés aux entrées du module 8 relais. Dans ce tutoriel, nous n’utilisons pas les broches Enable (OE) et Reset(MR).
- OE Output enable, active LOW. Broche connectée à GND pour activer les sorties
- MR Master reset, active LOW. Broche de remise à zéro. Connectée au 5V
Attention: Les sorties d’un microcontrôleur sont limités en courant. Pour piloter autant de relais, il est fortement conseillé d’utiliser une source extérieure de tension.
Code
Dans le code suivant, nous allons tout d’abord définir les fonctions de base pour gérer le registre à décalage. Puis, nous allons actionner les relais un par un en utilisant une boucle for.
//Constants #define number_of_74hc595s 1 #define numOfRegisterPins number_of_74hc595s * 8 #define SER_Pin 25 #define RCLK_Pin 33 #define SRCLK_Pin 32 //Variables boolean registers [numOfRegisterPins]; void setup() { //Init Serial USB Serial.begin(115200); Serial.println(F("Initialize System")); //Init register pinMode(SER_Pin, OUTPUT); pinMode(RCLK_Pin, OUTPUT); pinMode(SRCLK_Pin, OUTPUT); pinMode(OUT_Pin, INPUT); clearRegisters(); writeRegisters(); delay(500); } void loop() { writeGrpRelay(); } void clearRegisters() { /* function clearRegisters */ //// Clear registers variables for (int i = numOfRegisterPins - 1; i >= 0; i--) { registers[i] = HIGH;//LOW; } } void writeRegisters() { /* function writeRegisters */ //// Write register after being set digitalWrite(RCLK_Pin, LOW); for (int i = numOfRegisterPins - 1; i >= 0; i--) { digitalWrite(SRCLK_Pin, LOW); int val = registers[i]; digitalWrite(SER_Pin, val); digitalWrite(SRCLK_Pin, HIGH); } digitalWrite(RCLK_Pin, HIGH); } void setRegisterPin(int index, int value) { /* function setRegisterPin */ ////Set register variable to HIGH or LOW registers[index] = value; } void writeGrpRelay() { /* function writeGrpRelay */ for (int i = numOfRegisterPins - 1; i >= 0; i--) { Serial.print(F("Relay ")); Serial.print(i); Serial.println(F(" HIGH")); setRegisterPin(i, LOW); writeRegisters(); delay(200); Serial.print(F("Relay ")); Serial.print(i); Serial.println(F(" LOW")); setRegisterPin(i, HIGH); writeRegisters(); delay(500); } }
Résultat
Une fois les composants branchés correctement et le code chargé dans le microcontrôleur, les relais devrait s’activer les uns à la suite de autres.
Bonus: Contrôler 16 relais avec deux registres à décalage
Schéma
Code
La beauté de ce code est que pour le faire fonctionner avec un second registre à décalage il suffit de modifier le paramètre:
#define number_of_74hc595s 2