T2-U开发板实现红外遥控接收与发送

news2024/11/25 15:43:45

文章目录

  • 一、红外概况
  • 二、发射
    • 1. 调制
    • 2. 红外传输协议
    • 3. 编码
  • 三、接收
  • 四、T2-U开发板硬件连接
  • 五、TuyaOS红外功能介绍
    • 红外接收功能
  • 六、红外功能代码使用流程
    • 1. 硬件注册
    • 2. 设备查找
    • 3. 打开设备
    • 4. 红外发送
    • 5. 红外接收
    • 6. 接收回调注册

红外遥控是利用近红外光进行数据传输的一种控制方式,广泛应用在工业控制、家电、照明等多个领域,很多产品在加入了智能控制功能后,依然还会保留红外控制方式。

这次我们就是使用Tuya T2-U开发板开发智能产品的基础上,加入红外接收、发送功能。不仅可以通过APP、语音等方式控制设备,还可以使用红外遥控器控制。

一、红外概况

近红外光波长0.76um~1.5um,红外遥控收发器件波长一般为0.8um ~ 0.94um,具有传输效率高,成本低,电路实现简单,抗干扰强等特点。

红外遥控一般有发射和接收两部分组成,发射元件为红外发射管,接收一般采用一体化红外接收头,但发射载波频率与接收头固定频率需一致才能正确接收。
在这里插入图片描述

二、发射

1. 调制

红外遥控是以调制方式发射数据,将数据调制到固定的载波上发送,调制发送抗干扰能力更强,传送距离也更远。
红外发送首先要解决的就是调制问题,目前主流的调制方式有PPM和PWM。

  • PPM:脉冲位置调制,调制脉冲宽度不变,用脉冲间隔来区分0和1。如下图所示,脉冲宽度不变都是560us,脉冲间隔改变。逻辑1总时间为2.25ms,逻辑0中时间长度为1.12ms。

在这里插入图片描述
图1:PPM调制

  • PWM:脉冲宽度调制,脉冲间隔不变,调制脉冲宽度改变。如下图所示,脉冲间隔 为600us,脉冲宽度不同。逻辑1高电平时间为1.2ms,逻辑0高电平时间为0.6ms。

在这里插入图片描述
图2:PWM调制

调制载波频率一般在30KHz到60KHz之间,常用的载波有33K,36K,36.6K,38K,40K,56K等,其中38K使用最多。
常用占空比有1/3、1/2,1/3最多。

2. 红外传输协议

常用的红外传输协议有ITT协议、NEC协议、Nokia NRC协议、Sharp协议、Philips RC-5、RC-6 RECS-80协议、Sony SIRC协议等,其中最常见的为NEC协议。
常见NEC协议分析:

  • 载波38KHz,逻辑1为2.25ms,脉冲时间560us;逻辑0为1.12ms,脉冲时间560us

在这里插入图片描述
图3:NEC逻辑’0’与逻辑’1’

  • 协议格式
    在这里插入图片描述
    图4:NEC红外载波发送协议

(1) 首先发送9ms的载波脉冲
(2) 然后发送4.5ms的低电平
(3) 接下来是8bit的地址码(低位在前)
(4) 然后是8bit的地址反码,用于检验地址码是否出错
(5) 接下来的是8bit的命令码(低位在前)
(6) 然后是8bit的命令反码,用于检验命令码是否出错。

  • 重复码

在这里插入图片描述
图5:NEC重复发送载波协议

如果一直按着一个键,将以110ms为周期发送重复码,重复码由9ms载波、2.25ms低电平及560us载波组成。
在这里插入图片描述
图6:NEC重复码

3. 编码

虽然不同协议都对各自的协议格式做了不同定义,但总体而言还是有高低电平组成的一串数据。
对于红外发射,就是按照协议规定高电平时间内,在红外输出口输出固定频率载波;低电平则直接输出低。红外接收头接到载波时输出高电平,没有载波时输出低电平,完成数据解码。

在这里插入图片描述
图7:NEC解码后协议

三、接收

红外接收常采用一体化红外接收头,集红外接收、放大、滤波、比较器输出等功能,并输出MCU可识别的TTL信号的。常用的一体化红外接收头有SCR638、HS0038、VS1838等。
在这里插入图片描述
SCR638
在这里插入图片描述
HS0038

图8:一体化接收头

红外接收应用电路图:
在这里插入图片描述
图9:红外接收典型应用

四、T2-U开发板硬件连接

这次使用的是T2-U2开发板配套红外遥控功能板,实现设备红外接收与发送功能。
红外遥控功能板介绍:
https://developer.tuya.com/cn/docs/iot/tuya-sandwich-infrared-remote-control-board?id=K97o1wfxi7v9l
在这里插入图片描述
红外遥控功能板
在这里插入图片描述
将遥控接收 study 管脚连接到T2开发板GPIO8,连接3.3V电源。
如需要红外发射功能将CRTL管脚连接到T2开发板GPIO7,同时连接5V电源。

五、TuyaOS红外功能介绍

TuyaOS红外接收目前支持NEC码、红外学习时间码(可用于万能红外遥控器)、红外发送功能。

TuyaOS红外接收采用中断+硬件定时器方式,可使用所有支持外部中断的GPIO,无 GPIO 管脚限制,给产品设计带来很大的便利。

红外接收功能

  1. 支持查询模式和中断模式,可应用与不同的场景;如查询模式目前多用于万能红外遥控器学习状态,中断模式多用于设备红外控制。

  2. 支持NEC解码,支持高位之前/低位在前,引导码最大误差率 , 高电平最大误差率, 低电平最大误差率重复码最大误差率 设置

  3. 支持按下、松开通知,在中断模式下,可在回调中通过 s_frame_finish 获取,
    is_frame_finish 为 1 表示这帧数据接收完成,处于松开状态,为 0 表示这帧数据可能还没有结束还在接收中。

  4. 支持长按、短按通知,在中断模式下,可在回调函数中通过recv_data中断的repeat_cnt判断当前遥控器重复发送次数。
    中断模式下回调函数通过 tdl_ir_config(ir_handle, IR_CMD_RECV_CB_REGISTER, app_ir_recv_cb); 注册。

T2开发板上已经提供 tuyaos_ir_driver_demo_quickstart 工程可以快速实现红外接收与发送。红外接收目前支持 NEC 码、红外学习时间码(可用于万能红外遥控器)。tuyaos_ir_driver_demo_quickstart 可通过 wind_ide 或者 github 仓库先下载。

六、红外功能代码使用流程

初始流程为:硬件注册->查找设备->打开设备->操作设备(红外发送,介绍)

1. 硬件注册

选择驱动方式,支持下列三种驱动方式:

  • 单硬件定时器驱动

  • 双硬件定时器驱动

  • PWM 捕获驱动

捕获方式驱动不一定所有硬件都支持,其中除单硬件定时器驱动方式外,其他两种驱动方式都支持自发自收,这里选择的定时器必须是微妙级(us)的定时器。发送引脚应支持 38KHz 的 PWM 输出。

硬件注册示例代码如下:

char dev_name[] = {"IR_DEVICE"};

    IR_DRV_CFG_T ir_hw_cfg = {
        .send_pin = GPIO_NUM_7,
        .recv_pin = GPIO_NUM_8,
        .send_timer = TIMER_NUM_0,
        .recv_timer = TIMER_NUM_0,
        .send_duty = 50,
    };

    TUYA_CALL_ERR_RETURN(tdd_ir_driver_register(IR_DEV_NAME, IR_DRV_SINGLE_TIMER, ir_hw_cfg)); 

2. 设备查找

根据设备名称,获取设备操作句柄。示例代码如下:

