365浏览
查看: 365|回复: 0

[项目] 【花雕动手做】ASRPRO语音识别(73)---语音控制红外发NEC码

[复制链接]
本例实验使用红外线发射管(IR LED)
也称红外线发射二极管,属于二极管类。它是可以将电能直接转换成近红外光(不可见光)并能辐射出去的发光器件,主要应用于各种光电开关、触摸屏及遥控发射电路中。红外线发射管的结构、原理与普通发光二极管相近,只是使用的半导体材料不同。红外发光二极管通常使用砷化镓(GaAs)、砷铝化镓(GaAlAs)等材料,采用全透明或浅蓝色、黑色的树脂封装。

【花雕动手做】ASRPRO语音识别(73)---语音控制红外发NEC码图5

主要参数

发射距离、发射角度(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大功率红外线发射管可应用于红外监控照明。

【花雕动手做】ASRPRO语音识别(73)---语音控制红外发NEC码图4

工作原理

普通的的红外线发射管外形和一般的可见光LED相似,但却是发出红外线。其管压一般降约1.4v,工作电流一般小于20mA。为了适应不同的工作电压,回路中常常串有限流电阻。发射红外线去控制相应的受控装置时,其控制的距离与发射功率成正比。为了增加红外线的控制距离,红外发光二极管工作于脉冲状态,因为脉动光(调制光)的有效传送距离与脉冲的峰值电流成正比,只需尽量提高峰值Ip,就能增加红外光的发射距离。提高Ip的方法,是减小脉冲占空比,即压缩脉冲的宽度T,一些彩电红外遥控器,其红外发光管的工作脉冲占空比约为1/3-1/4;一些电器产品红外遥控器,其占空比是1/10。减小脉冲占空比还可使小功率红外发光二极管的发射距离大大增加。普通的红外发光二极管,其功率分为小功率(1mW-10mW)、中功率(20mW-50mW)和大功率(50mW-100mW以上)三大类。要使红外发光二极管产生调制光,只需在驱动管上加上一定频率的脉冲电压。红外发光二极管发射红外线去控制受控装置时,受控装置中均有相应的红外光一电转换元件,如红外接收二极体,光电三极管等。

【花雕动手做】ASRPRO语音识别(73)---语音控制红外发NEC码图2

红外光

是太阳光线中众多不可见光线中的一种,由英国科学家赫歇尔于1800年发现,又称为红外热辐射,热作用强。他将太阳光用三棱镜分解开,在各种不同颜色的色带位置上放置了温度计,试图测量各种颜色的光的加热效应。结果发现,位于红光外侧的那支温度计升温最快。因此得到结论:太阳光谱中,红光的外侧必定存在看不见的光线,这就是红外线。也可以当作传输之媒介。 太阳光谱上红外线的波长大于可见光线,波长为0.75~1000μm。红外线可分为三部分,即近红外线,波长为(0.75-1)~(2.5-3)μm之间;中红外线,波长为(2.5-3)~(25-40)μm之间;远红外线,波长为(25-40)~l500μm 之间。

【花雕动手做】ASRPRO语音识别(73)---语音控制红外发NEC码图1


红外线(Infrared)
是波长介于微波与可见光之间的电磁波,波长在1mm到760纳米(nm)之间,比红光长的非可见光。高于绝对零度(-273.15℃)的物质都可以产生红外线。现代物理学称之为热射线。医用红外线可分为两类:近红外线与远红外线。含热能,太阳的热量主要通过红外线传到地球。如图所示,我们把红光之外的辐射叫做红外线(紫光之外是紫外线),肉眼不可见。可见光是指肉眼可见的光波域从400nm(紫光)到700nm(红光),而波长760nm到1mm之间的光称为红外线,是一种肉眼看不到的光。借助一些光学设备,我们可以感受到红外线,通常红外线摄像机接收到红外线后会将其转化为可见的绿光,我们的肉眼永远见不到真正的红外线。电影中常出现的能看到红外线的眼镜也是不存在的。

【花雕动手做】ASRPRO语音识别(73)---语音控制红外发NEC码图3

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码信号
实验开源代码

  1. #define ASC2_12
  2. #define ST7735_CS_PIN 9
  3. #define ST7735_CS_GPIO_PIN gpio_pin_1
  4. #define ST7735_DC_PIN 1
  5. #define ST7735_DC_GPIO_PIN gpio_pin_1
  6. #define ST7735_RST_PIN 25
  7. #define ST7735_RST_GPIO_PIN gpio_pin_1
  8. #define ST7735_SCK_PIN 3
  9. #define ST7735_SCK_GPIO_PIN gpio_pin_3
  10. #define ST7735_MOSI_PIN 2
  11. #define ST7735_MOSI_GPIO_PIN gpio_pin_2
  12. #define ASC2_32
  13. #define ST7735S_RGB_GBR_ORDER   0
  14. #include "asr.h"
  15. extern "C"{ void * __dso_handle = 0 ;}
  16. #include "setup.h"
  17. #include "myLib/asr_st7735.h"
  18. #include "myLib/asr_IRSendRev.h"
  19. #include "myLib/asr_event.h"
  20. uint32_t snid;
  21. IRSendRev irsendrev;
  22. void hardware_init();
  23. SPITFT spi_tft(128, 160);
  24. void sys_sleep_hook()
  25. {
  26.   digital_write((4),1);
  27.   digital_write((21),0);
  28. }
  29. //{ID:250,keyword:"命令词",ASR:"最大音量",ASRTO:"音量调整到最大"}
  30. //{ID:251,keyword:"命令词",ASR:"中等音量",ASRTO:"音量调整到中等"}
  31. //{ID:252,keyword:"命令词",ASR:"最小音量",ASRTO:"音量调整到最小"}
  32. void ASR_CODE()
  33. {
  34.   //{ID:500,keyword:"命令词",ASR:"向后退",ASRTO:"已经发送,命令二十五"}
  35.   if(snid == 500){
  36.     spi_tft.clear((0x001F));
  37.     spi_tft.set_text_color((0xFFFF),(0x001F));
  38.     spi_tft.set_cursor(16,45);
  39.     spi_tft.draw_hanzi_32("向后退");
  40.     spi_tft.set_cursor(0,80);
  41.     spi_tft.draw_hanzi_24("命令二十五");
  42.     taskENTER_CRITICAL();
  43.       irsendrev.send_nec(64, 25);
  44.     taskEXIT_CRITICAL();
  45.   }
  46.   //{ID:501,keyword:"命令词",ASR:"向前进",ASRTO:"已经发送,命令十七"}
  47.   if(snid == 501){
  48.     spi_tft.clear((0x001F));
  49.     spi_tft.set_text_color((0xFFFF),(0x001F));
  50.     spi_tft.set_cursor(16,45);
  51.     spi_tft.draw_hanzi_32("向前进");
  52.     spi_tft.set_cursor(0,80);
  53.     spi_tft.draw_hanzi_32("命令十七");
  54.     taskENTER_CRITICAL();
  55.       irsendrev.send_nec(64, 17);
  56.     taskEXIT_CRITICAL();
  57.   }
  58.   //{ID:502,keyword:"唤醒词",ASR:"智能管家",ASRTO:"我在"}
  59.   if(snid == 502){
  60.     digital_write((21),1);
  61.     digital_write((4),0);
  62.     spi_tft.clear((0xF800));
  63.     spi_tft.set_text_color((0xFFFF),(0xF800));
  64.     spi_tft.set_cursor(0,66);
  65.     spi_tft.draw_hanzi_32("红外发射");
  66.   }
  67.   //{ID:503,keyword:"命令词",ASR:"向右转",ASRTO:"已经发送,命令二十二"}
  68.   if(snid == 503){
  69.     spi_tft.clear((0x001F));
  70.     spi_tft.set_text_color((0xFFFF),(0x001F));
  71.     spi_tft.set_cursor(16,45);
  72.     spi_tft.draw_hanzi_32("向右转");
  73.     spi_tft.set_cursor(0,80);
  74.     spi_tft.draw_hanzi_24("命令二十二");
  75.     taskENTER_CRITICAL();
  76.       irsendrev.send_nec(64, 22);
  77.     taskEXIT_CRITICAL();
  78.   }
  79.   //{ID:504,keyword:"命令词",ASR:"向左转",ASRTO:"已经发送,命令二十"}
  80.   if(snid == 504){
  81.     spi_tft.clear((0x001F));
  82.     spi_tft.set_text_color((0xFFFF),(0x001F));
  83.     spi_tft.set_cursor(16,45);
  84.     spi_tft.draw_hanzi_32("向左转");
  85.     spi_tft.set_cursor(0,80);
  86.     spi_tft.draw_hanzi_32("命令二十");
  87.     taskENTER_CRITICAL();
  88.       irsendrev.send_nec(64, 20);
  89.     taskEXIT_CRITICAL();
  90.   }
  91.   //{ID:505,keyword:"命令词",ASR:"停止",ASRTO:"已经发送,命令二十一"}
  92.   if(snid == 505){
  93.     spi_tft.clear((0x001F));
  94.     spi_tft.set_text_color((0xFFFF),(0x001F));
  95.     spi_tft.set_cursor(16,45);
  96.     spi_tft.draw_hanzi_32("停止了");
  97.     spi_tft.set_cursor(0,80);
  98.     spi_tft.draw_hanzi_24("命令二十一");
  99.     taskENTER_CRITICAL();
  100.       irsendrev.send_nec(64, 21);
  101.     taskEXIT_CRITICAL();
  102.   }
  103. }
  104. void hardware_init(){
  105.   spi_tft.init();
  106.   spi_tft.set_direction(2);
  107.   spi_tft.set_text_wrap(true);
  108.   spi_tft.set_text_size(32);
  109.   spi_tft.set_bg_mode(1);
  110.   pinMode(0,output);
  111.   dpmu_set_adio_reuse(PA0,DIGITAL_MODE);
  112.   irsendrev.begin(PWM5);
  113.   setPinFun(0,SECOND_FUNCTION);
  114.   vTaskDelete(NULL);
  115. }
  116. void setup()
  117. {
  118.   //{speak:阿文-温和男声,vol:20,speed:10,platform:haohaodada}
  119.   //{playid:10001,voice:欢迎使用人工智能AI语音助手,用智能管家唤醒我}
  120.   //{playid:10002,voice:我退下了}
  121.   digital_write((4),1);
  122.   digital_write((21),0);
  123.   xTaskCreate(hardware_init,"hardware_init",256,NULL,100,NULL);
  124. }
复制代码

生成模型与编译烧录

【花雕动手做】ASRPRO语音识别(73)---语音控制红外发NEC码图6

【花雕动手做】ASRPRO语音识别(73)---语音控制红外发NEC码图9

实验记录视频

https://www.bilibili.com/video/BV1cH4y1J7if/?share_source=copy_web&vd_source=371a292a55e5ca9be994cbb4a86cc987



实验场景图

【花雕动手做】ASRPRO语音识别(73)---语音控制红外发NEC码图12

【花雕动手做】ASRPRO语音识别(73)---语音控制红外发NEC码图7

【花雕动手做】ASRPRO语音识别(73)---语音控制红外发NEC码图8

【花雕动手做】ASRPRO语音识别(73)---语音控制红外发NEC码图10

【花雕动手做】ASRPRO语音识别(73)---语音控制红外发NEC码图11


18 (5).jpg
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail