我试图使用三个HC-SR04超声波传感器和我的Arduino Pro Mini创建一个机器人,但我遇到了一些问题。简而言之,机器人的功能如下:
即。为了使机器人前进,我们将手放在机器人的左右两侧,使其向右转,我们移除右手并将左手保持在原位,反之亦然向左转,等等。 p>
我的测试代码如下:
#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库来收集传感器数据。在for循环的每次迭代之后,传感器检测到的距离存储在传感器阵列中。当一只手放在离传感器大约15-20厘米的地方时,arduino发送一个数字&#34; HIGH&#34;触发信号到相应的H桥,激活相应的电机(我只有这些引脚中的一个,&#34; ena1&#34;,在我的代码中启用,另外两个被评论用于测试)。
为了测试我的代码,我只需连接H桥触发引脚&#34; ena1&#34;对于LED,该引脚由传感器激活,其距离数据存储在变量传感器[0]和#34;中。然而,在我编译并上传我的代码之后,我注意到当我把手放在传感器前面时,LED只是微弱地闪烁。好像LED正在快速打开和关闭。
串行监视器的输出如下:
15
detected
0
NA
16
detected
0
NA
14
detected
如您所见,通过将手放在传感器前约15cm处,传感器返回正确的距离并且&#34; ena1&#34;引脚设置为高(由&#34;检测到#34;打印到屏幕上)。
然而,传感器始终返回&#34; 0&#34;在主循环的下一次迭代中的值(当我的手仍在传感器前面时),随后设置&#34; ena1&#34;再次将引脚设为低电平,这可以解释为什么LED开启和关闭速度如此之快。
我不确定为什么会发生这种情况...有趣的是,通过从代码中删除digitalWrite行,传感器返回正确的值(即当我的手是时,没有&#34; 0&#34;值在传感器前面)。
关于如何解决此问题的任何想法?
提前致谢!
答案 0 :(得分:0)
这可能是硬件错误。我见过的情况是,如果HC-SR04的针脚是黄铜色(金色),传感器倾向于抛出0距离。
我的建议是买另一个超声波传感器,最好是带有更多银色的针脚。
你的代码看起来不错!
祝你好运!