IR_HANDLE_T ir_handle;

op_ret = tdl_ir_dev_find(dev_name, &ir_handle);
if (OPRT_OK != op_ret) {
    PR_NOTICE("tdl_ir_dev_find error:%d", op_ret);
    goto __EXIT;
}

3. 打开设备

这里可以通过配置,通过不同的协议方式开启设备,目前支持下列两种方式:

  • 时间码类型
  • NEC 协议类型

配置红外设备模式,支持以下三种模式配置:

  • 仅发送
  • 仅接收
  • 发送接收同时支持

时间码类型(timecode),是将红外码值按照发送时的高低电平时间进行发送和接收的。示例代码如下:

ir_cfg.ir_mode = IR_MODE_SEND_RECV;  // 红外设备模式
ir_cfg.recv_queue_num = 3;    // 最多接收缓存红外数据条数
ir_cfg.recv_buf_size = 1024; // 单条红外码值最大支持空间大小
ir_cfg.recv_timeout = 1000; // 接收超时时间

ir_cfg.prot_opt = IR_PROT_TIMECODE;  // 时间码协议类型

op_ret = tdl_ir_dev_open(ir_handle, &ir_cfg);
if (OPRT_OK != op_ret) {
    PR_ERR("open failed, %d", op_ret);
    goto __EXIT;
}

NEC 协议初始化示例代码:

ir_cfg.ir_mode = IR_MODE_SEND_RECV;
ir_cfg.recv_queue_num = 3;
ir_cfg.recv_buf_size = 1024;
ir_cfg.recv_timeout = 1000;

ir_cfg.prot_opt = IR_PROT_NEC; // NEC 协议类型

ir_cfg.prot_cfg.nec_cfg.is_nec_msb = 0,
ir_cfg.prot_cfg.nec_cfg.lead_err = 70; // 引导码最大误差率
ir_cfg.prot_cfg.nec_cfg.logics_err = 50; // 逻辑 0/1 高电平最大误差率
ir_cfg.prot_cfg.nec_cfg.logic0_err = 45; // 逻辑 0 低电平最大误差率
ir_cfg.prot_cfg.nec_cfg.logic1_err = 70; // 逻辑 1 低电平最大误差率
ir_cfg.prot_cfg.nec_cfg.repeat_err = 50; // 重复码最大误差率

op_ret = tdl_ir_dev_open(ir_handle, &ir_cfg);
if (OPRT_OK != op_ret) {
    PR_ERR("open failed, %d", op_ret);
    goto __EXIT;
}

4. 红外发送

这里需要注意的是,红外发送采用的是阻塞的方式,因为发送时使用数据是发送传入的数据的空间,所以必须等红外码值发送完成后才会执行后面的程序。

这里的发送是和 tdl_ir_dev_open 时设备的协议有关的, ir_cfg.prot_opt = IR_PROT_TIMECODE 时红外发送示例如下:

UINT32_T data[] = {560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 1690, 1690, 1690};
ir_send_data.timecode.data = data;
ir_send_data.timecode.len = strlen(data);

op_ret = tdl_ir_dev_send(ir_handle, 38000, ir_send_data, 1);
if (OPRT_OK != op_ret) {
    PR_ERR("ir send error, %d", op_ret);
}
PR_DEBUG("ir send start");

ir_cfg.prot_opt = IR_PROT_NEC 时红外发送示例如下:

ir_send_data.nec_data.addr = 0x807F;
ir_send_data.nec_data.cmd = 0x1DE2;
ir_send_data.nec_data.repeat_cnt = 1;

op_ret = tdl_ir_dev_send(ir_handle, 38000, ir_send_data, 1);
if (OPRT_OK != op_ret) {
    PR_ERR("ir send error, %d", op_ret);
}
PR_DEBUG("ir send start");

5. 红外接收

