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


 

 


úvodní strana webu AstroMiK.org

poslední úprava stránky 4.10.2016