RpiPowerControl

RpiPowerControl est un petit module permettant le contrôle « intelligent » de l’alimentation d’un RaspberryPi.

RpiPowerControl permet principalement d’alimenter le RaspberryPi via une simple pression sur un bouton. Une seconde pression sur ce même bouton permet d’éteindre proprement le RaspberryPi avant de lui retirer l’alimentation. De plus, RpiPowerControl est fournit 2 sorties : une pour le RaspberryPi, et une autre pour un autre périphérique (un écran tactile, dans mon cas).

Fonctionnalités principales

  • 2 sorties pouvant être pilotées indépendament : une pour le RaspberryPi, et une autre pour un périphérique quelconque
  • Affichage de l’état du système grâce à 2 LEDs
  • Contrôle du système via 2 boutons poussoirs
  • Communication intelligente entre le RaspberryPi et RpiPowerControl via USART (communication série)

Petit historique

J’ai eu besoin de ce genre de petit module pour finaliser un premier prototype de Touchradio. En effet, je voulais pouvoir éteindre et allumer le système comme je l’aurais fait pour ma TV ou mon PC: en appuyant sur un simple bouton. Sans cela, le seul moyen de démarrer le RasbperryPi était de brancher la prise. Pour l’éteindre, je devait la débrancher… Pas très ergonomique!

Il existe déjà quelques projets similaires, mais ceux que j’ai trouvé ne permettent que de contrôler une sortie d’alimentation vers le RaspberryPi. Pour Touchradio, j’en voulais deux : une pour le Rpi, et une autre pour l’écran tactile. J’ai donc décidé de me lancer dans la conception de mon propre contrôleur d’alimentation, et j’ai fais ce que j’ai pu avec mes moyens et mes connaissances (et l’aide d’un collègue bien sympathique!).

Certes, je n’ai pas choisis la voix la plus directe et la plus appropriée, surtout si je voulais en faire un dispositif à vendre et à produire en grande quantité. Par contre, les choix que j’ai effectué me permettent d’être autonome, d’implementer tout ce dont j’ai besoin, et ce, à moindre frais.

Hardware

RpiPowerControl est basé sur la carte d’évaluation STM32F0Discovery (je l’avais sous la main, j’ai déjà travaillé avec, le choix était facile). Il s’agit d’une carte d’évaluation pour le processeur STM32F051 (ARM Cortex-M0). Ce micro-contrôleur tourne à une fréquence de 48Mhz, et dispose de 64Kb de mémoire FLASH et de 8Kb de mémoire RAM.

Bien sûr, ce processeur est surdimensionné pour ce projet, mais, comme je l’ai dis, j’avais cette carte sous la main, autant l’utiliser !

J’y ai ajouté un petit montage électronique simple afin de disposer de 2 LEDS, 2 relais, 2 boutons ainsi que d’un port série.

Software

Le code embarqué dans le STM32F0 est écris en C sous l’environnement Keil µVision4. Un petit démon doit aussi être exécuté sur le RasbperryPi. Celui-ci a été écrit en Python.

Fonctionnement

Une alimentation 5V alimente RpiPowerControl. C’est cette alimentation qui alimentera aussi le RaspberryPi et l’écran tactile lorsque les relais seront fermés.

RpiPowerControl dispose de 2 boutons. Un des deux permet d’alimenter ou non l’écran tactile. Lorsque l’on appuie une première fois sur le bouton, le relais de l’écran est fermé et celui-ci est alimenté. Lorsque l’on ré-appuie, le relai s’ouvre et l’écran s’éteint.

Le second bouton permet le contrôle intelligent de l’alimentation du Rpi. Lorsque du premier appuis sur le bouton, le relai du Rpi est fermé, et le Rpi démarre tout à faire normalement. A la fin de la séquence de démarrage, le petit démon en Python est lancé. Celui-ci commence par envoyer un petit message sur son port série pour indiquer à RpiPowerControl qu’il a bien démarré. Ensuite, le démon Python se met en attente d’une commande de RpiPowerControl.

Lors d’un 2eme appuis sur ce bouton, RpiPowerControl va envoyer une commande sur le port série du Rpi afin de lui demander de s’éteindre. A ce moment le démon Python du Rpi va executer la commande ‘shutdown’. A la fin de la séquence, un autre script python va être lancé pour envoyer une dernière commande a RpiPowerControl lui notifiant que la procédure de shutdown est en cours. A ce moment, RpiPowerControl va attendre un certains temps (20 secondes) avant de rouvrir le relai et couper ainsi l’alimentation du Rpi.

Dans le cas où le Rpi s’éteindrait de lui même (une application pourrait éteindre le Rpi sans passer par RpiPowerControl), la commande de notification de shutdown sera aussi envoyée, permettant à RpiPowerControl de rouvrir le relais lorsque le Rpi sera bien éteint.

Etat du projet

Tout comme Touchradio, ce projet en est à ses débuts et est toujours en développement intensif. Le fonctionnement décris ci-dessus a été implémenté, mais quelques adaptations doivent toujours être effectuées.

Le code embarqué en C et celui du démon Python n’est pas encore prêts à être publié, mais dès que j’aurais terminé les corrections et le nettoyage du code, je le publierai sur mon compte GitHub.