红外接收默认也是阻塞的方式,但也支持通过回调的方式进行操作。如果选择的是 IR_PROT_TIMECODE 协议方式,那接收的数据将直接是解码后的数据。红外接收示例如下:

op_ret = tdl_ir_dev_recv(ir_handle, &ir_recv_data, 3000);
if (OPRT_OK == op_ret) {
#if USE_NEC_DEMO
    PR_DEBUG("demo addr:%04x, cmd:%04x, cnt:%d", ir_recv_data->nec_data.addr, ir_recv_data->nec_data.cmd, ir_recv_data->nec_data.repeat_cnt);
#else
    PR_DEBUG("demo addr:%p, len:%d", ir_recv_data, ir_recv_data->timecode.len);
    for (i=0; i<ir_recv_data->timecode.len; i++) {
        PR_DEBUG_RAW("%d ", ir_recv_data->timecode.data[i]);
    }
    PR_DEBUG_RAW("\r\n");
#endif
    tdl_ir_dev_recv_release(ir_handle, ir_recv_data);
}

6. 接收回调注册

硬件注册->查找设备->打开设备 之后就可以注册接收回调后,红外接收到数据会立马通过注册的回调函数通知应用,无法再使用 tdl_ir_dev_recv() 获取数据。

在接收到有效数据后回调函数会传出两个参数 is_frame_finishrecv_datais_frame_finish 为 1 表示这帧数据接收完成,为 0 表示这帧数据可能还没有结束还在接收中;recv_data 表示接收的数据。回调函数类型如下:

typedef void (*IR_APP_RECV_CB)(UINT8_T is_frame_finish, IR_DATA_U *recv_data);

这里的数据类型也是根据您初始化的时候选择的协议格式进行配置。比如:在初始化时您配置红外协议为 NEC 编码格式的话,那么红外接收到数据后会将接收到的红外码转换成 NEC 格式之后再通过回调函数将数据传出。

使用示例如下:

void app_ir_recv_cb(UINT8_T is_frame_finish, IR_DATA_U *recv_data)
{
    TAL_PR_NOTICE("is_finish: %d, addr: 0x%04x, cmd: 0x%04x, repeat: %d", \
                    is_frame_finish, recv_data->nec_data.addr, recv_data->nec_data.cmd, recv_data->nec_data.repeat_cnt);
}

tdl_ir_config(ir_handle, IR_CMD_RECV_CB_REGISTER, app_ir_recv_cb);

日志如下:

[01-01 00:00:29 ty N][app_main.c:43] is_finish: 0, addr: 0x807f, cmd: 0x0cf3, repeat: 0
[01-01 00:00:29 ty N][app_main.c:43] is_finish: 0, addr: 0x807f, cmd: 0x0cf3, repeat: 1
[01-01 00:00:29 ty N][app_main.c:43] is_finish: 0, addr: 0x807f, cmd: 0x0cf3, repeat: 2
[01-01 00:00:29 ty N][app_main.c:43] is_finish: 0, addr: 0x807f, cmd: 0x0cf3, repeat: 3
[01-01 00:00:30 ty N][app_main.c:43] is_finish: 1, addr: 0x807f, cmd: 0x0cf3, repeat: 3
[01-01 00:00:31 ty N][app_main.c:43] is_finish: 0, addr: 0x807f, cmd: 0x0cf3, repeat: 0
[01-01 00:00:31 ty N][app_main.c:43] is_finish: 0, addr: 0x807f, cmd: 0x0cf3, repeat: 1
[01-01 00:00:31 ty N][app_main.c:43] is_finish: 1, addr: 0x807f, cmd: 0x0cf3, repeat: 1
[01-01 00:00:33 ty N][app_main.c:43] is_finish: 0, addr: 0x807f, cmd: 0x0cf3, repeat: 0
[01-01 00:00:33 ty N][app_main.c:43] is_finish: 1, addr: 0x807f, cmd: 0x0cf3, repeat: 0

