【花雕动手做】ASRPRO语音识别(73)---语音控制红外发NEC码
本例实验使用红外线发射管(IR LED)也称红外线发射二极管,属于二极管类。它是可以将电能直接转换成近红外光(不可见光)并能辐射出去的发光器件,主要应用于各种光电开关、触摸屏及遥控发射电路中。红外线发射管的结构、原理与普通发光二极管相近,只是使用的半导体材料不同。红外发光二极管通常使用砷化镓(GaAs)、砷铝化镓(GaAlAs)等材料,采用全透明或浅蓝色、黑色的树脂封装。
主要参数
发射距离、发射角度(15度、30度、45度、60度、90度、120度、180度)、发射的光强度、波长。以上为物理参数,需了解其电性能参数:市场上常用的直径3mm,5mm为小功率红外线发射管,8mm,10mm为中功率及大功率发射管。小功率发射管正向电压:1.1-1.5V,电流20mA,中功率为正向电压:1.4-1.65V 50-100mA,大功率发射管为正向电压:1.5-1.9V200-350mA.煜星电子做出1-10W大功率红外线发射管可应用于红外监控照明。
工作原理
普通的的红外线发射管外形和一般的可见光LED相似,但却是发出红外线。其管压一般降约1.4v,工作电流一般小于20mA。为了适应不同的工作电压,回路中常常串有限流电阻。发射红外线去控制相应的受控装置时,其控制的距离与发射功率成正比。为了增加红外线的控制距离,红外发光二极管工作于脉冲状态,因为脉动光(调制光)的有效传送距离与脉冲的峰值电流成正比,只需尽量提高峰值Ip,就能增加红外光的发射距离。提高Ip的方法,是减小脉冲占空比,即压缩脉冲的宽度T,一些彩电红外遥控器,其红外发光管的工作脉冲占空比约为1/3-1/4;一些电器产品红外遥控器,其占空比是1/10。减小脉冲占空比还可使小功率红外发光二极管的发射距离大大增加。普通的红外发光二极管,其功率分为小功率(1mW-10mW)、中功率(20mW-50mW)和大功率(50mW-100mW以上)三大类。要使红外发光二极管产生调制光,只需在驱动管上加上一定频率的脉冲电压。红外发光二极管发射红外线去控制受控装置时,受控装置中均有相应的红外光一电转换元件,如红外接收二极体,光电三极管等。
红外光
是太阳光线中众多不可见光线中的一种,由英国科学家赫歇尔于1800年发现,又称为红外热辐射,热作用强。他将太阳光用三棱镜分解开,在各种不同颜色的色带位置上放置了温度计,试图测量各种颜色的光的加热效应。结果发现,位于红光外侧的那支温度计升温最快。因此得到结论:太阳光谱中,红光的外侧必定存在看不见的光线,这就是红外线。也可以当作传输之媒介。 太阳光谱上红外线的波长大于可见光线,波长为0.75~1000μm。红外线可分为三部分,即近红外线,波长为(0.75-1)~(2.5-3)μm之间;中红外线,波长为(2.5-3)~(25-40)μm之间;远红外线,波长为(25-40)~l500μm 之间。
红外线(Infrared)
是波长介于微波与可见光之间的电磁波,波长在1mm到760纳米(nm)之间,比红光长的非可见光。高于绝对零度(-273.15℃)的物质都可以产生红外线。现代物理学称之为热射线。医用红外线可分为两类:近红外线与远红外线。含热能,太阳的热量主要通过红外线传到地球。如图所示,我们把红光之外的辐射叫做红外线(紫光之外是紫外线),肉眼不可见。可见光是指肉眼可见的光波域从400nm(紫光)到700nm(红光),而波长760nm到1mm之间的光称为红外线,是一种肉眼看不到的光。借助一些光学设备,我们可以感受到红外线,通常红外线摄像机接收到红外线后会将其转化为可见的绿光,我们的肉眼永远见不到真正的红外线。电影中常出现的能看到红外线的眼镜也是不存在的。
NEC码(NEC Protocol)
是一种红外遥控编码协议,广泛应用于家用电器、电视、空调、音频设备等遥控器中。它是日本电子公司NEC(Nippon Electric Company)最早提出和使用的一种红外线编码协议。
NEC码的特点:
脉宽编码:NEC码使用脉宽编码(Pulse Width Encoding)来表示二进制数据。一个NEC码包含一系列的脉冲,通过脉冲的高电平时间来表示0和1。
异常检测:NEC码使用脉宽的异常检测来确保数据的可靠性。通过检测脉冲的长短来验证接收到的数据是否有效。
重复码:NEC码支持重复码功能,即当按住遥控器上的某个按钮时,会连续发送相同的NEC码。
NEC码的格式:
NEC码由三个部分组成:引导码、用户码和数据码。它们的脉冲编码格式如下:
引导码(Leader Code):一个9ms的低电平后紧跟着一个4.5ms的高电平,用于同步接收器和发送器。
用户码(Address Code):一个8位的二进制数,表示遥控器的设备地址。
数据码(Data Code):一个8位的二进制数,表示具体的遥控命令或数据。
在NEC码中,逻辑0的编码为560微秒的低电平,后面是560微秒的高电平;逻辑1的编码为560微秒的低电平,后面是1690微秒的高电平。
NEC码的接收端会根据脉冲的高电平时间来解码并判断接收到的数据是0还是1。同时,NEC码还包含了异常检测功能,通过检测脉冲的长短以及引导码的存在,可以验证接收到的数据的正确性。
总结:
NEC码是一种常见的红外遥控编码协议,用于家电、电视、空调等遥控器中。它使用脉宽编码表示二进制数据,包括引导码、用户码和数据码三个部分。NEC码的特点包括脉宽编码、异常检测和重复码功能。通过解码NEC码,接收端可以识别遥控器发送的命令或数据,并执行相应的操作。
【花雕动手做】实验七十八:使用板载红外管通过语音命令发射NEC码信号
实验开源代码
#define ASC2_12
#define ST7735_CS_PIN 9
#define ST7735_CS_GPIO_PIN gpio_pin_1
#define ST7735_DC_PIN 1
#define ST7735_DC_GPIO_PIN gpio_pin_1
#define ST7735_RST_PIN 25
#define ST7735_RST_GPIO_PIN gpio_pin_1
#define ST7735_SCK_PIN 3
#define ST7735_SCK_GPIO_PIN gpio_pin_3
#define ST7735_MOSI_PIN 2
#define ST7735_MOSI_GPIO_PIN gpio_pin_2
#define ASC2_32
#define ST7735S_RGB_GBR_ORDER 0
#include "asr.h"
extern "C"{ void * __dso_handle = 0 ;}
#include "setup.h"
#include "myLib/asr_st7735.h"
#include "myLib/asr_IRSendRev.h"
#include "myLib/asr_event.h"
uint32_t snid;
IRSendRev irsendrev;
void hardware_init();
SPITFT spi_tft(128, 160);
void sys_sleep_hook()
{
digital_write((4),1);
digital_write((21),0);
}
//{ID:250,keyword:"命令词",ASR:"最大音量",ASRTO:"音量调整到最大"}
//{ID:251,keyword:"命令词",ASR:"中等音量",ASRTO:"音量调整到中等"}
//{ID:252,keyword:"命令词",ASR:"最小音量",ASRTO:"音量调整到最小"}
void ASR_CODE()
{
//{ID:500,keyword:"命令词",ASR:"向后退",ASRTO:"已经发送,命令二十五"}
if(snid == 500){
spi_tft.clear((0x001F));
spi_tft.set_text_color((0xFFFF),(0x001F));
spi_tft.set_cursor(16,45);
spi_tft.draw_hanzi_32("向后退");
spi_tft.set_cursor(0,80);
spi_tft.draw_hanzi_24("命令二十五");
taskENTER_CRITICAL();
irsendrev.send_nec(64, 25);
taskEXIT_CRITICAL();
}
//{ID:501,keyword:"命令词",ASR:"向前进",ASRTO:"已经发送,命令十七"}
if(snid == 501){
spi_tft.clear((0x001F));
spi_tft.set_text_color((0xFFFF),(0x001F));
spi_tft.set_cursor(16,45);
spi_tft.draw_hanzi_32("向前进");
spi_tft.set_cursor(0,80);
spi_tft.draw_hanzi_32("命令十七");
taskENTER_CRITICAL();
irsendrev.send_nec(64, 17);
taskEXIT_CRITICAL();
}
//{ID:502,keyword:"唤醒词",ASR:"智能管家",ASRTO:"我在"}
if(snid == 502){
digital_write((21),1);
digital_write((4),0);
spi_tft.clear((0xF800));
spi_tft.set_text_color((0xFFFF),(0xF800));
spi_tft.set_cursor(0,66);
spi_tft.draw_hanzi_32("红外发射");
}
//{ID:503,keyword:"命令词",ASR:"向右转",ASRTO:"已经发送,命令二十二"}
if(snid == 503){
spi_tft.clear((0x001F));
spi_tft.set_text_color((0xFFFF),(0x001F));
spi_tft.set_cursor(16,45);
spi_tft.draw_hanzi_32("向右转");
spi_tft.set_cursor(0,80);
spi_tft.draw_hanzi_24("命令二十二");
taskENTER_CRITICAL();
irsendrev.send_nec(64, 22);
taskEXIT_CRITICAL();
}
//{ID:504,keyword:"命令词",ASR:"向左转",ASRTO:"已经发送,命令二十"}
if(snid == 504){
spi_tft.clear((0x001F));
spi_tft.set_text_color((0xFFFF),(0x001F));
spi_tft.set_cursor(16,45);
spi_tft.draw_hanzi_32("向左转");
spi_tft.set_cursor(0,80);
spi_tft.draw_hanzi_32("命令二十");
taskENTER_CRITICAL();
irsendrev.send_nec(64, 20);
taskEXIT_CRITICAL();
}
//{ID:505,keyword:"命令词",ASR:"停止",ASRTO:"已经发送,命令二十一"}
if(snid == 505){
spi_tft.clear((0x001F));
spi_tft.set_text_color((0xFFFF),(0x001F));
spi_tft.set_cursor(16,45);
spi_tft.draw_hanzi_32("停止了");
spi_tft.set_cursor(0,80);
spi_tft.draw_hanzi_24("命令二十一");
taskENTER_CRITICAL();
irsendrev.send_nec(64, 21);
taskEXIT_CRITICAL();
}
}
void hardware_init(){
spi_tft.init();
spi_tft.set_direction(2);
spi_tft.set_text_wrap(true);
spi_tft.set_text_size(32);
spi_tft.set_bg_mode(1);
pinMode(0,output);
dpmu_set_adio_reuse(PA0,DIGITAL_MODE);
irsendrev.begin(PWM5);
setPinFun(0,SECOND_FUNCTION);
vTaskDelete(NULL);
}
void setup()
{
//{speak:阿文-温和男声,vol:20,speed:10,platform:haohaodada}
//{playid:10001,voice:欢迎使用人工智能AI语音助手,用智能管家唤醒我}
//{playid:10002,voice:我退下了}
digital_write((4),1);
digital_write((21),0);
xTaskCreate(hardware_init,"hardware_init",256,NULL,100,NULL);
}
生成模型与编译烧录
实验记录视频
https://www.bilibili.com/video/BV1cH4y1J7if/?share_source=copy_web&vd_source=371a292a55e5ca9be994cbb4a86cc987
https://www.bilibili.com/video/BV1cH4y1J7if/?share_source=copy_web&vd_source=371a292a55e5ca9be994cbb4a86cc987
实验场景图
页:
[1]