|
Raspberry Pi
Řízení otáček ventilátoru v RasPi přes
GPIO
Podle typu ventilátoru se jeho napájení připojí buď
na +5V, nebo na +12V.
Program pro řízení ventilátoru
Před spuštěním je třeba v programu nastavit správné konstanty pro převod teploty na PWM
šířku signálu (v kódu zvýrazněno modře).
V programu je i část kódu, která zajišťuje, že se při zvyšování
otáček na chvíli (na půl sekundy) pustí do ventilátoru plný výkon.
To by mělo zajistit jeho bezproblémové roztočení i ze stavu, kdy
ventilátor úplně stojí.
Pokud by ale při regulaci docházelo při tomto rozjezdu ke znatelnému
hluku, je třeba trochu zkrátit čas, po který se ventilátor roztáčí
na plný výkon, nebo upravit tento výkon ze 100% trochu níže (v kódu
zvýrazněno zeleně).
#!/usr/bin/python
# -*- encoding: utf-8 -*-
import RPi.GPIO as GPIO # Knihovna pro praci s GPIO konektorem.
import time # Knihovna pro praci s casem.
import os # Knihovna pro pristup k systemovym prikazum (kvuli zjistovani teploty).
# Konstanty pro prepocet z teploty na PWM sirku signalu.
pwm_min = 30 # Minimalni vykon, pri kterem se dokaze ventilator jeste tocit (alespon trochu fouka) (0 az 100).
tep_min = 36 # Minimalni teplota, pri ktere se zacne ventilator tocit minimalnimi otackami (36 stupnu Celsia).
tep_max = 42 # Teplota, od ktere uz ventilator bezi naplno (42 stupnu Celsia)
ventilator = 8 # Pin na GPIO, kterym je rizeny ventilator.
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM) # Cislovani pinu podle signalu procesoru.
GPIO.setup(ventilator, GPIO.OUT) # Uvodni nastaveni PWM rezimu na vybranem pinu.
signal = GPIO.PWM(ventilator, 25000) # Frekvence PWM na 25kHz (mimo slysitelnou oblast).
signal.start(0)
predchozi_pwm = 0;
while True: # Nekonecna smycka.
# Zjisteni teploty procesoru (v tisicinach stupne Celsia) a uprava na stupne Celsia.
teplota = os.popen("cat /sys/class/thermal/thermal_zone0/temp").readline()
teplota = float(teplota) / 1000
if (teplota < tep_min): pwm = 0 # Az do minimalni teploty ventilator stoji.
if (teplota > tep_max): pwm = 100 # Nad maximalni teplotou je ventilator spusteny naplno.
if (teplota >= tep_min and teplota <= tep_max): # Mezi minimalni a maximalni teplotou probiha linearni vypocet PWM.
pwm = int(((100 - pwm_min) * ((teplota - tep_min) / (tep_max - tep_min))) + pwm_min)
if (predchozi_pwm < pwm): # Pokud se maji otacky zrychlovat, tak se na chvili pusti do ventilatoru plny vykon.
signal.ChangeDutyCycle(100) # (kvuli pripadnemu rozjezdu ze zastaveneho nebo zadreneho stavu)
time.sleep(0.5) # Doba, po kterou se pri zrychlovani otacek pusti ventilator na plno.
predchozi_pwm = pwm # Znacka, aby se pri pristim cyklu zjistilo, jestli se brzdi, nebo zrychluje.
signal.ChangeDutyCycle(pwm) # Nastavi se vypocteny vykon.
print "teplota: " , teplota , "vypoctene pwm: " , pwm
time.sleep(10) # 10 sekund pauza pred dalsim merenim
|
Ke stažení zde: vent-gpio.py
Běh programu při regulaci
Pro ruční nastavování PWM, při zjišťování minimálního
potřebného výkonu pro udržení otáčení, může posloužit třeba tenhle
zjednodušený program:
vent-gpio-test.py
|
|
|