首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有Arduino的多个超声波传感器

带有Arduino的多个超声波传感器
EN

Stack Overflow用户
提问于 2017-01-06 13:53:01
回答 1查看 4.1K关注 0票数 2

我试图创造一个机器人使用三个HC 04超声波传感器和我的Arduino Pro Mini,但我遇到了一些问题。简而言之,机器人的功能如下:

  1. 机器人是双轮式的,每个轮子都由一个H桥(SN754410)驱动.
  2. 机器人的每一侧都有一个HC 04传感器,左边的传感器检测到前方有一只手时,左边的传感器会激活左轮电机,右边的传感器则会激活左轮电机。

也就是说,为了让机器人前进,我们把手放在机器人的左边和右边,为了让它向右转,我们移除右手,保持左边的位置,反之亦然,左转等等。

  1. 第三个HC-SR04位于机器人的顶部,因此当用户的手悬停在机器人上方时,它会激活第三个马达。

我的测试代码如下:

代码语言:javascript
运行
复制
#include <NewPing.h>

#define SONAR_NUM 3      // Number of sensors.
#define MAX_DISTANCE 20 // Maximum distance (in cm) to ping.

NewPing sonar[SONAR_NUM] = {   // Sensor object array.
  NewPing(4, 5, MAX_DISTANCE), // Each sensor's trigger pin, echo pin, and max distance to ping. 
  NewPing(6, 7, MAX_DISTANCE), 
  NewPing(8, 9, MAX_DISTANCE)
};

#define ena1 10   //trigger for left motor H-bridge
//#define ena2 11 //trigger for right motor
//#define ena3 12  //for top motor

long sensors[3]; //array to store sensor distances 

void setup() {
 Serial.begin (115200);

 pinMode(ena1, OUTPUT);
 //pinMode(ena2, OUTPUT);
 //pinMode(ena3, OUTPUT);
}

void loop() {

 for (uint8_t i = 0; i < SONAR_NUM; i++) { // Loop through each sensor and display results.
    delay(50); // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
    sensors[i] = sonar[i].ping_cm(); 
  }

  Serial.println(sensors[0]);
  if (sensors[0] > 0 && sensors[0] <= 20){
  Serial.println("detected");
  digitalWrite(ena1, HIGH);
  }else{
  Serial.println("NA");
  digitalWrite(ena1,LOW);
  }
 }

如您所见,我正在使用NewPing.h .h库来收集传感器数据。在for循环的每一次迭代之后,传感器检测到的距离被存储在传感器阵列中。当一只手被放置在离传感器大约15-20厘米的地方时,arduino会向相应的H桥发送一个数字“高”触发信号,激活相应的马达(我只有其中一个引脚,"ena1",在我的代码中启用了,另外两个是为测试注释的)。

为了测试我的代码,我简单地将H桥触发引脚"ena1“连接到一个LED上,这个引脚由传感器激活,传感器的距离数据存储在可变的”传感器“中。然而,在我编译和上传我的代码后,我注意到当我把手放在传感器前时,LED只是微弱地闪烁。就好像LED正被快速地打开和关闭。

串行监视器的输出如下:

代码语言:javascript
运行
复制
15
detected 
0
NA
16
detected
0
NA
14
detected

正如您所看到的,通过将我的手放在传感器前面大约15厘米,传感器返回正确的距离,并且"ena1“引脚被设置为很高(通过打印到屏幕上的”检测到的“来证明)。

然而,传感器总是在主循环的下一次迭代时返回一个"0“值(当我的手还在传感器前面),随后又将"ena1”引脚设置为低,这可能解释了为什么LED被快速地打开和关闭。

我不知道为什么会这样..。有趣的是,通过从代码中删除digitalWrite行,传感器返回正确的值(即当我的手在传感器前面时没有"0“值)。

我有什么办法解决这个问题吗?

提前感谢!

EN

回答 1

Stack Overflow用户

发布于 2017-01-13 02:10:25

这可能是硬件错误。我见过这样的情况,如果HC 04的引脚是黄铜(金色的)颜色,传感器会有抛出距离为0的倾向。

我的建议是,得到另一个超声波传感器,最好是更多的银色别针.

不过,你的代码看起来不错!

祝好运!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41507221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档