知識ゼロから始めるラズパイ -CPU温度によるファン制御-

目次

Pythonプログラム -CPUファンの制御-

回路ができましたので、CPUファンを動かすプログラムを作成していきます。ここでは、シンプルにCPUファンを動かすだけの簡単なプログラムとします。今後は、このプログラムをベースにデーモン化してバックグラウンドで動かすなど、改良していきたいと思います。

プログラム(全様)

import RPi.GPIO as GPIO
import time
import subprocess

GPIO.setmode(GPIO.BCM) # PIN番号にするときは(GPIO.BOARD)

pin = 18 # BCMの番号
GPIO.setup(pin, GPIO.OUT) #入力にする場合は(GPIO.IN)

pwm = GPIO.PWM(pin,100)

cut = 0

while cut < 8640:  #Ends after 24 hours
    
    cut = cut + 1
    
    args = ['cat','/sys/class/thermal/thermal_zone0/temp']
    temp = subprocess.run(args,stdout=subprocess.PIPE,encoding='utf8')
    temp = round(int(temp.stdout)/1000,1)
    
    if temp < 50:
        dt = 50
    elif temp < 70:
        dt = 75
    else:
        dt = 100   

    pwm.start(dt)
    time.sleep(10) 

else:
    pwm.stop()

GPIO.cleanup()

プログラムの説明

プログラムについて簡単に説明します。間違いや、お気づきの点がありましたらご連絡いただけると嬉しいです。

1~3行目 ・・・ ライブラリのインポート

import RPi.GPIO as GPIO 
import time 
import subprocess

GPIOを制御する「RPi.GPIO」、時間を扱う「time」、ラズベリーパイのコマンドを使用するための「subprocess」の3つを呼び出します。

5~10行名 ・・・ ピン番号の指定

GPIO.setmode(GPIO.BCM) # PIN番号にするときは(GPIO.BOARD)

GPIOの番号指定方法をBCM番号に指定します。PIN番号とどちらか使いやすいほうでよいと思います。

pin = 18 # BCMの番号 
GPIO.setup(pin, GPIO.OUT) #入力にする場合は(GPIO.IN)

変数「pin」にBCM番号の18を入力、今回は電流の出力なので「GPIO.OUT」とします。使用するピンについては、ラズベリーパイ購入時の説明書についていたピン配列図からPWM制御ができそうな18番(ピン番号ですと12)を使用します。

ラズベリーパイのピン配列

pwm = GPIO.PWM(pin,100)

PWM制御をするための周波数を指定しています。(最適値がわからなかったため、とりあえず100Hzとしました)

18~30行目 ・・・ CPU温度の取得とDuty比の設定

while文についての説明は省略しますが、24時間経過後にループから抜ける設定としています。

args = ['cat','/sys/class/thermal/thermal_zone0/temp'] 
temp = subprocess.run(args,stdout=subprocess.PIPE,encoding='utf8') 
temp = round(int(temp.stdout)/1000,1)

「cat」を利用して温度を取得し、取得した数字を1/1000として温度を算出しています。詳しい解説は下記のリンクをご確認ください。

ComoAki Site
知識ゼロから始めるラズパイ -CPU温度の監視ー ラズパイにCPUファンを設置したところ「ぶーーん」という音が気になって仕方なかったので、GPIOピンやトランジスタを使用してファンの回転数制御に挑戦します。まずは、Pyt...
if temp < 50: 
  dt = 50 
elif temp < 70:
  dt = 75 
else:
  dt = 100

典型的なIF文です。CPU温度が50℃未満であれば、dtに50を格納。50℃を超えて70度未満であれば、dtに75を格納。それ以外はdtに100を格納しています。

pwm.start(dt) 
time.sleep(10)

先ほど取得したdtについては、「pwm.start(dt)」で Duty比として使用しています。dt=50であれば、50%の出力です。「time.sleep(10)」で10秒経過した後、while文により繰り返し処理が実行されます。

33行目 ・・・ ループからの離脱

pwm.stop()

24時間経過後にループから抜けますので、「pwm.stop()」により出力を停止させます。

動作テスト

私のラズパイは、気温25℃前後の環境下でCPUファンを使用しなかった場合の温度は60℃前後で推移していました。今回のプログラム起動後数分で温度は50℃以下となり、その後50℃前後で落ち着くことがわかりました。

今回のプログラムは50℃以下でDuty比50%としているため、このような動きとなったともいます。数字についてはいろいろと調整して、ノイズ音を発生させない最適な回転速度を見つけていけばよいと思います。

CPU温度を連続取得するプログラムは下記リンクの記事で紹介しています。

ComoAki Site
知識ゼロから始めるラズパイ -CPU温度の監視をGUIで- ラズベリーパイ(Raspberry PI 4B)のCPU温度の監視することのできるGUIアプリをPythonで作成してみました。プログラミングは慣れていないので、非効率な記述となっていた...

今回使用したもの

ブレッドボード

[amazon asin=”B00DSKCS68″ kw=”サンハヤト ブレッドボード”]

ジャンパワイヤ(オス-オス)(メス-メス)(オス-メス)のセットが便利です。

[amazon asin=”B06Y48V9DL” kw=”ジャンパーワイヤ”]

抵抗(セット)は耐久性が高いとされている金属皮膜のものを使用しましたが、青ですと色が読みにくい場合があります。

目に自信がない方は炭素皮膜のほうが良いかもしれません。

[amazon asin=”B07MZWJG8C” kw=”金属皮膜 抵抗 セット”]

[amazon asin=”B082LY9ZQK” kw=”炭素皮膜 抵抗 セット”]

ファンの動きに合わせてLEDを発光させる工夫を加える場合はこちらのセットが便利です。

[amazon asin=”B08BF58FWX” kw=”発光ダイオード セット”]

1 2
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次