スイッチングハブの温度を計測&ファンで冷やす

本ページにはプロモーションが含まれています

うちで使用している10Gb対応のスイッチングハブGS110MXは、ファン非搭載なので無音で働いてくれています。しかし、無音の代償として10Gポート付近はかなり熱をもちます。あちあちです。これから始まる気温の高い季節を無事に乗り切るために、これをなんとかしようと思います。

これまでは充電式の扇風機で冷やしていました

これまでも、スイッチが熱々になっていたら、充電式の携帯型扇風機で風を送って冷やすようにしていました。これでも良いのですが、充電式のため、電池が切れると止まってしまうのが、ちょっとイマイチ。バッテリーにダメージがあるので、充電しながら使用するわけにもいきません。また、外出時に持ち出すこともあり、そのタイミングで扇風機のバッテリーが空っぽだった、というのも困ります。そんなわけで、別の方法でスイッチを冷やすことにします。

こんな感じで風をあてていました。

スイッチングハブの温度を測って、ファンで冷やす

単純に小型の扇風機を手動でON/OFFしても良いのですが、それではおもしろくありません。復活させたラズパイもあるので、ファンと温度センサーを繋いで、測定した温度に応じて、接続したファンの回転数を変えてみます。

用意したもの

まず温度を測るセンサー。ラズパイで使用できるセンサーとしてはメジャーっぽいDS18B20を購入しました。脚が3本あるセンサーですが、今回は1mのケーブルが結線されたものを購入しました。3個入りで¥798。

ファンは5V対応の、60x60x15mmサイズのものを秋月電子で購入しました。一個¥380。

回路のON/OFFに使うトランジスタは2SC1815L-GR-T92-K 50V150mA。これも電子工作界隈ではメジャーなものらしい。20個入りで¥100、秋月電子で購入。

抵抗器も必要になるので詰め合わせを購入(バラで買うと割高感あるので)。600本入りで¥989。4.7kΩの抵抗をひとつ使います。

これらを組み合わせた全体的な回路はこんな感じ。

ブレッドボードを使って繋いだ状態はこんな感じ。ラズパイにファンが取り付けてあるため、上図よりもケーブルの数が多くなっています。

温度を取得してみる

温度センサーDS18B20は、1-Wire通信というもので制御します。ラズパイで1-Wire通信を使用できるよう設定します。

pi@raspberrypi:~ $ sudo raspi-config
表示された画面のInterface Options -> 1-Wireで設定します。

センサーから出ているケーブルは、赤が電源、黄が信号線、黒がGND。それぞれ赤線は3.3Vの電源へ、黄線はGPIOの4番へ、黒線はGNDに繋いでいます。赤線と黄線の間に抵抗を挟んでいます。

正しく繋がっていれば/sys/bus/w1/devices/ にセンサーが出てきます。28-0b235761a22eというのがセンサー。catコマンドでw1_slaveを読み取ると温度を読み取ることができます。t=xxxxxxというのが温度です。t=25812なので、25.812℃です。

pi@raspberrypi:~ $ ls /sys/bus/w1/devices/
28-0b235761a22e  w1_bus_master1
pi@raspberrypi:~ $ ls /sys/bus/w1/devices/28-0b235761a22e
alarms  conv_time  driver  eeprom_cmd  ext_power  features  hwmon  id  name  power  resolution  subsystem  temperature  uevent  w1_slave
pi@raspberrypi:~ $ cat /sys/bus/w1/devices/28-0b235761a22e/w1_slave 
9d 01 4b 46 7f ff 03 10 57 : crc=57 YES
9d 01 4b 46 7f ff 03 10 57 t=25812

思っていたよりも簡単に温度を読み取ることができました。次は、ファンの回転数をPWMで制御できるようにします。

ファンの回転数を制御する

トランジスタ2SC1815Lの三本の足は正面(平らな方)から見て、左がエミッタ、真ん中がコレクタ、右がベース。エミッタはGNDへ、コレクタはファンのマイナスへ、ベースはGPIO18に繋いでいます。回転数を制御するプログラムにはPythonを使用。thermalという名前の仮想環境で行なっています。

#RPI.GPIOをインストール。
pi@raspberrypi:~ $ pip3 install RPi.GPIO

#以下、pythonスクリプト。
#! /home/pi/thermal/bin/python3

#モジュールをインポート
import w1thermsensor, time

#RPi.GPIOモジュールをインポート
import RPi.GPIO as GPIO

FAN =18
Hz = 60

# BCM(GPIO番号)で指定する設定
GPIO.setmode(GPIO.BCM)

# GPIO18を出力モード設定
GPIO.setup(FAN, GPIO.OUT)

p = GPIO.PWM(FAN, Hz)

# 閾値
highTemp = 40
middleTemp = 36
lowTemp = 32

# センサー
sensors = w1thermsensor.W1ThermSensor()

#duty
duty = 100
p.start(duty)
time.sleep(1)

def main():
    while True:
        # センサーから温度を取得
        temp = sensors.get_temperature()

        if temp >= highTemp:
            duty = 100

        elif temp >= middleTemp:
            duty = 75

        elif temp >= lowTemp:
            duty = 50

        else:
            duty = 25

        p.ChangeDutyCycle(duty)
        time.sleep(5)

    p.stop()

    # GPIO設定クリア
    GPIO.cleanup()

if __name__ == "__main__":
    main()

このスクリプトをデーモン化します。

/etc/systemd/system/fanctrl.service 

[Unit]
Desctiption = Fan control

[Service]
ExecStart = /home/pi/thermal/fanctrl.py
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target

ひとまず完成ですが、低速回転時にファンがジージー鳴るのがイマイチ。回転と停止を制御する温度も、室温と相談しながら決める必要がありますね。今年の夏も故障することなく乗り越えられますように。

ペットボトルキャップに収まる基盤にはんだ付けしました。