昉·星光系列课程13:昉·星光开发板温控风扇

昉·星光系列课程13:昉·星光开发板温控风扇

本次课程为昉·星光开发板IoT开发系列课程的第十三讲,将带领同学们在昉·星光开发板上,结合使用温度传感器控制风扇转速。
本次课程,在昉·星光开发板V1和V2上,操作步骤相同。

一、学习目标

  • 学习昉·星光开发板通过温度传感器的温度值,来控制PWM输出,从而控制风扇的转速

二、准备工作

在开始本次课程的实际操作之前,同学们需要做好一些准备工作,课程中涉及到的硬件如下:

  • 开发板:昉·星光开发板
  • 温度传感器:SHT30温度传感器
  • 电机驱动模块:5V直流电机驱动模块
  • 电机:带风扇的5V直流电机
  • 数字电源:直流数控电源,用于给电机供电
  • 杜邦线:若干

三、风扇控制原理

本次课程中,使用的电机驱动模块和电机如下具体如下:

在这个电机驱动模块上,输入接口中,有PWM和DIR,其中DIR用于控制电机旋转的方向,PWM用于控制电机旋转的速度。
PWM的核心是占空比,也就是在一个周期内,高电平保持的时长比,从而控制周期内的平均电压:
3.PWM_1

3.PWM_2

在本次课程中,我们先从温度传感器读取当前的温度值,然后进过一定的转换,再设定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的黑色探头部分】,降低到25度及以下,风扇停止

8.温度较低情况.jpg

七、总结

在本次课程中,我们学习了结合使用温度传感器控制风扇转速。
PWM控制的实际使用场景非常多,除了风扇控制,在灯光控制、舵机控制、机器人控制、飞行器控制等方面都有广泛的应用。
例如有很多所谓的护眼灯,实际上就是通过光线传感器来控制PWM的输出,从而控制灯光的亮度。

八、课后作业

  • 了解PWM的知识
  • 了解直流电机驱动模块和使用
  • 尝试通过光线传感器来获取环境亮度,控制风扇转速,以及控制LED的亮度

九、参考资料

1 Like