Affichage des articles triés par pertinence pour la requête pcf8574. Trier par date Afficher tous les articles
Affichage des articles triés par pertinence pour la requête pcf8574. Trier par date Afficher tous les articles

dimanche 3 février 2019

Les extensions de GPIOs de l'ARDUINO




Les extensions de GPIOs de l'ARDUINO


Nous allons explorer dans cet article les différentes possibilité d'étendre le nombre d'entrées / sorties digitales d'une carte  ARDUINO.
Des schémas et sketches de base sont proposés.

1. Les GPIOs de l'ADUINO

Comme vous le savez probablement, le nombre d'entrées et de sorties digitales d'une carte ARDUINO ou de l'ESP8266 est limité.

ARDUINO UNO, NANO, MINI, etc. :
  • 14 GPIOs
  • 6 pins analogiques utilisables en pins digitales
Deux de ces GIOs sont réservées à l'émission / réception sur la ligne série.
Cela nous laisse donc 18 GPIOs utilisables, ce qui est parfois insuffisant.

ARDUINO MEGA, DUE :
  • 54 GPIOs
  • 16 pins analogiques utilisables en pins digitales
Ici également deux de ces GIOs sont réservées à l'émission / réception sur la ligne série.
ESP-01 :
  • 2 GPIOs
ESP-12E :
  • 8 GPIOs
Lorsque l'on désire travailler avec un format de carte réduit, comme une NANO par exemple, changer pour une MEGA est fortement pénalisant en terme d'encombrement.
Comme nous allons le voir il existe des solutions bon marché.

2. La démarche

Nous allons examiner d'abord les caractéristiques d'un certain nombre de circuits.

Ensuite pour certains de ces circuits que j'ai en ma possession, je les ai expérimentés.
Je les ai raccordés à un ARDUINO NANO et des LEDs et écrit les sketches correspondants à l'aide de librairies. Les schémas, sketches et la liste des librairies sont fournis.
Ce travail peut servir de base de départ pour démarrer un projet.

Ensuite j'ai mesuré les temps d'écriture. Ceux-ci sont mesurés pour l'écriture d'un mot (8 bits ou 16 bits) sur les sorties.
Les composants I2C sont mesurés à 100KHz et 400KHz.

Enfin, deux petits tableaux récapitulent ensuite les principales caractéristiques et les performances.

3. Les décodeurs

Un décodeur permet de décoder un certain nombre de lignes binaires ou BCD.
  • 3 entrées / 8 sorties
  • 4 entrées / 16 sorties
Une seule sortie peut être activée à la fois. Une ou plusieurs broches "enable" permettent d'activer ou non la sortie.

3.1. Le 74LS138 et le 74LS238

Le 74LS138 et le 74LS238 permettent à partir de 3 entrées binaires d'obtenir 8 sorties.

3.2. Le74HC154

Le 74HC154 permet à partir de 4 entrées binaires d'obtenir 16 sorties.

4. Les registres à décalage

Un registre est un convertisseur série / parallèle, il offre un certain nombre de sorties mais est dépourvu d'entrées.

4.1. Le 74HC595

Le 74HC595 est un registre à décalage. Il peut être utilisé comme expander de GPIOs. Il a les caractéristiques suivantes :
  • 8 sorties
  • courant maximal par sortie 35mA
  • courant maximal pour l'ensemble des sorties 70mA
Quelques lien utiles :
https://learn.adafruit.com/adafruit-arduino-lesson-4-eight-leds/the-74hc595-shift-register
https://eskimon.fr/tuto-arduino-901-ajouter-des-sorties-num%C3%A9riques-%C3%A0-larduino-le-74hc595

Il est possible de chaîner plusieurs 74HC595 pour obtenir un registre à décalage 16bits, 24bits, 32bits ou plus.
Voir plus bas :  7. Les schémas et sketches

Certains afficheurs du commerce en sont équipés :
Le 74HC595 existe en boîtier DIP.
Il est facile de trouver des modules "breakboard" équipés de ce circuit :

4.2. Le 74LS673

Le 74LS673 est aussi un registre à décalage pouvant être utilisé comme expander de GPIOs. Il a les caractéristiques suivantes :
  • 16 sorties
  • courant maximal par sortie 8mA
Malheureusement son prix élevé - une quarantaine d'euros - est dissuasif. Il est préférable de s'orienter vers un expander lorsque l'on désire disposer de 16 bits, ou de chaîner deux 74HC595.

5. Les expanders

Un expander permet de disposer de vraies entrées / sorties. Il offre souvent des fonctionnalités annexes :
  • broche d'interruption
  • résistances PULL-UP configurables ou non
Commençons par les plus connus.

5.1. Le MCP23008 et MCP23S08

Le MCP23008 est un expander de GPIOs sur bus I2C. Le MCP23S08 est un expander de GPIOs sur bus SPI. Ils ont les caractéristiques suivantes :
  • 8 entrées/sorties
  • résistances PULL-UP 100kΩ configurables
  • courant maximal par sortie 25mA
  • courant maximal pour l'ensemble des sorties 125mA
  • MCP23008 : 3 broches de sélection d'adresse
  • MCP23S08 : 2 broches de sélection d'adresse
  • 1 sortie d'interruption
Le MCP23008 et le MCP23S08 existent en boîtier DIP.
On ne trouve pas de modules "breakboard" équipés de ces circuits.

5.2. Le MCP23017 et MCP23S17

Le MCP23017 est un expander de GPIOs sur bus I2C. Le MCP23S17 est un expander de GPIOs sur bus SPI. Ils ont les caractéristiques suivantes :
  • 16 entrées/sorties 
  • résistances PULL-UP 100kΩ configurables
  • courant maximal par sortie 25mA
  • courant maximal pour l'ensemble des sorties 125mA
  • 3 broches de sélection d'adresse
  • 2 sorties d'interruption
Le MCP23017 et le MCP23S17 existent en boîtier DIP.
Il est facile de trouver des modules "breakboard" équipés du MCP23017 :

5.3. Le PCA9537

Le PCA9537 est un expander de GPIOs sur bus I2C. Il a les caractéristiques suivantes :
  • 4 entrées/sorties 
  • courant maximal par sortie 50mA
  • courant maximal pour l'ensemble des sorties 85mA
  • 1 adresseI2C fixe
  • 1 sortie d'interruption
  • boîtier TSSOP10
On ne trouve pas de "breakboard" équipés de ce circuit.

5.4. Le PCA9555

Le PCA9555 est un expander de GPIOs sur bus I2C. Il a les caractéristiques suivantes :
  • 16 entrées/sorties 
  • résistances PULL-UP 100kΩ non configurables
  • courant maximal par sortie 8mA (état bas)
  • courant maximal pour l'ensemble des sorties 200mA (état bas)
  • 3 broches de sélection d'adresse
  • 1 sortie d'interruption
On trouve peu de "breakboard" équipés de ce circuit :

5.5. Le PCA9655

Le PCA9655 est un expander de GPIOs sur bus I2C. Il a les caractéristiques suivantes :
  • 16 entrées/sorties 
  • résistances PULL-UP 100kΩ non configurables
  • courant maximal par sortie 25mA (état bas)
  • courant maximal pour l'ensemble des sorties 400mA (état bas)
  • 3 broches de sélection d'adresse
  • 1 sortie d'interruption
On ne trouve pas de modules "breakboard" équipés de ce circuit.

5.6. Le PCF8574

Le PCF8574 est un expander de GPIOs sur bus I2C. Il a les caractéristiques suivantes :
  • 8 entrées/sorties en collecteur ouvert
  • courant maximal par sortie 50mA (état bas), 100µA (état haut)
  • courant maximal pour l'ensemble des sorties 100mA
  • 3 broches de sélection d'adresse
  • 1 sortie d'interruption
La majeure partie de convertisseurs I2C pour afficheurs LCD 2x16 ou 4x20 utilisent le PCF8574 :

Attention, le PCF8574 est quasi-bidirectionnel. Il ne possède pas de registre de direction comme un MCP23008. De plus, il est incapable de fournir un courant important à l'état haut.

