PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Distance Sensor HC-SR04 + Arduino



Mulag
25.10.2013, 12:49
Moin zusammen,

ich habe den Distance Sensor SainSmart HC-SR04 an das Breadboard angeschlossen, mithilfe des Arduino Mega 2560 versuche ich die Werte nun auszulesen. An VCC klemme ich 5V an, an GND natürlich GND, an Echo und Trig gehe ich jeweils auf einen Digitalen Pin.
Mithilfe des Codes lasse ich nun die Entfernung berechnen. Klappt wunderbar! Jedoch nicht, wenn ich dem Sensor einen zu weiten "Spielraum" gebe, also vor dem Fliegenauge NICHTS habe und seine Ultraschallwellen einen weiten Raum lasse -oder- schnelle Bewegungen vor ihm mache. Daraus resultieren verrückte Werte. Zu allererst gibt er vernünftige Werte von ca. 45...50 wieder. Dann auf einmal schießt er die Werte auf 4000 hoch und der sofortige nächste Wert ist 4..5 und dann wieder 45...50-iger Werte! Meine angeschlossenen Schrittmotoren laufen dadurch NICHT flüssig!
Wie kann ich das unterbinden? Evtl Pulldown Widerstand? Wo muss ich den anschließen? Oder doch was ganz anderes? Liegt das nur am Programmcode?


Programmcode (nur HC-SR04):


int trigPin = 46;
int echoPin = 47;
int gLed = 31;
int rLed = 30;
long duration, distance;

int distance_counter;

void setup()
{
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(gLed, OUTPUT);
pinMode(rLed, OUTPUT);
}


void loop()
{

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

duration = pulseIn(echoPin, HIGH);

distance = microsecondsToCentimeters(duration);

Serial.println(distance, DEC);

if(distance <= 10)
{
distance_counter++;
if(distance_counter == 3)
{
digitalWrite(gLed, LOW);
digitalWrite(rLed, HIGH);
}
}
else if(distance > 10) {
digitalWrite(gLed, HIGH);
digitalWrite(rLed, LOW);
distance_counter = 0;
}

//delay(100);
}

long microsecondsToCentimeters(long duration)
{
float c_luft = 0.03435;
return c_luft * duration * 1/2;
}



Danke im voraus für eure Hilfe!

shedepe
26.10.2013, 18:15
Der SRF04 hat eine maximal Laufzeit, wenn diese überschritten wurde heißt dass, es wurde nichts erkannt. Das kann man abfangen und entsprechend verarbeiten

Mulag
28.10.2013, 20:17
Danke für deine Antwort,

die maximale Laufzeit beträgt 36ms. Dementsprechend würde ich meinen, dass ich das pulseIn() abfragen kann. pulseIn() arbeitet in Mikrosekunden. Einfach geschrieben



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

if(pulseIn(echoPin, HIGH) < 36000)
{
duration = pulseIn(echoPin, HIGH);
distance = microsecondsToCentimeters(duration);
Serial.println(distance);
} else {
Serial.println("time out");
}


nur haut das natürlich nicht so hin wie ich mir das wünsche... das gesamte System arbeitet sehr träge.
Bitte um weitere Hilfe...