风筝
发表于: 2018-9-9 14:31:25 | 显示全部楼层

本篇文章主要将向您介绍如何连接超声波传感器和Arduino开发板,以便在感应到运动时点亮LED指示灯。


在本篇文章中,我使用NPN晶体管2N3904作为开关。如果您没有2N3904,则可以使用类似的器件,如2N2222。只要是NPN,就可以使用下面提供的代码。如果您使用的是PNP晶体管,则需要更改相关的代码。要点亮和熄灭LED指示灯,使用这些晶体管就可以正常工作。但是为了点亮更大功率的LED灯,如家里的灯,那么你需要一个功率晶体管。能够处理从电源插座流过电流的晶体管是NPN晶体管MJ15022


使用超声波传感器作为运动检测器

超声波传感器或声纳传感器是一种使用回声定位来感测周围的物体的传感器形式。这与鲸鱼和蝙蝠在移动时用来寻找食物或物体的回声定位原理相同。通过发出一定频率并查看它返回所需的时间,我们可以确定物体的位置甚至速度。


我们使用的超声波传感器的应用范围可达20英尺。它是一种有源传感器,不断发出声波然后等待接收。它可以每50ms或以20Hz的速率发出新的声波。我们将使用超声波传感器作为运动检测器;当距离发生明显变化时,我们会将其视为物体在传感器前方经过的指示。这样,如果你把它指向你的门,它将获得恒定的距离。但是只要有人走过,声纳传感器接收的距离就会改变,我们就知道这是移动的东西。


由于声纳传感器使用声波的反射,因此当物体在其范围内移动时可能存在一些延迟或滞后。为了获得完美的信号,物体必须是平的并且直接面向传感器以便完美地反射波。人体不会完美地反射声纳波,但是由于声波相对于人体的半径足以反射回波,所以延迟或滞后不应该产生那么大的差异。您可以尝试使用较小的物体来找到最佳的波反射角度,以便Arduino获开发板得正确的距离。


使用晶体管作为开关

晶体管是一种非常通用的电子元件。它可用于开关、放大、滤波、缓冲器和稳压器。在本例中,我们将把它用作开关。


我们必须确保在本文中您使用的是NPN晶体管而不是PNP管 - 否则,电路将与您希望的相反。使用PNP晶体管时,未检测到运动时灯将亮起;检测到运动时灯将熄灭。发生这种情况是因为,在NPN晶体管上,当基极中没有电流时,集电极和发射极之间存在开路。这对PNP来说是相反的效果。当基极中没有电流时,集电极和发射极之间存在短路,使其成为闭合电路并允许电流流过。


我们将通过模拟输出A2输出到晶体管的基极,以打开通过LED的电流。

Moises_1.jpg


如果我们查看2N3904数据手册,那么我们就可以读取它的所有电气特性。当使用晶体管作为开关时,我们最关心的电气特性是基极 - 发射极饱和最小电压和最大电压。


当晶体管工作在饱和区时,它将允许发射极和集电极之间的电流流动。当我们检查2N3904的数据手册时,我们发现在饱和区运行该晶体管所需的最小电压为0.65V。

Moises_chart.jpg


如果您使用电池为Arduino供电,并且不想每次感测到某些东西时发出一个高的输出电平,那么您可以更改电压输出。默认情况下,当Arduino输出高电平时,输出5V。但要将其更改为更低的值,如0.65 V或1 V,那么您必须更改AnalogWrite函数参数。其电流值255给出最大(100%)占空比,这意味着它给出5V。使用比率,我们可以使用以下公式将输出更改为大约1 v:

value=voltage desired x 255 / 5


如果我们在公式假设所需电压为1 v,则value的值为51。我将它舍入到50。简而言之,要将输出电压更改为1V,请将AnalogWrite参数更改为50。所以代码类似于下面的代码。这样,消耗的电量更少,Arduino可以延长电池寿命。

  1. analogWrite(transistor,50) ;
复制代码

如果您正在使用另一个NPN晶体管,请查看其数据手册并密切关注最小基极 - 发射极饱和电压。确保Arduino输出足够的电压以使晶体管导通。


在面包板上连接我们的组件

一旦我们准备好所有组件,我们就像下图所示连接它们。在本文中,我们通过A2的模拟输出连接晶体管导通。只要在代码中更改它,您就可以选择所需的输出。

schematic-2.jpg


如上所述,我们的模拟输出将短接3.3V和LED之间的电路。我们Arduino的3.3V恒定输出将模拟电源插座输出。

如上图所示连接声纳传感器,以便能够检测运动。使用万用表检查所有导线是否连接良好,以免出现不需要的短路或开路。确保LED指示方向正确 - 否则无法点亮。


代码

在Arduino IDE上输入以下代码。编译代码后打开Arduino串口监视器,检查当物体在其前面通过时,晶体管是否正在切换。

  1. #include "Maxbotix.h"   // Library for Sonar Sensor

  2. Maxbotix rangeSensorPW(8, Maxbotix::PW, Maxbotix::LV); // Initializing Sensor Input at Digital Pin 8

  3. int transistor = A2; // Initialzing Analog Output to Transistor at A2

  4. void setup()
  5. {
  6.   pinMode(transistor, OUTPUT); // Sets the Analog A2 as an output
  7.   Serial.begin(9600); // Starts the Serial Monitor

  8. }

  9. void loop()
  10. {

  11.   Serial.println(" ");

  12.   Serial.print("Distance: "); // Prints Distance on the Screen
  13.   Serial.print(rangeSensorPW.getRange());  // Receives the Distance in Cm
  14.   Serial.print(" cm"); // Prints Cm

  15. if ( (rangeSensorPW.getRange()) <  48) {  // If Distance is less than 48 Cm

  16.     Serial.println("Transistor On");  // Then the transitor turns on
  17.     analogWrite(transistor, 255);   // Sends out 5V on Output A2
  18.     delay(2000); // Leaves it on for 2 seconds, you can change it depending on how long you want the light on
  19.   } //if

  20.   else {  // Else If distance is greater than 48 cm
  21.     analogWrite(transistor, 0);   // Turns off the Transistor
  22.     Serial.println("Transistor Off");  // Prints Transistor Off

  23.   }

  24.   delay(100); // Wait 100 ms
  25. } // loop
复制代码

打开串口监视器后,您将看到传感器的读数。由于在此示例中编写的代码用于检测小于48cm的距离/移动,因此如果在48cm内检测到运动时,则打开晶体管并点亮LED指示灯。


在下面的串口监视器中,您可以看到当距离从172cm变为18cm时晶体管是如何开启的。

IDE-2.jpg


如果您更喜欢英制系统而非公制系统,则在串口监视器上打印值时,您必须进行简单的转换。当调用rangeSensorPw.getRange()函数时,将其乘以0.393701以接收以英寸为单位的距离。如果您继续进行此更改,则必须为调用该函数的所有实例执行此更改。在If语句中,新条件现在以英寸为单位。因此,不是48厘米,而是18英寸,新的范围将是48英寸。确保考虑到这一变化,并根据需要调整距离。

  1. rangeSensorPw.getRange()*.393701 // To Output Distance in Inches instead of cm
复制代码

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 714 | 回复: 1501



手机版|

GMT+8, 2024-12-22 15:11 , Processed in 0.060190 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

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