うちで使用している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
センサーから出ているケーブルは、赤が電源、黄が信号線、黒が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
ひとまず完成ですが、低速回転時にファンがジージー鳴るのがイマイチ。回転と停止を制御する温度も、室温と相談しながら決める必要がありますね。今年の夏も故障することなく乗り越えられますように。