C’est un accessoire souvent réclamé par les utilisateurs de Raspberry Pi et autres cartes SBC (Single Board Computer = Ordinateur monocarte). En cas de coupure de courant, cette alimentation prend le relais et alimente le Raspberry Pi le temps que le courant revienne. Plusieurs heures d’autonomie sont disponibles et la batterie se recharge dès que le secteur revient. Des ports GPIO sont disponibles pour avertir le programme de l’évolution des tensions, et déclencher éventuellement un arrêt propre du système.
Au sommaire :
Alimentation non interruptible UPS pour Raspberry Pi : PiPower de SunFounder
Alimentation non interruptible ?
Si votre projet Raspberry Pi nécessite une alimentation constante, il est risqué de compter sur la seule alimentation secteur. Selon l’endroit où vous vous trouvez, la situation météo, les coupures de courant et les surtensions peuvent être fréquentes et même durer plusieurs heures. Toute coupure brutale de la tension d’alimentation peut endommager votre Raspberry Pi, ou la carte SD, et une coupure de courant l’arrête immédiatement. Par conséquent, il ne s’éteint pas « proprement », ce qui peut entraîner la perte de toutes les données de la carte SD.
D’où l’utilisation d’une alimentation non interruptible, UPS en anglais : Uninterruptible Power Supply.
Avec un UPS, en cas d’interruption de l’alimentation secteur (panne de courant), la batterie ou une autre source d’alimentation prend le relais et continue d’alimenter l’appareil sans l’éteindre. Un onduleur est souvent utilisé comme source d’alimentation de secours pour les PC, les serveurs… Une fois la source d’alimentation principale rétablie, l’onduleur se recharge et est prêt à faire face à la prochaine coupure.
À propos de PiPower
C’est la raison pour laquelle SunFounder a conçu PiPower. PiPower peut être utilisé comme deuxième source d’alimentation pour le Raspberry Pi. Une alimentation secteur USB-C branchée sur le PiPower alimente directement le Raspberry Pi et charge la batterie à faible courant. Le PiPower peut alimenter en continu le Raspberry Pi en cas de panne de courant ou de déconnexion de l’alimentation secteur USB-C.
PiPower peut fournir une alimentation de 5V/3A, suffisants pour alimenter les différents modèles de Raspberry Pi et quelques extensions. Il dispose de 4 LED indiquant l’état de la batterie : chaque LED représente environ 25 % de la capacité. Il y a également un un interrupteur pour allumer/éteindre le Raspberry Pi sans avoir à brancher ou débrancher le cordon d’alimentation.
Déballage
Le PiPower arrive dans une boîte en carton solide et de taille réduite (13x10x4 cm).
A l’ouverture on trouve une notice bien détaillée (en Anglais).
Le montage est repris dans le WiKi de PiPower. (cliquez sur les images ci-dessus pour agrandir)
Le contenu de la boîte avant déballage.
Lorsqu’on sort tout le matériel de la boîte, on trouve des sachets de vis et d’entretoises. Il y a des pièces supplémentaires comme toujours chez SunFounder, ce que j’apprécie toujours (car je suis souvent assez maladroit 😛 ). Un morceau de mousse double face pour fixer la batterie.
La batterie avec sa prise 5 points (2 pour le +, 2 pour le – et le central pour l’équilibrage de charge. Il s’agit d’un pack de batteries personnalisé fabriqué par SunFounder, composé de deux batteries 18650.
Tension 3,7V / capacité 2200mAh. Le connecteur est un modèle PH2.0-5P qui se connecte sur la carte PiPower et permet de recharger la batterie.
On trouve également une plaque en acrylique transparent et deux courts câbles USB pour le Pi3 (µ-USB) et le Pi4 (USB-C).
La carte PiPower
La partie inférieure de la carte est prévue pour recevoir la batterie dans la zone centrale encadrée. A droite des broches Masse et +5v sont disponibles, à gauche un bornier à vis pour une autre batterie (ne pas connecter les deux batteries simultanément !) et en haut on trouve les pastilles qui sortent les signaux de la carte dont certains serviront pour gérer l’extinction du Raspberry Pi. Les fonctions de ces bornes sont détaillées plus bas.
Sur le dessus de la carte on trouve en bas à gauche l’interrupteur A/M qui alimente le Raspberry Pi et permet de couper complètement son alimentation après un arrêt propre. An bas à droite la LED PWR indique que le RasPi est alimenté. En haut au centre la prise USB-C sur laquelle arrive l’alimentation 5 volts, et la LED CHG qui indique que la batterie est en charge. En haut à droite la prise USB-A qui va alimenter le Raspberry Pi et enfin en haut à gauche la prise 5 points de la batterie.
Quelques vues de la carte PiPower
Montage
Le montage ne pose pas de problème particulier. vous le verrez en détail dans la vidéo. Il suffit de suivre la notice.
Gérer la charge de la batterie
L’intérêt d’un complément comme PiPower, c’est bien entendu de pouvoir gérer la charge et la décharge de la batterie, et surtout de provoquer un arrêt « propre » de l’OS qui tourne sur le Raspberry Pi en cas de coupure de courant prolongé. Dans ce cas la batterie va se décharger doucement et on va déclencher l’arrêt du système lorsque la capacité restante devient critique. Ce sont les signaux générés par la carte qui permettent cette automatisation.
Connecter les broches de surveillance aux GPIO
La carte PiPowerpossède plusieurs broches d’extension (en haut de la photo) qui peuvent être utilisées pour activer des fonctionnalités telles que l’arrêt sécurisé du Raspberry Pi. Voici une description détaillée de ces broches et de leurs fonctions.
GND : Connexion à la masse.
BT_LV : Indique la tension de la batterie, valeur = 1/3 de la tension réelle de la batterie.
IN_DT : Aide à déterminer si l’alimentation USB est connectée. La sortie est à 1 (HIGH) lorsque l’alimentation USB est détectée.
CHG : Signale que l’appareil est en cours de chargement.
LO_DT : Indique que la tension de la batterie est faible. La sortie est à 1 (HIGH) lorsque la batterie est faible.
EN : Sert de signal de commutation. Lorsque la broche est connectée à un interrupteur externe et mise à la masse, elle éteint le PiPower. Ceci n’est effectif que lorsque l’interrupteur intégré est actif (ON).
LED : Fournit une indication de puissance. Sort du 5V lorsque la carte est sous tension. Si vous connectez une LED externe, il faut prévoir une résistance de limitation de courant.
Remarque : Les broches ne sont pas soudées, il n’y a que des pastilles. Vous devrez souder les broches.
Pour cette partie de l’article, nous utiliserons les broches IN_DT, CHG et LO_DT pour déterminer si une batterie est présente, si le câble de charge USB est branché et si la charge de la batterie est faible. Cela permet de s’assurer que le Raspberry Pi s’éteint en toute sécurité lorsque le niveau de la batterie est faible.
Avertissement : Ne branchez pas simultanément une batterie externe et la batterie incluse !
Connexion des GPIO
Le tableau ci-dessous indique les broches à connecter entre PiPower et le Raspberry Pi :
PiPower | Raspberry Pi |
---|---|
IN_DT | GPIO17 |
CHG | GPIO18 |
LO_DT_PIN | GPIO27 |
GND | GND |
Installer les programmes
Surveiller l’état de PiPower
Un exemple de code pour l’arrêt sécurisé est fourni sur le github de SunFounder :
Télécharger depuis PiPower Github ou cloner en utilisant la commande :
git clone https://github.com/sunfounder/pipower
Déplacez vous dans le répertoire des exemples :
cd pipower/examples
Exécutez le programme de test pour vérifier que le Raspberry Pi peut lire les états d’alimentation correctement :
python3 read_all.py
On obtient ceci avec l’alimentation connectée et la batterie à pleine charge.
Lorsque le câble d’alimentation USB-C est déconnecté on obtient :
C’est ce qui se produirait si la tension secteur venait à manquer.
Arrêter proprement le Raspberry Pi
Pour activer la fonctionnalité d’arrêt « propre » lorsque l’alimentation ne fournit plus de courant (alim. débranchée ou coupure secteur) ET que la batterie est déchargée. :
Dans le répertoire pipower/examples, exécutez :
sudo bash enable_safe_shutdown.sh
Redémarrez le Raspberry Pi :
sudo reboot
Avec ce redémarrage, votre Raspberry Pi s’éteindra automatiquement en cas d’absence d’alimentation ou de batterie faible. Ici PiPower ne servira que pour maintenir une alimentation le temps pour le système de s’arrêter proprement.
Le programme safe_shutdown.py :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
#!/usr/bin/env python3 # Safe shutdown example # Change the pin numbers to match your setup import RPi.GPIO as GPIO import time import os VUSB_PIN = 17 CHG_PIN = 18 LO_DT_PIN = 27 def setup(): GPIO.setmode(GPIO.BCM) GPIO.setup(VUSB_PIN, GPIO.IN) GPIO.setup(CHG_PIN, GPIO.IN) GPIO.setup(LO_DT_PIN, GPIO.IN) if __name__ == '__main__': setup() while True: charging = GPIO.input(CHG_PIN) low_battery = GPIO.input(LO_DT_PIN) external_power = GPIO.input(VUSB_PIN) # If it's not charging and the battery is low, shut down the pi # Even if the external power is connected, no charging means the power supply is not strong enough if not charging and low_battery: # Do some stuff before shutting down # Shutdown print("Shutting down...") time.sleep(1) os.system("sudo shutdown -h now") break # You don't need that fast to check the states time.sleep(2) |
Le programme lit l’état de la carte PiPower toutes les 2 secondes. Ça suffit largement et ça ne consomme pas de ressource processeur… Si l’alimentation est coupée ET que la batterie est faible (if not charging and low_battery), l’arrêt propre du système est déclenché.
Configuration avancée
Bien entendu vous pouvez (devez ?) personnaliser les réactions de votre PiPower en fonction de vos besoins propres. Pour ceux qui souhaitent réaliser cette personnalisation, vous pouvez ajouter des actions supplémentaires dans safe_shutdown.py. Le fichier a été déplacé depuis le dossier où vous l’avez cloné, vers /usr/local/bin.
Insérez le code nécessaire sous # Do some stuff before shutting down pour exécuter des actions spécifiques avant l’arrêt, comme l’envoi d’une notification à votre téléphone ou l’arrêt de certains services. Pour ma part j’ai choisi d’enregistrer un fichier qui me donne l’heure de l’arrêt, pour mesurer le temps de fonctionnement du Pi4.
1 2 3 4 5 6 7 8 9 10 11 |
if not charging and low_battery: # Do some stuff before shutting down print("Arrêt du système") time.sleep(5) # Ouvrir le fichier LOG en écriture f = open('/home/pi/pipower.log', 'a') # Ecrire dans le fichier f.write('\nArret PiPower.\n') f.write((datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f'))) f.write("\n") f.close() |
Si vous faites des modifications, pensez à relancer les commandes suivantes :
sudo systemctl daemon-reload
sudo systemctl enable pipower_safe_shutdown
J’ai déconnecté l’alimentation à 11H36. Le Raspberry Pi 4 est juste en attente avec affichage du bureau sur un écran. A 15h15 la troisième LED s’est éteinte. A 15h34, la deuxième LED s’est éteinte) et le programme d’arrêt système a été exécuté. On peut tabler sur 4 heures de maintien avec un Raspberry Pi 4 en attente. Mon fichier pipower.log contient :
Arret PiPower.
2023-08-30 15:35:02.219110
Compatibilité avec les autres cartes
PiPower ne fonctionne pas ?
Lorsque vous mettez la batterie en place pour la première fois ou lorsque la batterie est débranchée et remise en place, PiPower risque de ne pas fonctionner pas correctement.
En effet, lorsque la batterie est retirée, le mécanisme embarqué de protection contre la sur-décharge de la batterie se met en route. En effet la tension de batterie est considérée comme trop faible, ce qui active le circuit de protection.
Dans ce cas, branchez le câble USB-C de l’alimentation secteur dans le port de charge pour débloquer le circuit de protection, et PiPower pourra être utilisée normalement.
Vidéo
Conclusion
Les essais de charge avec panneau solaire ne sont pas concluants, avec une charge lente et un faible ensoleillement (j’aurais du tester pendant la canicule ?) la recharge est hyper longue.
Par contre avec une alimentation secteur le PiPower rempli bien sa fonction et coupe proprement le système. Cela pourra être utile sur des installations où le Raspberry Pi doit rester en fonctionnement en continu.
Le bémol (il y en a toujours) c’est qu’il aurait été bien de prévoir un redémarrage du Raspberry Pi quand la batterie remonte, ce qui n’est pas le cas ici. Le système a été arrêté, et il le reste. Resterait à imaginer un montage susceptible de relancer le système quand la batterie a repris du « poil de la bête ». Il suffirait d’utiliser la borne RUN du Raspberry Pi, un Raspberry Pi PICO pour mesurer la tension de batterie (il a une entrée analogique) qui enverrait un 0 sur la pastille RUN, par exemple…
L’alimentation protégée PiPower est disponible pour 26$ sur la page de Sunfounder.
Vous pouvez également l’acheter sur Amazon pour 30€. (liens affiliés)
Les prix peuvent varier en fonction du cours du dollar ou des promotions
Sources
Acheter PiPower
https://www.sunfounder.com/products/power-pack?ref=HoiTVi03
Page Wiki du projet
https://docs.sunfounder.com/projects/pipower-v2/en/latest/
Page github des programmes associés
https://github.com/sunfounder/pipower
Bonjour,
Est-il possible avec ce genre de montage de modifier la batterie, pour qu’elle puisse tenir 2 à 3 semaines ?
Bonjour
je ne pense pas la charge est lente et il faudrait des jours pour charger une grosse batterie
le montage est fait pour deux 18650
Un Raspi consomme (à la louche) 1A pour une journée il faut 24Ah et pour 14 jours (2 semaines) il faut 336Ah
regardez le prix des batteries 300Ah…
cdt
francois
Ping : Alimentation non interruptible UPS pour Raspberry Pi : PiPower de SunFounder
Hello,
Super article, et merci pour le détail du montage et de l’usage.
Un case, doit se faire sur-mesure ; mais quid de la surchauffe du rpi4 ? J ai un case coolmaster passif (suite à la lecture et présentation sur votre site) .
Quid d’un usage embarqué ? Comme en voiture ? Mais si on ajoute un écran/module gps…
Bonjour
mon contact chez Sunfounder me dit que la prochaine version aura un boîtier dédié et
que le redémarrage du Raspberry Pi quand la batterie remonte en tension sera prévu.
cdt
francois
Bonjour, il y a fort longtemps, lorsqu’un serveur était sur onduleur et que la batterie était presque vide, grâce à initd on passait le système en lecture seule et on attendait (le signal) que la batterie se remplisse à nouveau puis on « redémarrait » le système en mode normal. Tout cela était géré par le système mais je ne sais pas ce qu’il en est depuis systemd.
Pour moi un onduleur qui ne redémarre pas le système lorsque le courant revient c’est « no-go ».
Bonjour
tout à fait d’accord avec vous
j’ai fait remonter l’info au constructeur et effectivement la prochaine version intègrera un redémarrage du système (borne RUN du Raspberry Pi ?) lorsque la batterie remontera. On verra lors de la sortie de la prochaine version qui intègrera également un boîtier adapté
cdt
francois
J’utilise une carte UPS-HAT sur un PI3B+ et un PI4
L’interface avec le GPIO est donc réalisée et je commande le ventilateur en PWM
avec un Script chargé au démarrage du Raspi en lisant la température CPU
Bonjour Christian
la prochaine version devrait être plus intéressante avec un redémarrage du Pi quand la batterie remonte… A suivre
amitiés
Francois
Bonjour,
Pour ma part, j’utilise une simple batterie tampon choisie de manière à avoir le bon goût de faire 12V+5VUSB.
Ainsi, c’est la Livebox et le PI3B gérant la maison juste a côté qui restent alimentés. Et comme côté NRA, de l’autre côté, les équipements fonctionnent sur alim secourue on conserve internet (et aussi la téléphonie, vu que ce sont des DECT à batterie et que celle LB a encore la base DECT intégrée contrairement aux dernières, potentiellement utile en cas d’urgence même si désormais les réseaux mobiles sont là) pendant les coupures.
Le switch réseau à la cave a aussi désormais ce type de batterie tampon (en 19V) et un injecteur POE passif alimente aussi sur cette même tension le routeur+double AP wifi dans les combles distribuant l’étage.
Certes, on n’a pas l’info décharge pour couper proprement si cela dure (mais plus de 3h, pour une durée testée dans les 3h30), mais la domotique a au moins l’info de coupure courant et son heure. Cela permet de scripter un shutdown propre du PI au bout de 3h00.
Je pense que c’est bien moins cher, tout en protégeant aussi la box (ma domotique intégrant une alarme perso, il est utile de conserver le réseau pour les notifications).
Dans tous les cas, peu probable de se retrouver avec une uSD qui ne boot pas avec un système de fichiers journalisé comme Ext4. C’est fait pour. La seule possibilité serait en fait liée au support Ext simplifié des boot loader (reader simple) qui ne permet bien souvent pas un rejeu de journal. Mais pour tomber dans ce cas, il faudrait qu’un fichier chargé par le boot loader très tôt dans le boot Linux le nécessite: C’est possible, par exemple si on a la coupure pendant une MAJ et que cela tombe sur le kernel/initrd… Double coup de pas de bol nécessaire donc. Et en pareil cas, simplement extraire la SD et la mettre dans un PC Linux va corriger le problème sans même une action de l’utilisateur: Le rejeu de journal va être fait au moment du montage automatique, laissant juste une discrète trace « Replay Journal » dans les dmesg! On remets sur le PI et ça devrait démarrer sans problème.
Bref, c’est possible mais il faut quand même un peu démystifier le truc à mon sens. Et fermer tout tuto incitant à désactiver la journalisation (voir revenir à Ext2) afin d’avoir soit-disant pas de problème en cas de coupure alim: Ceux qui les écrivent étant totalement à côté de la plaque…
merci pour ces précision !
cdt
francois