Il est facile de trouver des modules "breakboard" équipés de ce circuit :

5.7. Le PCF8575

Le PCF8575 est un expander de GPIOs sur bus I2C. Il a les caractéristiques suivantes :
  • 16 entrées/sorties en collecteur ouvert
  • courant maximal par sortie 50mA (état bas), 100µA (état haut)
  • courant maximal pour l'ensemble des sorties 100mA
  • 3 broches de sélection d'adresse
  • 1 sortie d'interruption
Attention, comme le PCF8574, le PCF8575 est quasi-bidirectionnel. Il ne possède pas de registre de direction comme un MCP23017. De plus, il est incapable de fournir un courant important à l'état haut. 

Il est facile de trouver des modules "breakboard" équipés de ce circuit :

5.8. Le SX1509

Le SX1509 est un expander de GPIOs sur bus I2C. Il a les caractéristiques suivantes :
  • 16 entrées/sorties en push-pull ou collecteur ouvert
  • résistances PULL-UP PULL-DOWN 100kΩ configurables
  • PWM, BLINK, FADE IN/OUT
  • clavier matriciel
  • courant maximal par sortie 15mA (état bas), 8mA (état haut)
  • 2 broches de sélection d'adresse
  • 1 sortie d'interruption
  • Attention : tension d'alimentation 3.3V
Ce circuit, avec ses possibilités avancées (clavier matriciel, PWM, clignotement, FADE IN/OUT) programmables, permet de décharger le processeur de certaines tâches.

La fréquence PWM est ajustable (voir la datasheet) :

ClkX = fOSC/(2^(RegMisc[6:4]-1))

J'ai fait un essai en réel avec la lib SparkFun :

 io.clock(INTERNAL_CLOCK_2MHZ, 1, OUTPUT, 1);    // F = 8.33KHz
 io.clock(INTERNAL_CLOCK_2MHZ, 7, OUTPUT, 1);    // F = 113Hz


Un lien utile :https://learn.sparkfun.com/tutorials/sx1509-io-expander-breakout-hookup-guide/all

Il est facile de trouver des modules "breakboard" équipés de ce circuit :
Le modèle SparkFun possède deux rangées de pastilles que l'on peut raccorder au 3.3V ou GND par soudure.

5.9. Le MCP23009 et MCP23S09

Le MCP23009 est un expander de GPIOs sur bus I2C. Le MCP23S09 est un expander de GPIOs sur bus SPI. Il a les caractéristiques suivantes :
  • 8 entrées/sorties  en collecteur ouvert
  • résistances PULL-UP 100kΩ configurables
  • courant maximal par sortie 25mA (état bas)
  • courant maximal pour l'ensemble des sorties 125mA (état bas)
  • 1 broche de sélection d'adresse
  • 2 sorties d'interruption
Le MCP23009 et le MCP23S09 existent en boîtier DIP.
On ne trouve pas de modules "breakboard" équipés de ce circuit.

5.10. Le MCP23018 et MCP23S18

Le MCP23018 est un expander de GPIOs sur bus I2C. Le MCP23S18 est un expander de GPIOs sur bus SPI. Il a les caractéristiques suivantes :
  • 16 entrées/sorties  en collecteur ouvert
  • résistances PULL-UP 100kΩ configurables
  • courant maximal par sortie 25mA (état bas)
  • courant maximal pour l'ensemble des sorties 400mA (état bas)
  • 1 broche de sélection d'adresse
  • 2 sorties d'interruption
Le MCP23018 et le MCP23S18 existent en boîtier DIP.
On ne trouve pas de modules "breakboard" équipés de ce circuit.

5.11. Le MAX7301

Le MAX7301 est un expander de GPIOs sur bus 4 fils. Il a les caractéristiques suivantes :
  • 20 (SSOP28) ou 28 (SSOP36) entrées/sorties
  • résistances PULL-UP configurables
  • courant maximal par sortie 10mA (état bas), 4.5mA (état haut)
  • courant maximal pour l'ensemble des sorties 600mA (état bas)
On ne trouve pas de modules "breakboard" équipés de ce circuit.

5.12. Le MAX7311

Le MAX7311 est un expander de GPIOs sur bus I2C. Il a les caractéristiques suivantes :
  • 16 entrées/sorties
  • résistances PULL-UP 100kΩ configurables
  • courant maximal par sortie 17mA (état bas), 29mA (état haut)
  • courant maximal pour l'ensemble des sorties 250mA
  • 3 broches de sélection d'adresse
  • 1 sortie d'interruption
On ne trouve pas de modules "breakboard" équipés de ce circuit.

5.13. Le MAX7318

Le MAX7318 est un expander de GPIOs sur bus I2C. Il a les caractéristiques suivantes :
  • 16 entrées/sorties
  • résistances PULL-UP 100kΩ configurables
  • courant maximal par sortie 17mA (état bas), 29mA (état haut)
  • courant maximal pour l'ensemble des sorties 250mA
  • 3 broches de sélection d'adresse
  • 1 sortie d'interruption
On ne trouve pas de modules "breakboard" équipés de ce circuit.

5.14. Le TCA9534

Le TCA9534 est un expander de GPIOs sur bus I2C. Il a les caractéristiques suivantes :
  • 8 entrées/sorties
  • résistances PULL-UP 100kΩ configurables
  • courant maximal par sortie 50mA
  • courant maximal pour l'ensemble des sorties 160mA
  • 3 broches de sélection d'adresse
  • 1 sortie d'interruption
On ne trouve pas de modules "breakboard" équipés de ce circuit.

5.15. Le PCA9685

Le PCA9685 est un driver de LEDs I2C PWM 16 canaux, mais on peut également s'en servir comme d'un expander (en sortie uniquement) :

Il dispose de fonctions avancées :
  • PWM 12 bits : fréquence variable de 24Hz à 1526Hz
  • luminosité des LED programmable
  • allumage / extinction des LED avec un temps programmable
  • etc.

6. Les multiplexeurs I2C

Nous allons terminer par une dernière catégorie de circuits permettant de multiplexer un bus I2C afin d'obtenir plusieurs bus I2C à partir d'un seul.

Ces composants peuvent permettre de résoudre des conflits d'adresse I2C, lorsque l'on utilise plusieurs composants I2C identiques n'ayant pas de broche de sélection d'adresse par exemple.

6.1. Le PCA9540

Le PCA9540 permet de multiplexer 2 bus I2C. Il a les caractéristiques suivantes :
  • 2 bus esclaves
  • alimentation 2.3V - 3.6V
  • pas de broche de sélection d'adresse
On ne trouve pas de modules "breakboard" équipés de ce circuit.

6.2. Le PCA9541

Le PCA9541 permet de multiplexer 2 bus I2C. Il a les caractéristiques suivantes :
  • 2 bus esclaves
  • alimentation 2.3V - 5.5V
  • 4 broches de sélection d'adresse
On ne trouve pas de modules "breakboard" équipés de ce circuit.

6.3. Le PCA9543

Le PCA9543 permet de multiplexer 2 bus I2C. Il a les caractéristiques suivantes :
  • 2 bus esclaves
  • alimentation 2.3V - 3.6V
  • 2 broches de sélection d'adresse
On ne trouve pas de modules "breakboard" équipés de ce circuit.

6.4. Le PCA9545

Le PCA9545 permet de multiplexer 4 bus I2C. Il a les caractéristiques suivantes :
  • 4 bus esclaves
  • alimentation 2.3V - 5.5V
  • 2 broches de sélection d'adresse
On ne trouve pas de modules "breakboard" équipés de ce circuit.

6.4. Le PCA9546

Le PCA9546 permet de multiplexer 4 bus I2C. Il a les caractéristiques suivantes :
  • 4 bus esclaves
  • alimentation 2.3V - 5.5V
  • 3 broches de sélection d'adresse
On ne trouve pas de modules "breakboard" équipés de ce circuit.

6.5. Le PCA9548

