Cet article à pour but de faire interagir le Raspberry Pi avec n’importe quel dispositif basse tension (230 v) de votre maison ou appartement. Ceci vous permettant de faire un peu de domotique comme allumer ou éteindre une ampoule, une prise de courant, un appareil électrique ou encore contrôler un portail électrique.
Pour cela on va se servir d’un petit module appelé un relais. Vous en trouverez sur le net très facilement.
Pour contrôler le module nous allons le connecter à un port GPIO du RPI.
Attention, on ne peut bien sur pas se connecter sur n’importe quelle broche. Vous pouvez lire cette introduction écrite par François pour vous familiariser avec se qu’est un port GPIO.
Pour faire un recap, le connecteur GPIO est équipé de :
- d’entrées / sorties numériques (GPIOx) permettant de faire du tout ou rien ( entrée/sortie numérique 0 ou 1)
- Un port série (UART)
- Un bus I2C pour des transmission vers des composants électroniques utilisant ce protocole (I2C)
- Un bus SPI, qui est un bus série ressemblant au bus I2C mais beaucoup plus rapide (SPI).
- Une sortie + 5 Volts pour alimenter divers montages (maximum 500 mA suivant le type de RPI utilisé)
- Une sortie + 3.3 Volts avec un maximum de 50 mA.
Les broches sont à usage multiple :
- en entrée numérique tout ou rien, pour détecter un interrupteur par exemple
- en sortie numérique tout ou rien, pour activer un relais par exemple (justement ce qu’on va faire plus loin)
- en sortie numérique PWM, pour contrôler la puissance moyenne d’une led par exemple
- en protocole I2C, d’échanger avec une ou plusieurs puces
- en protocole SPI, idem
- en protocole UART, d’échanger avec une seule puce (ou un PC)
Au sommaire :
Premier test avec une LED
A l’aide d’un script Python, on va passer l’état de la broche GPIO 4 de 0 à 1. Ce qui aura pour effet de faire passer le courant dans la LED et l’éclairer. Le RPI sera protégé par une résistance de 100 Ohm (marron, noir marron, or). Le circuit est fermé par un raccordement à l’une des broches « GND» qui représente donc la masse.
C’est un peu le « hello world » des circuits électroniques pour Raspberry Pi. Vous le trouverez un peu partout sur le net. Je ne passe plus de temps à expliquer, l’objectif ici est de valider que notre script est capable de commuter un des ports GPIO.
Le script se base sur la librairie python RPI.GPIO. Il en existe d’autres comme gpiozero. Libre à vous de modifier le script pour utiliser la librairie de votre choix si vous etes à l’aise avec l’exercice.
On installe la librairie à l’aide du gestionnaire PIP:
1 |
sudo pip3 install RPi.GPIO |
On ajoute notre script avec le contenu suivant:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
import RPi.GPIO as gpio import time from signal import signal, SIGINT from sys import exit def handler(signal_received, frame): # on gère un cleanup propre print('') print('SIGINT or CTRL-C detected. Exiting gracefully') gpio.cleanup() exit(0) def main(): # on passe en mode BMC qui veut dire que nous allons utiliser directement # le numero GPIO plutot que la position physique sur la carte gpio.setmode(gpio.BCM) # defini le port GPIO 4 comme etant une sortie output gpio.setup(4, gpio.OUT) # Mise a 1 pendant 2 secondes puis 0 pendant 2 seconde while True: print("on") gpio.output(4, gpio.HIGH) time.sleep(2) print("off") gpio.output(4, gpio.LOW) time.sleep(2) if __name__ == '__main__': # On prévient Python d'utiliser la method handler quand un signal SIGINT est reçu signal(SIGINT, handler) main() |
On lance le script:
1 |
python3 test_led.py |
Utilisation du relais 5v
Maintenant on va simplement remplacer la LED (et la resistance) par le relais.
La carte relais est un commutateur électrique qui permet de commander un second circuit utilisant généralement une tension et un courant bien supérieur à ce que un dispositif électronique comme le Raspberry pourrait accepter. En gros, c’est un interrupteur qui se ferme quand on lui lui place un certain courant ou une certaine tension sur sa patte de commande. Dans notre cas c’est la tension de l’un des ports GPIO du Rpi (3.3V) qui déclenchera cet interrupteur. Voici une petite image pour bien identifier chaque élément.
Le relais se compose de deux parties.
- Une partie commande (à droite sur la photo) composée :
- VCC: broche d’alimentation de 5 v pour le relais lui même,
- GND: une masse
- IN1: broche de commande pour faire basculer l’état
- De l’autre coté, à gauche donc, on trouve la partie basse tension. C’est cette dernière partie qui sera connectée à votre dispositif que vous souhaitez piloter. Elle se compose:
- NC : signifie ‘NORMALLY CLOSED’. Cela veut dire que lorsque le relais n’a pas de signal d’entrée (0 sur la broche de commande), le circuit haute tension connecté sera actif. Si on câble comme cela il faut donc envoyer du courant à la partie commande pour faire basculer le relais.
- NO signifie ‘NORMALLY OPEN’. Cela veut dire qu’à contrario, une valeur de 5V appliqué au relais (1 sur la broche de commande) coupera le circuit haute tension et inversement.
- COM: Commun. Dans nôtre cas on va y brancher la masse du dispositif à contrôler.
Vous l’aurez compris. On ne va utiliser que deux des fiches sur les trois du relais suivant le mode de fonctionnement choisi (normalement ouvert ou fermé).
Donc le montage est simple:
- 5 v du Rpi -> Vcc 5V du relais
- Ground du Rpi -> GND du relais
- L’un des port GPIO du Rpi -> La patte de commande du relais (numéroté IN1, IN2, etc.. généralement)
Relancez le script, si le relais commute correctement, c’est tout bon!
En revanche, il est possible que le relais, comme c’est mon cas, passe bien en position fermé, mais ne revienne jamais en position ouverte.
On peut voir sur la photo de droite que même en position 0, le relais reçoit un faible courant sur sa broche. Pour palier à ce problème, on va ajouter un composant: un MOSFET, qui aura en plus pour vertu de protéger notre Pi.
Utilisation d’un MOSFET en amont du relais
Un MOSFET est un composant électronique permettant de faire de la commande en puissance. Le principe du fonctionnement de ce type de transistor est que lorsque la tension de la Gate atteint une valeur suffisante, le courant passe entre le Drain et la Source. Certains transistors sont commandés en courant, le MOSFET est commandé en tension.
-
1 = G = GATE : broche de commande. La commande ici sera le port GPIO.
-
2 = D = DRAIN : broche qui draine le courant (la charge quoi… c’est ici que l’on va raccorder le relais pour le déclencher)
-
3 = S = SOURCE : broche source de courant (ou le courant est collecté pour être envoyé vers la charge… dans notre cas, il s’agit de la masse)
Voila le schéma de la petite installation avec MOSFET modéle IRF740.
Cela fonctionne aussi avec un transistor de type 2N2222:
Le résultat:
Une fois que tout cela fonctionne, il ne vous reste plus qu’a interfacer de l’autre coté l’élément basse tension que vous souhaitez contrôler et bien sur écrire un bout de code qui correspond à vôtre besoin.
Merci à toi Nicolas de de partager ton expérience 😉 j’ai quand même failli m’étrangler quand j’ai vu que tu voulais interfacer ton relais avec un mosfet !! d’ailleurs même le 2N2222 est bien coûteux, compte tenu de la vitesse du commutation du relais, un simple BC547 fait l’affaire (tout en étant plus robuste). Quand au programme en Python, je sais que c’est la mode, mais, comme tu semble viser les débutants, avec WiringPi, un « gpio mode 4 out », suivi d’un « gpio write 4 1 » suffirait… Python ou même le C peuvent être réservés à des amateurs plus avancés. Sinon, j’ai bien aimé les illustrations soignées. Bravo!
Attention, si on met un transistor NPN genre 2N2222 ou (j’imagine) BC547, il faut mettre une résistance entre le pin GPIO et la base du transistor (j’imagine qu’1Kohm devrait faire l’affaire), sinon il y a risque de griller le transistor et/ou le GPIO.
tu as parfaitement raison ! le schéma est le suivant :
http://www.cvardon.fr/npn-gpio.jpg
une résistance de 10kOhm environ fera l’affaire
Cela dit , la résistance et la diodes semblent déjà intégrés sur le module utilisé
Ping : Contrôle d’un dispositif basse tension via Raspberry Pi et un relais – Framboise 314, le Raspberry Pi à la sauce française…. – Jhc Info
Merci pour l’article je regarde ce genre de solutions pour eviter une solution domotique coûteuse pour juste une à deux prises. Ma question est plus sur l’intégration, où peut on trouver ce genre de relai avec un boîtier pour faire propre et sécuriser l’installation ? J’ai pas envie qu’un enfant puisse toucher cette installation vu qu’elle devra se trouver à leur porté.
Que recommandez vous ?
Non les relais sont souvent comme sur la photo. C’est à vous après de faire un montage propre et sécurisé. Vous pouvez tout simplement enfermé le tout dans un boitier électronique.
Bonjour
vous avez raison d’autant que le secteur est présent sur le montage si vous alimentez une prise 🙁
pour ma part j’utilise des boites électriques qu on trouve en magasin de bricolage
mais d’autres solutions sont possibles
si boîte métallique il faut obligatoirement une terre reliée au boîtier !
cdt
françois
Ping : Variation de puissance électrique via Raspberry - Framboise 314, le Raspberry Pi à la sauce française....
Ping : Hacking website like HN in French - NSO News
Hello,
Pour info il existe des modèles de relai qui ne nécessitent pas l’usage d’un MOFSET, par example : https://www.amazon.fr/SODIAL-Trigger-Relais-Optocoupleur-Arduino/dp/B00YGPYD0S/ref=sr_1_2?__mk_fr_FR=%C3%85M%C3%85%C5%BD%C3%95%C3%91&dchild=1&keywords=sodial+relais+5v&qid=1588061055&sr=8-2
C’est quand même plus simple à mettre en place 😉
Oui c’est se que je précise à un moment dans l’article. Certains relais n’en n’ont pas besoin.
Salut à tous.
Cela ne vous choque pas, un relais fonctionnant en 5Vcc de venir le commander par la broche IN1 en 3.3Vcc ?
Combien d’articles que j’ai pu lire sur le net où le branchement se fait directement en 3.3Vcc.
Un transistor est nécessaire. Je suis du même avis que M. Christophe Vardon, un simple BC547 est largemnt suffisant.
Oui, mais voilà, cela dépend du type de relais qui est utilisé.
Ce que je reproche à tous les articles de ce genre (même celui-ci), est de ne donner aucune explication sur les caractéristiques du relais utilisé.
On doit tout deviner ! Un lien vers le pdf du datasheet aurait été le bien venu, avec quelques explications aussi.
On ne sait même pas où vous vous êtes procuré ce relais.
Par contre, celui qui est en vente chez Kubii :
–> https://www.kubii.fr/composants-raspberry-pi/1969-module-1-relais-avec-couplage-optique-5v-kubii-3272496008250.html
ne nécessite pas de transistor pour obtenir du 5Vcc sur la broche IN1.
Un montage un peu plus sophistiqué, avec par exemple deux leds, l’une sur la broche NO et l’autre sur le broche NC, nous aurait permis de mieux comprendre le fonctionnement de ce relais.
@+
Merci pour le commentaire. Je n’ai pas plus élaboré l’article. Mon métier c’est l’informatique et du coup j’ai juste souhaité déposé les informations que j’avais ici pour ne pas les perdre et pour aider d’autres débutant.
Si je vois que ça fait trop polémique je supprimerais l’article.
Salut Nicolas Marcq.
>>> Si je vois que ça fait trop polémique je supprimerais l’article.
Je ne cherche pas à polémiquer mais à signaler ce qui ne va pas.
Essayez de vous mettre à la place d’une personne qui est débutante en électronique.
Il désire reproduire votre votre sujet qui par ailleurs est intéressant.
Avec difficulté, je lis la référence suivante de votre première photo : JQC3F-05VDC-C.
Il se trouve que celui que j’ai commandé est un : SRD-05VDC-SL-C ? En quoi sont-ils différents ?
Voici une photo plus grande du relais utilisé dans ce sujet :
https://www.vs-elec.fr/5803-large_default/module-card-1-relay-5v-arduino-pic-arm-avr-dsp.jpg
Ensuite, je vois un erreur dans la valeur de la résistance du « Premier test avec une LED ».
Le GPIO de la raspberry fournit du 3.3Vcc. Avec du 100 ohms, l’intensité est de : 3.3Vcc / 100 ohms = 33mA.
Or il se trouve que la GPIO en 3.3Vcc ne doit pas dépasser 16mA.
Le total de toutes les GPIO en 3.3Vcc ne doit pas dépasser les 50mA. Je tenais à vous le signaler !
Je choisirai plutôt une résistance de 330 ohms, ce qui donne 10mA.
Et j’ai trouvé ce lien où il y a plus d’explication :
https://raspberrypi.stackexchange.com/questions/73311/using-single-5v-relay-jqc-3ff-s-z-safety-advice-required
@+
oui un datasheet aurait été le bienvenu… si on regarde la photo du module on voit clairement qu’il intègre déjà une résistance de ?? un transistor, et la diode de roue-libre
Ce genre de module peut donc être connecté directement aux gpio
Mais comme tu l’as dit, cela dépend du type de module relais utilisé
Bonjour , juste pour signaler une petite erreur , dans le commentaire du code on peut lire :
il s’ agit de la notation BCM et pas BMC , et celle-ci n ‘ utilise pas les numeros de GPIO , c ‘ est la notation wiring pi qui utilise les numeros des GPIOS .
d ‘ ailleurs c’ est tres facile a verifier , pour le IN du pilotage relais vous utilisez le pin physique 7 qui correspond au GPIO 7 ( wiring pi ) et donc au BCM 4 .
c ‘ est d’ ailleurs le seul pin qui comporte le numero de son pin physique comme nom .
Pour avoir ces indications sans confusion , la commande :
gpio readall
donne un retour de la sorte :
Merci pour votre superbe travail et partage !
Cordialement .
Bonjour,
J’ai bien aimé l’article, mais malheureusement ça ne fonctionne pas chez moi pour je ne sais quelle raison.
En fait, si j’alimente mon relais en 5v, tout les pins que je cherche à utiliser sont en high. Quelque soit le montage (avec ou sans mofset, résistance, système anti-murphy…)
Par contre, si j’alimente en 3.3v, ça passe… Je vais voir pour acheter le relai vendu chez kubii pour tester.
C’est frustrant ! 🙂
merci