Ultraschallsensor gibt falsche Werte zurück
Ich habe in einem alten Beitrag darüber geklagt, dass der Ultraschallsensor (HC-SR04), möglicherweise aufgrund mangelnder
Stromversorgung, falsche Werte zurückgibt. Dieses Problem tritt auf, wenn ich einen weiteren Sensor
anbringe. Halte ich den Roboter in der Luft so arbeitet der Ultraschallsensor normal. Sobald ich den Roboter abstelle bzw. auf
die Räder Druck ausübe, reagiert der Roboter/Sensor so, als ob ein Hindernis vor ihm steht. Daher die Annahme
der mangelnden Stromversorgung.
Zum Beitrag: https://www.roboternetz.de/community...reren-Sensoren
Zum Roboter:
Ich habe mir ein Roboterbauset gekauft:
https://www.banggood.com/DIY-L298N-2...html?rmmds=buy
Mithilfe dieses Videos habe ich den Roboter zusammengebaut:
https://www.youtube.com/watch?v=BH33F-Hi_2M
Bei 6:14 ist ein Plan mit den Verbindungen zu sehen.
Der zusätzliche Sensor ist ein Infrarotsensor mit dem ich Signale einer Fernbedienung
empfange, um den Roboter fernzusteuern. Dieser Sensor ist auf dem Sensorshield lediglich an den
Pins an der Nummer 3 angeschlossen. Das ist der einzige Unterschied zu dem Plan im Video.
Der Grund für diesen Beitrag ist, dass mir in dem alten Beitrag dazu geraten wurde 6x 1.2V Akkus mit 2600mAh an den
Roboter anzuschließen. Dies habe ich nun gemacht. Nun gibt der Sensor immer noch eigenartige Werte aus und die Gleichstrommotoren
drehen sich sehr schnell. An Strom scheint es nun wahrscheinlich nicht mehr zu mangeln^^.
Das Problem wurde allerdings dadurch nicht gelöst. Der Sensor gibt Werte nicht unter 100 und manchmal bis über 2000 zurück.
Mein Vorschlag wäre nun an die Stromversorgung "einfach" einen Potentiometer anzuschließen und die Stromversorgung so
zu regulieren, bis die Sensoren normal arbeiten. Übrigens, bin ich in dem Bereich Elektrotechnik ein totaler Anfänger.
Ich weiss nicht ob es weiterhilft den Code zu posten, da der Roboter normal funktioniert, wenn ich mit den 4x 1.5V Batterien
die im Bausatz vorhandenen Bauteile betreibe. Das Problem tritt auf, wenn ich den zusätzlichen Infrarotsensor anschließe.
Der Infrarotsensor scheint normal zu arbeiten, nur der Ultraschallsensor spielt verrückt.
Ich versuche die für dieses Problem relevanten Codezeilen herauszupicken.
Ultrasonic Methode sendSignal:
Code:
long UltraSonic::sendSignal()
{
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
while ( digitalRead(ECHO_PIN) == 0 );
t1 = micros();
while ( digitalRead(ECHO_PIN) == 1);
t2 = micros();
pulse_width = t2 - t1;
cm = pulse_width / 58.0;
inches = pulse_width / 148.0;
return cm;
}
Code in dem sich die Kollisionserkennung abspielt:
Code:
void setup() {
leftMotor = new Motor(enA, in1, in2);
rightMotor = new Motor(enB, in3, in4);
servo = new ServoEng();
servo->moveServo(servo->mitte);
irrecv.enableIRIn();
delay(3000);
if (!irC.mode)
{
leftMotor->drive(250);
rightMotor->drive(250);
}
servo->servoPos = 0;
}
void loop() {
if (irrecv.decode(&results)) {
String irResult = String(results.value);
if (irC.mode)
{
//2
if (irResult == "1033561079" || irResult == "16718055" || irResult == "2506190260")
irC.moveForward(rightMotor, leftMotor);
//6
if (irResult == "71952287")
irC.turnRight(rightMotor, leftMotor);
//8
if (irResult == "16730805" || irResult == "465573243")
irC.stopEngines(rightMotor, leftMotor);
//4
if (irResult == "16716015" || irResult == "2351064443")
irC.turnLeft(rightMotor, leftMotor);
}
//5
if (irResult == "16726215")
{
irC.changeMode(rightMotor, leftMotor);
servo->moveServo(servo->mitte);
}
irrecv.resume();
}
if (!irC.mode)
if (findeHinderniss())
{
//Suche Ausweg
findeAusweg();
leftMotor->drive(250);
rightMotor->drive(250);
}
}
bool findeHinderniss()
{
schauDichUm();
int distanceUltraSonic = ultraSonic.sendSignal();
if (distanceUltraSonic < 20)
{
//Stop!
leftMotor->drive(0);
rightMotor->drive(0);
return true;
}
return false;
}
void schauDichUm()
{
if (dreheRechts)
{
if (servo->servoPos <= servo->mitte + 50)
servo->servoPos++;
else
dreheRechts = false;
}
else
{
if (servo->servoPos >= servo->mitte - 50)
servo->servoPos--;
else
dreheRechts = true;
}
servo->moveServo(servo->servoPos);
delay(5);
}
void findeAusweg()
{
int distanceRight = 0;
int distanceLeft = 0;
leftMotor->drive(0);
rightMotor->drive(0);
servo->moveServo(180);
delay(500);
distanceRight = ultraSonic.sendSignal();
delay(50);
servo->moveServo(0);
delay(500);
distanceLeft = ultraSonic.sendSignal();
delay(50);
servo->moveServo(servo->mitte);
delay(200);
if (distanceRight < 20 && distanceLeft < 20)
{
//Fahre rückwärts
leftMotor->drive(-250);
rightMotor->drive(-250);
delay(750);
}
else if (distanceRight > distanceLeft)
{
//Fahre rechts
leftMotor->drive(-250);
rightMotor->drive(250);
delay(500);
}
else
{
//Fahre links
leftMotor->drive(250);
rightMotor->drive(-250);
delay(500);
}
servo->servoPos = servo->mitte;
dreheRechts = true;
dreheLinks = false;
}
Am Code sollte es nicht liegen. Der Code kompiliert und der Roboter
funktioniert solange ich keinen weiteren Sensor als den Ultraschallsensor
anschließe.
Ich würde mich über Hilfe sehr freuen! Danke an alle die sich die Mühe machen!
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo eniddelemaj!
Du schreibst: "Dieser Sensor ist auf dem Sensorshield lediglich an den
Pins an der Nummer 3 angeschlossen."
In dem Film sieht man zwar das Sensor Shield, allerdings kann ich nichts von Nummer 3 lesen oder etwas, was darauf hindeutet. Ich kenne mich aber auch mit dem Sensor Shield nicht aus.
Allerdings denke ich, muss man wissen, wie und wo Du den zusätzlich Sensor ganz genau angeschlossen hast. Ich kann mir zwei Dinge vorstellen:
1. der Infrarotsensor stört den Ultraschallsensor, so, wie der angeschlossen ist (was nicht ersichtlich ist)
2. Es ist irgendwie ein Fehler in der Programmierung
Entweder sehe ich den Infrarotsensor einfach nicht und den Anschluss 3 oder es ist nicht zu erkennen. Vielleicht machst Du mal ein Foto von Deinem Sensor Shield, wenn alles angeschlossen ist, dass man das genau sehen kann. Wer sich damit auskennt, sieht vielleicht, wo das genau angeschlossen ist und wie man das programmtechnisch dann umsetzt, mit dem Infrarot.
Nachtrag:
Sensor Shield: Anhang 33618
Infrarot: https://www.mymakerstuff.de/2017/03/...nfrarotsensor/
Ultraschall: https://funduino.de/nr-10-entfernung-messen
Der Ultraschallsensor wird getriggert, dann wird gewartet, bis der Sensor den Logikpegel eines Pin verändert. Jetzt wird das erste Mal die Zeit erfasst, danach wird gewartet, bis am Pin wieder der Logikzustand geändert wurde. Nun wird das zweite Mal die Zeit erfasst und daraus die Lauflänge des Signals berechnet. Das alles findet im Arduino statt. Hierbei kommt infrage, dass diese Routine gestört/unterbrochen wird. Zum Beispiel durch einen externen Auslöser ein Interrupt ausgelöst und das Programm unterbrochen wird, während es misst. Dauert die Unterbrechung mal länger, mal kürzer, kann das infolge zu falsch berechneten Werten kommen, weil man genau den Punkt abpassen muss, an dem der Logikzustand des Pin wechselt.
Es könnte sein, dass der Infrarotsensor falsch auf dem Board angeschlossen ist. Es könnte sein, dass dieser Sensor defekt ist und die Boardelektronik beeinflusst. Es könnte sein, dass das Sensor Shield nicht richtig aufgesteckt ist oder dass Kontakte nicht richtig zustande kommen oder gar nicht (umgebogene Pin-Stifte).