前言

折腾了一段时间树莓派3B+。后来发现一个问题,那就是树莓派上面的散热小风扇,只要一通电,就开始转起来了,不管你开没开机。这是真的坑啊,我不想它一直转啊,就不说费不费电了,安静时风扇一直嗡嗡嗡的转,听着就烦躁。我就想弄一个东西控制一下,超过设定温度就开风扇,低于设定温度就停止。

硬件准备

硬件方面,需要如下几样东西:

首先,你需要有几根杜邦线(主要是杜邦线上的插头,需要三个),如下图所示
ChaTou.jpg

一个pnp类型的三极管,我用的型号是ss8550
SanJiGuan.jpg

散热小风扇,这个必须要有哈
FengShan.jpg

两根导线,经过实验,杜邦线不沾焊锡,鬼知道是什么材质啊,所以必须要另外准备导线

软件准备

我们需要在树莓派上安装一个软件 wiringPi,因为我们需要用这个软件来控制树莓派的引脚信号,这个软件有好几种安装方法。

方法一:

注意:该方式已失效,请看方法二或者方法三。

首先进这个网站:https://git.drogon.net/?p=wiringPi;a=summary

进去后点击 snapshot 按钮下载 wiringPi ,下载最新的一个就行了。
wiringPi.jpg

需要注意的是,因为一些大家都懂的原因,你可能没法下载,你需要进行魔法上网,或者用 Git 来进行安装,具体教程自行百度。

下载完成后,得到 wiringPi-36fb7f1.tar.gz 压缩包(注意,压缩包的 36fb7f1 是版本号,你下载时可能已经不是这个版本了,下载最新的就行,这个不用管),将压缩包上传到树莓派中,我放在了 /home/pi 目录。然后将压缩包解压

pi@fyypll:~ $ tar -zxvf wiringPi-36fb7f1.tar.gz

解压后得到 wiringPi-36fb7f1 文件夹,进入这个文件夹,进行编译安装

pi@fyypll:~ $ cd wiringPi-36fb7f1
pi@fyypll:~ $ ./build

几秒钟后 wiringPi 将会自动安装完毕,输入 sudo gpio -v 命令测试一下。

pi@fyypll:~ $ sudo gpio -v
gpio version: 2.50
Copyright (c) 2012-2018 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty

Raspberry Pi Details:
  Type: Pi 3B+, Revision: 03, Memory: 1024MB, Maker: Sony 
  * Device tree is enabled.
  *--> Raspberry Pi 3 Model B Plus Rev 1.3
  * This Raspberry Pi supports user-level GPIO access.

若输出以上类似信息,证明软件安装成功。

方法二:

上面的方法太麻烦了,若你想简单快速的安装,请忘记上面的方法。

上面的操作都是在 2019-04-08-raspbian-stretch-lite.zip 这一版系统的操作,由于是最小化系统,所以需要的所有东西都要自己装。

我最近重装了系统,发现 2019-07-10-raspbian-buster.zip 这一版的镜像,可能是因为是桌面版的原因,所以已经安装了 wiringpi ,若没有安装,可以执行以下命令安装:

sudo apt-get install wiringpi

是的,这样就安装完了,够快吧

wiringpi 官方下载网站:http://wiringpi.com/download-and-install ,用法官网都有。

方法三:

时间:2021/08/25

最近发现方法一已经没用了,网站关了,遂记录此安装方式。

首先先安装需要的软件依赖

sudo apt-get update
sudo apt-get install gcc automake autoconf libtool make

然后到 github 拉取 WiringPi 代码,然后安装即可

cd /usr
git clone https://github.com/WiringPi/WiringPi
cd WiringPi
sudo ./build

同样的,安装以后,验证一下是否安装成功

root@raspbian:~# gpio -v
gpio version: 2.60
Copyright (c) 2012-2018 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty

Raspberry Pi Details:
  Type: Pi 3B+, Revision: 03, Memory: 1024MB, Maker: Sony 
  * Device tree is enabled.
  *--> Raspberry Pi 3 Model B Plus Rev 1.3
  * This Raspberry Pi supports user-level GPIO access.

输出版本信息即为安装成功

焊接风扇

三极管平的一面对着自己,三个脚从左到右分别为E(发射极)、B(基极)、C(集电极)。

将准备的两根导线分别焊在发射极和基极,将小风扇负极(黑线)焊在集电极。然后将从杜邦线上拆下来的三个插头分别安装在连接发射极的导线、连接基极的导线、小风扇正极(红线)。至此,小风扇焊接完成了。

风扇安装

经过焊接改装的小风扇将会有三个插头,应该如何安装?

我们首先需要确定引脚位置,将树莓派有网线接口的那面朝下,然后引脚的那面对着自己,从左往右数,引脚编号分别为:

1    2
3    4
5    6
7    8
.....

我们需要将风扇的红线(正极)插在4号脚,发射极插在6号脚,基极插在8号脚,如下图所示。
ShanRe.jpg

至此,风扇的安装也完成了。

备注:2019/8/15,风扇的线插错引脚了,树莓派通电后发现脚本控制不了风扇了,排查发现是插错了引脚。插回正确位置后,风扇转动不起来,用手拨动才会轻轻的转。首先分析是电压小了,用万用表测 gpio 引脚,电压测得5.25V,电压正常。后来猜测是三极管因为插错引脚所以烧了,重新换一个三极管后,一切恢复正常。

wiringPi引脚编码

上面我们说方法判断的是物理引脚编号,在 wiringPi 中引脚编码可是不一样的了。我们可以通过命令查看物理引脚编码和wiringPi编码的对应关系:

pi@fyypll:~ $ sudo gpio readall
 +-----+-----+---------+------+---+---Pi 3B+-+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     |
 |   2 |   8 |   SDA.1 |   IN | 1 |  3 || 4  |   |      | 5v      |     |     |
 |   3 |   9 |   SCL.1 |   IN | 1 |  5 || 6  |   |      | 0v      |     |     |
 |   4 |   7 | GPIO. 7 |   IN | 1 |  7 || 8  | 1 | OUT  | TxD     | 15  | 14  |
 |     |     |      0v |      |   |  9 || 10 | 1 | IN   | RxD     | 16  | 15  |
 |  17 |   0 | GPIO. 0 |   IN | 0 | 11 || 12 | 0 | IN   | GPIO. 1 | 1   | 18  |
 |  27 |   2 | GPIO. 2 |   IN | 0 | 13 || 14 |   |      | 0v      |     |     |
 |  22 |   3 | GPIO. 3 |   IN | 0 | 15 || 16 | 0 | IN   | GPIO. 4 | 4   | 23  |
 |     |     |    3.3v |      |   | 17 || 18 | 0 | IN   | GPIO. 5 | 5   | 24  |
 |  10 |  12 |    MOSI |   IN | 0 | 19 || 20 |   |      | 0v      |     |     |
 |   9 |  13 |    MISO |   IN | 0 | 21 || 22 | 0 | IN   | GPIO. 6 | 6   | 25  |
 |  11 |  14 |    SCLK |   IN | 0 | 23 || 24 | 1 | IN   | CE0     | 10  | 8   |
 |     |     |      0v |      |   | 25 || 26 | 1 | IN   | CE1     | 11  | 7   |
 |   0 |  30 |   SDA.0 |   IN | 1 | 27 || 28 | 1 | IN   | SCL.0   | 31  | 1   |
 |   5 |  21 | GPIO.21 |   IN | 1 | 29 || 30 |   |      | 0v      |     |     |
 |   6 |  22 | GPIO.22 |   IN | 1 | 31 || 32 | 0 | IN   | GPIO.26 | 26  | 12  |
 |  13 |  23 | GPIO.23 |   IN | 0 | 33 || 34 |   |      | 0v      |     |     |
 |  19 |  24 | GPIO.24 |   IN | 0 | 35 || 36 | 0 | IN   | GPIO.27 | 27  | 16  |
 |  26 |  25 | GPIO.25 |   IN | 0 | 37 || 38 | 0 | IN   | GPIO.28 | 28  | 20  |
 |     |     |      0v |      |   | 39 || 40 | 0 | IN   | GPIO.29 | 29  | 21  |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+---Pi 3B+-+---+------+---------+-----+-----+
pi@fyypll:~ $ 

要是上面这个你看着懵比的话,那我用一张别人做好的图吧:
YinJiao.jpg

我们可以看到,4号和6号物理引脚没有 wiringPi 编码,但是8号物理引脚有,对应 wiringPi 编码是15。

记住这个编码,因为我们下面的代码要通过这个8号引脚控制风扇转还是停,就需要这个编码来控制。

编写脚本

因为我们要通过8号物理引脚控制风扇,在编写程序时,就要用它对应的 wiringPi 编码15来控制。

我的控制代码是用 shell 脚本写的,我看网上有的用C有的用Python,完全没必要啊,直接用 shell 脚本多简单啊。

建个 fengshan.sh 文件,写入如下代码:

#!/bin/bash
#设置8号物理I/O口为输出状态
sudo gpio mode 15 'OUTPUT'
#设置为死循环,一直监控设备状态
while :
do
temp=`cat /sys/class/thermal/thermal_zone0/temp`
#获取cpu的温度
cpu_temp=`expr $temp / 1000`
#如果cpu温度大于45度
if [ $cpu_temp -gt 45 ]
then
    #开启风扇
    sudo gpio write 15 0
fi
#如果cpu温度小于37度
if [ $cpu_temp -lt 37 ]
then
    #关闭风扇
    sudo gpio write 15 1
fi
#每隔10秒执行一次循环
sleep 10
done

脚本写好后,我直接将脚本放到 /usr 目录下,给脚本执行权限 chmod +x /usr/fengshan.sh

设置开机启动

脚本弄好了,将脚本加入开机启动,这样每次开机都不需要我们手动执行脚本了。

sudo vim /etc/rc.local 命令打开 /etc/rc.local 文件,你会看到如下内容:

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi
exit 0

将代码

nohup /usr/fengshan.sh > /usr/fengshan.log 2>&1 &

加入 fiexit 0 中间,然后保存即可。

分类: LinuxRaspberry 标签: 编程树莓派

评论

暂无评论数据

暂无评论数据

目录