我有一个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传输数据。
如何解决这个问题?
答案 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");
}
答案 1 :(得分:0)
根据你的说法,看起来地面和设备之间存在一条相互间的捷径...或者可能是有一个有缺陷的部件在地面上发生故障。所以我的建议是:
关于你的代码本身,就我所知,问题的根源不是,我建议你将全局常量的声明改为:
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 。