Le PCA9548 permet de multiplexer 8 bus I2C. Il a les caractéristiques suivantes :
  • 8 bus esclaves
  • alimentation 2.3V - 5.5V
  • 3 broches de sélection d'adresse
On ne trouve pas de modules "breakboard" équipés de ce circuit.

6.6. Le TCA9543


Le TCA9543 permet de multiplexer 2 bus I2C. Il a les caractéristiques suivantes :
  • 2 bus esclaves
  • alimentation 1.65V - 5.5V
  • 2 broches de sélection d'adresse
On ne trouve pas de modules "breakboard" équipés de ce circuit.

6.7. Le TCA9548

Le TCA9548 permet de multiplexer 8 bus I2C. Il a les caractéristiques suivantes :
  • 8 bus esclaves
  • alimentation 1.65V - 5.5V
  • 3 broches de sélection d'adresse
Il est facile de trouver des modules "breakboard" équipés de ce circuit :

7. Les librairies

Remarque : la librairie PCF8574 de Rob Tillaart est préférable. De plus elle est compatible ESP8266 et ESP32.

8. Les performances

Le tableau suivant regroupe les caractéristiques des différents circuits.
 
Module BUS GPIOS INT Tension Conso
au repos
Boîtier
74HC595 Série 8 0 2.0V - 6.0V 80µA DIP16 SO16
SSOP16
TSSOP16
2 x 74HC595 chaînés Série 16 0 2.0V - 6.0V 160µA
MCP23008 I2C 8 1 1.8V - 5.5V 1µA DIP18 SO18S
SOP20
MCP23S08 SPI 8 1 1.8V - 5.5V 1µA DIP18 SO18
SSOP20
MCP23009 I2C 8 1 1.8V - 5.5V 1µA DIP18 SO18
SSOP20
MCP23S09 SPI 8 1 1.8V - 5.5V 1µA DIP18 SO18
SSOP20
MCP23017 I2C 16 2 1.8V - 5.5V 1µA DIP28 SO28
SSOP28
MCP23S17 SPI 16 2 1.8V - 5.5V 1µA DIP28 SO28
SSOP28
MCP23018 I2C 16 2 1.8V - 5.5V 1µA DIP28 SO28
SSOP28
MCP23S18 SPI 16 2 1.8V - 5.5V 1µA DIP28 SO28
SSOP28
PCA9537 I2C 4 1 2.3V - 5.5V 1µA TSSOP10
TSSOP24
PCA9555 I2C 16 1 2.3V - 5.5V 1µA SO24 SSOP24
TSSOP24
PCA9655 I2C 16 1 1.65V - 5.5V 1µA SO24 TSSOP24
PCF8574 I2C 8 1 2.5V - 5.5V 10µA DIP16 SO16
PCF8575 I2C 16 1 2.5V - 5.5V 10µA SO24 SSOP24
TSSOP24
SX1509 I2C 16 1 1.425V - 3.6V 1µA QFN28
MAX7301 4W 20 ou 28 0 2.5V - 5.5V 11µA SSOP28
SSOP36
MAX7311 I2C 16 1 2.0V - 5.5V 15µA SO24 SSOP24
TSSOP24
MAX7318 I2C 16 1 2.0V - 5.5V 19µA SO24 SSOP24
TSSOP24
TCA9534 I2C 8 1 1.65V - 5.5V 22µA TSSOP16


Le tableau suivant donne leurs performances en écriture.

L'augmentation de la vitesse du bus 12C de l'ARDUINO à 400KHZ permet d'obtenir une plus grande rapidité, grâce à cette simple modification :

void setup() {
  Serial.begin(115200);
  Serial.println("MCP23008");
  mcp.begin();
  Wire.setClock(400000); 

  for (int i = 0 ; i < 8 ; i++) {
    mcp.pinMode(i, OUTPUT);
  }
}


Module Temps
d'écriture
Temps
d'écriture I2C à 100KHz
Temps
d'écriture I2C à 400KHz
74HC595 121µs

2 x 74HC595 chaînés 236µs

MCP23008
325µs 118µs
MCP23S08 20µs

MCP23009 (*)
325µs 118µs
MCP23S09 (*) 20µs

MCP23017
425µs 153µs
MCP23S17 24µs

MCP23018 (*)
425µs 153µs
MCP23S18 (*) 24µs

PCA9537


PCA9555


PCA9655


PCF8574
225µs 79µs
PCF8575


SX1509


MAX7301


MAX7311


MAX7318


TCA9534



(*) : je n'ai pas ces composants sous la main pour les tester mais ils ont des caractéristiques probablement très proches de leurs homologues push-pull en matière de vitesse :
  • MCP23009 : MCP23008
  • MCP23S09 : MCP23S08
  • MCP23018 : MCP23017
  • MCP23S18 : MCP23S17

9. Les schémas et sketches

Les performances des différents circuits sont testées à l'aide des schémas et sketches suivants.

9.1. Le 74HC595 

Le schéma :
Le schéma est réalisé avec KICAD. Les broches d'alimentation du 74HC595  ne sont pas représentées : VCC = 16, GND = 8.

Le sketch :

#define LATCH_PIN 5
#define CLOCK_PIN 6
#define DATA_PIN  4

void setup() {
  Serial.begin(115200);
  Serial.println("74HC595");
  pinMode(LATCH_PIN, OUTPUT);
  pinMode(CLOCK_PIN, OUTPUT);
  pinMode(DATA_PIN, OUTPUT);
}

void loop() {
  unsigned long start = micros();
  for (unsigned cnt = 0; cnt < 256; cnt++) {
    digitalWrite(LATCH_PIN, LOW);
    shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, cnt);
    digitalWrite(LATCH_PIN, HIGH);
  }
  unsigned long stop = micros();
  Serial.print("Elapsed : ");
  Serial.print((stop-start) / 256);
  Serial.println(" µs");
}



Chaîner deux 74HC595
Le schéma :
Le schéma est réalisé avec KICAD. Les broches d'alimentation des 74HC595  ne sont pas représentées : VCC = 16, GND = 8.

Le sketch :

#define LATCH_PIN 5
#define CLOCK_PIN 6
#define DATA_PIN  4

void setup() {
  Serial.begin(115200);
  Serial.println("2x74HC595");
  pinMode(LATCH_PIN, OUTPUT);
  pinMode(CLOCK_PIN, OUTPUT);
  pinMode(DATA_PIN, OUTPUT);
}

void loop() {
  unsigned long start = micros();
  for (unsigned long cnt = 0; cnt < 65536 ; cnt++) {
    digitalWrite(LATCH_PIN, LOW);
    shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, cnt & 0xff);

    shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, cnt >> 8);
    digitalWrite(LATCH_PIN, HIGH);
  }
  unsigned long stop = micros();
  Serial.print("Elapsed : ");
  Serial.print((stop-start) / 65536);
  Serial.println(" µs");
}


9.2. Le MCP23008

Le schéma :
Le schéma est réalisé avec KICAD. Les broches d'alimentation du MCP23008 ne sont pas représentées : VCC = 18, GND = 9.

Les deux résistances de pullup sur les lignes SDA et SCL ne sont pas représentées non plus, mais elles sont nécessaires.

L'adresse I2C est 0x20.

Le sketch :

#include <SPI.h>
#include <Adafruit_MCP23008.h>

Adafruit_MCP23008 mcp;

void setup() {
  Serial.begin(115200);

  Serial.println("MCP23008");
  mcp.begin(); 
  Wire.setClock(400000); 
  for (int i = 0 ; i < 8 ; i++) {
     mcp.pinMode(i, OUTPUT);
  }
}

void loop() {
  unsigned long start = micros();
  for (int cnt = 0 ; cnt < 256 ; cnt++) {
    mcp.writeGPIO(cnt);
  }
  unsigned long stop = micros();
  Serial.print("Elapsed : ");
  Serial.print((stop-start) / 256);
  Serial.println(" µs");
}


9.3. Le MCP23S08

Le schéma :
Le schéma est réalisé avec KICAD. Les broches d'alimentation du MCP23S08 ne sont pas représentées : VCC = 18, GND = 9.

