Ceci est une ancienne révision du document !
Système d'ouverture du garage et de la porte arrière
Le boîtier rose fixé près du garage contient un Arduino Uno (clone AZ-Delivery), une télécommande 433 MHz de la porte de garage et le lecteur de badges RFID. Il est branché en USB sur le serveur Atom (192.168.42.1), qui le pilote de deux façons :
- Framateam (Mattermost) : commandes slash dans les canaux autorisés → ouvrir le garage, ouvrir / fermer la porte arrière ;
- Badge RFID : un badge de la liste ouvre le garage uniquement.
Framateam ──HTTP :4280──► nginx ──► server.py (Flask, 127.0.0.1:8001) ──USB série 9600──► Arduino ──► télécommande garage (D9) Badge ──► lecteur RFID USB ──► rfid.py ──► rfid.log ──► gate-service.sh (perm.list) ──┘ └──► télécommande serrure (D10 / D11)
Électronique
Schéma Fritzing modifiable : boitier_garage_fritzing.zip (contient boitier-garage.fzz, à ouvrir avec Fritzing)
| Broche Arduino | Fonction | Fonctionnement |
|---|---|---|
| D9 | Bouton de la télécommande du garage | Mise à la masse pendant 800 ms = appui (ouvre ou ferme) |
| D10 | Télécommande de la serrure : ouvrir | Impulsion 5 V de 2,5 s |
| D11 | Télécommande de la serrure : fermer | Impulsion 5 V de 2,5 s |
| USB | Liaison avec l'Atom | Série 9600 bauds, puce CH340 |
La télécommande du garage (PCB vert HXQ920BT-4) n'a plus de pile : elle est alimentée par l'Arduino. Les boutons de la télécommande de la serrure sont court-circuités par D10 / D11.
Anciennement, un servomoteur appuyait physiquement sur le bouton de la télécommande ; il a été remplacé par la commande électrique de D9 (code servo conservé en commentaire ci-dessous).
Firmware Arduino (LOV garage opener v3)
Protocole : un caractère sur le port série (9600 bauds). O = garage, E = ouvrir la porte arrière, L = fermer la porte arrière. Tout autre caractère est ignoré. Au démarrage, l'Arduino affiche LOV garage opener v3.
#include <Servo.h> Servo servo; void setup() { pinMode(10, OUTPUT); digitalWrite(10, LOW); pinMode(11, OUTPUT); digitalWrite(11, LOW); Serial.begin(9600); Serial.println("LOV garage opener v3"); /*servo.attach(9); servo.write(0); delay(400); servo.detach();*/ pinMode(9, INPUT); digitalWrite(9, HIGH); } void loop() { int c = 0; c = Serial.read(); if (c == 'O') { Serial.println("opening garage..."); /*servo.attach(9); servo.write(30); delay(1000); servo.write(0); delay(400); servo.detach();*/ pinMode(9, OUTPUT); digitalWrite(9, LOW); delay(800); pinMode(9, INPUT); digitalWrite(9, HIGH); Serial.println("done"); } else if (c == 'E') { //Serial data for shorting the remote controller of backdoor Serial.println("opening back door..."); digitalWrite(10, HIGH); delay(2500); digitalWrite(10, LOW); Serial.println("done"); } else if (c == 'L') { //Serial data for shorting the remote controller of backdoor Serial.println("closing back door..."); digitalWrite(11, HIGH); delay(2500); digitalWrite(11, LOW); Serial.println("done"); } }
Vérifié le 10/10/2026 : ce code correspond au firmware présent sur la carte.
Serveur (Atom)
Pré-requis :
apt install python3-flask python3-serial python3-evdev inotify-tools tmux nginx adduser lov dialout
Fichiers dans /home/lov/garage :
| Fichier | Rôle |
|---|---|
server.py | Serveur Flask (127.0.0.1:8001) qui envoie O / E / L à l'Arduino (/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0) |
gate-service.sh | Surveille rfid.log, cherche le badge dans perm.list et ouvre le garage |
rfid.py | Lit le lecteur RFID USB et ajoute chaque badge lu à rfid.log |
perm.list | Badges autorisés, une ligne ID pseudo |
rfid.log | Journal de tous les badges passés |
nginx écoute sur le port 4280 et ne transmet au serveur Flask que les URL secrètes (voir /etc/nginx/sites-enabled/default sur l'Atom — ne pas les recopier sur le wiki) :
| Route | Déclenchée par | Action | Contrôle |
|---|---|---|---|
| ouverture locale (GET) | gate-service.sh (badge) | garage | aucun : réservé à l'usage local |
| garage (POST) | commande slash Framateam | garage | canal garage ou canal porte |
| entrer (POST) | commande slash Framateam | ouvre la porte arrière + message « X a ouvert le local » | canal porte |
| sortir (POST) | commande slash Framateam | ferme la porte arrière + message « X a fermé le local » | canal porte |
Lancement au démarrage, dans /etc/rc.local :
tmux new -s garage -d 'sudo -u lov -g lov /usr/bin/python3 /home/lov/garage/server.py' tmux new -s rfid -d /home/lov/garage/gate-service.sh
Pour voir ce qui se passe : sudo tmux attach -t garage ou sudo tmux attach -t rfid (sortir avec Ctrl-B puis D).
Ajouter un badge
- Passer le badge sur le lecteur.
- Sur l'Atom :
tail ~/garage/rfid.log→ noter le 2e champ (8 caractères, ex.A1B2C3D4). - Ajouter la ligne
<ID> <pseudo>dans~/garage/perm.list. C'est pris en compte immédiatement.
Dépannage
didn't find the garage opener banner: l'Arduino ne répond pas → vérifier le câble USB, puisscreen /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0 9600doit afficher la bannière.could not open port: Arduino débranché (ls /dev/serial/by-id/).- Le badge ne fait rien : lecteur débranché (
lsusb), ou badge absent deperm.list. - L'Arduino répond
donemais la porte ne bouge pas : vérifier la télécommande (alimentation, bouton) —doneveut dire « impulsion envoyée », pas « porte ouverte ».
Documentation technique détaillée (rétro-ingénierie, schéma, sauvegarde du firmware) : dépôt AdminLova, docs/boitier-garage/.



