带Arduino的多个超声波传感器

时间:2017-01-06 13:53:02

标签: arduino arduino-ultra-sonic

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

  1. 机器人是双轮的,带有一个驱动每个车轮的H桥(SN754410)。
  2. 在机器人的每一侧都有一个HC-SR04传感器,左边的一个传感器在检测到前面的一只手时激活左轮电机,反之亦然。右侧。
  3. 即。为了使机器人前进,我们将手放在机器人的左右两侧,使其向右转,我们移除右手并将左手保持在原位,反之亦然向左转,等等。 p>

    1. 第三个HC-SR04位于机器人的顶部,当用户的手悬停在机器人上方时,它激活第三个电动机。
    2. 我的测试代码如下:

      #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;值在传感器前面)。

      关于如何解决此问题的任何想法?

      提前致谢!

1 个答案:

答案 0 :(得分:0)

这可能是硬件错误。我见过的情况是,如果HC-SR04的针脚是黄铜色(金色),传感器倾向于抛出0距离。

我的建议是买另一个超声波传感器,最好是带有更多银色的针脚。

你的代码看起来不错!

祝你好运!