佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 10450|回复: 25

【教学】简易IR 遥控电路 (16/03/2009 新增4ch 遥控概念)

[复制链接]
发表于 27-3-2008 09:26 PM | 显示全部楼层 |阅读模式
这里提供了最简单的IR 遥控器基本电路, 可供初学者参考。
欢迎大家来讨论。

简易IR 发射电路
用2~3粒1.5V电池, 利用PWM 产生~38Khz 的方波, 直接推动IR LED, 电流最大限制在20mA, 不用电阻。
也可以用12F683以减小体积。

CCS C IR 发射电路 源码:
  1. // IR TX , by pic@cArI , 27 Mar 2008
  2. #include <16F628A.h>   // #include <12F683.h>
  3. #FUSES NOWDT, INTRC, NOPUT, NOPROTECT, NOBROWNOUT, NOMCLR, NOLVP
  4. #use delay(clock=4000000)

  5. void main()
  6. {
  7.    setup_timer_2(T2_DIV_BY_1,25,1);
  8.    setup_ccp1(CCP_PWM);
  9.    set_pwm1_duty(52); //50%duty, 38462Hz
  10.    while(true);
  11. }
复制代码


===============================================================

简易IR 接收电路
用2~3粒1.5V电池 为电源, 用IR sensor module 38Khz 的接收。
功能: 按一次IR TX 会On LED, 再按一次IR TX 会Off LED,重覆。

CCS C IR 接收电路 源码:
  1. // IR RX , by pic@cArI , 27 Mar 2008
  2. #include <16F628A.h>
  3. #FUSES NOWDT, INTRC, NOPUT, NOPROTECT, NOBROWNOUT, NOMCLR, NOLVP
  4. #use delay(clock=4000000)

  5. void main()
  6. {
  7.    while(true)
  8.    {
  9.       // wait for signal
  10.       while(input(pin_b0));
  11.       output_toggle(pin_b3);

  12.       // wait for signal go off
  13.       while(!input(pin_b0));
  14.       delay_ms(100); // may not require

  15.    }
  16. }
复制代码



================================================================
2009年3月16日
上面的这个教学是超简单, 但只能控制一个频道, 或只要有38Khz 的IR 输入就触发启动。

下面再深入一些, 示范简易的4频道(ch)的控制, 只是要把概念带出来, 至于怎样应用在大家的制作里, 就要大家自己发挥想象力了。

要控制个别的ch, 我们就要编码, 解码。 这里, 我们就直接利用PIC 的USART (RS232)来做。
当我们按钮 (B0)如按Ch1 是发送‘a' 码, 接收机收到后如能辨别是’a‘, 那就点亮开启相对的LED Ch 1, (D0), 以此类推。 程序很容易懂, 用心就能看出。

制作时, 可能先用电线 把 发射机的TX/C6 和 接收机的RX/C7  接起来, 确定操作了才加入 IR 的部分。

可能要说明的是, 当IR 发射时, 要配合 RS232 Data bit, 当Data bit 是’1‘ 时, 就要有38Khz 的IR输出, ’0‘ 就不要输出。我们利用PIC 的内建CCP 产生了38Khz 50% 的方波, 然后使用两颗PNP CS9012 来做成的AND gate, 对 RS232 的data bit 做一个’闸‘ (gate)。

接收的部分, 就是直接用TSOP XX38 IR 接收模组, 什么也不用做。
对这个制作有问题的话请提问,写教学是很耗时间的, 希望大家会珍惜。
其实, 这个教学也教出了如何做IR无线传输, 聪明的你, 学会了如何变通吗? ^_^



  1. // IR TX - Send RS232 Data code
  2. // by pic@cArI , 16 Mar 2009
  3. #include <16F877A.h>
  4. #fuses HS,NOWDT,NOBROWNOUT,PUT,NOPROTECT,NOLVP
  5. #use delay(clock=20000000)
  6. #use rs232(baud=1200, xmit=PIN_C6, rcv=PIN_C7)

  7. void main()
  8. {

  9.    setup_timer_2(T2_DIV_BY_1,130,1); // 38168hz
  10.    setup_ccp1(CCP_PWM); // Enable PWM
  11.    set_pwm1_duty(65); //50% duty
  12.    
  13.    while(true)
  14.    {
  15.       
  16.       if(!input(pin_B0))putc('a'); // Ch 1
  17.       if(!input(pin_B1))putc('b'); // Ch 2
  18.       if(!input(pin_B2))putc('c'); // Ch 3
  19.       if(!input(pin_B3))putc('d'); // Ch 4
  20.    }
  21.    
  22. }
