Christian a déjà écrit de nombreux articles pour le blog. Cette fois il nous propose de réguler un ventilateur en PWM. Il s’est inspire d’une carte ArgonFanHAT qu’il a achetée chez Kubii. Son montage et son programme pourront s’adapter à divers ventilateurs sans problème.
Au sommaire :
Réguler la vitesse du ventilateur d’un Raspberry Pi en PWM
Christian m’a envoyé ce message il y a quelques jours : « J’ai acheté la ArgonFanHAT chez KUBII qui fonctionne très bien sur un PI3B+. Mais pourquoi ne pas réguler son ventilateur en PWM par un petit script lancé dans autostart : Voulez vous un petit article sur ce sujet avec le soft et l’interface avec le ventilateur ? Quatre de mes raspi en sont équipés et le ventilo ne tourne plus tout le temps !!«
Ce que j’ai bien entendu accepté et voici donc cet article de Christian.
Objectif de la réalisation
Le but est de commander le ventilateur du Raspberry selon la température de son CPU.
On va utiliser un port GPIO configuré en PWM pour faire varier sa vitesse.
Comme le GPIO ne peut fournir le courant necessaire au ventilateur, on utilise un transistor darlington, le BC517, en interface.
BC517
Schéma
Caractéristiques
Type de boîtier : TO-92
Type de transistor : NPN Darlington
Courant collecteur maximal (Ic) : 1,2A
Tension maximale collecteur-émetteur (VCE) : 30V
Tension maximale collecteur-base (VCB) : 40V
Tension maximale base l’émetteur (VEBO) : 10V
Dissipation maximale au collecteur (Pc) : 625 miliWatt
Fréquence de transition maximale (fT) : 200 MHz
Gain en courant continu (hFE) : 30000
Température maximale de stockage et de fonctionnement : -55 à +150 °C
Le montage de régulation
Ce qui traduit en schéma plus classique donne ceci :
Et une fois câblé sur une plaquette de prototypage
Le GPIO sera programmé par un Script en Python lancé au démarrage. Ce Script permet également d’avoir un bouton d’arrêt propre qui va provoquer un ShutDown et terminer normalement et sans danger l’exécution du système d’exploitation.
Le Script ShutD2.py :
J’utilise le GPIO-18 en PWM et GPIO-26 pour le ShutDown
La variable FANwait = 10 permet de mettre une hysthérésie de 10s dans la boucle
Les températures et vitesses sont à adapter dans la liste cnf :
- < 50°C Arrêt
- >=50°C et <53°C vitesse 1
- >=53°C et <58°C vitesse 2
- >=58°C vitesse 3
Pour lancer au démarrage avec autostart :
Créer le fichier :
sudo nano /home/pi/ShutD2.sh
1 2 3 |
# !/bin/bash sleep(15) usr/bin/python3.7 /home/pi/Scripts/ShutD2.py & |
Lui donner les droits :
sudo chmod +x /home/pi/ShutD2.sh
Puis déclarez le dans autostart :
sudo nano /home/pi/.config/autostart/Lxinput-setup.desktop
1 2 3 4 |
[Desktop Entry] Type=Application Comment=Cde Ventilateur Exec=/home/pi/ShutD2.sh |
Programme Python de régulation du ventilateur en PWM
Script ShuD2.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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
#!/usr/bin/env python3.7 # -*- coding: utf-8 -*- #Lancé dans autostart avec ShutD.sh #Bouton appuyé au moins 3 Secondes #Ventilateur en PWM import os import time import RPi.GPIO as GPIO from threading import Thread GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) #GPIO-26 pour le Poussoir SD=26 #on met le GPIO26 en Entrée et à UP GPIO.setup(SD, GPIO.IN, pull_up_down=GPIO.PUD_UP) #Ventilateur sur GPIO18 en PWM à 10 Hz pwm=18 GPIO.setup(pwm,GPIO.OUT,initial=GPIO.LOW) fan=GPIO.PWM(pwm,10) #T1,V1,T2,V2,T3,V3 cnf=[50,70,53,80,58,100] waitSD=3.0 waitFAN=30 def Shutdown(): while True: GPIO.wait_for_edge(SD, GPIO.FALLING) debut=time.time() intS=0 print ("SHUTDOWN dans 3 secondes") while intS < waitSD and GPIO.input(SD) == GPIO.LOW: intS=time.time()-debut time.sleep(0.5) if intS >= waitSD and GPIO.input(SD) == GPIO.LOW : GPIO.cleanup() os.system('sudo shutdown -h now') #print ("SHUT") def Ventil(): while True: temp = os.popen("vcgencmd measure_temp").readline() temp = temp.replace("temp=","") temp = int(float(temp.replace("'C",""))) if temp < cnf[0]: fan.stop() #print (str(temp) + " V0") else: fan.start(0) if temp < cnf[2] and temp >= cnf[0]: fan.ChangeDutyCycle(cnf[1]) time.sleep(0.01) #print (str(temp) + " V1") elif temp < cnf[4] and temp >= cnf[2]: fan.ChangeDutyCycle(cnf[3]) time.sleep(0.01) #print (str(temp) + " V2") else: fan.ChangeDutyCycle(cnf[5]) time.sleep(0.01) #print (str(temp) + " V3") time.sleep(waitFAN) fan.stop() GPIO.cleaup() try: t1 = Thread(target = Shutdown) t2 = Thread(target = Ventil) t1.start() t2.start() except: t1.stop() t2.stop() GPIO.cleanup() |
Vous pouvez télécharger le programme au format .zip en cliquant sur ce lien.
Tester le programme en « chargeant le Raspberry Pi
Pour tester ce programme et son fonctionnement, il faut faire travailler le Raspberry Pi. en utilisation normale (c’est quoi normal ?) ce fainéant n’en fout pas une et on a parfois du mal à faire monter sa température. Christian a écrit un programme de test en Python que vous pourrez bien entendu utiliser pour tester d’autres radiateurs, refroidisseurs, ventilateurs etc. sur le Raspberry Pi ! Vous pouvez le télécharger en cliquant sur ce lien.
Le programme Test-Charge est en mode graphique et intègre matplotlib en canvas tkinter
Modules nécessaires :
- matplotlib
sudo pip3 install matplotlib - psutil
sudo pip3 install psutil - stress
sudo apt-get install stress
Les graphes sont en moyenne glissante sur 3 points et mise à l’échelle automatique
Limites de température :
- <55 °C Affichage en vert
- >= 55 °c Affichage en magenta ligne –
- >= 60 °c Affichage en rouge ligne –
- >=70 °c Affichage en rouge ligne pleine
Cycle en S
temps entre chaque acquisition en secondes
si 0, fixé à 0.1
modifiable en live si en MANUEL
Bouton MANUEL
Lance acquisition selon le cycle
vous pouvez modifier la charge en live avec les options de stress
Affichage du graphe tous les 10 points
On peut arreter à tout moment
Bouton AUTO
lance une acquisition de 100 points selon Cycle pour chaque séquence de charge :
charge 0, charge 25, charge 50, charge 75, charge 100, charge 0
Indique le temps restant
- si Cycle=0 durée #11 minutes
- si Cycle=1 durée #20 minutes
- si Cycle=2 durée #30 minutes
Affichage du graphe à la fin, on peut arreter à tout moment
Bouton ENREGISTRER
Définir un nom de fichier seul sans extension…..il sera Horodaté
Enregistre le graphe présent en JPG
Conclusion
Une nouvelle fois un grand merci Christian pour ces exemples très pratiques de développement destiné à améliorer l’expérience utilisateur sur le Raspberry Pi, tout en fournissant une approche de l’électronique et de la programmation.
J’utilise un script identique depuis mon premier achat de ce ventilo, il est disponible sur plusieurs site.
https://github.com/kounch/argonone/blob/master/argononed.py
https://www.yodeck.com/docs/display/YO/Configure+Argon+1+case+with+Fan+and+Power+Button
Bonjour Michel
merci pour l’information
Christian aime bien faire lui même pour apprendre 🙂
Michel,
Bien sûr la carte argone a un logiciel de commande
qui fonctionne très bien , mais assez lourd et qui crée des raccourcis sur le bureau.
Le Raspi, c’est pour essayer de tout faire sois-même.
D’où l’idée de coupler la régulation du ventilateur avec la gestion d’un bouton de ShutDown
que j’utilise depuis longtemps sur tous mes Raspi
Très utile et intéressant, mais:
Comment câble t on le poussoir shutdown ?
le poussoir est entre le GPIO et la masse
Salut à tous.
J’ai fait l’acquisition de deux Argon FanHat pour mes deux RPi 4B/8G et je peux vous assurer qu’ils sont très silencieux et performants.
Même en poussant à l’extrême (stress) la raspberry, la température ne dépasse jamais, chez moi, les 50°C.
J’ai configuré l’Argon FanHat selon les paramètres suivants : 35°C / 25% – 45°C / 50% – 55°C / 75% – 65°C / 100%.
Je me contente du script python d’Argon qui répond bien à mon attente.
Le but du paramétrage est d’avoir parfois des arrêts du ventilateur quand la température est faible.
Par PWM, je suppose que tu voulais dire faire varier le ventilateur autrement qu’en 25%, 50%, 75% et 100%.
Ton projet électronique est fort intéressant, mais je ne vois pas en quoi une meilleure précision de la vitesse du ventilateur apporte un plus.
Je n’ai pas compris, à partir de ton schéma, comment effectues-tu le montage sur la raspberry ?
Je suppose que l’Argon FanHat est positionné dans les 40 broches des GPIO de la raspberry.
Je ne comprends pas où se branche ta sortie « 1 » sur l’Argon FanHat.
En regardant ton prototypage, je vois les résistances et le transistor, mais où se trouve le condensateur ? Il a totalement disparu.
De même, on doit deviner à quoi correspond les trois pins de ton prototypage.
En fait, il manque la photo du dessous de ton prototypage.
Tu utilises la GPIO-26 pour le ShutDown.
Comment cela se traduit dans ton schéma ou dans ton prototypage ?
Je ne vois aucun bouton poussoir. Est-ce un autre oubli ?
Ou bien, est-ce un autre montage, entre la gpio 26 et la masse ?
Pas de résistance pull-up externe car tu utilises celui interne à la raspberry.
Pas de reboot comme dans la version python d’Argon ? Et pourtant, c’est très utile.
Je ne connais pas du tout le transistor Darlington.
Vis-à-vis d’un transistor bipolaire comme le BC327-40, qu’apporte-t-il en plus ?
Le symbole du condensateur n’est pas celui classique des deux branches parallèles.
Dois-je comprendre que c’est un condensateur polarisé ?
Le script python d’Argon FanHat est de 99 lignes.
Tu dis qu’il est lourd, mais ton script ne possède pas toutes les fonctionnalités que propose Argon.
Par exemple, pas de fichier de configuration, pas de reboot.
Est-il envisageable d’utiliser le bouton poussoir, en plus du shutdown et du reboot, pour démarrer la raspberry quand il est à l’arrêt ?
@+
Bonjour,
Pour les broches, par déduction j’ai mis par rapport à la photo:
–fil noir ventilateur (le rouge sur 5v)
–gpio raspberry
–Masse
… mais ça marche pas chez moi(j’ai tester avec un arduino et un autre programme..)
alors j’ai tester ça (avec le transistor 2N2222)
http://riton-duino.blogspot.com/2019/10/arduino-pilotage-de-ventilateurs.html
ça marche …mais lentement…
Bonjour à tous,
Bon, je vois qu’il y a toujours confusion:
Je n’ai pas voulu remplacer le soft de la Fan HAT….je m’en suis inspiré.
j’ai plein de Raspi avec des ventilateurs car ils sont en boitier (certains à l’extérieur)
Je ne vais pas acheter 10 FanHAT (Chère !…le prix d’un Raspi)
En plus, on ne peut mettre d’autres HATs (connecteur Femelle)….c’est la cata
J’avais déjà un script lancé au démarrage pour le ShutDown sur tous mes raspi
Je lui ai simplement ajouté la commande du ventilateur en thread
GORDON:
installer le soft Argon sur un PI qui ne sert qu’à remonter des capteurs sur le réseau est « LOURD »
J’ai supprimé le condo chimique de 47 µF
WYATT:
Pour le câblage…OK (de haut en bas sur la photo)
un 2n2222 n’a pas assez de gain en courant pour commander 200mA à partir d’un port
d’où le Darlington
Arduino….j’ai pas et un « autre programme » ???
Bonjour,
Je préfère tester sur un arduino à 2€ que sur mon pi … j’imagine que si sa marche sur l’arduino (avec 2n2222 (lent)) ça devrait marcher aussi avec le darlingtion… je vais re-re-refaire le montage on verra…
Merci de la réponse au moins je ne me suis pas trompé dans la connexion
Bonjour, merci pour ce partage.
De mon côté, j’ai un RasPi 3b+ en boîtier avec un petit ventilateur 30mm monté via un transistor comme vous.
J’ai fait un petit script pour que le ventilateur s’enclenche à 52°C et s’éteigne à 48°C.
Je partagerai ce script avec grand plaisir si vous le souhaitez.
Bonne continuation.
Bonjour,
Je viens d’acheter un RPi 4 pour faire des mesures thermiques, et je découvre les problèmes de refroidissement. L’article est très clair, et je commence à voir ce qu’on peut faire.
Par contre, je n’ai pas compris pourquoi c’est lent avec un 2N2222 par rapport à un darlington.
Je sais bien que le courant est moindre, mais sinon, il doit se saturer/désaturer très vite .. qu’est ce que je n’ai pas compris ?
Merci d’avance 🙂
Bonjour
ça c’est si vous désirez faire vous même
sinon il y a aussi https://www.framboise314.fr/refroidir-en-silence-le-raspberry-pi-4-avec-ventilapi4-de-garatronic/
qui fonctionne très bien et est très silencieux 🙂
cdt
françois
Ping : Un lanceur IP pour le Raspberry Pi - Framboise 314, le Raspberry Pi à la sauce française....