Les deux résistances de pullup sur les lignes SDA et SCL ne sont pas représentées non plus, mais elles sont nécessaires.

Le sketch :

#include <SPI.h>
#include <gpio_MCP23SXX.h>

gpio_MCP23SXX mcp(MCP23S08, 10, 0x20);

void setup() {
  Serial.begin(115200);
  Serial.println("MCP23S08");
  mcp.begin();
  for (int i = 0 ; i < 8 ; i++) {
    mcp.gpioPinMode(i, OUTPUT);
  }
}

void loop() {
  unsigned long start = micros();
  for (int cnt = 0; cnt < 256; cnt++) {
    mcp.gpioPort(cnt);
  }
  unsigned long stop = micros();
  Serial.print("Elapsed : ");
  Serial.print((stop-start) / 256);
  Serial.println(" µs");
}


9.4. Le MCP23017

Le schéma :

Le schéma est réalisé avec KICAD. Les broches d'alimentation du MCP23017 ne sont pas représentées : VCC = 9, GND = 10.

Les deux résistances de pullup sur les lignes SDA et SCL ne sont pas représentées non plus, mais elles sont nécessaires.

L'adresse I2C est 0x20.

Le sketch :

#include <SPI.h>
#include <Adafruit_MCP23017.h>

Adafruit_MCP23017 mcp;

void setup() {
  Serial.begin(115200);
  Serial.println("MCP23017");
  mcp.begin();

  Wire.setClock(400000); 
  for (int i = 0 ; i < 8 ; i++) {
    mcp.pinMode(i, OUTPUT);
  }
}

void loop() {
  unsigned long start = micros();
  for (unsigned cnt = 0; cnt < 256; cnt++) {
    mcp.writeGPIOAB(cnt);
  }
  unsigned long stop = micros();
  Serial.print("Elapsed : ");
  Serial.print((stop-start) / 256);
  Serial.println(" µs");
}


9.5. Le MCP23S17

Le schéma :

Le schéma est réalisé avec KICAD. Les broches d'alimentation du MCP23S17 ne sont pas représentées : VCC = 9, GND = 10.

Le sketch :

#include <SPI.h>
#include <MCP23S17.h>

MCP mcp(0, 10);

void setup() {
  Serial.begin(115200);
  mcp.begin();
  mcp.pinMode(0x0000);
}

void loop() {
  unsigned long start = micros();
  for (unsigned cnt = 0; cnt < 256; cnt++) {
    mcp.digitalWrite(cnt);
  }
  unsigned long stop = micros();
  Serial.print("Elapsed : ");
  Serial.print((stop-start) / 256);
  Serial.println(" µs");
 
}


9.6. Le PCF8574

Le schéma :

Les deux résistances de pullup sur les lignes SDA et SCL ne sont pas représentées, mais elles sont nécessaires.

Je me suis aperçu récemment que le PCF8574 ne fournit que 100µA à l'état haut. Il serait préférable de connecter les couples résistance+LED entre le +5V et les sorties si l'on veut bénéficier d'un courant supérieur.

Le sketch :

#include <Wire.h>    // Required for I2C communication
#include "PCF8574.h" // Required for PCF8574
 

PCF8574 pcf;

void setup() {
  Serial.begin(115200);
  Serial.println("PCF8574");
  pcf.begin(0x27);
  Wire.setClock(400000);
  for (int i = 0 ; i < 8 ; i++) {
    pcf.pinMode(i, OUTPUT);
  }
}

void loop() {
  unsigned long start = micros();
  for (unsigned cnt = 0; cnt < 256; cnt++) {
    pcf.write(cnt);
  }
  unsigned long stop = micros();
  Serial.print("Elapsed : ");
  Serial.print((stop-start) / 256);
  Serial.println(" µs");
}


10. Gestion d'entrées sous interruption

MCP23017
Ci-dessous un schéma avec un MCP23017 gérant un clavier à 16 touches :

Les deux résistances de pullup sur les lignes SDA et SCL ne sont pas représentées, mais elles sont nécessaires.

La broche d'interruption A  du MCP23017 est reliée à la broche D2 de l'ARDUINO. Ceci va permettre d'endormir celui-ci et de le réveiller uniquement si nécessaire. Un montage de ce genre avec un ARDUINO PRO MINI modifié devrait pouvoir offrir une consommation extrêmement faible, 5 à 6 µA.

Le sketch :

#include <LowPower.h>
#include <SPI.h>
#include <Adafruit_MCP23017.h>

#define INTERRUPT_A_PIN   2

Adafruit_MCP23017 mcp;

volatile boolean awakenByInterrupt = false;

void setup() {
  Serial.begin(115200);
  Serial.println("MCP23017");
  pinMode(INTERRUPT_A_PIN, INPUT);
  mcp.begin();
  mcp.setupInterrupts(true, false, LOW);
  for (int i = 0 ; i < 16 ; i++) {
    mcp.pinMode(i, INPUT);
    mcp.pullUp(i, HIGH);
    mcp.setupInterruptPin(i, FALLING);
  }
}

void intCallBack() {
  awakenByInterrupt = true;
}

void loop() {
  attachInterrupt(digitalPinToInterrupt(INTERRUPT_A_PIN), intCallBack, FALLING);
  LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
  detachInterrupt(digitalPinToInterrupt(INTERRUPT_A_PIN));
  if (awakenByInterrupt) {
    uint8_t pin = mcp.getLastInterruptPin();
    uint8_t val = mcp.getLastInterruptPinValue();
    Serial.print("Interrupt: pin"); Serial.print(pin); Serial.print(": "); Serial.println(val);
    while (!mcp.digitalRead(pin));
    EIFR=0x01;
    awakenByInterrupt = false;
  }
}


MCP23008
Il est possible de faire exactement la même chose avec 8 touches et un MCP23008. Par contre la gestion des interruptions n'est pas prévue dans la librairie.
Plutôt que de la modifier bêtement, il vaut mieux en hériter dans notre code :

#include <Wire.h>
#include "Adafruit_MCP23008.h"

class MyMCP23008 : public Adafruit_MCP23008
{
  protected:
    void write8(uint8_t addr, uint8_t data);
    uint8_t i2caddr;

  public: 
    void enableInterrupts(uint8_t data);
};

void MyMCP23008::write8(uint8_t addr, uint8_t data)

{
  Wire.beginTransmission(MCP23008_ADDRESS | i2caddr);
#if ARDUINO >= 100
  Wire.write((byte)addr);
  Wire.write((byte)data);
#else
  Wire.send(addr); 
  Wire.send(data);
#endif
  Wire.endTransmission();
}

void MyMCP23008::enableInterrupts(uint8_t data)
{
  this->write8(MCP23008_GPINTEN, data);
}


MyMCP23008 mcp;


void setup()
{
  Serial.begin(115200);
  Serial.println("MCP23008");
  mcp.begin();
  for (int button = 0 ; button < 8 ; button++) {
    mcp.pinMode(button, INPUT);
    mcp.pullUp(button, HIGH);

    mcp.enableInterrupts(0xff);  }
}


La méthode write8() est celle de la librairie AdaFruit. Pourquoi la dupliquer ? parce que dans cette classe elle est "private", donc inutilisable dans les méthodes des classes dérivées, ce qui n'est pas très malin.

11. Les circuits spécialisés

Certains circuits peuvent être utilisés en lieu et place d'expanders ou de registres à décalage pour des tâches spécialisées, en particulier le pilotage d'afficheurs ou de claviers matriciels.
Ces circuits se chargent à la place du processeur du multiplexage de l'afficheur.

Voir cet article :
https://riton-duino.blogspot.com/2018/09/lcd-tft-et-arduino.html

12. Conclusion

On remarque facilement la nette supériorité en vitesse des composants SPI.

Malgré cela les composants I2C n'en restent pas moins intéressants quand la vitesse n'est pas un critère primordial :
  • pilotage de LEDs
  • pilotage d'écrans y compris LCD 7 segments
  • pilotage de relais
  • pilotage de claviers matriciels
  • etc.
