Mine:
圖中圈出來的是三極管 和濾波電容
依賴庫: wiringPi
sudo apt-get install wiringpi
Shell腳本
本文介紹使用Shell腳本在樹莓派上啟用軟件PWM控制風扇轉速。
最新版本下載地址https://github.com/tankririri/RaspberryPi_CPU_PWM
硬件需求
樹莓派(這里用的3代B);
5V小風扇;
NPN三極管,我用的s8050;
面包板加杜邦線,或者用電烙鐵。
硬件接法:
先把電扇直接接到樹莓派上測試一下哪根線是+極,然后把風扇+極直接接在樹莓派的5V上,-極接在三極管集電極Collector。
(從三極管平的那面看)
三極管發射極Emitter接樹莓派GND,基極Base接樹莓派Pin12#(GPIO18)(GPIO_GEN1),資料表明只有這個針腳可以啟用軟件pwm,其他針腳我也沒有試過。
軟件需求
安裝GPIO驅動,這里使用C語言編寫的wiringPi,安裝步驟看這里。
在按照上面的方法連接好風扇以后,風扇是不會轉的,此時可以先手動控制風扇測試一下,在終端中輸入以下命令開啟風扇
gpio mode 1 pwm gpio pwm 1 1023
正常情況下風扇應該會開始全速運轉。
可以使用gpio readall命令查看針腳信息,針腳模式應該顯示ALT5,見下圖。
設置風扇自動調速:
新建一個cpu_fan.sh文件,輸入以下內容
#!/bin/sh #sleep 5 #設置運行狀態文件 RUN=/var/run/cpu-fan.run touch $RUN chmod 777 $RUN #設置風扇默認運行模式,0為關閉,1為全速,2為自動,運行過程中可以直接修改/var/run/cpu-fan.run文件來生效 echo "2" > $RUN #設置開啟風扇的最低溫度 set_temp_min=35000 #設置關閉風扇溫度比最低溫度小1度 shutdown_temp=`expr $set_temp_min - 1000` #設置風扇全速運行的溫度 set_temp_max=70000 #開機風扇全速運行 #默認的pwm值范圍是0~1023 gpio mode 1 pwm gpio pwm 1 1023 #初始化參數 fan=0 while true do #獲取cpu溫度 tmp=`cat /sys/class/thermal/thermal_zone0/temp` status=`cat $RUN` #計算pwm值,從變量set_temp_min設置的溫度開始開啟風扇,最低轉速50% pwm=$((($tmp-$set_temp_min)*512/($set_temp_max-$set_temp_min)+511)) #設置pwm值上限 if [ $pwm -gt 1023 ] ;then pwm=1023 fi #小於設置溫度關閉風扇 if [ $tmp -le $shutdown_temp ] ;then pwm=0 fan=0 else #第一次超過設置溫度全速開啟風扇,防止風扇不能啟動 if [ $tmp -gt $set_temp_min ] && [ $fan -eq 0 ] ;then gpio pwm 1 1023 fan=1 sleep 5 fi fi #檢查run文件,為0時關閉風扇 if [ $status -eq 0 ] ;then pwm=0 fan=0 else #檢查run文件,為1時持續開啟風扇最高轉速 if [ $status -eq 1 ] ;then pwm=1023 fi fi gpio pwm 1 $pwm #每5秒鍾檢查一次溫度 sleep 5 #輸出日志,不需要的可注釋掉 echo "`date` temp=$tmp pwm=$pwm status=$status" >> /var/log/cpu-fan/cpu-fan.log done
最新版本下載地址https://github.com/tankririri/RaspberryPi_CPU_PWM
配置日志自動管理:
新建/etc/logrotate.d/cpu-fan文件,輸入以下內容
/var/log/cpu-fan/cpu-fan.log { su root rotate 7 daily compress delaycompress missingok notifempty create 666 root root }
由於腳本運行在一般用戶下,所以對日志文件的訪問會產生權限問題,第一次運行的時候需要將/var/log/cpu-fan/cpu-fan.log文件的組和擁有者改為root,文件權限改為666
mkdir /var/log/cpu-fan chown root:root /var/log/cpu-fan chmod 777 /var/log/cpu-fan touch /var/log/cpu-fan/cpu-fan.log chown root:root /var/log/cpu-fan/cpu-fan.log chmod 666 /var/log/cpu-fan/cpu-fan.log
設置開機自動運行
在/etc/rc.local文件中添加以下內容
su -c /home/xbian/cpu_fan.sh xbian
我這里裝的是xbian的系統,所以用戶名是xbian,如果用的是官方rasbian系統,用戶名就是pi。
這里需要注意的是,如果使用root用戶開機運行腳本,會發生bug,腳本不會發生作用。另外還需要關閉lirc服務,否則會導致cpu占用率100%。
如果開機完成后手動運行腳本則沒有任何問題,目前尚不知道bug產生的具體原因,上述問題可能都跟gpio驅動有關系。
Python


樹莓派的15號引腳連接到了三極管的基極(引腳編號可參看這里),當溫度過高時,GPIO引腳輸出低電平,可以開啟風扇。python程序為:
#!/usr/bin/python2 #coding:utf8 #自動風扇控制程序,使用wiringPi的gpio命令來操作GPIO import commands,time #控制風扇的GPIO FAN_GPIO = 15 commands.getoutput('sudo gpio mode '+str(FAN_GPIO)+' OUTPUT') while True: # 獲取CPU溫度 tmpFile = open( '/sys/class/thermal/thermal_zone0/temp' ) cpu_temp_raw = tmpFile.read() tmpFile.close() cpu_temp = round(float(cpu_temp_raw)/1000, 1) print cpu_temp #如果溫度大於50`C,就啟動風扇 if cpu_temp >= 50.0 : commands.getoutput('sudo gpio write '+str(FAN_GPIO)+' 0') #如果溫度小於45`C,就關閉風扇 if cpu_temp <= 45.0 : commands.getoutput('sudo gpio write '+str(FAN_GPIO)+' 1') time.sleep(10)
保存為 cool.py 后,運行程序。
sudo python cool.py
當溫度高於50度就開啟風扇降溫,溫度降到45度以下時關閉風扇,這樣可以防止風扇在臨界點往復。
C 語言 電機調速
#include <wiringPi.h> #define PWMPin 1 //定義PWM引腳 void setup(); int main (void) { setup(); intval = 0; intstep = 2; while(1) { if(val>1024) { step = -step; val = 1024; } else if(val<0) { step = -step; val = 0; } pwmWrite(PWMPin,val); val+=step; delay(10); } return 0 ; } /*初始化配置*/ void setup() { wiringPiSetup (); //wiringPi庫初始化 pinMode (PWMPin, PWM_OUTPUT); //設置1為PWM輸出 }
編譯
gcc -o pwm pwm.c -lwiringPi
運行:
./pwm或者sudo ./pwm
參考:
https://blog.csdn.net/lzty634158/article/details/72902803