Domanda:
Come posso controllare la ventola collegata a GPIO tramite codice a una determinata temperatura della CPU?
Peter Swiggs
2017-02-20 17:20:00 UTC
view on stackexchange narkive permalink

Ho appena acquistato un ventilatore Pi 5v per il mio Pi3. Sto usando Retropie 4.1 per il sistema operativo. Ho collegato i fili rosso e nero della ventola rispettivamente a massa e GPIO 18.

Come posso avviare la ventola quando la temperatura della CPU raggiunge una certa temperatura?

I ho letto un tutorial su thepihut, ma è coinvolta una resistenza (capisco come funziona e posso capire la parte di codice). Voglio usare la temperatura della CPU dal Pi3 stesso per controllare l'accensione o lo spegnimento della ventola (se la temperatura della CPU può essere letta dal sistema operativo, ovviamente). Non sono ancora preoccupato per la velocità della ventola, voglio solo che la ventola si accenda quando la CPU è a 45 ° C o superiore.

Il seguente sito web ( hackernoon) utilizza un relay per creare il temp controler e questo è nel codice.

So di dover cambiare il modo la ventola è collegata al Pi; la parte che mi lascia perplesso è il codice.

Dubito che esista una "ventola Pi 5v 0.2ma", ma se ci fosse la quantità di aria che potresti muovere con 1 mW di potenza è trascurabile. Questo non importa perché il Pi non ha bisogno di un fan.
Hai provato Google? Devono esserci centinaia se non migliaia di articoli su questo argomento.
Sì, avevo provato Google, tutto il giorno infatti stavo cercando su Google soluzioni. I 2 siti Web che ho fornito avevano entrambe le parti del codice della mia soluzione, ma non sapevo come combinarle per utilizzare il codice per il mio fan. Grazie anche ad @sir_ian e alla sua risposta sono in grado di iniziare a testare il codice e di approfondire le mie conoscenze e di utilizzare meglio le informazioni che trovo in google.better.
Cinque risposte:
sir_ian
2017-02-20 20:16:08 UTC
view on stackexchange narkive permalink
  da gpiozero import LED # stiamo usando il sottomodulo LED proprio come output genericofan = LED (18) #per il positivo, metti il ​​negativo in uno di the grounddef cputemp (): f = open ("/ sys / class / thermal / thermal_zone0 / temp") CPUTemp = f.read () f.close () StringToOutput = str (int (CPUTemp) / 1000) mentre True: cputemp () if StringToOutput > = 45: fan.on () elif StringToOutput < 45: fan.off  

Questo è un codice abbastanza semplice che ottiene la temperatura da / sys / class / thermal / thermal_zone0 / temp in millesimi Celsius divide per 1000 per Celsius e controlla se è maggiore di 45. se lo è accende la "ventola" e in caso contrario rimane spenta. Ma quasi certamente non avrai mai bisogno di un fan fintanto che non stai facendo nulla di stupido.

Questo codice è stato adattato da una domanda SE ma non sono sicuro di quale.

Grazie mille per questo, il codice è brillante ed è un inizio perfetto per la mia crescita nell'area pi. Attualmente sto per iniziare il mio retropie da zero a causa delle impostazioni sull'arco retrò che sono confuse. più facile iniziare da default. Metterà alla prova il codice una volta che ho scritto l'immagine sulla scheda SD e aggiornato tutto. Riporterò il mio successo o problemi.
Non ho avuto la possibilità di provare questo script, ma il ciclo non verrà eseguito molte volte al secondo? Non dovrebbe esserci qualcosa come `sleep (x)` (importato naturalmente `da time import sleep`) per farlo controllare solo una volta ogni x secondi?
ben_nuttall
2017-03-19 03:51:39 UTC
view on stackexchange narkive permalink

gpiozero ha una classe CPUTemperature che ti consente di controllare facilmente i dispositivi in ​​base alla temperatura di funzionamento del Pi. E dovresti semplicemente usare OutputDevice per controllare la ventola:

  da gpiozero import OutputDevice, CPUTemperaturefan = OutputDevice (18) cpu = CPUTemperature () mentre True: if cpu. temperatura > 45: fan.on () else: fan.off ()  
b_laoshi
2017-08-05 15:34:27 UTC
view on stackexchange narkive permalink

Utilizzo di PWM e transistor NPN
Vorrei iniziare dicendo che non sono un ingegnere elettrico. Se qualcuno che sa di più vede un problema con quello che presento, per favore commenta !

Ho trovato un eccellente articolo per farlo con un Arduino qui. Anche io, tuttavia, sto usando un RaspberryPi (RPi3). Una preoccupazione che ho visto sottolineato è che tirare la potenza dalla GPIO18 per far funzionare la ventola può avere conseguenze negative. Invece, quello che propongo di seguito è tirare il 5v da un pin 5v RPi. Quindi usa PWM e commutazione per controllare il passaggio del 5v alla ventola.

