我试图创造一个机器人使用三个HC 04超声波传感器和我的Arduino Pro Mini,但我遇到了一些问题。简而言之,机器人的功能如下:
也就是说,为了让机器人前进,我们把手放在机器人的左边和右边,为了让它向右转,我们移除右手,保持左边的位置,反之亦然,左转等等。
我的测试代码如下:
#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正被快速地打开和关闭。
串行监视器的输出如下:
15
detected
0
NA
16
detected
0
NA
14
detected
正如您所看到的,通过将我的手放在传感器前面大约15厘米,传感器返回正确的距离,并且"ena1“引脚被设置为很高(通过打印到屏幕上的”检测到的“来证明)。
然而,传感器总是在主循环的下一次迭代时返回一个"0“值(当我的手还在传感器前面),随后又将"ena1”引脚设置为低,这可能解释了为什么LED被快速地打开和关闭。
我不知道为什么会这样..。有趣的是,通过从代码中删除digitalWrite行,传感器返回正确的值(即当我的手在传感器前面时没有"0“值)。
我有什么办法解决这个问题吗?
提前感谢!
发布于 2017-01-13 02:10:25
这可能是硬件错误。我见过这样的情况,如果HC 04的引脚是黄铜(金色的)颜色,传感器会有抛出距离为0的倾向。
我的建议是,得到另一个超声波传感器,最好是更多的银色别针.
不过,你的代码看起来不错!
祝好运!
https://stackoverflow.com/questions/41507221
复制相似问题