我正在尝试使用三个 HC-SR04 超声波传感器和我的 Arduino Pro Mini 创建一个机器人,但我遇到了一些问题。简而言之,机器人的功能如下:
- 该机器人是双轮的,每个轮子都有一个 H 桥 (SN754410) 驱动。
- 机器人的每一侧都有一个 HC-SR04 传感器,左侧的传感器在检测到前面有一只手时激活左轮电机,右侧反之亦然。
即为了让机器人前进,我们将手放在机器人的左右两侧,为了使其向右转,我们将右手移开并保持左手在原位,反之亦然左转等。
- 第三个 HC-SR04 位于机器人的顶部,因此当用户的手悬停在机器人上方时,它会启动第三个电机。
我的测试代码如下:
#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 会向相应的 H 桥发送一个数字“HIGH”触发信号,激活相应的电机(我只有一个这些引脚,“ena1”,启用在我的代码中,另外两个被注释为测试)。
为了测试我的代码,我简单地将 H 桥触发引脚“ena1”连接到 LED,该引脚由距离数据存储在变量“sensors[0]”中的传感器激活。然而,在我编译并上传我的代码后,我注意到当我把手放在传感器前面时,LED 只是微弱地闪烁。好像 LED 的开关速度非常快。
串行监视器的输出如下:
15
detected
0
NA
16
detected
0
NA
14
detected
如您所见,通过将我的手放在传感器前面约 15 厘米处,传感器返回正确的距离,并且“ena1”引脚设置为高电平(如“检测到”打印到屏幕上所证明的那样)。
然而,传感器在主循环的下一次迭代中总是返回一个“0”值(当我的手仍然在传感器前面时),随后再次将“ena1”引脚设置为低电平,这可以解释为什么 LED 是如此快速地打开和关闭。
我不确定为什么会发生这种情况...有趣的是,通过从代码中删除 digitalWrite 行,传感器返回正确的值(即当我的手在传感器前面时没有“0”值)。
关于如何解决这个问题的任何想法?
提前致谢!