Avant de faire un choix l'essentiel est de recenser les besoins. Quand une ou plusieurs entrées sont nécessaires, les expanders sont indispensables. Les registres à décalage en sont dépourvus.

Cordialement
Henri

13. Mises à jour

04/02/2019 : 5.9. Le MCP23009 et MCP23S09.
                     ajout de mesures de vitesse I2C à 400KHz
05/02/2019 : 5.7. Le PCF8574
                     ajout de mesures de vitesse PCF8574
05/02/2019 : 11. Les circuits spécialisés
09/02/2019 : 3. les decodeurs
10/02/2019 : 10. Gestion d'entrées sous interruption
17/02/2020 : 5.3. Le PCA9537
                     5.14. Le TCA9534
                     6. Les multiplexeurs I2C

mardi 10 août 2021

Modules à relais DIY

 


Modules à relais DIY

 

Les modules relais sont très nombreux dans le commerce, mais ils n'offrent en général que des possibilités limitées. Nous allons voir dans cet article comment les réaliser et surtout pour quelles raisons nous aurions à les fabriquer nous-même.

Dans cet article nous allons aborder différents sujets :

  • relais classiques ou bistables
  • pilotage de relais avec des transistors
  • pilotage de relais avec un ULN2803
  • élévateurs de tension
  • modules relais pilotés par I2C

1. Présentation

Prenons un exemple :

Cette carte comporte un relais, un transistor de commande, 2 LEDs, trois résistances de 1KΩ et un connecteur 3 broches (GND, 5V, IN).
La description de la carte précise que ce relais doit être commandé par un niveau bas.

Cela me convient-il ? pas forcément. J'ai plutôt l'habitude de commander mes relais avec un niveau haut et les LEDs sont inutiles. De plus la résistance de base de 1KΩ est faible et impose un courant de commande de 5mA.

Elle a un autre défaut : elle ne possède pas de trous de fixation.  

Attention, certains modules sont équipés d'optocoupleurs bas de gamme avec des résistance d'entrée de 200Ω et réclament 20mA.

D'autres cartes proposent un cavalier afin de pouvoir choisir le niveau de la broche de commande :

Ces modules sont équipés en général de relais chinois du type SONGLE SRD-05VDC-SRD, ce qui n'est pas vraiment un gage de qualité.

1.1. Modules à optocoupleur

Les modules sont en général équipés d'un optocoupleur. Quel intérêt ? Le relais offre déjà lui-même une isolation galvanique tout à fait suffisante, 1000V pour les plus courants.

Sur ce module, on voit 2 connecteurs :

  • connecteur d'alimentation
    • JD-VCC
    • VCC
    • GND
  • connecteur de commande :
    • VCC
    • IN1, IN2
    • GND

Pourquoi 2 broches VCC et deux broches GND ?

Il faut examiner un schéma pour avoir l'explication :

On peut remarquer que les relais seront activés si l'on applique un niveau bas 0V sur IN1 ou IN2, et seront désactivés si l'on applique un niveau haut 5V sur IN1 ou IN2.

Les deux proches VCC sont reliées entre elles, ainsi que les deux broches GND. Le cavalier J5 permet de relier VCC à JD-VCC (ou RY-VCC).

Il y a deux façons de brancher ces modules.

1.1.1. La manière simple en 5V

Il suffit de laisser le cavalier en place entre VCC et JD-VCC, et de relier le module comme ceci :

Cela fonctionne mais seulement si les relais sont des modèles à bobine 5V.

Si l'on alimente par la broche VCC du connecteur de commande sous 12V, il sera impossible de désactiver les relais. En effet, si VCC vaut 12V et que la tension de commande sur D2 ou D3 est de 5V, il reste 7V aux bornes des composants R4+opto+LED, et le relais est donc activé.

1.1.2. La manière moins simple en 12V

Si les modules relais sont des modèles à bobine 12V, il faut retirer le cavalier entre VCC et JD-VCC, et relier le module comme ceci :

On peut aussi utiliser ce câblage avec des relais à bobine 5V ou 24V.

Comme on le voit sur ce schéma, la broche GND du connecteur de commande n'est pas utile. En effet, lors de l'activation d'un relais, le courant de commande va circuler du +5V, à travers l'optocoupleur, vers la sortie de l'ARDUINO.

Ici, le 12V présent sur la broche JD-VCC du connecteur d'alimentation peut être obtenu de plusieurs manières :

On peut utiliser une alimentation 12V pour le module relais, et alimenter également l'ARDUINO en 12V par sa broche VIN. Attention, certains ESP8266 ou ESP32 n'acceptent pas plus de 6.5V sur leur entrée 5V ou VCC. Il faudra ajouter un convertisseur STEP-DOWN.

On peut également utiliser un convertisseur STEP-UP 5V / 12V branché sur une alimentation 5V.

On peut utiliser 2 alimentations séparées, une alimentation 5V pour l'ARDUINO et une alimentation 12V pour le module relais. Les masses n'auront pas besoin d'être reliées.

Que se passe t-il si on raccorde la broche GND du module à la broche GND de l'ARDUINO ? Rien de spécial. Le GND de l'alimentation 12V sera relié au GND de l'ARDUINO.

1.1.3. Isolation galvanique

On lit beaucoup d'âneries à ce sujet. Les modules à relais avec optocoupleur apporteraient soit-disant une isolation galvanique (absence de liaison électrique), et cette isolation serait un plus.

Rien n'est plus faux. Je ne vois pas par quel miracle ou tour de magie il pourrait exister une isolation galvanique entre un ARDUINO et un module relais se partageant la même alimentation, en tout cas la même masse.

La seule manière d'obtenir une isolation galvanique totale entre l'ARDUINO et la partie commande de la bobine du relais est d'utiliser deux alimentations totalement distinctes, et de ne pas relier la broche GND de l'ARDUINO à celle du module relais.

Deuxièmement, on se demande ce que peut bien apporter une isolation galvanique entre l'ARDUINO et la partie commande de la bobine du relais. Il n'y a aucune que cela apporte quoi que ce soit. Par contre l'isolation galvanique est indispensable entre la partie commande de la bobine du relais et les contacts de celui-ci. Mais un relais offre déjà une isolation galvanique élevée : environ 1000V.

S'il s'agissait d'un module relais à bobine 230V, commandé par un opto-triac, je comprendrais l'utilité d'une l'isolation galvanique. Personne n'a envie de se prendre une châtaigne 230V en touchant un ARDUINO relié à la phase.

1.2. Domaine d'utilisation

En général, lorsqu'on utilise un relais, c'est que l'on a une charge 230V à alimenter. Si la charge fonctionne sous tension continue 12V ou 24V, il est préférable d'utiliser un MOSFET, ce qui apportera des avantages indéniables :

  • courant de commande minime
  • fiabilité
  • absence de bruit

J'en ai déjà parlé ici :

MOSFETS de puissance 

Un Module à 8 ou 16 Mosfets

Piloter des Relais ou des MOSFEts à l'aide d'un Module MCP23008 ou MCP23017 

1.3. Dissipation

Ces relais dissipent environ 350mW lorsque leur bobine est alimentée.

Si le courant traversant les contacts est important, le résistance de contact (en général 100mΩ) dissipera également de la puissance, par exemple 1W pour 10A, et provoquera une augmentation supplémentaire de température.

Cela paraît peu, mais cela peut poser des problèmes dans un boîtier de très faibles dimensions et non ventilé. La bobine peut s'échauffer, se dilater, et se coincer en position contacts fermés. Cela m'est déjà arrivé sur une prise connectée du commerce.

1.4. Module relais 3V

Il existe peu de modules relais fonctionnant sous 3V. ce point est très dérangeant lorsque l'on désire commander un relais à partir d'un microcontrôleur 3.3V.

D'autre part un module relais 3V ne peut être alimenté directement à l'aide d'une batterie (LITHIUM-ION ou LIPO), car il ne supportera pas la tension de 4.2V de ces batteries à pleine charge.

1.5. Module relais bistable

 Avec un grand nombre de relais l'utilisation de modèles bistables permet de limiter la consommation de l'ensemble.

