@traitor
2016-10-15T05:43:47.000000Z
字数 3246
阅读 1555
西南交通大学创客协会
夜校
Arduino
HC-SR04
红外接收
想必大家应该都听说过超声波那货(也就是蝙蝠用来代替眼睛的东西),在不了解它之前,也许你会觉得这东西真是神奇,然鹅,在了解之后,你会惊奇地发现,沃德天,这东西真是好玩儿!本期夜校中,查克拉玛山寨大王将会向大家介绍超声波模块HC-SR04的简单使用,你将会学习到如何用这东西来做一个不精准的测距。
是时候让你们见识一下什么叫做力量了!!
上图!
此处献上如诗般的源码,手动偷笑(~ o ~)~zZ
int Trig = 4; // 定义超声波信号发射接口
int Echo = 5; // 定义超声波信号接收接口
void setup()
{
Serial.begin(9600); //设置串口波特率
pinMode(Echo, INPUT); //
pinMode(Trig, OUTPUT); //
}
void loop()
{
digitalWrite(outputPin, LOW); //低电平2μs
delayMicroseconds(2);
digitalWrite(outputPin, HIGH); //高电平至少10μs
delayMicroseconds(10);
digitalWrite(outputPin, LOW); //保持低电平
int distance = pulseIn(inputPin, HIGH); //读出脉冲时间
distance= distance/58; //将脉冲时间转化为距离(单位:厘米)
Serial.println(distance); //输出距离值
}
这就是超声波模块的使用示例了,你看,是不是So Easy啊!!!
这代码的功能就是模块的一个简单示例,将模块的测距结果输出到串口上,这样你就可以使用串口工具来接收数据啦!!!
看完了超声波模块,接下来就来介绍下红外的简单知识了!那边的朋友,让我看见你们竖起的耳朵好吗?!
在学了下面的知识以后,你也可以拿着家里的红外电视遥控来“指使”你的作品来完成你的命令啦!!Are You Ready?!
先来看看它(一体化红外接收头)的真容吧!
哈哈哈,好了,既然算是打过照面了,那么,小重点来了,它是如何工作的呢?
红外接收电路通常被厂家集成在一个元件中,成为一体化红外接收头。内部电路包括红外监测二极管,放大器,限幅器,带通滤波器,积分电路,比较器等。红外监测二极管监测到红外信号,然后把信号送到放大器和限幅器,限幅器把脉冲幅度控制在一定的水平,而不论红外发射器和接收器的距离远近。交流信号进入带通滤波器,带通滤波器可以通过30khz到60khz的负载波,通过解调电路和积分电路进入比较器,比较器输出高低电平,还原出发射端的信号波形。注意输出的高低电平和发射端是反相的,这样的目的是为了提高接收的灵敏度。红外接收头的种类很多,引脚定义也不相同,一般都有三个引脚,包括供电脚,接地和信号输出脚。根据发射端调制载波的不同应选用相应解调频率的接收头。红外接收头内部放大器的增益很大,很容易引起干扰,因此在接收头的VCC(电压)PIN脚与GND(地线)pin脚须加上滤波电容,经专家测试试验一般在47uf陶瓷电容(注意:电容加到100uf或20UF电容会导致接收头接收距离拉短)。另针对VCC(电压)PIN脚与Vout(输出)之间串入一个10K欧姆的上拉电阻,电压不稳定的时候进行上拉作用。红外发射器可从遥控器厂家定制,也可以自己用单片机的PWM产生,家庭遥控推荐使用红外发射管(L5IR4-45)的可产生37.91KHz的PWM,PWM占空比设置为1/3,通过简单的定时中断开关PWM,即可产生发射波形。
好吧,说实在的,上面这一段还是需要一些知识才能理解的。。。没关系,这并不影响咱继续使用这个东西。下面的源代码就是一个小示例哈,它的功能就是将接收头接收到的,并且已经经过解码的信号输出到串口上。来,上代码!
#include <IRremote.h> //这个头文件包含在红外的库中
//下载:https://github.com/shirriff/Arduino-IRremote
int RECV_PIN = 11; // 红外一体化接收头连接到Arduino 11号引脚
IRrecv irrecv(RECV_PIN);
decode_results results; // 用于存储编码结果的对象
void setup()
{
Serial.begin(9600); //初始化串口通信
irrecv.enableIRIn(); //初始化红外解码
}
void loop()
{
if (irrecv.decode(&results))
{
Serial.println(results.value, HEX); //以十六进制输出结果
irrecv.resume(); // 接收下一个编码
}
}
很好,看了这些之后,咱已经基本学会了HC-SR04模块以及红外一体接收头的使用了。下面,咱就来把它们结合一下,做一个简单的小项目,作用就是当按下红外遥控的某一个按键时,将超声波的测距结果输出到串口,LED灯亮;当按下其他按键时,将该按键的编码输出到串口,LED灯亮;当什么都没有按时,串口啥也没有输出,LED灯灭。
先上线路连接图,用图占屏,挡住下边儿的代码,我们来好好思考一下该如何实现这样的功能。
啊,这个图嘛,额,连得有那么一点点的乱哈,不慌,到时候来听朕细细讲解,一定会连好的。嗯,会的。
好,如果你还没有准备好看代码,那么请停下你的鼠标滚轮,因为,我要po出代码了!!!
来,一起倒数3个数!
数
数
数
代码出现!抓住它!
/*头文件区*/
#include <IRremote.h>
#include <Wire.h>
/*全局变量区*/
int RECV_PIN = 11; //定义红外接收头引脚
int Trig = 2; //定义超声波发射引脚
int Echo = 3; //定义超声波接收引脚
int LED = 4; //定义LED灯控制引脚
float Distance = 0; //定义变量储存距离值
/*对象实例区*/
IRrecv irrecv(RECV_PIN); //实例化一个对象
decode_results results; //实例化一个对象
/*初始配置函数*/
void setup()
{
Serial.begin(9600); //初始化串口波特率
pinMode(Trig, OUTPUT); //定义引脚为输出
pinMode(Echo, INPUT); //定义引脚为输入
pinMode(LED, OUTPUT); //定义引脚为输出
irrecv.enableIRIn(); //红外使能,即开启
}
/*主函数*/
void loop()
{
digitalWrite(LED, HIGH); //开启LED灯
if (irrecv.decode(&results)) //判断是否接收到数据
{
if (results.value == 0x7070629D) //判断是否为指定按键
{ //注:此编码请根据实际更改
digitalWrite(Trig, LOW); //下面开始超声波测距功能
delayMicroseconds(2);
digitalWrite(Trig, HIGH);
delayMicroseconds(10);
digitalWrite(Trig, LOW);
Distance = pulseIn(Echo, HIGH) / 58.00;
Serial.println(Distance+ String("cm")); //输出结果
irrecv.resume(); //清空接收头信息
}
else
{
Setial.println(results.value, HEX);
irrecv.resume(); //清空接收头信息
}
}
digitalWrite(LED, LOW); //关闭LED
delay(1000); //延时1秒
}
快来将以上代码烧录入控制板试一试效果吧!!!
本实例仅仅是演示了两个模块的简单使用,更多的应用欢迎大家继续探索!
才疏学浅,如有不足,还请指教,感激不尽!