https://harmonyos.51cto.com/#zz
Hi3861解码红外遥控器
红外遥控器是个很实用的键盘扩展,即能扩展键盘还能远程操作!
首先在我的小游戏上试一下!
先前发布的小游戏:https://harmonyos.51cto.com/posts/1995
视频:https://harmonyos.51cto.com/show/2063
先上图:
一、红外遥控器原理(简述)
红外遥控器是通过940nm-950nm的红外线传输的,载波频率是38K,传输协议也比较简单:
上图左是红外发光二极管
上图右是红外接收器(HS0038B),会自动过滤掉38K的载波留下数据信息
我压上了杜邦头可以直接插在开发板的引脚上。
二、解析原理
接收器有三个管脚(左:输出,中:电源负,右:电源正)
配置该管脚为普通输入、启用内部上拉电阻、并注册中断函数;
- IoSetFunc(WIFI_IOT_IO_NAME_GPIO_6, WIFI_IOT_IO_FUNC_GPIO_6_GPIO);
- GpioSetDir(WIFI_IOT_IO_NAME_GPIO_6, WIFI_IOT_GPIO_DIR_IN);
- IoSetPull(WIFI_IOT_IO_NAME_GPIO_6, WIFI_IOT_IO_PULL_UP);
- GpioRegisterIsrFunc(WIFI_IOT_IO_NAME_GPIO_6, WIFI_IOT_INT_TYPE_EDGE, WIFI_IOT_GPIO_EDGE_FALL_LEVEL_LOW, rc_decode, NULL);
有输出(下降沿)的时候触发中断,中断里读取us时钟;
- static void rc_decode(char *arg)
- {
- (void) arg;
- time_r = hi_get_us();
- // t = 13500
- if(time_r - time_c > 13000 && time_r - time_c < 14000)
- {
- n = 0;
- data.Int = 0;
- }
- // t = 1120
- if(time_r - time_c > 920 && time_r - time_c < 1320)
- {
- ++n;
- }
- // t = 2250
- if(time_r - time_c > 2050 && time_r - time_c < 2450)
- {
- data.Int |= 1<
- ++n;
- }
- if(n == 32)
- {
- if ((data.Char[2] ^ data.Char[3]) == 0xff)
- {
- //printf("user_code:%x\tcom_code:%x\n", data.Short[0], data.Char[2]);
- switch_key(data.Char[2]);
- }
- data.Int = 0;
- }
- time_c = time_r;
- }
要获取每个按键的命令码是什么,可以直接打印到串口
- printf("user_code:%x\tcom_code:%x\n", data.Short[0], data.Char[2]);
然后对不同的键码进行一个switch操作就OK了!
- void switch_key(unsigned char key)
- {
- switch(key)
- {
- case 0x99: block_left();break;
- case 0xc1: block_right();break;
- case 0xca: game_stop();break;
- case 0xd2: block_down();break;
- case 0xce: block_turn();break;
- }
- }
三、同时也实现了红外编码
- void rc_encode(unsigned user_code, unsigned com_code)
- {
- PwmInit(PWM);
- PwmStart(PWM, 1404, 4212);
- hi_udelay(9000);
- PwmStop(PWM);
- hi_udelay(4500);
- unsigned int data = user_code | com_code<<16 | ~com_code<<24;
- for(unsigned char i=0;i<32;++i)
- {
- PwmStart(PWM, 1404, 4212);
- hi_udelay(560);
- PwmStop(PWM);
- hi_udelay((data&0x0001)==0x0001?1680:560);
- data >>= 1;
- }
- PwmStart(PWM, 1404, 4212);
- hi_udelay(560);
- PwmStop(PWM);
- hi_udelay(3000);
- PwmStart(PWM, 1404, 4212);
- hi_udelay(560);
- PwmStop(PWM);
- }
编码就是解码的反操作,相关简单
发送间隔本应该用定时器进行操作,但Hi3861的定时器都是ms级的,无法完成us级延时;
开始我用usleep延时操作,发现误差有一两个数量级,根本无法使用,还好我找到了hi_udelay(),位于hi_time.h可以满足需求!
以上只是介绍最常见的红外遥控器的解码及编码!有些厂家自己定义了请多非标编码就不一一介绍了!
最近必须付上代码!!!
©著作权归作者和HarmonyOS技术社区共同所有,如需转载,请注明出处,否则将追究法律责任
https://harmonyos.51cto.com/#zz
复制代码 代码如下: % URL="http://news.163.com/special/00011K6L/rss_newstop....
正则忽略大小写 – RegexOptions.IgnoreCase 例如: 复制代码 代码如下: Str = R...
DELETEFROMTablesWHEREIDNOTIN(SELECTMin(ID)FROMTablesGROUPBYName) Min的话保...
项目中用到的一些特殊字符和图标 html代码 XML/HTML Code 复制内容到剪贴板 div ...
上篇文章给大家介绍了 Java正则表达式匹配,替换,查找,切割的方法 ,接下来,...
4月11日20:30~22:00通过腾讯会议进行了第二次在线学习讨论我把学习笔记整理一下...
错误描述: 在开发.net项目中,通过microsoft.ACE.oledb读取excel文件信息时,报...
本文实例讲述了Laravel框架源码解析之反射的使用。分享给大家供大家参考,具体如...
Elasticsearch 是通过 Lucene 的倒排索引技术实现比关系型数据库更快的过滤。特...
工具:Eclipse,Oracle,smartupload.jar;语言:jsp,Java;数据存储:Oracle。...