相信不少人都會為熱情的 Pi 4 加上風扇散熱,不過小風扇噪音就成了問題,由於 Pi 也不是隨時都滿載需要風扇全速運轉,所以我們可以利用 PWM (Pulse Width Modulation) 來控制轉速。讓風扇在提高到一定溫度時才啟動,或是降低轉速來降低噪音。
硬體接線
我使用風扇是 Noctua NF-A4 5V PWM ,一個 40mm、5V 的 PWM 控速風扇,下圖是本次所使用的腳位:
- 黃色黑色分別為 5V 電源及接地
- 綠色為轉速信號
- 藍色為 PWM 控制訊號輸入
若風扇不支援 PWM 轉速控制(只有兩線或三線)可以參考 #138 Variable Speed Cooling Fan for Raspberry Pi using PWM and PID controller 此影片或 PWM Regulated Fan Based on CPU Temperature for Raspberry Pi 利用 BJT 電晶體來做 PWM 控制。
轉速訊號線(綠)的部分,由於風扇內是一個開集極電路(OC),所以需要一個上拉電阻(Pull-up resistor)至 Vcc 才能夠讀取到波形,這邊可以參考 Noctua PWM 規格白皮書(英文)(大部分的風扇轉速訊號應該都是這種設計,保險起見建議還是要查看廠商提供的資料)
注意!樹莓派的 GPIO 為 3.3V,所以上拉電阻 Vcc 一定要接到 3.3V,若接到 5V 會造成樹莓派電路損毀!
上拉電阻我這邊選擇了 1kΩ 1/4W,上面官方所提供的資料為電流不可以超過 5mA ,根據 $V=IR$ 可算出電阻應該要 660Ω 以上,如果過低會造成風扇電路過載。
PWM 訊號線因為大部分的微控制器或單晶片的 GPIO 都有做好穩定 PWM 方波的輸出電路了,所以這裡就不需要另外自製電路,直接接上 PWM 輸出腳即可(一般的 GPIO 貌似也能靠軟體設定輸出 PWM 訊號,不過硬體輸出較為穩定),腳位參考。
順帶一提,由於風扇沒有附轉杜邦的線材,所以另外買了 Molex 2510 4PIN (2.54mm間距) 連接器,不過要另外將防呆卡槽消掉一部份,如果有現成的專用風扇線就不用(一般風扇為了相容 3P 連接器所以不會做滿)
以下是接上 Pi 3 做硬體測試及軟體調教的照片:
硬體安裝完成後,接著就用軟體來控制風扇吧!
軟體控制
PWM GPIO 測試
這裡可以先選擇使用 Wiring Pi 來進行測試接線是否正確及 GPIO 是否正常,如果不測試可以直接跳到 PWM 訊號控制轉速。
記得之前的 Pi 版本都是有預裝的,不過目前新版 Pi 4B 還沒加入預設,我們可以透過手動的方式來升級:
1 | cd /tmp |
檢查版本:
gpio -v
撰文時最新版為 2.52
查看 GPIO 狀態:
gpio readall
把 PIN1 設定為 PWM 模式(注意這邊的編號為 wiring-pi 的編號,可參考Pi GPIO Pinout)
gpio mode 1 pwm
設定 PWM 訊號寬度(數值可為 0~1023)
gpio pwm 1 [數值]
檢查風扇是否成功用 PWM 控制,如果有隨著設定數值改變就沒問題了!
PWM 訊號控制轉速
我把控制程式放在 Github 上了,可以點擊參考:DriftKingTW/Raspberry-Pi-PWM-Fan-Control
我使用的是硬體 PWM GPIO18 (12/13與18/19),剩餘的腳位使用的話是軟體 PWM。由於硬體 PWM 跟耳機孔使用相同的電路,所以請不要同時使用
建立資料夾存放要用到的程式:
mkdir -p Scripts
cd Scripts/
下載程式:
1 | wget https://raw.githubusercontent.com/DriftKingTW/Raspberry-Pi-PWM-Fan-Contorl/master/fan_control.py |
開啟試試能不能成功控制:
python fan_control.py
沒問題的話就可以把程式設定為開機自動啟動:
編輯 rc.local
1 | sudo vim /etc/rc.local |
在 exit 0
之上加入以下指令:
1 | python /home/pi/Scripts/fan_control.py & |
檔案路徑可能會不同,記得使用絕對路徑。最後的 “&” 符號代表背景執行。
如果你不想知道原理,可以直接轉跳閱讀:讀取轉速訊號
PWM 控制原理簡單來說就是:輸出方波,利用工作週期(Duty Cycle 又稱佔空比)來控制風扇的轉速,假設方波訊號處於高電位所佔一個週期的時間是 50% 代表讓風扇處於半速狀態,以此類推 75% 即是風扇 75% 速度,更詳細可以參考維基:脈衝寬度調變
接著來分析程式的部分,這邊使用 Python 來做控制:
1 | # 載入需要的函式庫 |
讀取轉速訊號
程式同樣放在 Github 上:DriftKingTW/Raspberry-Pi-PWM-Fan-Control
1 | wget https://raw.githubusercontent.com/DriftKingTW/Raspberry-Pi-PWM-Fan-Control/master/read_fan_speed.py |
開啟即可開始輸出風扇的轉速(RPM),預設每秒偵測一次
python read_fan_speed.py
分析程式:
1 | # 載入需要的函式庫 |
參考
Noctua PWM specifications white paper
wiringPi updated to 2.52 for the Raspberry Pi 4B
#138 Variable Speed Cooling Fan for Raspberry Pi using PWM and PID controller
評論