复制代码
  1. // IR RX - Receive RS232 Data code
  2. // by pic@cArI , 16 Mar 2009
  3. // IR-RS232-RX.c
  4. #include <16F877A.h>
  5. #fuses HS,NOWDT,NOBROWNOUT,PUT,NOPROTECT,NOLVP
  6. #use delay(clock=20000000)
  7. #use rs232(baud=1200, xmit=PIN_C6, rcv=PIN_C7,errors)

  8. byte chr;
  9. void main()
  10. {
  11.    while(true)
  12.    {
  13.       if (kbhit())
  14.       {
  15.          chr=getc();
  16.          output_d(0); // turn off port D
  17.          switch (chr)
  18.          {
  19.             case 'a': output_high(pin_D0) ; break; // Ch1
  20.             case 'b': output_high(pin_D1) ; break; // Ch2
  21.             case 'c': output_high(pin_D2) ; break; // Ch3
  22.             case 'd': output_high(pin_D3) ; break; // Ch4
  23.          }
  24.    }
  25.    
  26. }
复制代码

[ 本帖最后由 pic 于 17-3-2009 07:14 PM 编辑 ]

评分

参与人数 1积分 +100 收起 理由
Abless + 100 怎没被加~|||

查看全部评分

回复

使用道具 举报


ADVERTISEMENT

发表于 31-3-2008 05:33 PM | 显示全部楼层
原帖由 pic 于 27-3-2008 09:26 PM 发表
这里提供了最简单的IR 遥控器基本电路, 可供初学者参考。
欢迎大家来讨论。

简易IR 发射电路
用2~3粒1.5V电池, 利用PWM 产生~38Khz 的方波, 直接推动IR LED, 电流最大限制在20mA, 不用电阻。
也可以用12F683以减小体积。



为何12F683 可以用GP2 脚发出 PWM方波? GP2 是如何模拟 CCP1 脚位的?
回复

使用道具 举报

 楼主| 发表于 31-3-2008 06:14 PM | 显示全部楼层
原帖由 chiller 于 31-3-2008 05:33 PM 发表
为何12F683 可以用GP2 脚发出 PWM方波? GP2 是如何模拟 CCP1 脚位的?

请查看12F683的接脚, GP2本来就是CCP1/PWM,  不用模拟。

回复

使用道具 举报

发表于 31-3-2008 06:35 PM | 显示全部楼层
原帖由 pic 于 31-3-2008 06:14 PM 发表

请查看12F683的接脚, GP2本来就是CCP1/PWM,  不用模拟。



哈。原来如此。。。我没有翻查资料所以没搞懂。 12F629/675 没有  CCP1 是不是就不能送 PWM?

[ 本帖最后由 chiller 于 31-3-2008 06:39 PM 编辑 ]
回复

使用道具 举报

 楼主| 发表于 1-4-2008 07:49 AM | 显示全部楼层
原帖由 chiller 于 31-3-2008 06:35 PM 发表
哈。原来如此。。。我没有翻查资料所以没搞懂。 12F629/675 没有  CCP1 是不是就不能送 PWM?

如用12F629/675, 或任何没有内建PWM 的MCU, 可以做简单的程序产生 38Khz 的方波。

如果你要用任何的PIC MCU(4Mhz),下面的简单CCS C源码供参考。
  1. // IR TX (Use any I/O), by pic@cArI , 1 Apr 2008
  2. #include <12F629.h>
  3. #FUSES NOWDT, INTRC, NOPUT, NOPROTECT, NOBROWNOUT, NOMCLR
  4. #use delay(clock=4000000)

  5. void main()
  6. {
  7.    while(true)
  8.    {
  9.       output_toggle(pin_a2);
  10.       delay_us(6);
  11.    }
  12. }
复制代码
回复

使用道具 举报

发表于 10-4-2008 12:42 AM | 显示全部楼层
原帖由 pic 于 1-4-2008 07:49 AM 发表

如用12F629/675, 或任何没有内建PWM 的MCU, 可以做简单的程序产生 38Khz 的方波。

如果你要用任何的PIC MCU(4Mhz),下面的简单CCS C源码供参考。// IR TX (Use any I/O), by pic@cArI , 1 Apr 2008
#incl ...


我也是有一个类似的circuit.不过是用serial comm的 。
下个礼拜再post上来。
回复

使用道具 举报

Follow Us
发表于 10-4-2008 10:17 AM | 显示全部楼层
原帖由 pic 于 1-4-2008 07:49 AM 发表

如用12F629/675, 或任何没有内建PWM 的MCU, 可以做简单的程序产生 38Khz 的方波。

如果你要用任何的PIC MCU(4Mhz),下面的简单CCS C源码供参考。// IR TX (Use any I/O), by pic@cArI , 1 Apr 2008
#incl ...


谢谢, 这是个很简易的电路,只可以 toggle 一个 switch 。 如过要控制多个 switch 是如何办到的? 你是不是要编码?
回复

使用道具 举报

发表于 10-4-2008 11:31 AM | 显示全部楼层
原帖由 fritlizt 于 10-4-2008 12:42 AM 发表


我也是有一个类似的circuit.不过是用serial comm的 。
下个礼拜再post上来。


你的 serial comm  是不是指 hardware serial comm?
回复

使用道具 举报


ADVERTISEMENT

发表于 10-4-2008 12:46 PM | 显示全部楼层
我觉得他的 serial comm 应该是电脑的serial comm 吧。
为什么要用38KHz - 40KHz 在红外线呢?
我刚才试了一下,IR LED发射器跟普通的LED没有差别,只是看不见而已。但是你可以用电话或者数码相机的镜头来看IR发射出来的红外线。
我没有用38-40KHz的信号,接受器也可以收到信号。

有谁可以高诉我啊?
多谢咯~
回复

使用道具 举报

发表于 10-4-2008 02:09 PM | 显示全部楼层
原帖由 SMD 于 10-4-2008 12:46 PM 发表
我觉得他的 serial comm 应该是电脑的serial comm 吧。
为什么要用38KHz - 40KHz 在红外线呢?
我刚才试了一下,IR LED发射器跟普通的LED没有差别,只是看不见而已。但是你可以用电话或者数码相机的镜头来看IR发射 ...


38KHz - 40KHz  是一般家电红外遥控的通讯协定频率,38KHz 是 SHARP的频率, 40KHz 是 SONY 的, 36KHZ是 philips 的, 还有其他家电的频率你可以去翻找。因为 IR 接收器只接受红外光的光区,其他可见光是不会被接受的。你说你没有用38-40KHz的信号,接受器也可以收到信号。 我想你的接受器是没带通讯协定频率的。

[ 本帖最后由 chiller 于 10-4-2008 02:15 PM 编辑 ]

评分

参与人数 1积分 +8 收起 理由
Abless + 8 原创内容

查看全部评分

回复

使用道具 举报

 楼主| 发表于 11-4-2008 03:49 PM | 显示全部楼层
原帖由 chiller 于 10-4-2008 10:17 AM 发表
谢谢, 这是个很简易的电路,只可以 toggle 一个 switch 。 如过要控制多个 switch 是如何办到的? 你是不是要编码?

上面的电路, 是最最简单的IR 遥控,任何的IR remote 都可以遥控它。。。。

如果要更多的Ch, 可以用PT2262, PT2272 (IR Version)的IC。
回复

使用道具 举报

发表于 24-5-2008 11:30 AM | 显示全部楼层
PIC 大大,既然有简易教学,那么还有没有深入一点的教学呢?
我是指关于这个 infra Red, 有没有 一些 soft code for received remote control 的简单的 template 呢?
回复

使用道具 举报

 楼主| 发表于 24-5-2008 02:19 PM | 显示全部楼层
原帖由 半夜鬼 于 24-5-2008 11:30 AM 发表
PIC 大大,既然有简易教学,那么还有没有深入一点的教学呢?
我是指关于这个 infra Red, 有没有 一些 soft code for received remote control 的简单的 template 呢?

我有, 但做商业用途, 详情不会在这里公开, 请见谅。
简单透露我的方法, 我不理什么Code/protocol, 不理什么牌子的IR remote, 我是量它的High rising, falling time, 从而learn 它的code。

你Google 就可以找到很多类似的应用。
回复

使用道具 举报

发表于 23-5-2009 02:56 PM | 显示全部楼层
这个IR detector能用在这个cirucit吗?两个pin而已的
回复

使用道具 举报

 楼主| 发表于 23-5-2009 04:17 PM | 显示全部楼层
原帖由 Yapl 于 23-5-2009 02:56 PM 发表
这个IR detector能用在这个cirucit吗?两个pin而已的

不可以。
回复

使用道具 举报

发表于 23-5-2009 06:33 PM | 显示全部楼层
原帖由 pic 于 1-4-2008 07:49 AM 发表

如用12F629/675, 或任何没有内建PWM 的MCU, 可以做简单的程序产生 38Khz 的方波。

如果你要用任何的PIC MCU(4Mhz),下面的简单CCS C源码供参考。// IR TX (Use any I/O), by pic@cArI , 1 Apr 2008
#incl ...

版主的perscaler是1:1吗?
7usec toggle一次吗?我用hi-tech picc的,看到ccsc写code好像比较简单
想用timer0 interrupt来写,不过好像不行
void main()
{
   while(true)
   {
      output_toggle(pin_a2);
      delay_us(6);
   }
}
回复

使用道具 举报


ADVERTISEMENT

发表于 23-5-2009 07:20 PM | 显示全部楼层
#include<pic.h>
#if defined(_16F84A)
        __CONFIG(0x3FF1);
#endif
static volatile bit IRTRIS@(unsigned)&TRISA*8+0;
static volatile bit IR@(unsigned)&ORTA*8+0;
static volatile bit SWITCHTRIS@(unsigned)&TRISB*8+0;
static volatile bit SWITCH@(unsigned)&ORTB*8+0;
static volatile bit IRDTRIS@(unsigned)&TRISA*8+4;
static volatile bit IRD@(unsigned)&ORTA*8+4;
int unsigned RTC=0;


void interrupt timer0(){
        if(T0IF){
        T0IF=0;
        RTC++;        

}
}

void main(){
        OPTION=0x0D8;
        TMR0=0;
        GIE=0;
        T0IE=1;
        IRTRIS=0;
        IR=1;
        while(1==1){
        _delay(8);
        IR^=1;

}
}

我做到了  不过要用mplab来算,放breakpoint然后算到delay准准 =.="
那么我加其他的switch code还是其他code不就会影响到ir的frequency?timer0 interrupt也会影响对吗?

在4Mhz操作下应该用不到timer0 interrupt来output出38khz对吗?我算过timer0 overflow最少都要256uSec了...

[ 本帖最后由 Yapl 于 23-5-2009 07:23 PM 编辑 ]
回复

使用道具 举报

 楼主| 发表于 24-5-2009 10:21 AM | 显示全部楼层
原帖由 Yapl 于 23-5-2009 07:20 PM 发表
#if defined(_16F84A)

为什么用16F84?
上面是要用16F628A 的内建PWM 来产生38Khz。
回复

使用道具 举报

发表于 24-5-2009 10:33 AM | 显示全部楼层
原帖由 pic 于 24-5-2009 10:21 AM 发表

为什么用16F84?
上面是要用16F628A 的内建PWM 来产生38Khz。

哦那是因为我手上只有84A可以用,877A ,876都坏了...
回复

使用道具 举报

发表于 4-8-2009 08:49 PM | 显示全部楼层
哇。。看起来好复杂哦!
我以前曾经用IR tranmitter and receiver 来做 project,
可是那时用的也只是普通 IR transmitter, 靠 555 timer 发 signal,
&#160;然后 IR receiver 那边接受 signal, &#160;
紧接用 op-amp 来 作 comparator 而已。

所以版主在 这儿讨论的教学,
看得我不明白哦!
看来我得多多学习了!

评分

参与人数 1积分 +10 收起 理由
fritlizt + 10

查看全部评分

回复

使用道具 举报

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

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 24-4-2024 03:51 PM , Processed in 0.080123 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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