Avec 8 relais 5V par exemple, s'il sont tous fermés, la consommation sera de 150mA par relais, donc 1.2A au total.

Si l'on utilise des relais bistables, le module consommera 150mA à chaque commutation pendant quelques dizaines de millisecondes, ensuite cette consommation retombera à ZÉRO.

L'alimentation sera donc beaucoup moins puissante qu'avec des relais traditionnels.

J'ai déjà utilisé ce type de relais ici :

Une prise connectée MYSENSORS

Un télérupteur MYSENSORS pour rail DIN 

Le relais bistable possède soit une bobine que l'on alimente dans un sens ou dans l'autre pour fermer ou ouvrir les contacts, soit deux bobines avec un point milieu. La durée d'alimentation des bobines est très courte (10ms à 20ms).

J'en ai déjà parlé ici :

Piloter un relais. Transistor unipolaire ou bipolaire ?

Ce type de relais permet d'une part d'économiser l'énergie, et d'autre part d'éviter une surchauffe de la bobine si celle-ci est sous tension pendant une durée importante, surtout si le montage est intégré dans un boîtier non ventilé.

Les relais bistables ne sont pas forcément plus cher. Par exemple un OMRON G5RL-K1A-E 5V (bistable) coûte même 10% moins cher qu'un FINDER 40.61.9.005.0000 (simple).

Le seul inconvénient est que le relais bistable mobilise deux sorties du microcontrôleur.

Les modules à relais bistables sont pratiquement inexistants sur le marché. On peut noter celui-ci (12V), disponible sur AliExpress :

Attention aux modules dits bistables, qui ne sont en réalité que des relais classiques commandés par une électronique gérant deux états :

D'autre part ce module possède une seule broche de commande, et fonctionne comme un télérupteur. Le microcontrôleur n'a donc aucun moyen de savoir dans quel état le relais va basculer.

2. Les besoins

J'avais déjà décrit une carte à 4 relais ici :

ARDUINO : prototypage amélioré sur breadboard

Je vais présenter ici plusieurs modules étudiés récemment pour couvrir mes besoins pour plusieurs projets :

  • 1 module à relais simple 16A
  • 3 modules à relais bistable 16A
  • 2 module I2C à relais classiques 10A ou 16A
  • 4 modules I2C à relais bistable 16A

Ces modules ont des caractéristiques communes :

  • des relais de qualité
  • pas d'optocoupleur
  • pas de LEDs
  • commande basse tension (3V à 5V)
  • commande par un niveau haut
  • des trous de fixations

3. Les schémas

Les schémas suivants ont un point commun. Les contacts des relais sont en parallèle, ce qui permet de doubler le courant admissible.

Certains relais FINDER SPDT (série 40.61 par exemple) peuvent être remplacés par des DPDT (série 40.52 par exemple). Le brochage est identique.

La plupart des modules disposent d'un connecteur J1 d'alimentation séparée pour les bobines de relais. L'utilisation est la suivante :

  • alimentation en 5V : mettre en place un cavalier sur les broches 2 et 3
  • alimentation séparée de la partie puissance : alimenter par les broches 1 (GND) et 3 (5V, 12V ou 24V), en fonction des relais utilisés.
  • pour obtenir un module relais 12 ou 24V, il suffit de remplacer les relais 5V par des modèles 12V ou 24V.

3.1. Transistors de commande

Pour commander un relais, on peut utiliser soit des transistors (2N2222 par exemple) ou un ULN2803A.

3.1.1. Transistor

Rappelons le schéma classique d'une commande de relais :


Calculons la résistance de base du transistor. Le 2N2222 a été choisi pour son gain important, mais également pour sa tension de saturation faible (45mV sur un relais du type SONGLE SRD-05VDC-SRD).

Ce transistor sera capable de piloter des relais 24V. Au delà, on peut s'orienter vers un 2N4238, par exemple, supportant 60V.

Le courant de bobine d'un relais OMRON G5RL-K1A-E 5V est de 120mA, et 130mA pour le FINDER 40.61.9.005.

Le gain du 2N2222 est de 50 pour un courant de collecteur de 130mA. Le courant minimal pour assurer la saturation sera de 130mA / 50 = 2.6mA. Nous allons doubler cette valeur par sécurité : 5mA.

Le courant de base maximal du 2N2222 est de 50mA, il supportera donc sans problème 5mA.

Il faut considérer deux cas :

  • commande en 5V (premier montage)
  • commande entre 3V à 3.3V correspondant à un microcontrôleur alimenté par batterie LITHIUM-ION sur son entrée VIN, ou à l'aide d'un régulateur externe 3.3V.

Pour le deuxième cas, quand la tension de la batterie descendra en dessous de 3.2V, le microcontrôleur sera alimenté sous 3V (régulateur LDO avec 200mV de chute de tension drop-out).

Pour une commande en 5V la résistance de base sera au maximum de (5V - 0.6V) / 5mA = 880Ω.

Pour une commande en 3V la résistance de base sera au maximum de (3V - 0.6V) / 5mA = 480Ω.

Avec cette résistance, pour une commande en 3.3V le courant de base sera 10% supérieur.

Si l'on adopte un relais 12V le courant de bobine sera moins important : 50mA. Il est facile de refaire les calculs.

3.1.2. ULN2803

L'ULN2803 est constitué de 8 transistors darlington. Il possède tous les composants nécessaires :

  • 8 transistors pouvant accepter 500mA
  • résistances de base
  • diodes de roue libre

L'ULN2803 remplace donc avantageusement les 8 transistors d'un montage classique, avec leurs composants annexes. La largeur de la carte en sera fortement réduite. 

De plus il supporte 50V, et pourra donc piloter des relais 48V.

La résistance de base d'un ULN2803 a une valeur de 2.7KΩ. La tension VBE est de 1.3V :

  • le courant de base sous 5V sera de : (5V - 1.3V) / 2700 = 1.3mA
  • le courant de base sous 3.3V sera de : (3.3V - 1.3V) / 2700 = 0.74mA

Un microcontrôleur ou un expander est capable de fournir 20mA en sortie. Comme l'ULN2803 a un gain très important (1000) il n'aura aucun mal à piloter le relais.

L'ULN2003A a toutefois un inconvénient : c'est un darlington, et il occasionne une chute de tension (VCEsat) de 1V sur la commande de bobine du relais.

Avec un montage à transistors 2N2222, cette chute de tension est de seulement 45mV.

Avec un relais 5V il restera 4V aux bornes de la bobine. Les relais, heureusement, sont tolérants :

  • un SONGLE SRD-05VDC-SRD réclame 75% de la tension nominale
  • un OMRON G5RL-K1A-E réclame 70% de la tension nominale
  • un FINDER 40.61.9.005 réclame 80% de la tension nominale

Avec certains relais (le FINDER par exemple), 4V de tension de commande risquent d'être insuffisants. 

Par contre avec un relais 12V il restera 11V aux bornes de la bobine, ce qui plus acceptable. Pour ma part je réserverais ce genre de montage à des relais 12V ou 24V.

3.2. Les modules relais bistable

Les modules suivants répondent à un besoin assez général : proposer une solution alternative aux modules du commerce, en utilisant des relais bistables.

3.2.1. Module relais bistable double bobine

Ce module est équipé comme suit :

  • 1 relais OMRON G5RL-K1A-E 5V 16A
  • 2 transistors 2N2222
  • 2 résistances 680Ω
  • 2 diodes de roue libre 1N4148
  • 1 connecteur DUPONT mâle 4 broches
  • 1 borniers 16A

Un relais bistable à double bobine est utilisé :

Le relais dispose de 3 broches pour les bobines :

  • un point commun à relier au + de l'alimentation
  • deux broches SET et RESET à relier aux collecteurs de 2 transistors de commande

Une impulsion 5V sur la broche 2 du connecteur d'entrée suffit à fermer les contacts du relais.

Une impulsion 5V sur la broche 3 du connecteur d'entrée suffit à ouvrir les contacts du relais.

