vendredi 18 octobre 2019

RASPBERRY PI : un bouton POWER-OFF (et ON)





RASPBERRY PI : un bouton POWER-OFF

(et ON)


La RASPBERRY PI est une carte très populaire depuis pas mal d'années et permet entre autres de monter à peu de frais un petit serveur domotique. Petit ne veut pas dire peu puissant, bien au contraire.

Un des inconvénients de cette carte, contrairement à d'autres, est qu'elle  ne possède pas de bouton POWER. Cela peut être assez gênant dans le cas où l'on veut pouvoir couper l'alimentation de la carte, car il peut arriver que l'on détériore le système de fichiers de la µSD si l'on coupe son alimentation sauvagement, lors d'un accès en écriture notamment.

Si un écran et une souris sont branchés en permanence sur la RASPBERRY PI (ou un écran tactile) c'est facile de faire un shutdown propre, mais en l'absence d'écran c'est plus compliqué.

Au paragraphe 4 est décrite une solution permettant aussi le démarrage de la carte par le même bouton. Je vous conseille néanmoins de tout lire.

1. Le bouton-poussoir

Nous allons remédier à cela en installant un bouton-poussoir.


J'ai choisi d'utiliser un bouton directement enfiché sur les pins 37 (GPIO26) et 39 (GND) du connecteur 40 points, à l'aide d'un connecteur DUPONT deux broches :

Il faut utiliser le contact NO (Normalement Ouvert) s'il s'agit d'un bouton-poussoir inverseur.
On peut très bien installer ce bouton-poussoir où l'on veut y compris en utilisant deux fils rallonge.

2. La LED


On peut compléter le dispositif avec une LED connectée entre les pins 8 (TX) et 6 (GND). La résistance en série avec la broche + de LED fait 10KΩ.

Cette LED s'éteindra lorsque le shutdown sera terminé.

3. Le logiciel

Pour la partie matérielle c'est terminé. Voyons la partie software.

Nous allons commencer par copier ce script PYTHON (pishdn.py) dans votre répertoire /home/pi :

#!/usr/bin/env python
import RPi.GPIO as GPIO
import os

gpio_pin_number=26

GPIO.setmode(GPIO.BCM)

GPIO.setup(gpio_pin_number, GPIO.IN, pull_up_down=GPIO.PUD_UP)

try:
    GPIO.wait_for_edge(gpio_pin_number, GPIO.FALLING)
    os.system("sudo shutdown -h now")
except:
    pass

GPIO.cleanup()


Ce script attend simplement un passage à l'état ZÉRO de la GPIO26.
Respectez bien l'indentation du code.

On peut rendre ce script exécutable :

chmod 755 pishdn.py

Et on peut l'essayer directement en entrant la commande dans un terminal :

./pishdn.py

Si le bouton est en place, appuyer dessus.

Si l'on a un un écran branché sur la carte, on verra simplement le bureau disparaître, et la LED verte clignoter un certain temps. Au bout d'une dizaine de secondes (sur une RASPBERRY PI 1B) on verra le message "PLYMOUTH POWEROFF SERVICE" apparaître. il faut encore attendre 5 secondes pour que la LED verte s'éteigne définitivement.
Sur d'autres cartes plus récentes, ce sera plus rapide.

Si l'on accède à la carte à travers une connexion ssh, on verra simplement la connexion se fermer :

pi@raspberrypi:~ $ Connection to 192.168.1.16 closed by remote host.
Connection to 192.168.1.16 closed.


Lorsque la LED verte est éteinte, on peut couper l'alimentation sans danger.

Il va falloir maintenant lancer ce script automatiquement au démarrage. Il faut pour cela modifier le script /etc/rc.local à l'aide d'un éditeur (vi, nano ou autre). On va simplement ajouter une ligne (en gras) avant la ligne "exit 0" :

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

python /home/pi/pishdn.py

exit 0


Il faut maintenant redémarrer :

sudo reboot

On peut vérifier que le script est bien lancé :

pi@raspberrypi:~ $ ps -ef |grep pishdn
root       341   338  0 10:32 ?        00:00:00 python /home/pi/pishdn.py
pi         674   635  0 10:39 pts/0    00:00:00 grep --color=auto pishdn


Voilà c'est tout !

D'autres préfèreront développer un petit service WEB pour pouvoir éteindre leur RASPBERRY PI à l'aide de leur smartphone. Cela sera certainement le sujet d'un futur article.

4. Le bouton POWER complet

Il est possible aussi de démarrer la RASPBERRY PI avec un bouton entre GPIO3 et GND.

Lisez bien ce que l'auteur écrit à propos de la RASPBERRY PI 4.

Un petit schéma :


Nous allons donc être capable de faire le shutdown et le démarrage avec le même bouton mais placé ailleurs, ce qui me donne l'occasion de concevoir une version un peu plus compacte :


Le montage utilise un connecteur 4 broches sur lequel est soudé un petit morceau de plaquette à pastille regroupant la LED et le bouton-poussoir :
  • bouton câblé entre les pins 5 et 6 (GPIO3 and GND)
  • LED + résistance 10KΩ en série câblées entre les pins 8 et 6 (TX et GND)
Le câblage est réalisé avec du fil à wrapper.

Ce montage rend la GPIO4 inaccessible. Est-ce bien grave ?
Si nécessaire il est possible de déporter la carte avec des fils DUPONT.

Pour que le shutdown soit pris en compte il suffit de changer le N° de gpio dans le script pishdn.py (3 au lieu de 26) :

gpio_pin_number=3

Une dernière chose : la batterie que l'on voir derrière le montage est collée sur une carte UPS DFRobot DFR0494.
Voir ici : https://riton-duino.blogspot.com/2019/10/raspberry-pi-ups-dfrobot-dfr0494.html


Cordialement
Henri

4. Mises à jour

20/10/2019 : 2. La LED
24/10/2019 : 4. Le bouton POWER complet

1 commentaire: