概要
Raspberry PI 3Bのモジュールの上に放熱板を貼って熱対策を行っていたのですがそれでもプログラム実行中意外と熱くなる事に気づきました。 そこでもっと強力は放熱板としてこれを買って見ました。
これには付いている2つのファンはとても静かで満足しているのですが、CPUの温度で回転を制御出来ないか調べて見ました。
駆動用回路の作成
ブラシ付きか無しか
モータがブラシ付きがどうかで回路が違ってきます。モータにラベルも無く判別出来なかったのですが、2本のコード (赤と黒)の抵抗を測ると約230KΩ有りました。ブラシ有りの場合これはモータのコイルに直結しているはずで、230kΩ なんて大きな抵抗になるはずは有りません。この事からモータはブラシレスと判断しました。
駆動用回路
- モータを2SC1815で駆動しています。
- モータの赤い線を5Vに、黒い線をトランジスタのコレクタにつなぎます
- GPIO17から1kΩの抵抗を通してベースにつなぎ、これてモータをオンオフします。
- 注意
- ブラシレスモータなのでPWMによる回転数の制御は出来ません。
- モータの配線(赤と黒)を間違えるとモータが壊れます。注意して下さい。
制御用コード
先ずは簡単にファンを回し、1分(60秒)後に停止するプログラムです。
import RPi.GPIO as GPIO
import time
FAN_PIN = 17
GPIO.setmode(GPIO.BCM)
GPIO.setup(FAN_PIN, GPIO.OUT)
try:
print("ファンをONにします")
GPIO.output(FAN_PIN, GPIO.HIGH)
# 60秒待機
time.sleep(60)
print("ファンをOFFにします")
GPIO.output(FAN_PIN, GPIO.LOW)
except KeyboardInterrupt:
print("中断されました")
finally:
GPIO.cleanup()
print("終了しました")
ファンが回ることを確認したら今度はRaspberry PIの温度を測定してファンを管理します。
# /home/kita/cam_serve/fan_control.py
import time
import os
import RPi.GPIO as GPIO
# GPIO設定
FAN_PIN = 17
GPIO.setmode(GPIO.BCM)
GPIO.setup(FAN_PIN, GPIO.OUT)
def get_temp():
temp_str = os.popen('vcgencmd measure_temp').readline()
return float(temp_str.replace("temp=","").replace("'C\n",""))
def main():
fan_on = False
print("ファン制御プログラムを開始しました")
while True:
try:
temp = get_temp()
if temp >= 50.0 and not fan_on:
GPIO.output(FAN_PIN, GPIO.HIGH)
fan_on = True
print(f"温度 {temp}℃: ファンON")
elif temp <= 40.0 and fan_on:
GPIO.output(FAN_PIN, GPIO.LOW)
fan_on = False
print(f"温度 {temp}℃: ファンOFF")
except Exception as e:
print(f"エラー: {e}")
time.sleep(10)
if __name__ == "__main__":
try:
main()
except KeyboardInterrupt:
GPIO.cleanup()
- sudo python3 fan_motor_01.py で実行して下さい
- 10秒間隔でCPUの温度を測定し
- 50度以上ならモータを回転。40度以下なら停止。と設定しています。
これ用にサービスファイルを作成(xxxxの箇所は調整下さい)
Description=Standalone Fan Control Service
After=network.target
[Service]
User=xxxxxxxx
WorkingDirectory=/xxxxx
ExecStart=/xxx/python3 fan_motor_01.py
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
下記を実行すればRaspberry PIの起動と同時にモータの管理が開始します。
sudo systemctl enable fan_control.service
sudo systemctl start fan_control.service
最後に
以外と簡単にモーアの制御が出来ました。モータの消費電流が非常に少なければ 2個一緒になっている線を別々に分けトランジスタを使わずにGPIOの出力で駆動出来るかもしれません。