ラズパイ ライフを楽しんでますでしょうか。

コロナ過前に入手したので、4年ぐらい前ですかね。

品薄になる直前に入手した Raspberry PI 4 8GB を持っています。

最近、特に利用目的が無くなってきたので、TVサーバーにでもしようかと思ったのですが、熱対策しないと暴走しちゃいますよね。

なので、ファンを取り付けて対策をすることにしました。

で、こんなFanを買って、取り付け(両面テープで)ました。

ファン購入先

ピンアサインは、↑こんな感じです。

 

物が手に入ったので、制御プログラムの作成ですよ。

今回は、Ubuntu23用です。

まず、必要そうな物をrootでぶち込みます。

apt install python-dev-is-python3
apt install python3-pip
apt install python3-rpi.gpio
apt install python3-pigpio
apt install pigpio-tools


pigpio(ラズパイでGPIOを制御するやつ)ってのが、Ubuntuでパッケージ化されていなかったので、ビルドです。

ビルドに必要そうな物は、適当にぶち込んでおいてください。
wget https://github.com/joan2937/pigpio/archive/refs/tags/v79.tar.gz
tar -xvf ./v79.tar.gz
cd pigpio-79
make
make install

 
※pigpiodは、TCP 8888番を使用します。もし、都合が悪かったら、改造しましょう
pigpio.h
#define PI_DEFAULT_SOCKET_PORT             8888
#define PI_DEFAULT_SOCKET_PORT_STR         "8888"
#define PI_DEFAULT_SOCKET_PORT             8898
#define PI_DEFAULT_SOCKET_PORT_STR         "8898"
pigpio.py
port = os.getenv("PIGPIO_PORT", 8888),
port = os.getenv("PIGPIO_PORT", 8898),
 
 
サービスデーモン化しときます。
/etc/systemd/system/pigpiod.service
[Unit]
Description=Daemon required to control GPIO pins via pigpio
[Service]
#ExecStart=/usr/local/bin/pigpiod -l -m #Disable alerts
ExecStart=/usr/local/bin/pigpiod -m #Disable alerts
ExecStop=/bin/systemctl kill pigpiod
Type=forking
 
[Install]
WantedBy=multi-user.target
 
登録して起動だ

systemctl daemon-reload
systemctl enable pigpiod
systemctl restart pigpiod


ファン制御用のスクリプトを作っちゃいます。

/root/fanctl.py

#!/bin/python3
 
import signal
import pigpio
import time
 
#Fan control
def fanctl(PWMfreq, PWMduty):
    gpio_pin0 = 18
 
    pi = pigpio.pi()
    pi.set_mode(gpio_pin0, pigpio.OUTPUT)
 
    # GPIO18
    pi.hardware_PWM(gpio_pin0, PWMfreq, PWMduty)
    pi.stop()
 
#Capture CPU Temparature
def cputemp():
    cputemppath = "/sys/class/thermal/thermal_zone0/temp"
    try:
        f = open(cputemppath)
        return int(f.read())/1000
    except Exception as e:
        return None
    finally:
        f.close()
 
running = True
 
#Catch signal
def handle_signal(signum, frame):
    global running
    print(f"Received signal {signum}. Exiting loop.")
    running = False
 
# シグナル設定
signal.signal(signal.SIGINT, handle_signal)
signal.signal(signal.SIGTERM, handle_signal)
 
#Loop
while(running):
    ctemp = cputemp()
    PWMfreq = 2
    PWMduty = 500000
 
    if ctemp < 45.0:
        PWMfreq = 0
        PWMduty = 1000000
    elif ctemp < 53.0:
        PWMfreq = 240000
        PWMduty = 1000000
    else:
        PWMfreq = 800000
        PWMduty = 1000000
 
    print(ctemp)
    fanctl(PWMfreq,PWMduty)
 
    time.sleep(10)

 

実行権限を与えておきます

chmod a+x /root/fanctl.py

 

スクリプトもサービスデーモン化しときます。

/etc/systemd/system/fanctl.service
[Unit]
Description=Raspberry Pi Fan Control
After=network.target
 
[Service]
ExecStart=/usr/bin/python3 /root/fanctl.py
WorkingDirectory=/tmp
StandardOutput=file:/var/log/fanctl.log
StandardError=file:/var/log/fanctl_error.log
Restart=always
 
[Install]
WantedBy=multi-user.target

 

スクリプトも登録して起動だ
systemctl daemon-reload
systemctl enable fanctl
systemctl restart fanctl

 

Joomla templates by a4joomla