发作品签到
专业版

基于【立创·梁山派开发板】智能窗帘控制项目

工程标签

369
0
0
0

简介

基于梁山派开发的智能窗帘

简介:基于梁山派开发的智能窗帘
立创·开发板电子设计训练营

开源协议

BSD License

创建时间:2023-08-30 00:35:49更新时间:2023-10-19 02:52:32

描述

一.项目简介
使用梁山派开发板制作一个智能窗帘的控制器,可以使窗帘在需要的情况下实现自动的开关,使用到语音模块可以进行语音控制,还有红外接受模块可以使用遥控器进行远程遥控,还有雨滴传感器自动检测是否在下雨天气下自动打开窗帘,还有光敏电阻检测光线强弱实现白天夜晚的自动开关窗帘,使用官方推荐的的步进电机模拟窗帘的开关。

二.设计要求与指标
技术要求
(1)雨滴传感器模块:用于检测雨滴;
(2)光线强度传感器模块:用于检测光线强度;
(3)红外接收模块,用于遥控控制;
(4)步进电机模块:用于窗户窗帘驱动。
技术指标
(1)可以通过红外遥控与语音设置是否打开自动模式;
(2)在自动模式下,当光照强度很高时,自动展开窗帘;当光照强度很低时,自动关闭窗帘;
(3)在自动模式下,当检测到大量雨滴时,自动展开窗帘,此优先级比光照检测高;
(4)在任何时候,可以通过红外遥控或语音命令展开与关闭窗帘,并关闭自动模式;
(5)主控芯片接收到数据后,驱动电机运转,现实智能窗帘窗户系统。
微信图片_20231014225953.jpg
(//image.lceda.cn/pullimage/3X19Gk9N03MRO2Y6T86mYQMS4zSu96IyLjWnOXjH.jpeg)
** 1.**雨滴与光照检测
雨滴检测原理
雨滴传感器常见的工作原理是通过检测水滴的导电性来判断是否下雨。它是利用两个电极之间的电导性变化来测量水滴的存在。这两个电极之间会有一个空气间隙,正常状态下是断路状态。
当水滴接触到电极上时,水滴的导电性会导致电流通过水滴形成电流回路,从而改变电极之间的电阻值。通过测量电阻值的变化,就可以判断是否有水滴存在。
微信图片_20231015221141.jpg
**2.**雨滴传感器接口设计
雨滴传感器购买链接:https://m.tb.cn/h.54eEkPQ?tk=3leidzZCKCs CZ3457
我们知道了雨滴传感器会根据雨滴进行电阻阻值变化。那我们如何通过梁山派去检测雨滴呢?
我们给雨滴传感器接入电源,当雨滴传感器的电阻发生变化时,其电压也会产生变化。此时我们可以把雨滴传感器看作一个开关。当没有雨滴时,
雨滴传感器没有因为雨滴短路,所以处于断路状态。

当有雨滴时,雨滴传感器因为雨滴导电,导致两个电极短路,相当于按键按下。

因此我们可以测量雨滴传感器的电压变化就可以知道是否有雨滴。
扩展板雨滴传感器接口如下:
我们需要给雨滴传感器的一极接正,一极接负,才可以产生回路测量电压变化。但是当传感器的雨滴过多时会导致两极彻底短路。为了防止雨滴传感器彻底短路,
需要增加一个电阻R1作为负载,防止3.3V直接接入GND,形成电源短路。
微信图片_20231015221433.png
**3.**光照检测原理
扩展板的光照检测功能是通过光敏电阻进行识别。光敏电阻是一种特殊的电阻器,它随着光照强度的升高,
电阻值会迅速降低,其在无光照时,几乎呈高阻状态,因此暗时电阻很大。
市场上最常见的用于检测光照的模块就是以光敏电阻作为主要识别器件。它的原理图见右方,原理图中的U2.1是一个电压比较器。当电压比较器的2脚电压大于3脚电压时,
1脚输出低电平;
当电压比较器的2脚电压小于3脚电压时,1脚输出高电平;R3为光敏电阻,当光敏电阻周围环境很亮时,其阻值会变小,AO的电压也会变小;当光敏电阻周围环境很暗时,其阻值会变大
,AO的电压也会变大;因此通过调整R4滑动电阻的阻值,就可以调整DO输出的灵敏度。
image.png

光照传感器接口设计
我们将模块原理图简化,直接使用一个分压电阻加上一个光敏电阻即可。我们扩展板直接检测的是光敏电阻的电压变化,见模块原理图中的AO。
光照传感器购买链接:因为只使用到了光敏电阻一个器件,可直接在立创商城购买;

微信图片_20231015221641.png
image.png

ADC介绍
ADC是一种用于将模拟信号转换为数字信号的模拟数字转换器。我们知道,模拟信号是连续的,其取值可以在一定范围内任意变化。而数字信号则是离散的,仅能取有限的值。
ADC的工作原理是将模拟信号通过采样转换为离散的数字信号,然后再通过量化、编码等处理,最终得到对应的数字表示。简单来说就是将电压转换为数字量
,例如测量3.3V的电压时数字量是4095,测量1.65V电压时数字量是2047,测量0V电压时数字量是0。
我们两个传感器都需要采集它们的电压变化,其中雨滴传感器接入的引脚是PF8,光敏电阻传感器接入的是PF6。要开启ADC功能,
必须确保引脚有ADC的采集通道,它们对应的ADC通道如下:
image.png

ADC配置
当前的ADC配置为软件触发方式的单次扫描模式。
软件触发方式意思很简单,就是通过我们编写代码的方式,去触发ADC的采集。
单次扫描模式指的是,触发采集之后,采集一次配置的通道数据,然后停止,等待下一次采集触发。

ADC采集
我们之前使用的是扫描模式并使用的是软件触发方式,因此当我们要采集信号时,需要配置好采集通道并开启软件转换。
开启转换后,等待EOC标志位置1。其中EOC为转换完成标志位,我们可以通过判断其是否置1,确定是否转换完成。转换完成后将数据从16位寄存器中取出。

在bsp_ad文件里有相应代码

二、步进电机驱动

步进电机介绍
步进电机是将电脉冲信号,转变为角位移或线位移的开环控制电机,又称为脉冲电机。步进电机组成最主要的就是转子和定子部分。
定子,就是由电流控制磁场方向,通电时就会产生磁力;
转子,被定子环绕在中间受定子磁场变化产生转动(下方示意图中转动的指针)
通过给定子通电,产生磁力,将转子吸附过来,那转子就会转一小格;通过给定子连续的通电,就可以实现让转子转动。

在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数。当步进驱动器接收到一个脉冲信号时,它就可以驱动步进电机按设定的方向转动一个固定的角度。因此:
可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;
可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的;
可以通过控制绕组通电顺序,达到控制电机正反转的目的。

步进电机的转动
我们采购的是二相四线式步进电机,二相指的是有两个线圈,四线指的是每一个线圈有两根线。其中A+与A-为一相,B+与B-为一相。

HQUSiMzZGDU4gSiFj3pPJv5gEuajDkO2cHzqZeJF.gif
yXHAuyoHDFze5yIVJDL4Wd4mslzhxPqq0tg6AVdh.jpeg
y3rUpNLxv49g3W0E6034sAJ2EsZLQ2crHQ58R0El.jpeg

R7EbYvyNUapNDNT4dxSkAh0HBLBNVaU885RCBEQp.png

其中BAK控制X4引脚的电平输出;FOR控制X3引脚的电平输出。图中的电机A,接入步进电机的一相即可。按照思路则需要两个L9110S才可以驱动二相四线步进电机
image.png
步进电机软件驱动设计
要想让步进电机动起来,我们需要先配置好引脚。引脚的配置直接配置为推挽输出模式即可。
注:区分电机哪两条线同相可用万用表蜂鸣挡测哪俩条短接短路即为同相,AB相则需上电观察

代码参照附件
三、红外接收驱动
1.红外线协议介绍
在光谱中波长自760nm至400um的电磁波称为红外线,它是一种不可见光。红外线通信的例子我们每个人应该都很熟悉,

目前常用的家电设备几乎都可以通过红外遥控的方式进行遥控,比如电视机、空调、投影仪等,都可以见到红外遥控的影子。

这种技术应用广泛,相应的应用器件都十分廉价,因此红外遥控是我们日常设备控制的理想方式。

2.红外线的通讯原理
红外光是以特定的频率脉冲形式发射,接收端收到到信号后,按照约定的协议进行解码,完成数据传输。在消费类电子产品里,

脉冲频率普遍采用 30KHz 到 60KHz 这个频段,NEC协议的频率就是38KHZ。 这个以特定的频率发射其实就可以理解为点灯,

不要被复杂的词汇难住了,就是控制灯的闪烁频率(亮灭),和刚学单片机完成闪烁灯一样的意思,只不过是灯换了一种类型,都是灯。

接收端的原理: 接收端的芯片对这个红外光比较敏感,可以根据有没有光输出高低电平,如果发送端的闪烁频率是有规律的,

接收端收到后输出的高电平和低电平也是有规律对应的,这样发送端和接收端只要约定好,那就可以做数据传输了。
红外线传输协议可以说是所有无线传输协议里成本最低,最方便的传输协议了,但是也有缺点,距离不够长,速度不够快;当然

,每个传输协议应用的环境不一样,定位不一样,好坏没法比较,具体要看自己的实际场景选择合适的通信方式。

3.NEC协议介绍
NEC协议是众多红外线协议中的一种(这里说的协议就是他们数据帧格式定义不一样,数据传输原理都是一样的),我们购买的外能遥控器

、淘宝买的mini遥控器、电视机、投影仪几乎都是NEC协议。 像格力空调、美的空调这些设备使用的就是其他协议格式,不是NEC协议,

但是只要学会一种协议解析方式,明白了红外线传输原理,其他遥控器协议都可以解出来。
NEC协议一次完整的传输包含: 引导码、8位地址码、8位地址反码、8位命令码、8位命令反码。这里我们主要讲解如何接收红外发送端发送的NEC协议内容。

11Pksrs8NGpRlulOvFVHUTWCzwK7mui0rEsRGFPz.png
4个字节的数据: 地址码+地址反码+命令码+命令反码。 这里的反码可以用来校验数据是否传输正确,有没有丢包。
重点: NEC协议传输数据位的时候,0和1的区分是依靠收到的高、低电平的持续时间来进行区分的。这是解码关键。
数据发送0码:0.56m低电平+ 0.56ms的高电平。

数据发送1码:0.56ms低电平+1.68ms的高电平。

所以,收到一个数据位的完整时间表示方法是这样的:
收到数据位0: 0.56m低电平+ 0.56ms的高电平
收到数据位1: 0.56ms低电平+1.68ms的高电平

还有一个重复码,它是由一个 9ms 的低电平和一个 2.5ms 的高电平组成。当一个红外信号连续发送时,可以通过发送重复码的方式快速发送。

4.红外接收硬件接口设计
红外线接收头模块输出电平的原理: 红外线接收头感应到有红外光就输出低电平,没有感应到红外光就输出高电平。因此,我们只要检测OUT端,是否输出低电平,就可以知道是否有接收到红外数据。
这里选择接入PF7,没有什么特殊要求,使用普通的GPIO即可。

image.png
四、语音识别驱动
**1.**语音模块介绍
HLK-V20是海凌科电子针对大量纯离线控制场景和产品推出的高性能纯离线语音识别模块,可广泛且快速的应用于智能家居、

各类智能小家电、86盒、玩具、灯具、工业、 医疗、物联网、汽车、安防与照明等需要语音操控的产品。 HLK-V20支持150条本地指令离线识别,

可自由定制唤醒词、命令词与应答播报词,具有丰富的外围接口。离线语音识别指的是只能识别固定命令词条,不需要连接网络。

购买链接:AI智能语音模块V20 海凌科离线语音开关控制 语音识别控制开发板

模块的命令词、播报词等配置,可以通过在线配置平台进行配置,因篇幅过长,另起了一份文档,
具体语音产品的配置案例见文档语音识别模块和手册V20_USB_Update_Tool_User_Guide_1.2。

参考案例的配置流程,本案例的语音模块引脚设置同样选择的是B2P3作为串口1。

image.png
置的控制参数如下。当串口接收到 0XAA 0X01 0X55 时,说明语音模块触发了开窗帘命令。
其它同理。为了方便接收并解析多条命令,设置成为了帧头帧尾的格式。
当串口接收到0X55说明语音识别模块触发了命令,分析上一个接收的数据,则可以知道是识别的哪一个命令

if( RX_BUFF[DATA_LEN] == 0X55 )//接收到帧尾
{
if( RX_BUFF[DATA_LEN-2] == 0XAA)//接收到帧头,确定数据格式正确
{
V20_data = cRX_BUFF[DATA_LEN-1];//接收数据
}
}
例如:语音识别模块发来了命令:0XAA 0X03 0X55,则说明触发了打开自动模式命令
置的控制参数如下。当串口接收到 0XAA 0X01 0X55 时,说明语音模块触发了开窗帘命令。
其它同理。为了方便接收并解析多条命令,设置成为了帧头帧尾的格式。
当串口接收到0X55说明语音识别模块触发了命令,分析上一个接收的数据,则可以知道是识别的哪一个命令

if( RX_BUFF[DATA_LEN] == 0X55 )//接收到帧尾
{
if( RX_BUFF[DATA_LEN-2] == 0XAA)//接收到帧头,确定数据格式正确
{
V20_data = cRX_BUFF[DATA_LEN-1];//接收数据
}
}
例如:语音识别模块发来了命令:0XAA 0X03 0X55,则说明触发了打开自动模式命令
UyvPpNjQV4lDlVoAFRr1bRTmv9YpHP1czcQYnRs6.png

**2.**语音识别模块硬件设计
该语音识别模块是可以由我们自由设计命令词的,可以通过在线配置平台进行配置。配置完成之后会生成一个语音识别固件,我们要将固件下载到模块里,
通过模块的B6,B7引脚进行下载。所以下方通过排针的方式引出了B6,B7引脚方便我们下载。还需要注意的是,在下载固件时,要先将模块断电。待下载工具识别到模块之后,
再给模块通电,才可以正常下载。这个通断电操作,由原理图中的SW1开关进行控制。
image.png
语音固件烧入步骤:
烧录前断开电源,连接如图所示:

1dZk1p40OD6IVjZcd3CRmaJcQvCd2UIqunlmLBzj.png
**3.**选择烧录文件路径
image.png
语音模块宏定义见
智能窗帘控制.zip

里harddware->bsp_hlkv20->BSP_hlkv20 .h

模块代码见附件

智能窗帘控制.zip

里harddware->bsp_hlkv20->BSP_hlkv20 .c

功能验证
在main.c中编写以下代码:
#include "gd32f4xx.h"
#include "systick.h"
#include
#include "bsp_usart.h"
#include "bsp_adc.h"
#include "bsp_stepper_motor.h"
#include "bsp_ir_receiver.h"
#include "bsp_ir_receiver.h"
#include "bsp_voice.h"

int main(void)
{
nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2); // 优先级分组

//滴答定时器初始化 1us
systick_config();

//串口0初始化 调试
usart_gpio_config(9600U);

//语音识别模块引脚初始化
hlk_usart_init(9600U);
while(1) 
{        
    //语音识别操作
    voice_anakysis_data();
}

}
五、完整案例设计
按照设计要求,完成完整的窗帘控制案例。
(1)可以通过红外遥控与语音设置是否打开自动模式;
(2)在自动模式下,当光照强度很高时,自动展开窗帘;当光照强度很低时,自动关闭窗帘;
(3)在自动模式下,当检测到大量雨滴时,自动展开窗帘,此优先级比光照检测高;
(4)在任何时候,可以通过红外遥控或语音命令展开与关闭窗帘,并关闭自动模式;
(5)主控芯片接收到数据后,驱动电机运转,现实智能窗帘窗户系统。
窗帘控制部分
上电第一步,先让步进电机复位到最开始的位置,这样方便我们后续的定位。
在调试时,已经测量出步进电机从左尽头到右尽头一共执行了600步,以下窗帘复位代码中,最大步数 MAX_STEPS = 590 步。

展开窗帘与关闭窗帘
通过步数的判断,确定我们步进电机是否到达了另一端。因为在我们编写步进电机的驱动时,设置了顺时针步数累加,逆时针步数累减。
当步数累加超过最大步数时,我们就知道已经到达了顺时针旋转的尽头。当步数累减为0或者比0还小时,我们就知道已经到达了逆时针旋转的尽头。
为什么采用的是if判断?是为了不阻碍到其他任务的执行。
例如你在步进电机动作的过程中,红外信号发送过来停止电机的信号,但是因为我们还在执行步进电机的运动过程,导致我们不能正常接收并处理红外信号。

自动模式部分
在自动模式下,我们需要检测光照强度值与雨滴值,当光照强度很高时,自动展开窗帘;当光照强度很低时,自动关闭窗帘。当检测到大量雨滴时,优先自动展开窗帘;

在设计要求中,我们要判断雨滴情况,红外接收情况,语音识别情况。在执行任务的同时,又不可以阻塞其他任务的运行,所以我们要考虑好各个模块间的调度问题。
红外接收部分
通过按键【+】【-】【10】【30】来进行控制。其中【10】为自动模式键,【30】为非自动模式键,【+】为展开窗帘键,【-】为关闭窗帘键。
这里需要注意的是在模式切换的过程中,需要将正在动作的电机停止,否则就停不下来了。
//mode_flag=0;自动模式;mode_flag=1手动模式;
char mode_flag=0;
//自动模式

完整版视频演示

【基于GD32的智能窗帘项目完整演示】
视频展示
开源代码

设计图

未生成预览图,请在编辑器重新保存一次

BOM

暂无BOM

附件

序号文件名称下载次数
1
QQ录屏20231016001330.mp4
1
2
5.完整案例.zip
7
3
yu yin bao.zip
7
克隆工程
添加到专辑
0
0
分享
侵权投诉

评论

全部评论(1)
按时间排序|按热度排序
粉丝0|获赞0
相关工程
暂无相关工程

底部导航