Ecco cosa ho usato: mi capita di vivere in Cina, e il costo totale, con spedizione, per queste parti (multiplo di ciascuna) era inferiore a $ 2 (USD). Magari guarda Alibaba.

  • 1x ventola da 5 V
  • 1x resistore da 330 ohm
  • 1x transistor NPN (2N4401)
  • 1x diodo (1N4001)
  • 1x Raspberry Pi

Collega la ventola al Raspberry Pi utilizzando il seguente circuito:
Preparati per un po 'di saldatura. Sono stato in grado di saldare insieme tutti i componenti, avvolgerli attorno alla ventola stessa e comunque inserire la ventola nella mia custodia RPi. La descrizione del case dice che la ventola è silenziosa. È una bugia ed è per questo che lo eseguo al 65% della velocità!

schematic

simula questo circuito - Schema creato usando CircuitLab

  • 5v si collega al pin 2 o 4
  • la massa si collega al pin 6
  • PWM si collega al pin 12 (GPIO 18)

Leggi il link alle istruzioni di Arduino sopra per informazioni più dettagliate su cosa sta succedendo.

Installazione del software:
Per far funzionare la ventola, ho installato la libreria pigpio. Puoi installare questa libreria dal terminale come segue:

  • Dipendenze: sudo apt-get install build-essential
  • Scarica pigpio: wget abyz.me.uk/rpi/pigpio/pigpio.zip
  • Decomprimere: unzip pigpio.zip && cd PIGPIO
  • Compila e installa: make && sudo make install

Ora abbiamo il programma che useremo per controllare la ventola tramite PWM.

Esecuzione del ventilatore:
puoi creare un nuovo script bash con il seguente contenuto. E impostalo per eseguire @reboot nel crontab di root. Modificare le variabili all'inizio dello script a proprio piacimento. Se vuoi vedere cosa sta succedendo, imposta DEBUG = 1 e le informazioni verranno scritte in / tmp / debug . Non lo lascerei acceso una volta che hai confermato che funziona tutto, poiché ciò eseguirà scritture non necessarie sulla tua scheda SD. Questo script presuppone che tu abbia Python installato.

Dichiarazione di non responsabilità: ho eseguito il mio RPi3 con questo script per più di 17 mesi a partire da gennaio 2019. Se queste impostazioni o qualsiasi altra impostazione che utilizzi brucia il tuo fan o causare danni al tuo Raspberry Pi, non posso essere ritenuto responsabile. Usa e apporta modifiche a tuo rischio!

  #! / Bin / bashfanSpeed ​​= 65 # avvia la ventola al 65% della velocità; il mio era troppo rumoroso al 100%. Fai attenzione a non impostarlo troppo basso, altrimenti la tua ventola potrebbe non girare! ThresholdF = 135 # Accendi la ventola quando siamo al di sopra di questa soglia di temperaturaC = $ (/ usr / bin / python -c "print ($ thresholdF-32) /1.8")DEBUG=0 debug funzione {[$ DEBUG -eq 1] && echo "[$ (date +% m% d.% H% M% S)] $ 0: $ @" >> / tmp / debug} funzione set_fan {percentuale = $ 1 # valore intero GPIO = 18 # numero pin GPIO; 18 è freq PWM hardware = 25000 # Questa è la frequenza del segnale PWM; aumenta se senti un debug lamentoso "impostando PWM su GPIO $ GPIO a $ {percent}%" [$ percent -gt 0] && / usr / local / bin / pigs hp $ GPIO $ freq 1000000 # fai girare la ventola prima di avviare back sleep 1 / usr / local / bin / pigs hp $ GPIO $ freq $ (/ usr / bin / python -c "print 10000 * $ percent")} funzione get_temp {echo "$ (/ opt / vc / bin / vcgencmd misura_temp | grep -oP "\ d +. \ d") "}
# restituisce 1 se siamo al di sopra della nostra soglia o 0 se non siamo la funzione is_too_hot {echo $ (/ usr / bin / python -c "print 1 if $ thresholdC< $ (get_temp) else 0")} debug "fan script avviato "# avvia il demone pigpiod se non è già in esecuzione [$ (pidof pigpiod | wc -l) -eq 0] && / usr / local / bin / pigpiod && debug" servizio pigpiod avviato "debug" soglia F: $ soglia F " C: $ thresholdC "# avvia un ciclo per continuare a controllare la temperatura della CPU e cambiare la ventola se necessariostate = off while: do while [$ (is_too_hot) -eq 1] do if [" $ state "==" off "]; quindi esegui il debug "accensione della ventola: $ (get_temp) (CPU temp) > $ thresholdC (soglia)" set_fan $ fanSpeed ​​&& state = "on" # accende la ventola fi sleep 300 # avvia la ventola per 5 minuti prima di controllare temp di nuovo fatto se ["$ state" == "on"]; quindi eseguire il debug "spegnendo la ventola: $ (get_temp) (CPU temp) < = $ thresholdC (threshold)" set_fan 0 && state = "off" fi sleep 60 # aspetta un minuto prima di controllare temp againdone  

Non è difficile immaginare come questo script possa essere modificato per far funzionare la ventola a velocità diverse per temperature diverse.

Ciao e Benvenuto. Si noti che il circuito ha un grave inconveniente: il transistor sul * lato alto * (vicino alla tensione + rispetto al carico) non è un circuito utile con un transistor NPN. Sfortunatamente è un po 'virale e spesso pubblicato ma comunque sbagliato. Collegare l'emettitore (la freccia) a massa e mettere il carico (ventola) tra il collettore e + 5V. Vedi https://raspberrypi.stackexchange.com/a/28201/19949
@Ghanima aveva ragione! Non ho disegnato correttamente il circuito! Il circuito corretto è ora mostrato sopra. Non so cosa stavo guardando quando l'ho disegnato inizialmente, ma non posso aver guardato il circuito che avevo messo insieme!
Perché usi 330 ohm? Quanta corrente consideri con quanto hFE?
Questo era semplicemente un adattamento di una [guida Arduino] (https://static.sparkfun.com/learn/materials/44/DC_motor_circuits_notes_2up.pdf) per realizzare la stessa cosa. Ho appena usato la stessa resistenza che hanno mostrato nei loro diagrammi. Il loro articolo diceva di utilizzare una resistenza da 220 o 330 ohm. Sarò il primo ad ammettere che sono limitato nella portata della mia conoscenza riguardo ai circuiti. Se puoi suggerire miglioramenti in un altro commento con una spiegazione (così posso imparare qualcosa di nuovo). Aggiornerò felicemente la mia risposta.
-1
Hossein RM
2017-12-27 14:17:06 UTC
view on stackexchange narkive permalink

Ho visto anche quel tutorial, non funzionava correttamente, quindi l'ho risolto e ora è da circa un mese che funziona bene. Ho realizzato un video di YouTube su di esso, per controlla le connessioni e fai clic sul tutorial passo passo su >> questo link. in realtà in quel video ti mostrerò come farlo partire automaticamente all'avvio!

In questo metodo usa un transistor S8050 , e questo è codice corretto:

  #! / usr / bin / env python3 # coding: utf-8import osimport timeimport signalimport sysimport RPi.GPIO as GPIOpin = 36 # L'ID pin, modificare qui per cambiarlomaxTMP = 50 # La temperatura massima in Celsius dopo la quale attiviamo il fanGPIO.setmode (GPIO.BOARD) def setup (): GPIO.setmode (GPIO.BOARD) GPIO.setup (pin, GPIO.OUT) GPIO.setwarnings (False) return () def getCPUtemperature (): res = os.popen ('vcgencmd measure_temp'). readline () temp = (res.replace ("temp =", ""). replace ("'C \ n", "") ) print ("temp is {0}". format (temp)) #comment here for stop testing return tempdef fanON (): setPin (True) return () def fanOFF (): setPin (False) return () def getTEMP ( ): CPU_temp = float (getCPUtemperature ()) if CPU_temp>maxTMP: fanON () else: fanOFF () return () def setPin (mode): # Una piccola funzione ridondante ma utile se vuoi aggiungere logging GPIO.output (pin, mode) return () try: setup () while True: getTEMP () time. sleep (8) # Leggi la temperatura ogni 8 sec, aumenta o diminuisci questo limite se vuoi eccetto KeyboardInterrupt: # intrappola un interrupt da tastiera CTRL + C GPIO.cleanup ()  

Buona fortuna!

Milliways
2020-07-27 05:18:34 UTC
view on stackexchange narkive permalink

Molte delle altre risposte erano corrette all'epoca, MA il kernel ora include funzionalità di controllo della temperatura.
È necessario aggiungere solo una singola riga a cmdline.txt

dtoverlay=gpio-fan,temp=60000

per accendere la ventola a 60 ℃ - 60000 millicelcius (il valore predefinito è 55 ℃ ma puoi selezionare qualsiasi temperatura) . La ventola si spegne quando la temperatura scende di 10 ℃.

Questo utilizza l'overlay gpio-fan (che è disponibile nel kernel dalla fine del 2018) e dovrebbe essere incluso in versioni recenti di Raspbian. (Leggi / boot / overlays / README per la descrizione di questo e di altri overlay dell'albero dei dispositivi.)

Vedi https://raspberrypi.stackexchange.com/a/105820 / 8697



Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...