Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the jetpack domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /home/nicolar/www/wp-includes/functions.php on line 6114
PiKot : domotique facile – Nicolas Colsoul

PiKot : domotique facile

J’ai déjà eu l’occasion de vous parler de mon installation domotique à base de Raspberry Pi dans ma chambre d’étudiant. Cette installation me suit maintenant depuis quelques années, mais la nouvelle disposition de la pièce m’a suggéré une certaine centralisation des différents relais.

Initialement, un câble avec les différents signaux faisait le tour des murs ; une alimentation 5V, une masse et un signal par relais. Un RJ45 de récupération faisait l’affaire. Les objets à actionner étant assez distants, cette installation était, selon moi, la plus simple.

Mais j’ai pu constater dans cette nouvelle organisation que ces fameux objets s’étaient considérablement rapprochés autour de la même prise et également du Raspberry Pi central. L’idée m’est venue de concevoir une multiprise commandée par Raspberry.

Je voulais que, pour assurer une bonne fiabilité, le montage soit sur un PCB dédié. Je voulais aussi que les IOs du Raspberry puissent être accessibles sans devoir changer tout le hardware. J’avais encore un MCP23017, le bien connu étendeur d’IOs sur bus I2C, du projet mécatronique de l’UCL.

La conception est assez simple et animera quelques soirées d’été sur le site EasyEDA (que je conseille pour les débutants). On a un connecteur dédié à la réception de la télécommande (voir cet article), 4 relais avec leur alimentation et une LED témoin, l’étendeur d’IOs et des connecteurs en tout genre. L’idée ici est de carrément faire la distribution de la tension AC sur le PCB. En d’autres mots, la carte a une entrée 220V et le distribue par l’intermédiaire des relais.

Schématique.

Notez que les LEDs 1, 2, 3 et 4 sont dans le mauvais sens et que des diodes de roue libre devraient être ajoutées. Les résistances de pullup sur les lignes I2C ne sont ici pas indispensables.

Le routage du PCB est aussi assez simple. Pas beaucoup de composants et facilement agençables. Les connecteurs sont sur les extrémités. Les boîtiers choisis pour les différentes références sont ceux que j’avais en stock (résistances et LEDs 1206 et transistors SOT23). Les pistes qui gèrent le 220V font une largeur de 120 mil, ce qui (selon la figure suivante) permet de faire passer 5 ampères de manière raisonnable, soit une puissance active de 1 100 watts. Ce qui est largement suffisant pour 3 lampes.

Largeur des traces selon le courant.

Néanmoins, je choisis de ne pas recouvrir ces pistes de vernis mais de les renforcer généreusement à l’étain. Pour éviter les mauvaises surprises, le plan de masse ne couvre pas cette zone.

Routage (sans plan de masse).

Pour quelques dollars, JLCB vous tire 5 PCBs et vous les recevez 10 jours plus tard dans votre boîte aux lettres. Leur soudure est aisée parce que la plupart des composants sont traversants et d’assez grande taille.

Carte assemblée.

Quelques lignes de code en Python pour automatiser les entrées de la télécommande vers les sorties des relais et c’est joué. 

#!/usr/bin/python
# Author : Nicolas Colsoul

import smbus
import time

bus = smbus.SMBus(1)
MCP23017_ADDRESS = 0x27

# MCP23017 init
bus.write_byte_data(MCP23017_ADDRESS, 0x00, 0xF0) # Pins A0-3 as output, pins A4-7 as input
bus.write_byte_data(MCP23017_ADDRESS, 0x0C, 0xF0) # Pins A4-7 internal pullup
bus.write_byte_data(MCP23017_ADDRESS, 0x14, 0x00) # Reset all

# Run
while True:
    switch = bus.read_byte_data(MCP23017_ADDRESS, 12) >> 4
    s0 = (switch & 0b1000) >> 3
    s1 = (switch & 0b0100) >> 2
    s2 = (switch & 0b0010) >> 1
    s3 = (switch & 0b0001)

    status = bus.read_byte_data(MCP23017_ADDRESS, 12)

    if s0:
        bus.write_byte_data(MCP23017_ADDRESS, 0x14, status ^ 0b00010000)
    if s1:
        bus.write_byte_data(MCP23017_ADDRESS, 0x14, status ^ 0b00000100)
    if s2:
        bus.write_byte_data(MCP23017_ADDRESS, 0x14, status ^ 0b00000010)
    if s3:
        bus.write_byte_data(MCP23017_ADDRESS, 0x14, status ^ 0b00000001)

    time.sleep(1)

J’avais d’abord prévu de faire un boîtier imprimé en PLA avec des prises directement disponibles en façade. J’ai vite laissé tomber cette idée au vu du temps d’impression. J’ai préféré improviser avec une scie cloche et une planche de contreplaqué. Le boîtier est fixé sur le flanc de mon bureau et assure parfaitement sa tâche. J’ai rajouté une commande cron pour automatiser le lancement du script au démarrage. Fiabilité assurée.

Raspberry, alimentation et la carte dédiée dans le châssis (sans la façade).

Si vous êtes intéressé par le PCB, je peux gratuitement vous en envoyer un. Quelques-uns traînent dans mes tiroirs.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *