昉·星光系列课程13:昉·星光开发板温控风扇
本次课程为昉·星光开发板IoT开发系列课程的第十三讲,将带领同学们在昉·星光开发板上,结合使用温度传感器控制风扇转速。
本次课程,在昉·星光开发板V1和V2上,操作步骤相同。
一、学习目标
- 学习昉·星光开发板通过温度传感器的温度值,来控制PWM输出,从而控制风扇的转速
二、准备工作
在开始本次课程的实际操作之前,同学们需要做好一些准备工作,课程中涉及到的硬件如下:
- 开发板:昉·星光开发板
- 温度传感器:SHT30温度传感器
- 电机驱动模块:5V直流电机驱动模块
- 电机:带风扇的5V直流电机
- 数字电源:直流数控电源,用于给电机供电
- 杜邦线:若干
三、风扇控制原理
本次课程中,使用的电机驱动模块和电机如下具体如下:
在这个电机驱动模块上,输入接口中,有PWM和DIR,其中DIR用于控制电机旋转的方向,PWM用于控制电机旋转的速度。
PWM的核心是占空比,也就是在一个周期内,高电平保持的时长比,从而控制周期内的平均电压:
在本次课程中,我们先从温度传感器读取当前的温度值,然后进过一定的转换,再设定PWM输出的占空比,从而实现对电机平均电压的控制,最终表现为风扇转速的控制。
由于电机运转的电流相对较大,所以一般需要给电机单独供电,通常就使用电机驱动模块来进行供电和控制。
四、实物连线
首先,参考下图,将温度传感器和电机驱动器到昉·星光开发板:
实物连接如下:
注意:
应根据实际使用的传感器,确定供电电压。本次课程中使用的模块使用5V供电电压。
五、代码编写
在本次课程中,SHT30温湿度传感器的使用,在 昉·星光系列课程3:昉·星光开发板温湿度传感器使用 中已有详细的讲解,请预先阅读该课程了解。
另外,赛昉还提供了 应用指南 (Python) - 使用昉·星光2使LED以PWM频率闪烁,演示了如何使用PWM控制LED,本课程中的PWM控制即参考该应用指南,请预先查看了解。
然后,我们编写如下的程序:
# -*- coding: utf-8 -*-
# file: ~/projects/sht3x/sht3x_fan_test.py
import time
from sensirion_i2c_driver import I2cConnection
from sensirion_i2c_sht.sht3x import Sht3xI2cDevice
from sensirion_i2c_driver.linux_i2c_transceiver import LinuxI2cTransceiver
import VisionFive.gpio as GPIO
GPIO.setmode(GPIO.BCM) #set pin numbering system
fan_pin = 22
GPIO.setup(fan_pin, GPIO.OUT)
p = GPIO.PWM(fan_pin, 1000)
p.start(0)
p.ChangeDutyRatio(0)
# 打开SHT3X设备
i2c_transceivervice = LinuxI2cTransceiver('/dev/i2c-0')
sht3x = Sht3xI2cDevice(I2cConnection(i2c_transceivervice))
while True:
# 读取温湿度值
temperature, humidity = sht3x.single_shot_measurement()
if temperature.degrees_celsius<=25:
fan_speed = 0
elif temperature.degrees_celsius>=35:
fan_speed = 0
else:
fan_speed = int((10 - (35-temperature.degrees_celsius)) * (100/10))
# 打印当前数据的数据和计算结果
print("{:0.2f} °C , {:0.2f} %RH, fan_speed={:d}".format(
temperature.degrees_celsius,
humidity.percent_rh, fan_speed))
# 设置风扇转速
p.ChangeDutyRatio(fan_speed)
time.sleep(1.0)
在上述代码中,我们先从SHT30读取到了温度值,然后根据其值,转换为对应的PWM占空比:
- 当温度值小于等于25度时,设置为0,风扇停止
- 当温度值大于等于35度时,设置为100,风扇全速运转
- 当温度值处于25度到35度之间时,占空比=(10-(35-当前温度值)) * 10
PWM输出控制部分的核心代码如下:
p = GPIO.PWM(fan_pin, 1000)
p.start(0)
p.ChangeDutyRatio(0)
其中:
- 使用 GPIO.PWM(fan_pin, 1000) 指定输出的GPIO,以及切换频率
- 然后启动PWM0
- 在使用pwm.ChangeDutyRatio(占空比)来设置输出的占空比,最大为100
六、运行效果
要运行以上的程序,还需要安装相应的支持库,具体如下:
# 安装扩展库
sudo pip install sensirion-i2c-sht
sudo pip install VisionFive.gpio
编写完成后,运行 sht3x_fan_test.py,然后改变SHT30的环境温度,从而触发风扇转速的变化。
python3 sht3x_fan_test.py
- 通常情况下:风扇转速一般
- 温度较高情况下:【可以用手指按住SHT30的黑色探头部分】,风扇转速提升
- 温度较低情况下:【使用冷冻后的铁棒接触SHT30的黑色探头部分】,降低到25度及以下,风扇停止
8.温度较低情况.jpg
七、总结
在本次课程中,我们学习了结合使用温度传感器控制风扇转速。
PWM控制的实际使用场景非常多,除了风扇控制,在灯光控制、舵机控制、机器人控制、飞行器控制等方面都有广泛的应用。
例如有很多所谓的护眼灯,实际上就是通过光线传感器来控制PWM的输出,从而控制灯光的亮度。
八、课后作业
- 了解PWM的知识
- 了解直流电机驱动模块和使用
- 尝试通过光线传感器来获取环境亮度,控制风扇转速,以及控制LED的亮度