Pour obtenir un module relais 12 ou 24V, il suffit de remplacer le relais 5V par un modèle 12V ou 24V. Cela n'aura pas d'impact sur les niveaux de tension de commande (5V).

J'utilise ce module sur un montage à base d'ARDUINO PRO MINI 5V 16MHz alimenté sur secteur.  L'électronique est confinée dans un petit boîtier étanche, le relais bistable permet d'éviter l'échauffement.

3.2.2. Module double relais bistable simple bobine


Ce module est équipé comme suit :
  • 2 relais OMRON G5RL-U1A-E 5V 16A
  • 1 L293D
  • 1 connecteur DUPONT mâle 7 broches
  • 1 connecteur DUPONT mâle 3 broches
  • 2 borniers 16A

Par rapport au schéma précédent, un relais bistable à simple bobine est utilisé :

Le relais dispose de 2 broches pour la bobine. Pour le piloter on alimente la bobine, pendant un bref instant, dans un sens ou dans l'autre pour fermer ou ouvrir les contacts. Il nous faut donc un pont en H.

Un L293D, que l'on utilise en général pour alimenter des moteurs à courant continu, convient parfaitement ici. Il permet même de se passer de diodes de roue libre.

Attention : le L293D est équipé de diodes, ce n'est pas le cas du L293.

La broche 7 permet d'alimenter la partie logique 5V du L293D. Cette tension de 5V est une obligation (4.5V à 7V), ce circuit ne saurait être alimenté sous 3.3V.

Les tensions sur les entrées de commande, par contre, peuvent accepter une tension de 3.3V sans problème (au minimum 2.3V).

La broche 6 ENABLE permet d'activer le L293D ou non. Cette broche, lorsqu'elle est à ZERO volts, permet d'économiser de l'énergie (10mA au lieu de 27mA à 35mA).

Les broches 2 à 5 permettent de désactiver et d'activer les relais 1 et 2.

A noter : si 10mA au repos est une consommation trop importante on peut remplacer le L293D par un TB6612FNG. La consommation tombera à 1µA.

Un sketch de commande est disponible :

https://bitbucket.org/henri_bachetti/arduino-relay-modules/src/master/arduino/dual-bistable-relay/dual-bistable-relay.ino

3.3. Les modules relais 3V

Les modules suivants répondent à un besoin précis : pouvoir être commandés par une carte ARDUINO PRO MINI 3.3V ou un ESP8266 ou ESP32, sans pour autant devoir ajouter une alimentation 5V, 12V ou 24V pour le relais.

Ils peuvent être alimentés sous 3.3V, ou 3.7V dans le cas d'une alimentation par batterie LITHIUM-ION ou LIPO (3V à 4.2V).

3.3.1. Module relais classique

Ce module est équipé comme suit :

  • 1 relais FINDER 40.61.9.005.0000
  • 1 module convertisseur STEP-UP XR2981
  • 1 transistor 2N2222
  • 1 résistance 390Ω
  • 1 diode de roue libre 1N4148
  • 1 connecteur DUPONT mâle 4 broches
  • 1 bornier 16A

C'est un relais classique, comme en sont équipés les modules du commerce, sauf que celui-ci est un relais 16A de marque FINDER, gage de qualité.

La particularité de ce module relais est d'utiliser un convertisseur STEP-UP XR2981 pour alimenter la bobine du relais en 5V.

Module XR2981 5V

Le module XR2981 consomme 120µA au repos.

La faible résistance R1 à la base du 2N2222 permet d'accepter une tension de commande plutôt basse (broche 2), de 3V.

La broche 4 du connecteur d'entrée est une sortie 5V que l'on pourra utiliser pour alimenter un module ou plusieurs modules 5V.

On peut parfaitement utiliser un relais 12V ou 24V, en remplaçant le XR2981 par un module SX1308 (mêmes dimensions, même brochage), que l'on réglera sur 12V ou 24V, mais attention la tension sur la broche 4 du connecteur sera également de 12V ou 24V.

Module SX1308 réglable

Le module SX1308 consomme 1mA au repos.

Comme tout module relais du commerce, celui-ci ne devra pas être enfermé dans un boîtier de dimensions très réduites non ventilé, sauf si la durée de fonctionnement du relais est courte.

3.3.2. Module relais bistable

Ce module est équipé comme suit :
  • 1 relais OMRON G5RL-K1A-E 5V 16A
  • 1 module convertisseur STEP-UP XR2981
  • 2 transistors 2N2222
  • 2 résistances 390Ω
  • 2 diodes de roue libre 1N4148
  • 1 connecteur DUPONT mâle 5 broches
  • 1 bornier 16A

Ce module reprend la conception du précédent, en adoptant un relais bistable à deux bobines.

Ici c'est la broche 5 du connecteur d'entrée qui est une sortie 5V. 

3.4. Augmenter le nombre de relais

Il est possible bien entendu de réaliser des modules à 4, 8 ou 16 relais, en suivant les mêmes principes que précédemment, mais que penser d'un module à 8 ou 16 relais bâti de cette manière ?

Il monopolise 8 ou 16 sorties de l'ARDUINO. On constate qu'avec 16 relais, les limites d'un ATMEGA328P sont atteintes. On peut certainement mieux faire.

Les modules relais ont évolué, grâce je pense à des optocoupleurs plus sensibles. Le dernier que j'ai acheté (4 relais) demande un courant de commande de seulement 1.4mA. Un module 16 relais aura donc besoin de 22mA au total, ce qu'une carte ARDUINO est parfaitement capable de fournir.

Les modèles un peu plus anciens demandaient un courant de commande de 5mA. Si tous les relais sont activés, un module 8 relais consommera 40mA sur les sorties du microcontrôleur, et cette consommation montera à 80mA pour un module à 16 relais.

Attention : avec certains module relais anciens et bas de gamme du commerce ce courant de commande peut doubler, et on approche dangereusement de la limite des 200mA du microcontrôleur.

3.4.1. Expander

Un expander d'entrées / sortie I2C 8 bits ou 16bits peut également être utilisé afin de limiter le nombre de broches de commande :

  • un MCP23008 + 8 transistors + 8 relais classiques
  • un MCP23008 + 8 transistors + 4 relais bistables
  • un MCP23017 + 16 transistors + 16 relais classiques
  • un MCP23017 + 16 transistors + 8 relais bistable

Un module relais équipé d'un expander MCP23017 I2C 16 canaux permettra de piloter 16 relais (ou 8 relais bistables). Comme le MCP23017 possède 3 broches de sélection d'adresse I2C, on peut connecter jusqu'à 8 modules. Cela permettra de piloter en tout 128 relais (ou 64 relais bistables).

Le nombre de broches de commandes est réduit à seulement 2 (SDA et SCL) :

  • ARDUINO : A4 & A5
  • ESP8266 : GPIO4 & GPIO5
  • ESP32 : GPIO21 & GPIO22

Le câblage sera donc réduit par l'utilisation du bus I2C.

3.4.2. Cartes commerciales

Des solutions commerciales équipées d'un expander existent :

Cette carte à 8 relais utilise un expander I2C PCF8574, un 74HC240 et un ULN2803A :

https://www.ereshop.com/shop/index.php?main_page=product_info&cPath=143_178&products_id=788

Son prix est assez élevé : 42$

3.4.3. Réalisation à l'aide de modules du commerce

Il est possible d'utiliser un module à relais et un module expander du commerce :

Module à 8 relais


Module MCP23017

On devra donc relier les sorties du module expander aux entrées du module à relais. J'ai déjà écrit un article à ce sujet :

Piloter des Relais ou des MOSFEts à l'aide d'un Module MCP23008 ou MCP23017

3.4.4. Réalisations personnelles

Si l'on désire une solution tenant sur une seule carte, ou une solution à relais bistables, il faudra la réaliser soi-même.

Les exemples suivants sont construits autour d'un expander MCP23008 ou PCF8574. Ils utilisent des transistors 2N2222 ou un driver ULN2803.

