raspberry piでPWM制御したファンを動かそう

スポンサーリンク
プログラミング

raspberry piでPWM制御したファンを動かそう

夏になってきてRaspberry PiのCPU温度が気になってきました。 なので、Raspberry PiようにCPUファンのようなものを作ろうと思います。

スポンサーリンク

必要なもの

主に必要なものは以下のものです。

  • Raspberry Pi

 

  • MOSFET

2N7000

 

  • 2Pinのファン

 

  • ジャンパーピン

配線図

以下のように配線します。 GPIOは18を使っています。

RaspberryPi_FanController

ファンを動かすプログラム

詳細 nozo-moto/fan_controller

詳細を知りたくない人向け

以下をコピペして終了

git clone https://github.com/nozo-moto/fan_controller.git
cd fan_controller
bash install.sh
sudo systemctl start fan_controller.service

詳細

先ほどGPIOの18に繋いだので、それを元にPWM制御します。

実装は以下になります。

手順は

  • 温度を取得してきて

    with open("/sys/class/thermal/thermal_zone0/temp", "r") as f:
        tmp = f.read()
        return int(tmp) / 1000
  • 温度を元にファンの速度を決めます。 ここの設定をいじれば、好みにカスタマイズできます。

            p.start(fan_power)
            temp = get_temp()
            if temp < 20.0:
                fan_power = 20
            elif temp < 50:
                fan_power = 50
            else:
                fan_power = 100
            p.ChangeDutyCycle(fan_power)

以下のように実装しました。

import RPi.GPIO as GPIO
import time

check_temp_interval = 15
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)
GPIO18 = 18

def get_temp():
    with open("/sys/class/thermal/thermal_zone0/temp", "r") as f:
        tmp = f.read()
        return int(tmp) / 1000

def run():
    print("run pwm fan")
    p = GPIO.PWM(GPIO18, 50)
    try:
        # fan_power 0% ~ 100%
        fan_power = 10
        while True:
            p.start(fan_power)
            temp = get_temp()
            if temp < 20.0:
                fan_power = 20
            elif temp < 50:
                fan_power = 50
            else:
                fan_power = 100
            p.ChangeDutyCycle(fan_power)

            time.sleep(check_temp_interval)
    except Exception as e:
        print(e)
    finally:
        p.stop()
        GPIO.cleanup()

if __name__ == "__main__":
    run()

systemctlの設定

systemctlで起動できるように設定ファイルを書きます。

[Unit]
Description = fan_controller

[Service]
ExecStart = /opt/fan_controller.py
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target

これを元にsystemctl startすれば動きます。

コメント

タイトルとURLをコピーしました