arduino红外遥控小车对管发烫是怎么回事

软件,还是开源的好
追梦,不轻言放弃!
先来说下制作这个DEMO的所经历的曲折以及知识点:
学习NEC协议;
学习AVR的定时与中断,因为Arduino是在AVR的基础上实现的;
编程实现NEC解码;
解码未成功,最终使用Ken Shirriff的解码类库,成功实现DEMO;
下面进入正题
1. 首先介绍下红外接收头
红外接收头有三个引脚如下图
三个引脚含义上图标的非常清晰:VOUT接模拟口,GND接GND,VCC接电源。
红外遥控器发出的信号是一连串的二进制脉冲码。为了使其在无线传输过程中免受其他红外信号的干扰,通常都是先将其调制在特定的载波频率上,然后再经红外发射二极管发射出去,而红外线接收装置则要滤除其他杂波,只接收该特定频率的信号并将其还原成二进制脉冲码,也就是解调.
工作原理:内置接收管将红外发射管发射出来的光信号转换为微弱的电信号,此信号经由IC内部放大器进行放大,然后通过自动增益控制、带通滤波、解调发、波形整形后还原为遥控器发射出的原始编码,经由接收头的信号输出脚输入到电器上的编码识别电路。
2. NEC协议
要想对某一遥控器进行解码必须要了解该遥控器的编码方式。我们的这个DEMO使用的遥控器的编码方式为:NEC协议。
(1)8位地址位,8位命令位
(2)为了可靠性地址位和命令位被传输两次
(3)脉冲位置调制
(4)载波频率38khz
(5)每一位的时间为1.125ms或2.25ms
逻辑0 和1 的定义如下图:
按键按下立刻松开的发射脉冲:
上面的图片显示了NEC的协议典型的脉冲序列。注意:这是首先发送LSB(最低位)的协议。在上面的脉冲传输的地址为0x59命令为0x16。一个
消息是由一个9ms的高电平开始,随后有一个4.5ms的低电平,(这两段电平组成引导码)然后由地址码和命令码。地址和命令传输两次。第二次所有位都取
反,可用于对所收到的消息中的确认使用。总传输时间是恒定的,因为每一点与它取反长度重复。如果你不感兴趣,你可以忽略这个可靠性取反,也可以扩大地址和
命令,以每16位!
按键按下一段时间才松开的发射脉冲:
一个命令发送一次,即使在遥控器上的按键仍然按下。当按键一直按下时,第一个110ms的脉冲不上图一样,随后每110ms重复代码传输一次。这个重复代码是由一个9ms的高电平脉冲和一个2.25ms低电平和560μs的高电平组成。
·重复脉冲:
注意:脉冲波形进入一体化接收头以后,因为一体化接收头里要进行解码、信号放大和整形,故要注意:在没有红外信号时,其输出端为高电平,有信号时为低电平,故其输出信号电平正好和发射端相反。接收端脉冲大家可以通过示波器看到,结合看到的波形理解程序。
3. 实现的效果以及器材
器材及数量:
红外遥控器:1个;
红外接收头:1个;
LED灯:1个;
220Ω电阻:1个;
多彩面包线:若干;
实现效果:按下遥控器的EQ键盘LED亮,按下电源键LED灭。
4. 编码实现
根据NEC 特点和接收端的波形,将接收端的波形分成四部分:引导码(9ms 和4.5ms 的脉冲)、地址码16 位(包括8 位的地址码和8
位的地址的取反)、命令码16 位(包括8 位命令位和8 位命令位的取反)、重复码(9ms、2.25ms、560us 脉冲组成)。
利用定时器对接收到的波形的高电平段和低电平段进行测量,根据测量到的时间来区分:逻辑“0”、逻辑“1”、引导脉冲、重复脉冲。引导码和地址码只要判断是正确的脉冲即可,不用存储,但是命令码必须存储,因为每个按键的命令码都不同,根据命令码来执行相应的动作。
代码如下:
#define LED 7//LED灯
#define IR_IN 8 //红外接收
int Pulse_Width=0;//存储脉宽
int ir_code=0x00;//命令值
void timer1_init(void)//定时器初始函数
TCCR1A = 0X00;
TCCR1B = 0X05;//给定时器时钟源
TCCR1C = 0X00;
TCNT1 = 0X00;
TIMSK1 = 0X00; //禁止定时器溢出中断
void remote_decode(void)//译码函数
TCNT1=0X00;
while(digitalRead(8))//是高就等待
if(TCNT1&=1563) //当高电平持续时间超过100ms,表明此时没有按键按下
ir_code = 0xff00;
//如果高电平持续时间不超过100ms
TCNT1=0X00;
while(!(digitalRead(8))); //低等待
Pulse_Width=TCNT1;
if(Pulse_Width&=140&&Pulse_Width&=141)//9ms
while(digitalRead(8));//是高就等待
Pulse_Width=TCNT1;
if(Pulse_Width&=68&&Pulse_Width&=72)//4.5ms
pulse_deal();
}else if(Pulse_Width&=34&&Pulse_Width&=36)//2.25ms
while(!(digitalRead(8)));//低等待
Pulse_Width=TCNT1;
if(Pulse_Width&=7&&Pulse_Width&=10)//560us
void pulse_deal()//接收地址码和命令码脉冲函数
//执行8个0
for(i=0; i&8; i++)
if(logic_value() != 0) //不是0
//执行6个1
for(i=0; i&6; i++)
if(logic_value()!= 1) //不是1
//执行1个0
if(logic_value()!= 0) //不是0
//执行1个1
if(logic_value()!= 1) //不是1
//解枂遥控器编码中的command指令
ir_code=0x00;//清零
for(i=0; i&16;i++ ){
if(logic_value() == 1){ir_code |=(1&&i);}
void remote_deal(void)//执行译码结果函数
switch(ir_code)
case 0xff00://停止
digitalWrite(LED,LOW);//LED亮
case 0xfe01://VOL+
digitalWrite(LED,HIGH);//LED灭
char logic_value()//判断逻辑值“0”和“1”子函数
while(!(digitalRead(8))); //低等待
Pulse_Width=TCNT1;
if(Pulse_Width&=7&&Pulse_Width&=10)//低电平560us
while(digitalRead(8));//是高就等待
Pulse_Width=TCNT1;
if(Pulse_Width&=7&&Pulse_Width&=10)//接着高电平560us
else if(Pulse_Width&=25&&Pulse_Width&=27) //接着高电平1.7ms
return -1;
void setup()
pinMode(LED,OUTPUT);//设置与LED连接的引脚为输出模式
pinMode(IR_IN,INPUT);//设置红外接收引脚为输入
void loop()
timer1_init();//定时器初始化
remote_decode(); //译码
remote_deal(); //执行译码结果
代码中的脉髋Pulse_Width比较值如7和10是如何算出来的呢?
引用Atommann的解释:
代码中用了 AVR 的 16 位 Timer/Counter 1,它的工作行为受几个寄存器的控制,这个可以在下面这个初始化函数里进行了设置:
void timer1_init(void)//定时器初始函数
TCCR1A = 0X00;
TCCR1B = 0X05;//给定时器时钟源
TCCR1C = 0X00;
TCNT1 = 0X00;
TIMSK1 = 0X00; //禁止定时器溢出中断
其中把 TCCR1B 设置为 0x05,你看 atmega88/168/328 的数据手册第 131/132 页对这个寄存器的描述: 15.11.2 TCCR1B - Timer/Counter1 Control Register B
0x05 把 Timer/Counter 1 的时钟源设置成 clk_IO/1024,Arduino 的时钟频率是 16MHz,这里的 clk_IO 的频率也应当是 16MHz,Timer/Counter 1 的时钟频率就是 16MHz/1024
想象一下 Timer/Counter 的工作行为,它按照前面设定的时钟源进行计数,TCNT1 就是它的计数值,我们最开始把它清 0,然后开启它,它就开始数数。事实上我们已经知道了 Timer/Counter 1 的时钟频率,那就可以算出它的周期(就是数字每加 1 的时间有多长)
时钟频率 = 16MHz/1024 = 4
周期 = 1/时钟频率 = 1/(4)
上面的时间单位是秒,乘上 1000000 就把单位换成 us
周期 = 4) = 64us
上面的例子程序里有下面的语句: if(Pulse_Width&=7&&Pulse_Width&=10)//低电平560us
Pulse_Width 就是取的 TCNT1 的值
64us*7 = 448us
64us*10 = 640us
560us 正好介于两者之间,就是这样算的。
以上知识点需要看点AVR的中断以及定时器相关知识。
5. 上面编码实现存在的问题
上述编码中并未真正实现预定的效果,主要原因是因为在对0和1的解码不成功,脉宽不匹配。我尝试使用串口输出调试,才发现这一问题。希望哪位兄弟给指点下,可联系我,非常感谢。
6. 使用 Ken Shirriff 的解码类库
Ken Shirriff的解码类库 IRremote,它在解码和发射红外线指令方面堪称一流,它尝试匹配不同生产厂商使用的标准,如NEC, Sony SIRC, Philips RC5, Philips RC6, 和 raw。。
#include &IRremote.h&
int RECV_PIN = 8;
int LED=7;
IRrecv irrecv(RECV_PIN);
void setup()
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
pinMode(LED,OUTPUT);
void loop() {
if (irrecv.decode(&results)) {
if(results.value==0xFFE01F){
digitalWrite(LED,HIGH);
}else if(results.value==0xFFA25D){
digitalWrite(LED,LOW);
irrecv.resume(); // Receive the next value
视频如下(我手机拍的凑合看吧):
参考资料:《基于Arduino的趣味电子制作》,
>> 博主下一篇:
<< 博主上一篇:& Arduino 红外热释电传感器 人体红外热释传感器 人体感应
Arduino 红外热释电传感器 人体红外热释传感器 人体感应
奥松售价:
商品编号:
商品库存:
商品重量:
商品品牌:
上架时间:
购买此商品可使用:
商品评价:
国际销售:
技术支持:
国内销售:
销售客服一:
销售客服二:
技术支持:
咨询电话:
购买数量:
产品介绍:
2014年最新红外热释电传感器是一款基于热释电效应的人体热释运动传感器,能检测到人体或动物身上发出的红外线,配合菲涅尔透镜能使传感器探测范围更远更广。可在控制器上编程应用,通过3P传感器连接线插接到专用传感器扩展板上使用,可以轻松实现人体或动物检测的相关的互动效果。引脚定义:(-)电源地,(OUT)信号输出,(+)电源正。
产品参数:
1.探测角度120度。
2.探测距离7米。
3.TTL开关信号输出,有信号输出高电平(3.3V左右),无信号输出低电平(0.4V左右)。
4.触发时间可调。
5.常用于做防盗器等设备。
6.模块已强制设置为可重复触发工作方式。
产品图片:
机器人现在已经开始渐渐走进我们的生活,无论是现在火热的服务机器人,还是多功能家居机器人,都在无时无刻的改变着我们的生活。6wd监控机器人,前方搭载的就是红外热释传感器,能检测到人体或动物身上发出的红外线,配合菲涅尔透镜能使传感器探测范围更远更广!
Arduino 红外热释人体电传感器配合菲涅尔透镜使传感器探测范围更广
没有菲涅尔透镜的红外热释人体电传感器
Arduino 红外热释人体电传感器背面图
有问有答:
1.夏普红外测距边界问题:
2.Arduino驱动安装失败? 最全的解决的方法:
3.Arduino uno R3+双H桥驱动板+红外遥控小车编程问题 :&
4.采用现成零件 在家自制Arduino手机:
5.利用Xbee模块实现两个UNO控制器的通信:
前沿科技:
1.利用红外热释电传感器制作属于自己的报警神器:
2.Arduino与Kinect打造“体感智能车”:&
3.玩转Arduino-编译环境软件:
4.Arduino IDE错误提示问题原因汇总:
5.Arduino+Processing 制作极客风格绘图机:
6.Arduino兼容的3D手势控制器:
7.玩转Arduino-闪烁的LED:
教学视频:
1.红外无线传输之旋转电位计控制LED灯:
2.红外无线发射接收之颜色识别系统:
3.Arduino红外无线遥控解码距离测试:
4.Arduino-2WD轻量型移动机器人红外遥控演示:
5.Arduino-4WD移动机器人寻线与避障功能演示网址:&
6.Arduino-4WD移动机器人侦测避障功能演示网址:&
技术博客:
1.热释电红外传感器:
2.奥松机器人带你“走进科学世界”:
3.奥松机器人助力中国教育首次亮相东南卫视《好好学习吧》娱乐节目:
4.玩转Arduino控制器——入门篇:&
5.玩转Arduino控制器——基于Arduino互动电子入门套 件:&
6.cooska的博客之Arduino与传感器网址:
百度百科:
1.(点击名称)
2.(点击名称)
3.(点击名称)
维基百科:
1.(点击名称)
2.(点击名称)
【为了给亲们提供更方便快捷的技术服务与支持,奥松机器人特开设技术社区为大家答疑解惑 ,即有专门的技术人员为您回帖,更有众多的电子爱好者可以一起交流学习心得! 】
总计 0 个记录,共 1 页。
服务热线:1-801周一至周五9时—18时
黑龙江哈尔滨香坊区衡山路18号远东大厦C区2层Tel: ,1-801E-mail:
哈尔滨奥松机器人科技有限公司 版权所有,并保留所有权利。黑ICP备号
国际销售:
技术支持:
国内销售:
销售客服一:
销售客服二:
咨询电话:Arduino红外接收库 - 下载频道
- CSDN.NET
&&&&Arduino红外接收库
Arduino红外接收库
Arduino红外接收库:
1.把压缩包解压到Arduino IDE的libraries文件夹中
2.需要注意的是在库文件夹下要直接显示*.cpp和*.h文件,绝对不可以把这些库文件再套一层二级目录,这样子就会导致IDE无法识别。
若举报审核通过,可奖励20下载分
被举报人:
xxxxxx91116
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
您可能还需要
开发技术下载排行

我要回帖

更多关于 arduino红外遥控小车 的文章

 

随机推荐