Arduino Ping)))在显示一些结果后,传感器突然停止

时间:2013-06-20 15:09:00

标签: java arduino ping

我有一个ping)))传感器(HC - SR04)正确连接。

我在没有接地的情况下启动它(否则它甚至不想启动)并且它一直向串行窗口写入0(距离)。一旦我将它插入接地引脚,我得到几行正确的距离读数,而不是它停止和挂起,在串行窗口中没有更多的结果,并且电路板本身似乎处于故障状态,我需要拔掉电源线它来自USB,断开接地,然后重新插入USB。

问题的原因是什么?

代码:

#define echoPin 2 // Echo Pin
#define trigPin 4 // Trigger Pin
#define LEDPin 13 // Onboard LED

int maximumRange = 200;  // Maximum range needed
int minimumRange = 0;    // Minimum range needed
long duration, distance; // Duration used to calculate distance
int currentDistance = 0;

void setup() {
    Serial.begin (9600);
    pinMode(trigPin, OUTPUT);
    pinMode(echoPin, INPUT);
    pinMode(LEDPin, OUTPUT); // Use LED indicator (if required)
}

void loop() {
    /* The following trigPin/echoPin cycle is used to determine the
       distance of the nearest object by bouncing soundwaves off of it. */
    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);

    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);

    digitalWrite(trigPin, LOW);
    duration = pulseIn(echoPin, HIGH);

    //Calculate the distance (in cm) based on the speed of sound.
    distance = duration/58.2;

    if (distance >= maximumRange || distance <= minimumRange){
        /* Send a negative number to computer and Turn LED ON
           to indicate "out of range" */
        Serial.println("-1");
        digitalWrite(LEDPin, HIGH);
    } else {
        /* Send the distance to the computer using Serial protocol, and
           turn LED OFF to indicate successful reading. */
        Serial.println(distance);
        digitalWrite(LEDPin, LOW);
    }

    //Delay of 50 ms before next reading.
    delay(50);
}

------------------------ UPDATE ---------------------- --------

似乎问题不在于传感器,而在于串行接口:我已将LED附加到电路板上,并根据距离为其提供模拟值。一旦Arduino“卡住”,LED就能正常工作,所以我猜问题就是Arduino关闭串口并停止通过USB传输数据。

如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

传感器停留在零的解决方案是在此链接中。这是docdoc的第二篇文章。您将需要使用更好的NewPing库。

工作代码:

#include <NewPing.h>
#define TRIGGER_PIN 12
#define ECHO_PIN 11
#define MAX_DISTANCE 200

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);

void setup() {
    Serial.begin(9600);
}

void loop() {
    delay(50);
    unsigned int uS = sonar.ping();
    pinMode(ECHO_PIN,OUTPUT);
    digitalWrite(ECHO_PIN,LOW);
    pinMode(ECHO_PIN,INPUT);
    Serial.print("Ping: ");
    Serial.print(uS / US_ROUNDTRIP_CM);
    Serial.println("cm");
}

链接:http://forum.arduino.cc/index.php?topic=55119.15

NewPing链接:http://playground.arduino.cc/Code/NewPing

答案 1 :(得分:0)

根据你的说法,看起来地面和设备之间存在一条相互间的捷径...或者可能是有一个有缺陷的部件在地面上发生故障。所以我的建议是:

  • Arduino是否正常工作?
    • 在没有连接传感器的情况下测试Arduino本身完美无缺(上传回声sketch),
  • 传感器设备是否正常工作?
    • 测试所有焊接点的连续性(查找地面与信号之间的快捷桥接),
    • 使用其他传感器设备进行测试(如果您碰巧有备用设备)以查看问题是否仍然存在
    • 或者尝试使用其他Arduino设备。

关于你的代码本身,就我所知,问题的根源不是,我建议你将全局常量的声明改为:

const uint8_t maximumRange = 200; // Maximum range needed
const uint8_t minimumRange = 0;   // Minimum range needed
const uint8_t currentDistance = 0;

或使用预处理器:

#define maximumRange 200  // Maximum range needed
#define minimumRange 0    // Minimum range needed
#define currentDistance = 0

然后移动:

long duration, distance;   // Duration used to calculate distance

loop()功能中。尽可能避免使用非常量全局变量总是一个好主意(尽管Arduino对象并不总是可行)。

答案 2 :(得分:0)

我能够找到问题的原因。似乎Arduino的串行监视器导致了“崩溃”,因为在使用允许Arduino输出在Flash(serproxy)中使用的服务器实用程序时,Arduino可以始终如一地执行并且没有问题。

该项目的视频是 Arduino + Ping))) Sensor - Change display in application according to distance