为了防止树莓派长时间开机运转温度太高致使触发过热关机,不少人都给装了散热风扇,但某宝买的风扇插上以后是随着开机一直运转的,不能随温度变化而自动开闭,不少时候作无用功浪费电且产生噪音。本文将以一个硬件小白的程序员视角详细讲述如何用三极管扩展普通的树莓派散热风扇从而实现温控功能。python
在制做本身的温控风扇前,本人也查阅了网上其余资料,最终选用了三极管方案,在接线方式中选择了自制杜邦线链接三极管和风扇,这样的好处是线材的长度能够随本身须要裁剪,并且能够轻松塞进树莓派的外壳中。全程无焊接,之后不用也可方便拆卸线材、杜邦头、三极管元件等用做其余用途。程序员
准备材料
如下材料都可某宝购买,为了省事其中杜邦头和杜邦胶壳是买的套件,一盒里边有公母端子各200个,以及各类类型的胶壳。
1.树莓派散热风扇
2.尖嘴钳:用来剥线和压线
3.导线
4.杜邦端子:母端子6个,公端子2个
5.杜邦胶壳:1P1个,2P2个,3P一个(非必须)
6.三极管S8550this
第一步:制做杜邦线
杜邦线:电子行业杜邦线可用于实验板的引脚扩展,增长实验项目等。能够很是牢靠地和插针链接,无需焊接,能够快速进行电路试验。
杜邦端子:分为两种,公端子和母端子。
杜邦胶壳:按照可封装的端子数,可插一个端子的为1P,可插两个端子的为2P,四个端子以上的按照排列分为单排XP或双排XP,例如单排4P为可插端子都排列成一排,双排4P为可插端子分为两排,每排两个端子。
上图:spa
以上简介如须详细了解请自行搜索相关资料。.net
此处须要制做4跟杜邦线:
其中两根杜邦线两头都带母端子(简称母对母)。一根用于接三极管基极到到主板GPIO14引脚上,另外一根用于接三极管集电极到主板地线引脚上。
剩余两根公对母杜邦线,其中一根公端子插风扇正极(红线)母端子,另外一头母端子插主板正极,另一根公端子插风扇负极(黑线)母端子,另外一头母端子接三极管发射集上。code
本人买的导线为单铜芯导线(外径0.58mm),后来发现制做一根杜邦线仅用一根导线会卡不牢固,容易发生导线与杜邦端子脱落,所以每跟杜邦线都是由两根单铜芯导线组成,所以本处须要裁剪8根导线。
1.剪8根导线,每根导线长度大约7cm。
2.剥线,用尖嘴钳将导线两端分别露出约1cm铜芯。
3.拧线(此处若是买的导线较粗,请略过这一步),将两根导线并排,分别将两端外露铜芯用尖嘴钳拧在一块儿。由于外露铜芯较细为了防止接触不良,我将外露铜芯反复折叠了两次并拧紧,实际导线外露的长度大概2.5mm左右。
4.压线,将导线外露铜芯压入杜邦端子中,因为手头没有专门的压线钳,此步骤也用尖嘴钳完成。成品见图:
注意:
若是买的导线较粗1cm左右,只需剪4根便可。(但若是太粗的话可能塞不进端子里边),另外剥线时导线两端只要露出大概2-3mm左右便可blog
第二步:用胶壳封装杜邦端子(不用胶壳的这一步能够略过)图片
第三步:接线ip
第四步:写驱动程序
执行驱动脚本前须要安装相关依赖yum install -y python-devel,以及RPi.GPIO模块
wget https://jaist.dl.sourceforge....get
附上驱动代码:
#!/usr/bin/python2 import sys import time try: import RPi.GPIO as GPIO except RuntimeError: print("Error importing RPi.GPIO! This is probably because you need superuser privileges. You can achieve this by using 'sudo' to run your script") def cpu_temp(): with open("/sys/class/thermal/thermal_zone0/temp", 'r') as f: return float(f.read())/1000 def main(): channel = 14 GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) # open air fan first GPIO.setup(channel, GPIO.OUT, initial=GPIO.LOW) is_close = False while True: temp = cpu_temp() if is_close == True: if temp > 50.0: print time.ctime(), temp, 'open air fan' GPIO.output(channel, GPIO.LOW) is_close = False else: if temp < 45.0: print time.ctime(), temp, 'close air fan' GPIO.output(channel, GPIO.HIGH) is_close = True time.sleep(15.0) #print time.ctime(), temp, is_close if __name__ == '__main__': main()
注意:由于这里使用的三极管为PNP型三极管,基极施加低电平时才导通电路,若是是用的NPN型三极管则与之相反。
本人的启动脚本:nohup python -u /usr/local/bin/tempctl.py >/usr/local/bin/tempctl.log 2>&1 &
若有须要可本身注册为服务并设置开机自启,这里再也不赘述。
最终成果: