[关闭]
@traitor 2016-10-15T05:43:47.000000Z 字数 3246 阅读 1555

Arduino与HC-SR04以及一体化红外接收头的故事

西南交通大学创客协会 夜校 Arduino HC-SR04 红外接收


想必大家应该都听说过超声波那货(也就是蝙蝠用来代替眼睛的东西),在不了解它之前,也许你会觉得这东西真是神奇,然鹅,在了解之后,你会惊奇地发现,沃德天,这东西真是好玩儿!本期夜校中,查克拉玛山寨大王将会向大家介绍超声波模块HC-SR04的简单使用,你将会学习到如何用这东西来做一个不精准的测距。
是时候让你们见识一下什么叫做力量了!!
上图!
此处输入图片的描述
此处献上如诗般的源码,手动偷笑(~ o ~)~zZ

  1. int Trig = 4; // 定义超声波信号发射接口
  2. int Echo = 5; // 定义超声波信号接收接口
  3. void setup()
  4. {
  5. Serial.begin(9600); //设置串口波特率
  6. pinMode(Echo, INPUT); //
  7. pinMode(Trig, OUTPUT); //
  8. }
  9. void loop()
  10. {
  11. digitalWrite(outputPin, LOW); //低电平2μs
  12. delayMicroseconds(2);
  13. digitalWrite(outputPin, HIGH); //高电平至少10μs
  14. delayMicroseconds(10);
  15. digitalWrite(outputPin, LOW); //保持低电平
  16. int distance = pulseIn(inputPin, HIGH); //读出脉冲时间
  17. distance= distance/58; //将脉冲时间转化为距离(单位:厘米)
  18. Serial.println(distance); //输出距离值
  19. }

这就是超声波模块的使用示例了,你看,是不是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,即可产生发射波形。

好吧,说实在的,上面这一段还是需要一些知识才能理解的。。。没关系,这并不影响咱继续使用这个东西。下面的源代码就是一个小示例哈,它的功能就是将接收头接收到的,并且已经经过解码的信号输出到串口上。来,上代码!

  1. #include <IRremote.h> //这个头文件包含在红外的库中
  2. //下载:https://github.com/shirriff/Arduino-IRremote
  3. int RECV_PIN = 11; // 红外一体化接收头连接到Arduino 11号引脚
  4. IRrecv irrecv(RECV_PIN);
  5. decode_results results; // 用于存储编码结果的对象
  6. void setup()
  7. {
  8. Serial.begin(9600); //初始化串口通信
  9. irrecv.enableIRIn(); //初始化红外解码
  10. }
  11. void loop()
  12. {
  13. if (irrecv.decode(&results))
  14. {
  15. Serial.println(results.value, HEX); //以十六进制输出结果
  16. irrecv.resume(); // 接收下一个编码
  17. }
  18. }

很好,看了这些之后,咱已经基本学会了HC-SR04模块以及红外一体接收头的使用了。下面,咱就来把它们结合一下,做一个简单的小项目,作用就是当按下红外遥控的某一个按键时,将超声波的测距结果输出到串口,LED灯亮;当按下其他按键时,将该按键的编码输出到串口,LED灯亮;当什么都没有按时,串口啥也没有输出,LED灯灭。
先上线路连接图,用图占屏,挡住下边儿的代码,我们来好好思考一下该如何实现这样的功能。
连得乱七八糟的线路图
啊,这个图嘛,额,连得有那么一点点的乱哈,不慌,到时候来听朕细细讲解,一定会连好的。嗯,会的。
好,如果你还没有准备好看代码,那么请停下你的鼠标滚轮,因为,我要po出代码了!!!
来,一起倒数3个数!

代码出现!抓住它!

  1. /*头文件区*/
  2. #include <IRremote.h>
  3. #include <Wire.h>
  4. /*全局变量区*/
  5. int RECV_PIN = 11; //定义红外接收头引脚
  6. int Trig = 2; //定义超声波发射引脚
  7. int Echo = 3; //定义超声波接收引脚
  8. int LED = 4; //定义LED灯控制引脚
  9. float Distance = 0; //定义变量储存距离值
  10. /*对象实例区*/
  11. IRrecv irrecv(RECV_PIN); //实例化一个对象
  12. decode_results results; //实例化一个对象
  13. /*初始配置函数*/
  14. void setup()
  15. {
  16. Serial.begin(9600); //初始化串口波特率
  17. pinMode(Trig, OUTPUT); //定义引脚为输出
  18. pinMode(Echo, INPUT); //定义引脚为输入
  19. pinMode(LED, OUTPUT); //定义引脚为输出
  20. irrecv.enableIRIn(); //红外使能,即开启
  21. }
  22. /*主函数*/
  23. void loop()
  24. {
  25. digitalWrite(LED, HIGH); //开启LED灯
  26. if (irrecv.decode(&results)) //判断是否接收到数据
  27. {
  28. if (results.value == 0x7070629D) //判断是否为指定按键
  29. { //注:此编码请根据实际更改
  30. digitalWrite(Trig, LOW); //下面开始超声波测距功能
  31. delayMicroseconds(2);
  32. digitalWrite(Trig, HIGH);
  33. delayMicroseconds(10);
  34. digitalWrite(Trig, LOW);
  35. Distance = pulseIn(Echo, HIGH) / 58.00;
  36. Serial.println(Distance+ String("cm")); //输出结果
  37. irrecv.resume(); //清空接收头信息
  38. }
  39. else
  40. {
  41. Setial.println(results.value, HEX);
  42. irrecv.resume(); //清空接收头信息
  43. }
  44. }
  45. digitalWrite(LED, LOW); //关闭LED
  46. delay(1000); //延时1秒
  47. }

快来将以上代码烧录入控制板试一试效果吧!!!
本实例仅仅是演示了两个模块的简单使用,更多的应用欢迎大家继续探索!
才疏学浅,如有不足,还请指教,感激不尽!

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注