为了防止树莓派长时间开机运转温度过高导致触发过热关机, 很多人都给装了散热风扇, 但某宝买的风扇插上之后是随着开机一直运转的, 不能随温度变化而自动开闭, 很多时候做无用功浪费电且产生噪音. 本文将以一个硬件小白的程序员视角详细讲述如何用三极管扩展普通的树莓派散热风扇从而实现温控功能.
在制作自己的温控风扇前, 本人也查阅了网上其他资料, 最终选用了三极管方案, 在接线方式中选择了自制杜邦线连接三极管和风扇, 这样的好处是线材的长度可以随自己需要裁剪, 而且可以轻松塞进树莓派的外壳中. 全程无焊接, 以后不用也可方便拆卸线材, 杜邦头, 三极管元件等用作其他用途.
准备材料
以下材料均可某宝购买, 为了省事其中杜邦头和杜邦胶壳是买的套件, 一盒里边有公母端子各 200 个, 以及各种类型的胶壳.
1. 树莓派散热风扇
2. 尖嘴钳: 用来剥线和压线
3. 导线
4. 杜邦端子: 母端子 6 个, 公端子 2 个
5. 杜邦胶壳: 1P1 个, 2P2 个, 3P 一个(非必须)
6. 三极管 S8550
第一步: 制作杜邦线
杜邦线: 电子行业杜邦线可用于实验板的引脚扩展, 增加实验项目等. 可以非常牢靠地和插针连接, 无需焊接, 可以快速进行电路试验.
杜邦端子: 分为两种, 公端子和母端子.
杜邦胶壳: 按照可封装的端子数, 可插一个端子的为 1P, 可插两个端子的为 2P, 四个端子以上的按照排列分为单排 XP 或双排 XP, 例如单排 4P 为可插端子都排列成一排, 双排 4P 为可插端子分为两排, 每排两个端子.
上图:
以上简介如须详细了解请自行搜索相关资料.
此处需要制作 4 跟杜邦线:
其中两根杜邦线两头都带母端子(简称母对母). 一根用于接三极管基极到到主板 GPIO14 引脚上, 另一根用于接三极管集电极到主板地线引脚上.
剩余两根公对母杜邦线, 其中一根公端子插风扇正极 (红线) 母端子, 另一头母端子插主板正极, 另外一根公端子插风扇负极 (黑线) 母端子, 另一头母端子接三极管发射集上.
本人买的导线为单铜芯导线(外径 0.58mm), 后来发现制作一根杜邦线仅用一根导线会卡不牢固, 容易发生导线与杜邦端子脱落, 因此每跟杜邦线都是由两根单铜芯导线组成, 因此本处需要裁剪 8 根导线.
1. 剪 8 根导线, 每根导线长度大约 7cm.
2. 剥线, 用尖嘴钳将导线两端分别露出约 1cm 铜芯.
3. 拧线(此处如果买的导线较粗, 请略过这一步), 将两根导线并排, 分别将两端外露铜芯用尖嘴钳拧在一起. 因为外露铜芯较细为了防止接触不良, 我将外露铜芯反复折叠了两次并拧紧, 实际导线外露的长度大概 2.5mm 左右.
4. 压线, 将导线外露铜芯压入杜邦端子中, 由于手头没有专门的压线钳, 此步骤也用尖嘴钳完成. 成品见图:
注意:
如果买的导线较粗 1cm 左右, 只需剪 4 根即可.(但如果太粗的话可能塞不进端子里边), 另外剥线时导线两端只要露出大概 2-3mm 左右即可
第二步: 用胶壳封装杜邦端子(不用胶壳的这一步可以略过)
第三步: 接线
第四步: 写驱动程序
执行驱动脚本前需要安装相关依赖 yum install -y python-devel, 以及 RPi.GPIO 模块
wget
附上驱动代码:
- #!/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 &
如有需要可自己注册为服务并设置开机自启, 这里不再赘述.
最终成果:
来源: https://segmentfault.com/a/1190000017225701