当前位置: 首页 > 科技观察

开发板鸿蒙Hi3861俄罗斯方块+=遥控器

时间:2023-03-15 14:21:42 科技观察

更多信息请访问:与华为官方共建的鸿蒙技术社区https://harmonyos.51cto.com/#zzHi3861解码红外遥控器红外遥控器是一款非常实用的键盘扩展,可以扩展键盘,远程操作!首先在我的小游戏上试试吧!之前发布的小游戏:https://harmonyos.51cto.com/posts/1995视频:https://harmonyos.51cto.com/show/2063上图第一张:1.红外遥控原理(简述)The红外遥控是通过940nm-950nm的红外线发射的,载波频率为38K,传输协议比较简单:先发一个9ms的引导码,引起接收方的注意,我要发送数据了!停4.5ms;开始发送数据(发送560us停560us表示bit0,发送560us停1680us表示发送bit1);每次发送发送4个字节 0-15为用户码(此码为一个控制器固定),16-23为命令码,24-31为命令码的反码,以上均为低阶优先。上图左边是红外发光二极管。上图右边是红外接收器(HS0038B),会自动滤除38K载波,留下数据信息。2、分析原理接收器有三个引脚(左:输出,中:电源负,右:电源正)。配置该引脚为普通输入,使能内部上拉电阻,并注册中断功能;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钟;然后判断中断本次中断与上次中断的时间间隔;如果在13500(9000+4500)左右,表示接收到开机信号,准备接收数据;如果在1120(560+560)左右,说明接收到一个bit0,接收到的数据没有变化,接收序号++;如果在2240(560+1680)左右,表示接收到一个bit为1,接收到的数据和上位接收序号所在的bit为1;如果接收序号=32,则表示第三接收端判断该字节与第4字节是否刚好互补,即可解析命令,并成功执行相关操作。staticvoidrc_decode(char*arg){(void)arg;time_r=hi_get_us();//t=13500if(time_r-time_c>13000&&time_r-time_c<14000){n=0;data.Int=0;}//t=1120if(time_r-time_c>920&&time_r-time_c<1320){++n;}//t=2250if(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]);然后对不同的键码进行一次切换操作就OK了!voidswitch_key(unsignedcharkey){switch(key){case0x99:block_left();break;case0xc1:block_right();break;case0xca:game_stop();break;case0xd2:block_down();break;case0xce:block_turn();break;}}红外线编码实现ode<<16|~com_code<<24;for(unsignedchari=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);}编码是解码的逆运算,相关简单函数接收用户码和命令码;9000us发送开机代码,4500us停止,将用户代码和命令代码组织成一个32位的数据,方便发送;逐位切换PWM发送;38k=(160M/4212),1/3占空比(4212/3=1404)发送完32位后,再发送一个结束码。发送间隔要用定时,但是Hi3861的定时器都是ms级的,不能完成us级的延时;一开始用usleep延时操作,发现误差一两个数量级,根本没法用。幸运的是,我找到了hi_udelay(),位于hi_time.h中可以满足需求!以上只是对最常见的红外遥控器解码编码的介绍!有的厂家自己定义了,非标准代码请多多指教,就不一一介绍了!最近打码必须要付费!!!?版权归作者和HarmonyOS技术社区共同所有。如需转载请注明出处,否则追究责任。/#ZZ