搜索
bottom↓
回复: 66

有没有做过学习型遥控器的高手,怎么做解码呢?

[复制链接]

出0入0汤圆

发表于 2005-9-14 08:46:46 | 显示全部楼层 |阅读模式
我是新手,还请大家多帮忙一下,实在是找不到相关的资料啊。谢谢!

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2005-9-14 15:16:00 | 显示全部楼层
我晕!难道没有人有做过学习型遥控器吗?太失望了!
头像被屏蔽

出0入0汤圆

发表于 2005-9-14 15:26:13 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2005-9-14 16:01:50 | 显示全部楼层
21IC有相关文章,去搜索一下吧

出0入0汤圆

发表于 2005-9-14 16:41:47 | 显示全部楼层
我没做过,但我和遥控器打的交道比较多。

按我的思路,可能通过解码的方式很麻烦,因为遥控码千变万化。

所以我觉得应该采用以不变应万变的办法,用很小的时间(比如100uS)对波形进行采样!

然后存储一串高低电平的数据,要发这个码的时候就按顺序全部输出!



另外,遥控器发码时一般在开始有一段较长时间的低电平作为引导码,可以由这个开始采样,到一定时间的高电平时结束!



但这样的结果是需要的存储量比较大,如果你EEPROM空间允许,我不反对,呵呵。

不过不怎么现实,所以可以换一个角度去做。思路以下:



因为遥控器发码是通过周期的长短来区别1或者0的,而且往往是低电平是固定长短,改变高电平的时间来区别0或和,长的为1,短的为0,这样就可以测量发码的时间,记录数据1的周期和数据0的周期,再记录1个低电平时间,并对原遥控器按这个原则进行解码,并存储下所解出来的遥控码。



具体记录内容:

      1、引导码低电平宽度

      2、数据为1的周期

      3、数据为0的周期

      4、数据中低电平宽度

      5、N字节的遥控码

      6、结束码周期(如果有结束码的话)





希望对你有一点点的帮助!











-----此内容被fortion于2005-09-14,16:44:31编辑过


-----此内容被fortion于2005-09-14,16:55:26编辑过

出0入0汤圆

发表于 2005-9-14 16:48:05 | 显示全部楼层
这是必杀招。

不过AVR的EEPROM不是很大.



统计各种常用的遥控芯片,提取脉宽特征,这样可以智能分析,减小数据体积。

出0入0汤圆

发表于 2005-9-14 21:04:20 | 显示全部楼层
不想做学习型的遥控器就可以考虑使用专用芯片。



好像网上已经有这样的芯片了。

出0入0汤圆

 楼主| 发表于 2005-9-14 23:16:28 | 显示全部楼层
多谢大家的回复!不过我也是新手,做起来很困难,都找不到相关的代码可以研究,自己分析设计一个字,难!哪位有相关资料的,麻烦共享一下,谢谢!我用的是AVR的ATMEGA8,使用C语言,我的邮箱是emptyh@163.com

出0入0汤圆

发表于 2005-9-14 23:55:05 | 显示全部楼层
我做过红外学习,挺困难的,主要是红外码没有一个标准,

如果不经过处理存储的话,存储量是很大的。

另外,四楼的兄弟说100us是短时间的说法是错误的,

在红外中,100us是一个很长的时间了,我用的采样周期是1us,

但是,我还是觉得精度不够。



五楼的兄弟说

“统计各种常用的遥控芯片,提取脉宽特征,这样可以智能分析,减小数据体积。”

理论上是可行的,但是,编码方式实在太多,而且,这样做的话误差大,

会导致很多红外码学习不了,即使能学习,控制距离也可能会大大缩短。

PS:我吃过这个亏

出0入0汤圆

发表于 2005-9-15 00:00:54 | 显示全部楼层
可以参考以下网站,用UART串口接受,当然BAUD很低,2400...

http://www.microsyl.com/

出0入0汤圆

发表于 2005-9-15 09:14:38 | 显示全部楼层
几年前曾研究过这个问题

