Un bouton power on/off pour le Raspberry Pi
Par makoto doushite le samedi, 18 août 2018, 14:20 - Raspberry Pi - Lien permanent
Je suis en train de travailler à l’élaboration d'une carte de type « Pi Hat », équivalent du « Schield » pour Arduino, à savoir une carte qu'on enfiche par dessus le Raspberry.
Cette carte destinée au Rpi Zero, comportera une sortie Audio avec son amplificateur, deux connecteurs FCP pour connecter un écran LCD de type SPI - ILI9341, un connecteur pour déporter des GPIO sur une nappe de fil, et enfin un connecteur d'alimentation 5V avec un système de bouton On/Off sécurisé.
Tout ceci dans le but d’intégrer un montage dans une maquette…
- En recherchant une solution pour gérer le bouton On/Off, je suis tombé sur quelques montages, dont celui-ci : https://www.youtube.com/watch?v=DM04K8hSQc4, http://www.tctec.net/RPI_Power_Button.pdf, au schéma électronique carrément imbitable !
Après beaucoup de temps perdu à tenter de comprendre ce dessin, en vue de bien sûr tester le concept, j'ai dû me résoudre à le redessiner complètement, en respectant les normes de représentation. Le voici : ( ouf ! )
- Fonctionnement :
- Pour mettre en route le Rpi, effectuer une pression longue sur le bouton SW1, afin de laisser le temps au signal TXD0 de passer à l'état haut et de faire coller le relais qui maintiens alors le Rpi alimenté en énergie.
- Pour éteindre le Rpi, le bouton SW1 étant connecté sur une sortie GPIO, il suffit de le presser normalement pour déclencher un arrêt propre de GNU/Linux grace au script Python3 ci-dessous.
- Une fois arrêté, le signal TXD0 passe donc à l'état bas et le relais se décolle alors, coupant l'énergie du Rpi.
- Le bouton SW2 sert à couper brutalement le courant, en cas de plantage du Rpi
- Ce montage ne gère pas le reboot. Effectuer un redémarrage éteindra donc le Raspberry, car durant le redémarrage TXD0 passe à l'état bas…
Édit : Passer C2 à 220µF et le relais attendra 5 secondes avant de couper , ça devrait permettre un reboot sans coupure.
- Prérequis :
sudo apt-get install python3 RPi.GPIO
- Écrire le script :
nano /home/pi/SoftOffButton.py
Avec dedans :
import RPi.GPIO as GPIO import time import os import signal print ("Soft Off Button") GPIO.setmode(GPIO.BCM) GPIO.setup(21, GPIO.IN, pull_up_down = GPIO.PUD_DOWN) def button_pressed(channel): print ("Boutton Off pressé") os.system("sudo shutdown now") GPIO.add_event_detect(21, GPIO.RISING, callback=button_pressed, bouncetime=300) signal.pause()
Pour démarrer automatiquement le programme python dés le démarrage du Raspberry, il faut créer un service :
sudo nano /etc/systemd/system/SoftOffButton.service
Avec dedans :
[Unit] Description=Démarre le script SoftOffButton [Service] ExecStart=/usr/bin/python3 /home/pi/SoftOffButton.py [Install] WantedBy=multi-user.target
Installer le service au démarrage :
sudo systemctl --system daemon-reload sudo systemctl enable SoftOffButton.service
Pour manipuler le service :
sudo systemctl status SoftOffButton.service sudo systemctl start SoftOffButton.service
- Ce montage fonctionne très bien, et vu le temps passé dessus j'ai voulu le partager à ceux qui pourraient en avoir besoin.
Je ne compte pas l'utiliser pour mon « Pi Hat », car le relais prendrait trop de place, et j'envisage une solution plus souple et élégante à base de microcontrôleur.
- Édition du 1 Décembre 2019 :
Je m'en suis rendu compte avec un RPi pi Zero, le port série (TXD0, RXD0) n'était pas actif par défaut, rendant alors le montage inopérant.
J'ai donc dû l'activer via « sudo raspi-config » ou en passant à 1 la ligne « enable_uart » du fichier « /boot/config.txt ».
Commentaires
Génial. Exactement ce qu’il me fallait.
Merci pour le partage !
bravo Makoto pour ce boulot de mise en ligne !!
passe C2 à 220uF et il attendra 5 secondes avant de couper , ça devrait te permettre un reboot sans coupure
5*( 220E-6 * 4700 ) = 5.17secondes
Ha oui ! Pas con ;
Merci
Bonjour,
quelles est l'utilité de prendre des diodes schottky? peut ont les remplacer par du plus classique?