OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4377|回复: 6

万能遥控器实验,已经实现对电视机控制,为什么空调不行

[复制链接]

1

主题

5

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2016-4-15
在线时间
3 小时
发表于 2016-4-25 19:14:09 | 显示全部楼层 |阅读模式
7金钱
毕设在做一个红外线通信实验。学校配的实验板,芯片是STM32F103 VBT6的。实验原理与原子哥第三十二章差不多,然后我想把它改为一个万能遥控器的程序。
http://www.openedv.com/forum.php?mod=viewthread&tid=13257&highlight=%A1%BEALIENTEK%2B%D5%BD%BD%A2STM32%BF%AA%B7%A2%B0%E5%C0%FD%B3%CC%CF%B5%C1%D0%C1%AC%D4%D8%2B%BD%CC%D1%A7%A1%BF
目前已经能够成功遥控电视机,但是空调就不行了。不知道电视机与空调的红外接收机制有哪些技术上的区别。所以还请大神指教!!!
我知道现在市面上的万能遥控器都使用一体化红外发射头,没有单独的红外接收器,即发射头也用来接收红外信号。
但从原理上来讲,我使用接收器读取红外数据,保存起来再发送出去,也是可行的。
有尝试过用机顶盒的遥控器学习空调遥控器的按键,也是可行的。
初步认为可能是载波频率不一样,但一般的遥控器不都是38KHz的吗?学习型机顶盒遥控器也使用38KHz的载波频率吗?还是更高?以便兼容各种不同制式的遥控器?
我的实验板上得红外接收器型号是TSOP34840,也就是40KHz的工作频率,是可以成功接收38KHz红外信号的。但更高就不行了,比如40KHz,56KHz。
以下是我的实验代码。


void TIM2_Configuration(void)
{
        TIM_ClearITPendingBit(TIM2,TIM_IT_Update);


        TIM_TimeBaseStruct.TIM_Period=947; //初值; 1s/38KHz/2=13.16us,即单个脉冲的宽度; 947=13.16*72 ,72MHz系统主频
        TIM_TimeBaseStruct.TIM_Prescaler=0;//预分频
        TIM_TimeBaseStruct.TIM_ClockDivision=0;
        TIM_TimeBaseStruct.TIM_CounterMode=TIM_CounterMode_Up;


        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStruct);


        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
        TIM_Cmd(TIM2,ENABLE);
}
void TIM2_IRQHandler(void)
{
        if(js_count>0)
                js_count--;
        TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}
#define Nbit 1000
u8 hw_jsm[Nbit];//红外接收码,共8000位数据,一位数据表示一个完整脉冲
void EXTI15_10_IRQHandler(void)
{
        if (mode==0)//工作模式,mode=0表示接收模式,mode=1表示发送模式
        {
                for(i1=0; i1<Nbit; i1++)
                {
                        for(j1=0; j1<8; j1++)
                        {
                                if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_11)==0)//低电平
                                {       
                                        data=0;
                                        js_count=1;
                                        while(js_count);//等待13.16us
                                }
                                else
                                {
                                        js_count=1;
                                        while(js_count);
                                        if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_11)==0)
                                                data=0;
                                        else
                                                data=1;
                                }
                                js_count=1;
                                while(js_count);
                                                                                               
                                hw_jsm[i1]<<=1;
                                hw_jsm[i1]+=data;
                        }
                }
        mode=1;//这里切换为发送模式是为了避免短时间内再次进入接收中断
        hw_jsbz=1;//接收标志置为1
        }//if(mode)
       
        EXTI_ClearITPendingBit(EXTI_Line11);                       
}

void hw_fs(void)
{       
        u16 i,j;
        u8 temp;

        for(i=0; i<Nbit; i++)
        {
                temp=0x80;                   //从高位开始发数据
                for(j=0; j<8; j++)
                {                       
                        if(hw_jsm & temp)        //该位数据为“1”
                        {                               
                                GPIO_ResetBits(GPIOC,GPIO_Pin_3);
                                js_count=2;
                                while(js_count);
                        }
                        else
                        {
                            GPIO_WriteBit(GPIOC,GPIO_Pin_3,(BitAction)((1-GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_3))));
                                js_count=1;
                                while(js_count);
                                GPIO_WriteBit(GPIOC,GPIO_Pin_3,(BitAction)((1-GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_3))));
                                js_count=1;
                                while(js_count);  
                        }
                        temp>>=1;
                }
        }
        GPIO_ResetBits(GPIOC,GPIO_Pin_3);
}



工作原理基本上是把接收到的脉冲信号原封不动的发出去。
还请大家帮我分析一下这样做有哪些缺陷,性能瓶颈在哪。


收发器原理图

收发器原理图

最佳答案

查看完整内容[请看2#楼]

空调是打包发送的,状态由遥控器管理。 电视只是单按键。 每家空调都有不同的协议,需要详细的文档才玩得动。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

1044

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3722
金钱
3722
注册时间
2011-5-23
在线时间
2013 小时
发表于 2016-4-25 19:14:10 | 显示全部楼层
空调是打包发送的,状态由遥控器管理。
电视只是单按键。

每家空调都有不同的协议,需要详细的文档才玩得动。
RT-Thread RTOS 音频,WIFI,蓝牙
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2016-4-15
在线时间
3 小时
 楼主| 发表于 2016-4-25 19:32:34 | 显示全部楼层
在网上找到一些资料:
“格力空调遥控器(YB0F2)红外码组成如下,按解码顺序排列  起始码(S)+35位数据码+连接码(C)+32位数据码”
但编码方式应该不影响我保存这些数据啊?8000bit的数据长度按照NEC码的规范也够存储空调红外信号了。
发送8000bit红外数据需要210ms呢,发送一个红外信号的时间还超过了210ms不成?
测试了办公室得空调,好像是格力的,遥控器型号好像是YB0F2。
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2016-4-15
在线时间
3 小时
 楼主| 发表于 2016-4-25 20:09:14 | 显示全部楼层
还有就是空调遥控器的一个红外信号包括了空调当前的状态,当一个按键生效后空调的状态变了,下次再按这个键发出去的编码就跟之前不一样。我也试过了,问题是我拿电视机机顶盒的遥控器读取空调遥控器的开关键,能够正确打开空调,但关不了。(因为空调打开之后状态就变了)然后我用自己的实验板读取空调的按键,一点反应的没有。。。可见我的实验板不如机顶盒的遥控器智能
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2016-4-15
在线时间
3 小时
 楼主| 发表于 2016-4-25 20:42:08 | 显示全部楼层
aozima 发表于 2016-4-25 20:35
空调是打包发送的,状态由遥控器管理。
电视只是单按键。

不知道要去哪里弄文档呢,光是红外编码就好多人在网上拿出来买。技术文档就更是毫无头绪了- -!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-4-25 22:44:34 | 显示全部楼层
测试小酱油 发表于 2016-4-25 20:42
不知道要去哪里弄文档呢,光是红外编码就好多人在网上拿出来买。技术文档就更是毫无头绪了- -!

网上别人做过万能遥控,貌似还是个毕业设计,你可以去参考看看。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2016-4-15
在线时间
3 小时
 楼主| 发表于 2016-5-22 19:41:19 | 显示全部楼层
纯技术贴没人看~~~毕设做完了,已经可以控制空调了,但只能录一次,原理已经讲过了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 15:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表