又要求智能学习,所有的遥控器通杀。又要求抓码的数据量尽可能的小。觉得好难。我曾经拆过一个现成。发现CPU用PIC16C57,可以学习很多种遥控器的码,也没见它外接什么存储芯片,真的不得其解,希望大家认真的看待这个问题。

出0入0汤圆

 楼主| 发表于 2005-9-15 23:36:11 | 显示全部楼层
这确实是个问题,而且我还是初学者,我怎么会碰到这么难的事啊,郁闷!

我的想法和4楼的fortion是差不多的,就是存储一串的高低电平,发射时再按顺序还原出去,至于存储量大的问题,我想通过限制学习型遥控器只能学习存储5个遥控器来解决,如果学习第6个遥控器,那么将覆盖前5个中的某一个遥控器的数据。

出0入0汤圆

发表于 2005-9-16 00:33:53 | 显示全部楼层
哈!如果楼主在我这里的话,我倒是可以给你介绍人来讲红外线调制和解调的过程,一步步用示波器演示哦.

是我们这里今年参加电子设计大赛里面硬件最强的学生.不过当时给我讲了一遍后,真的让我佩服的五体投地啊,虽然偶到现在还有很多东西不懂.

出0入0汤圆

 楼主| 发表于 2005-9-20 11:38:12 | 显示全部楼层
myhk007,演示就不用了,谢谢,如果可以的话,把程序贴出来研究一下就好了,麻烦!

出0入0汤圆

发表于 2005-9-20 11:59:07 | 显示全部楼层
我也曾经做过,采样频率不高,只限于几种遥控器.

也是判断长低电平为起始,长高电平为结束.

我去找找程序,找到了贴出来大家研究研究.


-----此内容被zhoupix于2005-09-20,12:01:08编辑过

出0入0汤圆

发表于 2005-9-20 15:46:05 | 显示全部楼层
你可以使用AVR的输入捕捉功能来实现,因为大多数遥控的0(高电平560us)与1(高电平1680us)的时间是一样的,只是有一些遥控器发出来的码的位数有些不同,你只需加几个判断来判断位数就可以很好地实现不同遥控的识别了.


-----此内容被pdcqve于2005-09-20,15:49:13编辑过

出0入0汤圆

 楼主| 发表于 2005-9-20 21:33:30 | 显示全部楼层
多谢大家的回复!因为我也是个初学者,很多东西还处于模仿阶段,很希望能够得到大家的帮助。很多想法想起来很简单,但是做起来碰到一堆的问题,真实郁闷啊!

出0入0汤圆

 楼主| 发表于 2005-9-20 21:33:55 | 显示全部楼层
zhoupix,长期等待你的程序,希望能够尽快得到你的帮助,先谢谢了!只限于几种遥控器没有关系,因为我主要是要在程序中有学习型遥控器的思想,并不要真的实现“万能”,我的水平还不够。我希望程序不是象网络找到的很多例子都是针对NEC一种格式进行解码,既然是要做学习型,就要有学习型的思想在其中,能不能对所有的遥控器都可以学习那就要看情况了,毕竟遥控器的型号太多了。

出0入0汤圆

 楼主| 发表于 2005-9-21 15:16:58 | 显示全部楼层
求救啊!我自己写的解码程序好像一直有问题,因为我自己不知道我解出来的这些数据是否是对的,发射用的遥控器的编码格式我不知道。哪位高手有写过学习型遥控器的,能不能把程序贴出来研究一下,我实在头大啊。请大家帮帮我吧,谢谢!

出0入0汤圆

 楼主| 发表于 2005-9-21 15:18:26 | 显示全部楼层
我用的是atmega8,c语言!谢谢!

出0入0汤圆

发表于 2005-9-21 19:39:38 | 显示全部楼层
把红外接收头的输出端接到MEGA8的ICP端即可实现输入捕捉,首先开辟一个足够长的数组,如:

   uint16  IrRec[400];      //如果只是对付电视的,200个也够了

   然后设置下降沿捕捉,开中断;

   在中断里进行数据处理,如:





   捕捉中断:   

                 if (是下降沿)

                 {

                     计算时间差,依次保存到数组中;

                     设置为上升沿中断

                 }   

                 else

                 {

                     计算时间差,依次保存到数组中;

                     设置为下降沿中断

                 }



    需要注意的仅仅是头和尾巴的处理,应该不成问题

    编码可保存到外接的EEPROM中,如果经过压缩再存储就更好了。

