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  pwm
gpio pwm

正常情况下风扇应该会开始全速运转。

可以使用gpio readall命令查看针脚信息,针脚模式应该显示ALT5,见下图。

设置风扇自动调速:

新建一个cpu_fan.sh文件,输入以下内容

#!/bin/sh

#sleep
#设置运行状态文件
RUN=/var/run/cpu-fan.run
touch $RUN
chmod $RUN
#设置风扇默认运行模式,0为关闭,1为全速,2为自动,运行过程中可以直接修改/var/run/cpu-fan.run文件来生效
echo "" > $RUN
#设置开启风扇的最低温度
set_temp_min=
#设置关闭风扇温度比最低温度小1度
shutdown_temp=`expr $set_temp_min - `
#设置风扇全速运行的温度
set_temp_max= #开机风扇全速运行
#默认的pwm值范围是0~
gpio mode pwm
gpio pwm #初始化参数
fan= 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)*/($set_temp_max-$set_temp_min)+)) #设置pwm值上限
if [ $pwm -gt ] ;then
pwm=
fi #小于设置温度关闭风扇
if [ $tmp -le $shutdown_temp ] ;then
pwm=
fan=
else #第一次超过设置温度全速开启风扇,防止风扇不能启动
if [ $tmp -gt $set_temp_min ] && [ $fan -eq ] ;then
gpio pwm
fan=
sleep
fi
fi #检查run文件,为0时关闭风扇
if [ $status -eq ] ;then
pwm=
fan=
else #检查run文件,为1时持续开启风扇最高转速
if [ $status -eq ] ;then
pwm=
fi
fi gpio pwm $pwm #每5秒钟检查一次温度
sleep #输出日志,不需要的可注释掉
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
daily
compress
delaycompress
missingok
notifempty
create root root
}

由于脚本运行在一般用户下,所以对日志文件的访问会产生权限问题,第一次运行的时候需要将/var/log/cpu-fan/cpu-fan.log文件的组和拥有者改为root,文件权限改为666

mkdir /var/log/cpu-fan
chown root:root /var/log/cpu-fan
chmod /var/log/cpu-fan
touch /var/log/cpu-fan/cpu-fan.log
chown root:root /var/log/cpu-fan/cpu-fan.log
chmod /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)+'')
#如果温度小于45`C,就关闭风扇
if cpu_temp <= 45.0 :
commands.getoutput('sudo gpio write '+str(FAN_GPIO)+'') time.sleep(10)
 

保存为 cool.py 后,运行程序。

sudo python cool.py
 

当温度高于50度就开启风扇降温,温度降到45度以下时关闭风扇,这样可以防止风扇在临界点往复。

 

C 语言 电机调速

对于树莓派硬件PWM只有1脚(wiringPi)GPIO.1,那么我们单独测试此脚通过不同占空比可以实现呼吸灯或者控制电机速度。
 
按照如下接线。
LED正极接GPIO.1,串联一个220Ω电阻接地,ULN2003电源接入5V电源和地,输出接直流小电机暂且用D,对应GPIO.1接入IN4。
编写控制代码如下,我们实现一个很简单的功能,PWM从小的占空比到最大然后在从小到大,实现呼吸灯的效果,电机也速度从慢到快,从快再到慢的过程。代码如下:
 
编写完代码通过SSH文件上传到wiringPi目录下。
输入如下命令:
#include <wiringPi.h>

#define PWMPin 1    //定义PWM引脚

void setup();

int main (void)
{
setup();
intval = ;
intstep = ;
while()
{
if(val>)
{
step = -step;
val = ;
}
else if(val<)
{
step = -step;
val = ;
} pwmWrite(PWMPin,val);
val+=step;
delay();
}
return ;
}
/*初始化配置*/
void setup()
{
wiringPiSetup (); //wiringPi库初始化
pinMode (PWMPin, PWM_OUTPUT); //设置1为PWM输出
}

编译

 gcc -o pwm pwm.c -lwiringPi

运行:

 ./pwm或者sudo ./pwm
实验现象:我们执行程序,则LED会从亮到灭再到亮逐渐变化的过程即呼吸灯效果,直流电机小风扇从快到慢再到快实现了电机的调速功能。
 
 
 

参考:

树莓派 温度监控 PWM 控制风扇 shell python c 语言的更多相关文章

  1. 剖析CPU温度监控技术【转】

    转自:http://blog.csdn.net/hunanchenxingyu/article/details/46476545 迄今为止还没有一种cpu散热系统能保证永不失效.失去了散热系统保护伞的 ...

  2. 剖析CPU温度监控技术

    转载 :剖析CPU温度监控技术   标签: CPU 温度控制技术 1805 具体温度检测调整代码(转载)        迄今为止还没有一种cpu散热系统能保证永不失效.失去了散热系统保护伞的“芯”,往 ...

  3. 树莓派Zero W GPIO控制

    作者:陈拓 chentuo@ms.xab.ac.cn 2018.06.09/2018.07.05 0.  概述 本文介绍树莓派 Zero W的GPIO控制,并用LED看效果. 0.1 树莓派GPIO编 ...

  4. 【原创】控制perl和python脚本执行过程中脚本文件是否关闭的方法

    引子 跟踪perl和python脚本对文件的访问,实际过程中,perl和python解析器在解析完脚本后,直接关闭了 脚本文件,在进程中查询不到是访问文件的脚本文件名称. shell.perl和pyt ...

  5. 树莓派3 之 pi3Robot 控制系统配置

    需求 个人正在用Python写一个控制系统,技术选型是python3 + Flask + Mysql + Bootstrap.需要将这套系统直接部署到树莓派中. 代码地址:https://github ...

  6. amba H2平台用PWM控制LCD背光

    ambarella H2系列Soc的GPIO口能作PWM使用的个数有限(GPIO0-GPIO3),从PRM里GPIO: Function Selection章节可以得到如何配置GPIO为PWM功能. ...

  7. PWM控制led渐变

    PWM,中文释义:脉冲宽度调制.它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术. PWM 是一种对模拟信号电平进行数字编码的方法.通过高分辨率计数器的使用,方波的占空比被调制用来对 ...

  8. Shell Python 日期和时间戳的互相转换

    一.初衷: 很多时候,时间的存储都是时间戳格式,如果需要展示就要转化成标准格式日期.也许会需要date和timestamp互转. 二.方法: 1.Shell下对date和timestamp的互转,是通 ...

  9. tomcat监控,自动重启shell脚本

    tomcat监控,自动重启shell脚本如下,取名 monitor_tomcat.sh: #!/bin/sh # func:自动监控tomcat脚本并且执行重启操作 # 获取tomcat进程ID(其中 ...

随机推荐

  1. SQL Server —— 查询数据库、表、列等

    一.查询数据库(sys.databases —— select *from sys.databases where name='<数据库名>') select *from sys.data ...

  2. 06-02 Java值传递、数据加密

    值传递: /* 思考题1:看程序写结果,然后分析为什么是这个样子的.并画图讲解.最后总结Java中参数传递规律. Java中的参数传递问题: 基本类型:形式参数的改变对实际参数没有影响.基本类型传递的 ...

  3. PCA (主成分分析)详解 (写给初学者) 结合matlab(转载)

    一.简介 PCA(Principal Components Analysis)即主成分分析,是图像处理中经常用到的降维方法,大家知道,我们在处理有关数字图像处理方面的问题时,比如经常用的图像的查询问题 ...

  4. RandomStringUtils工具类

    //产生5位长度的随机字符串,中文环境下是乱码 RandomStringUtils.random(5); //使用指定的字符生成5位长度的随机字符串 RandomStringUtils.random( ...

  5. Linux 普通用户启动nginx

    众所周知,apache的80端口为系统保留端口,如果通过其他非root用户启动,会报错如下: ()Permission denied: make_sock: could not bind to add ...

  6. Python模块:time模块详解(转)

    在平常的代码中,我们常常需要与时间打交道.在Python中,与时间处理有关的模块就包括:time,datetime以及calendar.这篇文章,主要讲解time模块. 在开始之前,首先要说明这几点: ...

  7. spring web应用

    <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...

  8. 常见的加密解密算法-MD5

    一.MD5加密概述 Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.该算法的文件号为RFC 13 ...

  9. 测试本地node包

    @subject: 测试本地node包 @author: leinov @date: 2018-10-25 当我们编写一个node包,在发布到npm上之前,需要在本地测试该包.假设我们有一个已经编写好 ...

  10. Docker基础-Docker数据管理

    1.数据卷 数据卷是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于Linux中的mount操作. 数据卷可以提供很多有用的特性: 1.数据卷可以在容器之间共享和重用,容器间传递 ...