Comme pour les exemples précédents, pour obtenir un module relais 12 ou 24V, il suffit de remplacer les relais 5V par des modèles 12V ou 24V (et même 48V pour le ULN2803).

Certains modules utilisent des relais OMRON-G5RL-K1A-E (SPST), d'autres des OMRON-G5RL-K1-E (SPDT). Ils sont compatibles broche à broche.

Un cavalier (JP1 sur les schémas) permet de relier les broches 4 et 5 du connecteur dans le cas où l'on désire alimenter uniquement en 5V avec la même source d'alimentation.

Trois ponts de soudure (JP2) permettent de changer l'adresse I2C du module (0x20 à 0x27) :
 

Les deux composants MCP23008 et PCF8574 occupent la même plage d'adresses I2C.

A0, A1 et A2 correspondent aux broches suivantes :

    MCP23008 : 5, 4, et 3
    MCP23017 : 15, 16 et 17
    PCF8574 : 1, 2 et 3

L'adresse I2C est sélectionnée à l'aide de points de soudure. Exemple pour un MCP23017 :

Pour obtenir l'adresse 0x20 il faudra réunir les pastilles 1-2, 4-5, 7-8
Pour obtenir l'adresse 0x21 il faudra réunir les pastilles 2-3, 4-5, 7-8
Pour obtenir l'adresse 0x22 il faudra réunir les pastilles 1-2, 5-6, 7-8
Pour obtenir l'adresse 0x23 il faudra réunir les pastilles 1-2, 4-5, 8-9
etc.

3.4.4.1. Exemple avec un MCP23008 et 8 relais classiques


Ce module est équipé comme suit :
  • 8 relais FINDER 36.11.9.005 10A (compatibles avec les SONGLE SRD-05VDC-SRD)
  • 8 transistors 2N2222
  • 8 résistances 680Ω
  • 8 diodes de roue libre 1N4148
  • 1 connecteur DUPONT mâle 4 broches
  • 1 connecteur DUPONT mâle 3 broches
  • 8 bornier 10A

La broche 4 permet d'alimenter le MCP23008. Il est possible de l'alimenter sous 3.3V ou 5V (1.8V à 5.5V). Le MCP23008 consomme 2µA.

Comme tout module à relais du commerce, celui-ci ne devra pas être enfermé dans un boîtier de dimensions très réduites non ventilé, sauf si la durée de fonctionnement des relais est courte.

Avec 8 relais 5V par exemple, s'il sont tous activés, la consommation sera de 70mA par relais, donc 560mA au total sur la broche VCC.

3.4.4.2. Autre exemple avec un MCP23008 et 8 relais classiques

Ce module est équipé comme suit :
  • 8 relais FINDER 40.61.9.005.0000 16A
  • 1 ULN2803
  • 1 connecteur DUPONT mâle 4 broches
  • 1 connecteur DUPONT mâle 3 broches
  • 8 bornier 10A

Comme dit plus haut (3.1.2. ULN2803), je réserverais ce genre de montage à des relais 12V ou 24V.

3.4.4.3. Exemple avec un MCP23008 et 4 relais bistables

Ce schéma reprend le principe de l'exemple N°1, avec des relais bistables.

3.4.4.4. Exemple avec un PCF8574 et 4 relais bistables

Ce schéma reprend le principe du précédent, avec un PCF8574.

3.4.4.5. Autre exemple avec un MCP23008 et 4 relais bistables

Ce schéma reprend le principe de l'exemple N°2, avec des relais bistables.

Comme dit plus haut (3.1.2. ULN2803), je réserverais ce genre de montage à des relais 12V ou 24V.

3.4.4.6. Autre exemple avec un PCF8574 et 4 relais bistables

On peut réaliser le même module que précédemment avec un expander I2C PCF8574 :

Comme précédemment, les remarques concernant la chute de tension de 1V sur la commande de bobine du relais s'appliquent.

Ce montage souffre d'un autre problème. Le PCF8574 est capable de fournir seulement 100µA en sortie (niveau haut). Comme l'ULN2803 a un gain très important (1000) il pourra néanmoins piloter le relais si celui-ci réclame un courant inférieur à 100mA. Pour certains relais 5V ce courant risque d'être insuffisant.

Si l'on désire piloter absolument des relais 5V ayant un courant de bobine important, il faudra intercaler driver de ligne (un 74HC240 par exemple) entre le PCF8574 et l'ULN2803 :

74HC240

L'encombrement des deux circuits (74HC240 + ULN2803) sera sensiblement le même que celui de 8 transistors avec leurs résistances et diodes, ce qui diminue l'intérêt d'avoir recours à un ULN2803.

Pour ma part, comme précédemment, je réserverais donc ce genre de montage à des relais 12V ou 24V.

3.4.3.7. Pilotage avec un ESP32

Passons à la pratique. Avec les montages précédent (PCF8574 ou MCP23008), sur un ESP32, les connexions seront les suivantes :

  • 21 : SDA
  • 22 : SCL
  • GND
  • VDD : 3.3V
  • VCC : en fonction de la tension des relais (5V, 12V ou 24V)

Voici deux petits exemples de serveur ESP32 utilisant les librairies suivantes :

https://github.com/RobTillaart/PCF8574

https://github.com/adafruit/Adafruit-MCP23008-library

Les exemples sont situés dans la repository bitbucket (voir 7. Téléchargement). Voici les liens directs :

https://bitbucket.org/henri_bachetti/arduino-relay-modules/src/master/arduino/esp32-pcf8574/esp32-pcf8574.ino

https://bitbucket.org/henri_bachetti/arduino-relay-modules/src/master/arduino/esp32-mcp23008/esp32-mcp23008.ino

Une petite page HTML pourvue d'un bouton permet d'activer et désactiver le relais N°1 :

3.4.5. Autres exemples

Bien entendu, on pourrait imaginer différents montages sur le même principe :

  • expander PCF8574 + ULN2803 + 8 relais classiques
  • expander PCF8575 ou MCP23017 + 2 ULN2803 + 8 relais bistables
  • expander PCF8575 ou MCP23017 + 2 ULN2803 + 16 relais classiques
  • etc.

Un registre à décalage 74HC595 serait également utilisable mais il monopolisera 3 broches de l'ARDUINO, au lieu de 2 pour un expander I2C.

4. Sécurité

Lorsque l'on manipule du 230V on doit prendre des précautions, en particulier ne pas toucher les parties haute tension (contacts, bornier de sortie), ni le dessous du module.

Il est totalement déconseillé de fabriquer des cartes devant supporter du 230V à l'aide de plaquettes à pastilles. L'écartement entre pastilles est nettement insuffisant pour assurer une isolation correcte sous 230V. En conséquence un PCB s'impose.

5. Réalisation

Si les contacts du relais doivent être soumis à des courants importants, il est conseillé de surcharger les pistes de puissance à l'aide de soudure, ou de souder sur ces pistes un fil rigide de section appropriée, par exemple 1.5mm² pour 16A.

6. Photos

Voici des images des premiers modules réalisés :

Module relais bistable

Module 2 relais bistables + L293D

Le module 2 relais bistables + L293D en action :


Les autres modules devraient suivre au rythme de la création des projets qui les utiliseront.

7. Téléchargement

Pour télécharger les projets :

https://bitbucket.org/henri_bachetti/arduino-relay-modules

Cette page vous donne toutes les informations nécessaires :

https://riton-duino.blogspot.com/p/migration-sous-bitbucket.html

8. Conclusion

On pourrait penser que les modules du commerce conviennent à la plupart de nos montages, mais ce n'est pas forcément le cas, surtout si l'on prend en compte la problématique de l'alimentation par batterie et celle de l'échauffement de la bobine.

9. Liens utiles

D'autres articles à propos de relais :

Piloter un relais. Transistor unipolaire ou bipolaire ?

Piloter des Relais ou des MOSFEts à l'aide d'un Module MCP23008 ou MCP23017

Relais Retardé sans Microcontrôleur

Télécommande de Relais par Infra-Rouge


Cordialement

Henri

10. Mises à jour

12/08/2021 : ajout connecteurs de puissance + cavaliers