出0入0汤圆

发表于 2005-9-21 22:45:25 | 显示全部楼层
我做过红外线的解码,一个红外线接收头到int口。

经常把遥控器当键盘用。不过我的程序有点乱,没有什么说明。切实需要的话我就整理上传。

出0入0汤圆

 楼主| 发表于 2005-9-21 23:30:40 | 显示全部楼层
需要大家的帮助,我是一个初学者,第一次接触MEGA8,还没有弄清楚多少,叫我自己做学习型遥控器确实比较难,所以我只能模仿别人的程序,从看懂程序来进步,谢谢!我会一直等待大家的帮助,谢谢了!如果可以,请尽快!

出0入0汤圆

 楼主| 发表于 2005-9-22 11:41:39 | 显示全部楼层
高手帮忙分析一下,我自己试着写的程序,串口输出的数据不符合格式,而且按同一个按键解码的数据也不一样,当然我没有做误差处理,这有可能导致问题的出现,不过也不至于差得太多吧。外部中断,我首先是通过低电平触发来判断接收到信号,接收到信号后,中断触发改为上升沿和下降沿都触发,用来记录0和1的脉冲时间长度。



程序写得太差,删了免得误人子弟!
-----此内容被jacky2056于2005-09-30,11:27:38编辑过

出0入0汤圆

 楼主| 发表于 2005-9-22 11:43:41 | 显示全部楼层
这是我第一次自己写程序,如果有什么低级错误,还请大家见谅!大家提一下意见,有错误尽管说,发现错误就是进步!麻烦大家了!

出0入0汤圆

发表于 2005-9-22 14:52:10 | 显示全部楼层
mega8有一个功能就是捕获中断,你没必要用外部中断也无需判断,用这个捕获中断设置好捕获上升沿或下降沿,你就可以统计到这些脉冲宽度的数据。

出0入0汤圆

 楼主| 发表于 2005-9-22 15:36:10 | 显示全部楼层
多谢john wu的建议,不过我T/C1的功能还不会用,如果可以,帮助改一下程序,谢谢!

当然了,我现在自己就试试看。

出0入0汤圆

发表于 2005-9-22 16:59:12 | 显示全部楼层
晶振频率建议用8MHz,这样在用8分频计时时就是以1us作为单位,方便调试。

  有好设备就最好,如果没有就用另一片MCU做个100us周期的方波发生器,如果能准确读出这个周期,离成功就不远了。

  用捕获中断的好处是不产生附加的时基误差,而用端口中断的方法必定产生误差,因为定时器还在走嘛。

出0入0汤圆

发表于 2005-9-22 17:09:36 | 显示全部楼层
8MHz更好。

定时更易算,而且可以产生合格的9600bps通讯速率。

出0入0汤圆

 楼主| 发表于 2005-9-22 21:16:37 | 显示全部楼层
多谢大家的回复!因为我是直接用板上的晶振7.3728M,如果有需要,当然可以改成8M的。我用INT0和TIMER0来做实验,时钟分频用1024,不然8位的TIMER0不够记录数据长度,130us计数器才加一,当然这样误差很大,难怪每次接收的的数据都不一样。今天听john wu的建议说用捕获功能更准确更简单,我中午就试了一下。不过T/C1的用法我不熟悉(我才学2个星期的MEGA8,程序都查书才写得出来,被逼的),很担心会弄错啊,我先试试,不行的话再请各位大侠帮忙!



如果谁有学习型遥控器的解码程序的,麻烦贴出来让我参考,第一次写程序搞这么难,我都没信心了。谢谢!大家就帮帮我,压力好大!

出0入0汤圆

 楼主| 发表于 2005-9-22 21:43:22 | 显示全部楼层
刚才看了HJJourAVR的“AVR定时器的使用要点介绍”。

