【MM32F103开发套件试用体验】+ 把玩红外遥控器

  • 开发
  • 遥控器
  • daheix
  • LV3工程师
  • |      2016-11-05 17:31:05
  • 浏览量 1168
  • 回复:9
本帖最后由 daheix 于 2016-11-5 20:22 编辑 没有看到大家玩红外遥控器,我来玩一个; 首先咨询QQ群里面的朋友,知道红外遥控器的例子是:exam22IRDA 目录中。所以我就用这个来自己玩一下; 1、保证工程i编译通过 2、我没有led显示屏幕,屏幕是坏的,所以我只好使用串口打印,来查看我的按键的信息。方法是添加 printf函数打印信息到串口显示。 3、加载包后,串口一直没有打印按键消息。然后我就一直尝试。看原理图发现有个LED跳线,两个针脚。我就尝试把这两个用跳线帽跳上。结果就打印出来信息了。 相关配置如下: 整体的实验硬件:主板 + 遥控器(我使用的是别的网络机顶盒的) 【备注】我也实验了那种LED灯带的小遥控器,但是无法接收到任何信息,估计不是一路货色。 跳线连接放大图 串口打印结果显示图: 实验修改的test.c代码如下:
#include "sys.h"

#include "usart.h"                

#include "delay.h"        

#include "led.h"   

#include "lcd.h" 

#include "usmart.h" 

#include "key.h" 

#include "remote.h"  



int main(void)

{                

        u32 times = 1;                //LED闪烁的总次数

        u8 key;

        u8 t=0;        

        u8 *str=0; 

        uart_init(72,9600);                 //串口初始化为9600

        delay_init(72);                            //延迟初始化

        LED_Init();                                  //初始化LED

        LCD_Init();                                   //初始化LCD         

        Remote_Init();                        //红外线接收器初始化         

         POINT_COLOR=RED;                //设置字体颜色

        

        LCD_ShowString(30,40,200,24,24,"Dev Board ^_^");        

        LCD_ShowString(60,70,200,16,16,"REMOTE TEST");        

        LCD_ShowString(60,90,200,16,16,"M3");

        LCD_ShowString(60,110,200,16,16,"2014/3/12");



        LCD_ShowString(60,130,200,16,16,"KEYVAL:");        

        LCD_ShowString(60,150,200,16,16,"KEYCNT:");        

        LCD_ShowString(60,170,200,16,16,"SYMBOL:");                  

        

        while(1)

        {

                key=Remote_Scan();        

                

                if(key)

                {         

                        LCD_ShowNum(116,130,key,3,16);                //显示键值

                        printf("onclick %d\n",key);

                        LCD_ShowNum(116,150,RmtCnt,3,16);        //显示按键次数

                        printf("onclick times: %d\n",RmtCnt);

                        

                        switch(key)

                        {

                                case 0:str="ERROR";break;                           

                                case 162:str="POWER";break;            

                                case 98:str="UP";break;            

                                case 2:str="PLAY";break;                 

                                case 194:str="RIGHT";break;           

                                case 34:str="LEFT";break;                  

                                case 224:str="VOL-";break;                  

                                case 168:str="DOWN";break;                   

                                case 144:str="VOL+";break;                    

                                case 104:str="1";break;                  

                                case 152:str="2";break;           

                                case 176:str="3";break;            

                                case 48:str="4";break;                    

                                case 24:str="5";break;                    

                                case 122:str="6";break;                  

                                case 16:str="7";break;                                                                   

                                case 56:str="8";break;         

                                case 90:str="9";break;

                                case 66:str="0";break;

                                case 82:str="DELETE";break;                 

                        }

                        LCD_Fill(116,170,116+8*8,170+16,WHITE);        //清屏

                        LCD_ShowString(116,170,200,16,16,str);        //显示 按键 值

                        printf(" onclicked\n",str);

                        

                }else delay_ms(10);          

                t++;

                if(t==20)

                {

                        t=0;

                        LED0=!LED0;

                        //80秒显示一次打印信息

                        if(0 == times % 80)

                        {

                            printf("I'm LED, light changed %d times\n",times);                        

                        }

                        times++;

                }

        }

}