在应用上可以通过 repeat_cnt 去判断红外按键是按下,长按或释放等动作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/627778.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何做好功能测试,看这几点就够了

关于新人如何做好功能测试&#xff0c;以下是我个人的一些思考。 01、测试基础的重要性 作为一名测试新人&#xff0c;测试基础非常非常重要。这里说的基础&#xff0c;不仅仅是什么是软件测试、软件测试的目的&#xff0c;而是测试用例的设计能力。 因工作的原因&#xff0…

进程信号以及用户态和内核态的理解

文章目录 什么是进程信号&#xff1f;用户层产生信号的方式有哪些&#xff1f;信号在内核的存在形式认识信号的一些接口信号处理的执行流程理解用户态和内核态信号处理流程 什么是进程信号&#xff1f; 进程信号是一种事件异步通知机制&#xff0c;属于软件中断&#xff08;因…

手机充电流程

手机的整个充电过程由充电管理IC 控制的&#xff0c;完整的充电过程可以分为6个阶段&#xff1a;涓流充电模式、预充电模式、恒流充电模式、恒压充电模式、充电完成模式、二次充电模式。 完整的充电过程 1. 涓流充电模式 涓流充电一般以很小的电流&#xff08;几十到一百毫安…

LeetCode - 15 三数之和

目录 题目来源 题目描述 示例 提示 题目解析 算法源码 题目来源 15. 三数之和 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满…

【Android】WMS(四)WMS职责

WMS职责 WMS&#xff08;Window Manager Service&#xff09;是 Android 系统中的一个系统服务&#xff0c;它是WindowManager的管理者&#xff0c;负责对窗口进行管理、分配资源&#xff0c;以及处理用户的输入事件等问题。WMS是整个系统中非常重要的一个组成部分&#xff0c;…

昨晚技术交流群“炸了”,论搞技术的网络工程师究竟能有多严谨?

昨日在IELAB网络实验室学习交流群中发生了一场“激烈”的争论&#xff0c;原本是同往常一样的答题领红包活动&#xff0c;同学对答案产生了异议&#xff0c;从而和Summer赵老师在群里进行了沟通交流&#xff0c;具体是什么情况呢&#xff1f; IELAB每日答题活动 于是乎&#xf…

JMeter 测试笔记(一):认识JMeter

引言&#xff1a; 在现代互联网时代&#xff0c;应用程序的性能已经成为了一个非常重要的问题&#xff0c;并且对于许多公司的生存和发展都起着至关重要的作用。 而JMeter作为一个免费且开源的性能测试工具&#xff0c;可以帮助我们进行各种类型的性能测试&#xff0c;如接口…

阿里巴巴最新开源:Java工程师面试笔记(30万字精华总结 + 面试1300问)吊打面试官绰绰有余

前言 作为一个 Java 程序员&#xff0c;你平时总是陷在业务开发里&#xff0c;每天噼里啪啦忙敲着代码&#xff0c;上到系统开发&#xff0c;下到 Bug 修改&#xff0c;你感觉自己无所不能。然而偶尔的一次聚会&#xff0c;你听说和自己一起出道的同学早已经年薪 50 万&#x…

网卡中的Ring buffer -- 解决 rx_resource_errors 丢包

1、软硬件环境 硬件&#xff1a; 飞腾E2000Q 平台 软件&#xff1a; linux 4.19.246 2、问题现象 网卡在高速收包的过程中&#xff0c;出现 rx error , 细查是 rx_resource_errors 如下&#xff1a; rootE2000-Ubuntu:~# ifconfig eth1 eth1: flags4163<UP,BROADCAST,RU…

Amazon SageMaker:探索AI绘画云端部署新方案

目录 1 从艺术实验到AI绘画2 什么是Amazon SageMaker&#xff1f;3 云端部署AI绘画应用3.1 模型构建与部署3.2 AI绘画测试(文生图) 4 亚马逊云科技中国峰会 1 从艺术实验到AI绘画 在过去&#xff0c;人们只希望基于已有的给定数据做一些预测和拟合&#xff0c;因此判别式模型得…