1  普通模式 WGM1=0

  1 采用内部计数时钟      用于 ICP捕捉输入场合---测量脉宽/红外解码

请问,HJJourAVR,用MEGA8的捕获功能,使用的是要内部计数时钟吗?我用的是晶振7.3728M

,计数器用TIMER1,时钟为8分频。我这样做可以吗?

出0入0汤圆

 楼主| 发表于 2005-9-24 08:30:48 | 显示全部楼层
不是有几个人说有做过遥控器解码的要将程序贴出来研究的吗,怎么回了个贴就不见人影了呢,这样的高手不厚道哦!我等了这么多天了,都没见程序贴出来。郁闷!

出0入0汤圆

发表于 2005-9-24 11:50:16 | 显示全部楼层
你可以先测试,这样做:

空出一个端口输出信号,先设置捕获上升沿,在捕获中断里面设置空出的口为高,在捕获中断里面重设捕获下降沿,然后再中断后设这个空出的口为低。这样以来,在你空出的这个口上输出的信号就是捕获到的信号,就可以知道捕获中断有没有起作用。

出0入0汤圆

 楼主| 发表于 2005-9-26 15:50:43 | 显示全部楼层
我用外部中断做了实验,用TIMER0计数,误差很大。后来接受john wu的意见,我改用捕获中断,用timer1计数器,晶振也改用8M,系统时钟用的是8分频,刚好一次计数1us,当然效果比用外部中断好多了,不过仍然存在着较大的误差,每次解码得到的数据仍然不固定。我的解码思路是这样的,捕获中断设为下降沿捕获(也用了输入捕获噪声抑制功能,好像没区别),产生捕获中断则计数中断产生次数,如果是第一次,则清零TCNT1,捕获方式改为上升沿,下次中断产生时,记录TCNT1的计数值,然后改变捕获方式(下降沿和上升沿交替)。得到一串的数据,这些数据和NEC编码格式已经很接近,但是还是有存在误差,请问高手,我在做中断处理时应该怎样做误差处理呢,才能使得得到的数据是准确的呢?麻烦高手指点!

出0入0汤圆

发表于 2005-9-26 16:57:03 | 显示全部楼层
捕获中断的误差很低,这是不应该的。