发现的问题: 【1】遥控器会突然的无法正常显示按键信息,这个时候,将红外跳线重新插拔跳线帽,就好了。这个应该室友问题。 【2】我按一次按键,会连续显示4次,这个应该是遥控器的问题,是为了保证控制信号真正的发送出去,这个需要在 接收端 做相关的处理,相同的4次按键,只处理一次有效的 就可以了。这个也是为了保证实际使用而做的保护措施吧。多次发送策略。 总结:其他的东西,慢慢玩,呵呵。然后就可以控制其他的各种东西了。 通过打印,把自己的遥控器都配置起来。实现了 通过遥控器的1到9来控制LED灯的闪烁的速度。1最快,9最慢; 代码很简单,修改了上面的几行代码而已: #include "sys.h" #include "usart.h" #include "delay.h" #include "led.h" #include "lcd.h" #include "usmart.h" #include "key.h" #include "remote.h" int main(void) { u32 times = 1; //¿ª»úµ½ÏÖÔڵĵÆÉÁ˸µÄ´ÎÊý u32 lcdSpeed = 20; u8 key; u8 t=0; u8 *str=0; uart_init(72,9600); //´®¿Ú³õʼ»¯Îª9600 delay_init(72); //ÑÓʱ³õʼ»¯ LED_Init(); //³õʼ»¯ÓëLEDÁ¬½ÓµÄÓ²¼þ½Ó¿Ú LCD_Init(); //³õʼ»¯LCD Remote_Init(); //ºìÍâ½ÓÊÕ³õʼ»¯ POINT_COLOR=RED;//ÉèÖÃ×ÖÌåΪºìÉ« LCD_ShowString(30,40,200,24,24,"Dev Board ^_^"); LCD_ShowString(60,70,200,16,16,"REMOTE TEST"); LCD_ShowString(60,90,200,16,16,"M3"); LCD_ShowString(60,110,200,16,16,"2014/3/12"); LCD_ShowString(60,130,200,16,16,"KEYVAL:"); LCD_ShowString(60,150,200,16,16,"KEYCNT:"); LCD_ShowString(60,170,200,16,16,"SYMBOL:"); while(1) { key=Remote_Scan(); if(key) { LCD_ShowNum(116,130,key,3,16); //ÏÔʾ¼üÖµ printf("onclick %d\n",key); LCD_ShowNum(116,150,RmtCnt,3,16); //ÏÔʾ°´¼ü´ÎÊý printf("onclick times: %d\n",RmtCnt); switch(key) { case 0:str="ERROR";break; case 24:str="PWOER ON/OFF";break; case 16:str="MUTE";break; //¾²Òô case 106:str="ZHI BO";break; case 234:str="DIAN BO";break; case 248:str="YING YONG";break; case 218:str="SETTING";break; case 186:str="LAST";break; case 58:str="NEXT";break; case 40:str="VOL +";break; case 8:str="VOL -";break; case 32:str="MENU";break; case 216:str="INFO";break; case 98:str="UP";break; case 226:str="LEFT";break; case 170:str="OK";break; case 168:str="RIGHT";break; case 104:str="DOWN";break; case 96:str="HOME";break; case 2:str="RETURN";break; //set speed by the button case 42: lcdSpeed = 20;//这里控制速度 str="1"; break; case 18:str="2";lcdSpeed = 40;break; case 224:str="3";lcdSpeed = 60;break; case 10:str="4";lcdSpeed = 80;break; case 72:str="5";lcdSpeed = 100;break; case 136:str="6";lcdSpeed = 120;break; case 50:str="7";lcdSpeed = 140;break; case 112:str="8";lcdSpeed = 160;break; case 176:str="9";lcdSpeed = 180;break; case 232:str="MOUSE_MODE";break; case 48:str="0";break; } LCD_Fill(116,170,116+8*8,170+16,WHITE); //Çå³þ֮ǰµÄÏÔʾ LCD_ShowString(116,170,200,16,16,str); //ÏÔʾSYMBOL printf(" onclicked\n",str); } else { delay_ms(10); } t++; //set speed if(t==lcdSpeed) { t=0; LED0=!LED0; //ÉÁ80´ÎÏÔʾһ´Î´òÓ¡ÐÅÏ¢ if(0 == times % 80) { printf("I'm LED, light changed %d times\n",times); } times++; } } } OK,拿去 happy吧~~~~~~ 我把hex文件也放在这里,可以用你们家里的遥控器来试验一下,是否可以使用吧。
  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:5
wengqiang 2016-11-09
好东西,顶一个
0   回复
举报
发布
daheix 2016-11-09
但是接收不到那种小型遥控器的值,我就不知道如何去匹配了。
0   回复
举报
发布
MindMotion 回复 2016-11-09
频率有可能不一样,有36K、38k还有40K的
0   回复
举报
MindMotion 回复 2016-11-09
我们配的接收头是38K的
0   回复
举报
daheix 回复 2016-11-11
哦,我感觉那种1.5v
0   回复
举报
daheix 回复 2016-11-11
我感觉那种1.5v供电的遥控器,应该是用最低频率的吧。只用一个纽扣电池供电的。
0   回复
举报
daheix 2016-11-09
家里没有电视遥控器,我用的是机顶盒的遥控器。然后自己匹配了按键值。
0   回复
举报
发布
MindMotion 2016-11-09
电视遥控器玩起来有点复杂,你可以钻研一下
0   回复
举报
发布
wengqiang 2016-11-07
学习。谢谢
0   回复
举报
发布
x
收藏成功!点击 我的收藏 查看收藏的全部帖子