RFID资产盘点在企业的应用

随着新技术的发展&#xff0c;企业在不断地进行转型&#xff0c;企业为了更好地发展&#xff0c;对企业内部的管理工作越来越重视。在管理中&#xff0c;如何利用先进的科学技术来提高管理效率&#xff0c;成为了企业发展的关键。在资产管理上&#xff0c; RFID技术在资产盘点和…

TCP三次握手建立连接和四次挥手断开连接

TCP的连接与断开 TCP 通过三次握手建立连接&#xff0c;以建立确保数据传输的参数&#xff0c;连接的双方都将初始化与 TCP 连接相关的许多 TCP 状态变量。该连接是一条逻辑连接&#xff0c;其共同状态仅保留在二个通信端系统的TCP程序中。 TCP连接的组成包括&#xff1a;一台…

上门服务app开发|上门服务系统定制打开家政服务的大门

上门服务app可以为用户带来更加便捷的服务体验&#xff0c;不需要用户出门寻找服务商&#xff0c;只需要通过小程序下单即可享受到上门服务&#xff0c;省去了用户的时间和精力。同时上门服务app也为服务商提供了一个更广阔的市场&#xff0c;他们可以通过上门服务系统向更多的…

走进科学之sudo rm -rf,为什么如此危险

关注微信公众号“网络安全学习圈”&#xff0c;回复暗号【网络安全】&#xff0c;立即领取最新网安教程全家桶。 什么是 sudo rm -rf&#xff1f; sudo rm -rf 是一个linux的命令行命令&#xff0c;用于在系统中删除文件和目录。sudo表示以管理员权限运行该命令。rm是remove…

OPEN AI 全新版本来了2.0.0永久免费在线体验构建AI开放生态

V2.0.0 更新内容 后台整体功能重构完善后台增加订阅接口服务后台会陆续扩展订阅更多AI接口服务后台增加分销推广功能OPEN AI注册增加邮箱验证绑定OPEN AI开发者插件生态构建后台分销推广额度累计支持提现现金后台支持查询官方账号key使用量和余量开放接口提供账号绑定和订阅接…

【ChatGLM】记录一次Windows部署ChatGLM-6B流程及遇到的问题

文章目录 部署环境文件下载项目文件模型配置文件模型文件 运行demo遇到的问题 部署环境 系统版本&#xff1a;Windows 10 企业版 版本号&#xff1a;20H2 系统类型&#xff1a;64 位操作系统, 基于 x64 的处理器 处理器&#xff1a;Intel Core™ i7-8700 CPU 3.20GHz 3.19 GH…

软考A计划-电子商务设计师-模拟试题卷四

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

NX/UG二次开发—Parasolid—PK_EDGE_ask_convexity

判断实体边的凸凹性 Convexity Value Example convex PK_EDGE_convexity_convex_c concave PK_EDGE_convexity_concave_c variable the convexity varies along the edge PK_EDGE_convexity_variable_c smooth flat parallel surface normals, both faces have zero f…

cli3 非父子组件传值

这里&#xff0c;App.vue中&#xff0c;引入了parent组件&#xff1b;parent组件中引入了child组件。现在要从app.vue&#xff0c;向child组件传值。 主要文件&#xff1a; 1. 通过事件总线传值 1. src ->util->bus.js // 通过util中的bus&#xff0c;完成两个组件之间…

你的Postman为什么连不了数据库?

postman本身没有数据库连接功能&#xff0c;所以用到了node.js中的xmysql实现Rest API的生成&#xff0c;利用postman进行请求&#xff0c;获取需要的数据&#xff0c;来做数据准备或断言 1.安装 安装node.js&#xff1a;要求版本大于等于7.6 首先保证你的环境上有node.js&a…