|
在本篇文章中,您将了解超声波模块及其工作原理。通过本文的学习,您将能够将其连接到Arduino开发板,然后将其用作运动检测器,以通过手势控制显示器。
超声波模块基础知识 超声波传感器是接近传感器。该传感器通过以高于人的听觉范围的频率发送短音频脉冲,并在物体表面反射后接收它,来计算空气中超声波的时间和方向。使用此时间,可以高分辨率测量距离。超声波法由于具有高精度和高速度,不与物体接触,无腐蚀且价格合理等优点,是测量距离和检测物体的最佳方法之一。大多数超声波模块包括一个发射器和一个接收器。 SRF04和SRF05模块的接收器和发送器彼此相邻,可以准确检测2到300 cm范围内的物体。 SRF05模块是SRF04的改进版本。该版本支持双模式,并包含5个引脚。但是SRF04模块具有4个引脚,并且仅支持一种模式。这两个模块都有一个称为mode1的共同模式。
首先在模式1中,应向触发引脚施加至少10微秒的脉冲。模块将自动以40 kHz的频率发送8个脉冲,并将Echo引脚设置为1。Echo引脚保持高电平,直到模块接收到来自物体的反射脉冲。然后,我们可以通过测量Echo引脚处于高逻辑电平的时间来计算发送和接收信号之间的时间。在此模式下,SRF05 OUT引脚不连接。
模式2(仅在SRF05模块中可用)对触发和回波信号使用一个引脚。要使用此模式,请将OUT引脚接地,并使用Echo引脚发送和接收Echo脉冲。如前所述,我们可以通过测量信号持续时间来计算距第一个物体的距离。
所需的组件 ● Arduino LEONARDO开发板 ● HY-SRF05超声波距离传感器模块 ● 跳线
超声波模块与Arduino的连接 超声波模块和Arduino之间的连接非常简单。只需将Trig和Echo引脚连接到Arduino的两个引脚,然后将这两个引脚引入Arduino。如前所述,Arduino使用这些引脚计算距模块前面第一个物体的距离。另外,不要忘记将模块的VCC和GND连接到Arduino的5V和GND。
电路连接
代码 - /*
- * Ultrasonic Sensor HC-SR05/4 and Arduino
- */
- long duration;
- int distance;
-
- const int trig = 9;
- const int echo = 10;
- void setup() {
- pinMode(trig, OUTPUT); // Sets the trigPin as an Output
- pinMode(echo, INPUT); // Sets the echoPin as an Input
- Serial.begin(9600); // Starts the serial communication
- }
- void loop() {
- distance = calculateDistance();
- Serial.println(distance);
-
- }
- int calculateDistance(){
-
- digitalWrite(trig, LOW);
- delayMicroseconds(2);
- // Sets the trigPin on HIGH state for 10 micro seconds
- digitalWrite(trig, HIGH);
- delayMicroseconds(10);
- digitalWrite(trig, LOW);
- duration = pulseIn(echo, HIGH); // Reads the echoPin, returns the sound wave travel time in microseconds
- distance= duration*0.034/2;
- return distance;
- }
复制代码
让我们仔细看一下代码: - digitalWrite(trigPin, HIGH);
- delayMicroseconds(10);
- digitalWrite(trigPin, LOW);
复制代码在Trig引脚上发送10微秒的脉冲。 - duration = pulseIn(echoPin, HIGH);
复制代码pulseIn()函数计算Echo引脚为高电平的时间,该时间实际上等于发送和接收信号之间的时间。 - distance= duration*0.034/2;
复制代码通过将duration和声音速度相乘,可以计算声音传播的距离。
使用Arduino和超声波模块控制显示器 假设您的屏幕上正在播放视频。我们仅通过手势控制视频的播放或停止、音量以及向前和向后播放。
为此,将两个超声波模块连接到Arduino Leonardo开发板上,然后将模块放在显示器的左右两侧。
将以下代码上传到您的开发板上。现在,您可以通过将双手放在距离模块20到30厘米的位置来停止或播放视频!
如果将右手放在右模块前面9到15厘米的位置,并将其稍微移开,视频将返回5秒钟。如果您将手稍微靠近模块,视频将向前播放5秒钟。通过将左手放在距模块9至15cm的位置并靠近模块,视频的音量将增加,而将手移开,视频的音量将减小。
电路
代码 此部分的代码需要用到Keyboard.h库。您可以从以下链接下载:https://www.arduinolibraries.info/libraries/keyboard - /*
- * Control Your PC with Ultrasonic Sensor HC-SR04 and Arduino
- */
- #include <Keyboard.h>
- long duration;
- int distance,distLeft,distRight;
-
- const int trigger1 = 2; //Trigger pin of 1st Sesnor
- const int echo1 = 3; //Echo pin of 1st Sesnor
- const int trigger2 = 4; //Trigger pin of 2nd Sesnor
- const int echo2 = 5;//Echo pin of 2nd Sesnor
-
- void setup() {
- Serial.begin(9600);
-
- pinMode(trigger1, OUTPUT);
- pinMode(echo1, INPUT);
- pinMode(trigger2, OUTPUT);
- pinMode(echo2, INPUT);
- }
-
- void loop() {
- distance=calculateDistance(trigger1,echo1);
- distLeft =distance;
-
- distance=calculateDistance(trigger2,echo2);
- distRight =distance;
-
- //Pause Modes -Hold
- if ((distLeft >20 && distRight>20) && (distLeft <30 && distRight<30)) //Detect both hands
- {Serial.println("Play/Pause");
- Keyboard.press(KEY_TAB);
- delay(100);
- Keyboard.releaseAll();
- delay (500);}
-
- distance=calculateDistance(trigger1,echo1);
- distLeft =distance;
-
- distance=calculateDistance(trigger2,echo2);
- distRight =distance;
-
- //Control Modes
- //Lock Left - Control Mode
- if (distLeft>=9 && distLeft<=14)
- {
- delay(100); //Hand Hold Time
- distance=calculateDistance(trigger1,echo1);
- distLeft =distance;
- if (distLeft>=0 && distLeft<=15)
- {
- Serial.println("Left Hand detected");
- while(distLeft<=20)
- {
- distance=calculateDistance(trigger1,echo1);
- distLeft =distance;
- if (distLeft<5) //Hand pushed in
- {Serial.println ("Volume Up");
- Keyboard.press(KEY_UP_ARROW); //up key
- delay(100);
- Keyboard.releaseAll();
- delay (300);}
- if (distLeft>17) //Hand pulled out
- {Serial.println ("Volume Down");
- Keyboard.press(KEY_DOWN_ARROW); //down key
- delay(100);
- Keyboard.releaseAll();
- delay (300);}
- }
- }
- }
-
- //Lock Right - Control Mode
- if (distRight>=9 && distRight<=14)
- {
- delay(100); //Hand Hold Time
- distance=calculateDistance(trigger2,echo2);
- distRight =distance;
- if (distRight>=0 && distRight<=20)
- {
- Serial.println("Right Hnaad Detected");
- while(distRight<=20)
- {
- distance=calculateDistance(trigger2,echo2);
- distRight =distance;
- if (distRight<5) //Right hand pushed in
- {Serial.println ("Rewind");
- Keyboard.press(KEY_LEFT_ARROW); //left key
- delay(100);
- Keyboard.releaseAll();
- delay (300);
- }
- if (distRight>17) //Right hand pulled out
- {Serial.println ("Forward");
- Keyboard.press(KEY_RIGHT_ARROW); //right key
- delay(100);
- Keyboard.releaseAll();
- delay (300);}
- }
- }
- }
-
- delay(200);
- }
- int calculateDistance(int trig, int echo){
-
- digitalWrite(trig, LOW);
- delayMicroseconds(2);
- // Sets the trigPin on HIGH state for 10 micro seconds
- digitalWrite(trig, HIGH);
- delayMicroseconds(10);
- digitalWrite(trig, LOW);
- duration = pulseIn(echo, HIGH); // Reads the echoPin, returns the sound wave travel time in microseconds
- distance= duration*0.034/2;
- distance = 50;
- return distance;
- }
复制代码
以上就是本篇文章的全部内容。接下来,您可以在模块上添加一个伺服电机,尝试计算与超声波模块周围每个物体的距离。或者尝试定义其他手势,例如更改视频播放速度。如果遇到问题,请随时在本帖下面进行回复。 |