下次中断产生时,记录TCNT1的计数值-------应该是读输入捕捉寄存器ICR1的值

      (看来你没有认真读我的笔记,看数据手册也行)

    当引脚ICP1 上的逻辑电平( 事件) 发生了变化,或模拟比较器输出ACO 电平发生了变化,并且这个电平变化为边沿检测器所证实,输入捕捉即被激发:

    16位的TCNT1 数据被拷贝到输入捕捉寄存器ICR1,同时输入捕捉标志位ICF1 置位。

    如果此时ICIE1 = 1,输入捕捉标志将产生输入捕捉中断。

    中断执行时ICF1 自动清零,或者也可通过软件在其对应的I/O 位置写入逻辑"1” 清零。



     使用输入捕捉中断时,中断程序应尽可能早的读取ICR1 寄存器

     如果处理器在下一次事件出现之前没有读取ICR1 的数据, ICR1 就会被新值覆盖,从而无法得到正确的捕捉结果。



     测量外部信号的占空比时要求每次捕捉后都要改变触发沿。

     因此读取ICR1 后必须尽快改变敏感的信号边沿。改变边沿后,ICF1 必须由软件清零( 在对应的I/O 位置写"1”)。

     若仅需测量频率,且使用了中断发生,则不需对ICF1 进行软件清零。



好像没必要采用下降沿和上升沿交替,单单下降沿捕获就行了,间隔位是一样长的(但不肯定所有的遥控格式都是一样)

出0入0汤圆

 楼主| 发表于 2005-9-26 20:11:22 | 显示全部楼层
遥控器的编码格式肯定是很多种的,所以我觉得用下降沿和上升沿交替还是有必要的。

多谢HJJourAVR的详细指导,我再改改看,谢谢!

出0入0汤圆

 楼主| 发表于 2005-9-26 22:55:45 | 显示全部楼层
我听取john wu的建议,改用timer1的输入捕获中断功能,可是我解码得到的数据仍然不固定,而且还是存在着较大的误差。这个程序的思路是这样的:ICP接收遥控器发射来的信号,利用输入捕获功能对信号进行采样,将得到的高低电平的时间长度存储在一个数组中,然后将数组中的数据发送到串口,从串口得到的数据检验解码是否正确。请各位高手帮我看看我的程序在哪里有问题?特别请有做过学习型遥控器的高手多多指点。我自己觉得会不会是我解码时没有做误差处理,可是我实在想不出应该怎样来做误差处理,请高手给点意见!谢谢!我只是个初学者,请大家帮帮我,我自己想了,实验了,但是存在问题。



由于是初学者,代码质量差,难免还有错误,所以还是把程序去了较好!


-----此内容被jacky2056于2005-09-30,11:25:53编辑过

出0入0汤圆

 楼主| 发表于 2005-9-26 22:58:02 | 显示全部楼层
希望高手能伸出你们的援助之手,帮帮我这个初学者,我的压力是巨大,谢谢!

出0入0汤圆

发表于 2005-9-27 09:09:25 | 显示全部楼层
改变边沿后,ICF1 必须由软件清零( 在对应的I/O 位置写"1”)。

TIFR&=0b11011111;     //清楚捕获标志ICF1

   TCCR1B|=0b01000000;  //改为上升沿捕获ICES1    why? 先后搞反了!



使用输入捕捉中断时,中断程序应尽可能早的读取ICR1 寄存器

code[ic_times-2]=ICR1;//保存计数值        why? 胡子都长了,才来读取数据?





我比你更郁闷。

出0入0汤圆

 楼主| 发表于 2005-9-27 09:17:41 | 显示全部楼层
HJJourAVR,你的文章我已经看过了。你说的那两个问题,我也都试过了,好像还是没有用,怎么办呢?学习型遥控器真的不好做,很少有人做过,真是惨啊!有做过的人都是用51的,都找不到程序可以参考一下,写起来好难,好辛苦!

出0入0汤圆

发表于 2005-9-27 09:20:47 | 显示全部楼层
前几天上不了网,现在好了.

这是以前用51写的.



void InitRedctl()

{

        MARK  = FALSE;        POWER = FALSE;       

        TMOD = 0x11; IE = 0x1a;

        TH0  = 0x10; TL0 = 0x04;

        TH1  = 0xff; TL1 = 0xff;

        TR1 = TRUE;  PT1 = TRUE; EA = TRUE;

}



void Delay(int tt)

{

    int i,j;

    for (i=0;i<tt;i++)

    {

         for (j=0;j<114;j++)

        {

            ;

            }

    }

}



void SetState()

{

        TR0 = FALSE; ET0 = FALSE;

        timerable = FALSE; rotenable = TRUE;

        MARK = gbLight;

}



void TimerStart(bit btimer,unsigned char byshu,unsigned char bymin)

{

        tenthsec = 15;

        sec      = 60;

        timerable = btimer;

        flashstate = byshu;

        bry = byshu;

        min = bymin;

        ET0 = TRUE;

        TR0 = TRUE;

}



void ReceiveRemote()

{

        static unsigned char by,tmprot;

        if(gbrecv)                                                                                // 允许接收时

        {

                if(lowstate == TRUE)

                {

                        if(!RED_RECV)                                                        // 低电平状态,接收端为低时计数加一

                                tmprot++;

                        else

                        {

                                gbyRemoteDate[by] = tmprot;                        // 低电平状态接收端转为高时计数值送到?

                                lowstate = FALSE;                                        // 变为高电平状态

                                by++;                                                                // 缓冲指针加一

                                tmprot = 0;

                                if(by >= 35)                                                // 总数大于35时退出接收

                                {

                                        gbrecv = FALSE;

                                        by = 0;

                                }

                        }

                }

                else

                {

                        if (RED_RECV)                                                        // 高电平状态,接收端为高时计数加一

                        {

                                tmprot++;

                                if (tmprot >= 0xff)                                        // 接收到长高电平

                                {

                                        gbyRemoteDate[by] = 0xff;                // 0xff送缓冲

                                        tmprot = 0;

                                        keynum = 2;                                                // 认定已接收到遥控码

                                        gbrecv = FALSE;                                        // 退出接收

                                        by = 0;                                                        // 缓冲指针指向0

                                }

                        }

                        else

                        {

                                gbyRemoteDate[by] = tmprot;                        // 高电平状态,接收端转为低时计数值送到缓冲

                                by++;                                                                // 缓冲指针加一

                                lowstate = TRUE;                                        // 变为低电平状态

                                if(tmprot >= 0x40)                                        // 计数值大于40

                                {

                                        gbrecv = FALSE;                                        // 退出接收

                                        keynum = 2;                                                // 认定已接收到遥控码

                                        by = 0;                                                        // 缓冲指针指向0

                                }

                                tmprot = 0;

                        }

                }                               

        }

        else if(!RED_RECV)                                                                // 不允许接收,但接收端有低电平

        {

                gbrecv = TRUE;                                                                // 开始允许接收

                by = 0;                                                                               

                tmprot = 0;

                lowstate = TRUE;                                                        // 变为低电平状态

        }

}



unsigned int ZipRemote()

{

        unsigned char by1 = 0;

        unsigned int wsign = 0;



        rotenable = FALSE;

       

        for( ; by1<35 ; )

        {

                if((by1%2) == 0 && gbyRemoteDate[by1] <= 0x0b)// 低电平时数值小于0x0b,不理会,继续下一个循环

                        continue;

                wsign = wsign << 1;

                if(by1 <= 8 && gbyRemoteDate[by1] >= 0x40)        // 前8个字节的数大于0x40,视为无效遥控码

                {

                        rotenable = TRUE;

                        return 0xffff;

                }

                if(by1 > 8 && gbyRemoteDate[by1] >= 0x40)        // 后8个字节的数大于0x40,继续

                        goto zip1;

                if(gbyRemoteDate[by1] >= 0x0b)                                // 数值大于0x0b,判断为逻辑1

                        wsign |= TRUE;       

zip1:       

                by1 ++;

                if(by1 >= 16)                                                                // 循环到16位时终止循环

                        break;

        }

        wsign |= 0xe000;

        if(learnable)                                                                        // 学习状态时

        {

                learnable = FALSE;                                                        // 清学习状态

                gbWaitLearn = 50;                                                       

                flashstate = SLOW;                                                        // 进入慢闪状态

                gwLearnSign = wsign;

                rotenable = TRUE;                                                       

                return 0xffff;       

        }

        else                                                                                        // 不是学习状态

        {

                rotenable = TRUE;

                return wsign;                                                                // 返回遥控码

        }

}



void Timer1intServer() interrupt 3

{

        TH1 = 0xff; TL1 = 0xaa;

        if(rotenable)

                ReceiveRemote();

}

出0入0汤圆

发表于 2005-9-27 09:26:17 | 显示全部楼层
我没搞过遥控器,但很感兴趣,顶一下啊!!!

另外我想问一下SIGNAL(SIG_INPUT_CAPTURE1)是你的中断程序吗???

如果是的话,处理程序写在中断里会不会带来时间的误差??

出0入0汤圆

发表于 2005-9-27 09:40:49 | 显示全部楼层
jacky2056

    你的做法明显是错的



TIFR&=0b11011111;     //清楚捕获标志ICF1     //这句是废话,进入中断服务程序时是自动清标志位的   

TCCR1B|=0b01000000;  //改为上升沿捕获ICES1   //这个时候可能已经错误触发,修改了ICR的值

后面的

code[ic_times-2]=ICR1;//保存计数值           //还读来干什么?



  不是难做,是你自己的问题。



temp=ICR1;             //先读出ICR1,保存起来

.......

TCCR1B|=0b01000000;  //修改捕捉方式(或上或下)

TIFR&=0b11011111;     //马上清捕获标志ICF1     



另外,51那么慢,而且没有硬件捕捉能力,都能完成解码任务,AVR是1000%没问题。

出0入0汤圆

发表于 2005-9-28 12:50:39 | 显示全部楼层
按照我的51程序的思路也可以改写成AVR的.

出0入0汤圆

 楼主| 发表于 2005-9-30 11:23:12 | 显示全部楼层
HJJouravr,多谢你的建议,不过我觉得我的做法好象没有什么错。我看了你的TIMER1的相关资料,我对程序做了相关修改,你提的那些错误都改正,可是得到的数据和没有修改相差不多,至少在我自己分析那些数据觉得没有使误差变小,所以我觉得这不是主要原因。在我很失望的情况下,我用数字示波器对波形进行捕捉,然后和我在串口上得到的数据进行比较,发现相差不大,说明解码得到的数据基本上还是比较准确的,但是为什么每次得到的数据都不一样,而且误差相对编码格式相差较大呢?然后我对遥控器上的同一个按键进行多次捕捉波形,分析后知道是遥控器发射的波形每次都不一样,误差也较大,和我串口得到的数据分析的结果差不多,所以我觉得是遥控器发射波形的原因。不知道大家觉得怎么样呢?

出0入0汤圆

发表于 2005-10-16 15:07:12 | 显示全部楼层
对此感兴趣,顶一下!JACKY2056,程序调出来了没有!



我也想用业余时间做一个玩一下!



期待中!



PS:你用的接收和发送芯片型号是什么类型?

出0入0汤圆

 楼主| 发表于 2005-10-23 21:29:33 | 显示全部楼层
多谢大家的帮助,现在我的程序对一些电视遥控器已经可以正确解码了,除了键盘扫描还有一点小问题(我查了很久都找不出来,奇怪啊!我发了一个帖子“键盘扫面程序不知道为什么有错?参考别人的程序。 ”,高手可以帮忙看看)。

我的思路是这样的,接收到第一个下降沿开始记录时间长度,捕获中断产生改变捕获的方式,接收到长高电平作为结束。

现在我想对空调遥控器进行解码,可是空调遥控器发射时没有重复发射,那我应该怎么判断为结束,请高手指教,谢谢!

出0入0汤圆

 楼主| 发表于 2005-11-7 11:41:10 | 显示全部楼层
再次来请教有做过学习遥控器的高手!我做的学习型遥控器可以解多种的遥控器,最近买了一个金松的“万能型电视机遥控器”来做测试,发现200多种(遥控器说明书上讲的,很多只是小小的差别)可以解一半。其中的原因在于我解码时用长高电平作为结束,不知道应该对多长的长高电平才判断作为结束,想对所有得遥控器都兼容好像挺难的,请教有做过学习遥控器的高手帮忙分析一下,该怎么来解决这个问题,谢谢!

出0入0汤圆

发表于 2005-11-7 12:25:10 | 显示全部楼层
按照我的经验,200ms结束比较好。

因为看过有些遥控器,两串码间隔为180ms左右

出0入0汤圆

 楼主| 发表于 2005-11-7 14:40:49 | 显示全部楼层
roasn,200ms是一个非常大的时间,我用买来的万能遥控器进行学习解码发现,最大的间隔就是几十ms。据我了解,很多格式的结束长高电平都是几十ms,如果用你建议的200ms做结束的话,那么当遥控器一直重复发码时,那讲一直不能结束。我现在碰到的问题是:假设我设30ms做为判断长高电平结束,但是有的格式有间隔超过30ms的,不知道这样的问题该怎样解决,看来想做完全兼容不太可能。

你有什么意见呢?请发表!

出0入0汤圆

发表于 2005-11-7 23:23:24 | 显示全部楼层
你结束的意思是数据码结束?那重复码呢?不接收吗?

我的做法是以200ms为结束,把接收到的码都读进去,

结束后再作分析

出0入0汤圆

 楼主| 发表于 2005-11-8 08:20:52 | 显示全部楼层
是的,我是想把引导码,系统码,数据码,还有判断结束的长高电平的时间长度都记录下来,发射时直接把这些数据发送出去,不接收重复码,这样存储的数据量才会小,发射时有必要的话,就把我接收的数据再重发一遍。我是只记录高低电平的时间长度,而没有分析是0还是1,如果根据我的思路,好像完全兼容不太可能,感觉要舍弃某些不常用的格式才可以。

出0入0汤圆

发表于 2005-11-8 09:02:04 | 显示全部楼层
如果你不接收重复码的话,大概15ms就够了,大于15ms就结束。不过,你不发送重复码的话,有些按键就不能完全模拟了,如音量加减,这种按键是允许重复的,就是说,按键没有松下,就不断发送重复码,接收端检测到重复码后不断加减。

而且,有些电器必须有重复码才能动作的,如NEC的有些投影机,关机键必须发送2s的重复码,投影机才能关机。

出0入0汤圆

发表于 2005-12-25 15:19:47 | 显示全部楼层
这个又不是很难的,我有学习码和滚动码的MEGA系列的解码程序

出0入0汤圆

发表于 2005-12-26 00:34:44 | 显示全部楼层
我以前做过红外遥控的接收程序,并且自己在计算机上加了个红外遥控信号接收装置,现在可以接收所有的红外信号,然后自己分析编码了。不过最近想做个无线电信号的遥控接收器。当然也要用软件解码。利用无线遥控的信号有重复性的特点,在第一次接收的信号中找到一个基准的时间,然后自动分析脉冲长度,并在内部记录基准的长度及相对于此基准的倍数,这样记录量少些。现在我接收的是我知道编码方法的信号。所以会简单些。只是针对不同的频率能够同时接收罢了。

出0入0汤圆

发表于 2006-8-25 15:40:39 | 显示全部楼层
jacky2056 你好,我对于学习型遥控器也是个新手.

我想看看你的程序,我好学习学习。

这是我的邮箱yujidanping@163.com

或者哪位高手有相关的程序或资料希望你可以发给我.

出0入0汤圆

发表于 2010-3-1 14:34:58 | 显示全部楼层
mark一下

出0入0汤圆

发表于 2010-9-30 12:47:40 | 显示全部楼层
留爪

出0入0汤圆

发表于 2011-4-6 13:57:02 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-4-8 17:03:11 | 显示全部楼层
学习

出0入0汤圆

发表于 2011-5-20 00:34:45 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-21 18:52:59 | 显示全部楼层
楼主,你好,我最近在学习学习型遥控。能否发程序给我呢?先谢谢了。我的邮箱是396935455@qq.com。

出0入0汤圆

发表于 2012-2-8 17:26:09 | 显示全部楼层
回复【61楼】limzhw
----------------------------------------------------------------------
你好,可以也发我一下吗?现在正在纠结中!

出0入0汤圆

发表于 2012-2-8 17:48:45 | 显示全部楼层
我以前接触过,好久没有做过东西了,今天刚来这里。

出0入0汤圆

发表于 2012-2-8 17:53:09 | 显示全部楼层
以前接触过的是红外,有专门的解码芯片,解码后输出的是二进制的数据,用示波器看波形,可以看到32位的数据,具体可以参考资料。前面16位引导码,后面16位,前8位是解析后的真实数据,后8位是前8位的补码。这个数据,解析可以分为两种,一种是pwm,一种是相位方式。pwm就是根据波形的宽度不同来确定是0或者1;相位方式是根据相位的变换来确定0或者1。程序解析有不同的方法。

出0入0汤圆

发表于 2012-10-11 22:06:40 | 显示全部楼层
jacky2056 发表于 2005-9-27 09:17
HJJourAVR,你的文章我已经看过了。你说的那两个问题,我也都试过了,好像还是没有用,怎么办呢?学习型遥控 ...

请问你一下网友,你的学习型遥控器做出来了没有啊?我做遥控器快差不多做了三个月,第一个月做了一个专门解NEC的,第二个月做了可以录制波形的.第三个月做了捕获的.到现在还不完美,我现在要做一个拷贝波形和有压缩数据的,
希望可以和你交流下,可以么?

出0入0汤圆

发表于 2012-10-12 11:21:16 | 显示全部楼层
2536066995
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 10:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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