PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ultraschallsensor gibt falsche Werte zurück



eniddelemaj
08.09.2018, 19:27
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/threads/72364-Stromversorgung-bei-mehreren-Sensoren

Zum Roboter:

Ich habe mir ein Roboterbauset gekauft:
https://www.banggood.com/DIY-L298N-2WD-Ultrasonic-Smart-Tracking-Moteur-Robot-Car-Kit-For-Arduino-p-1155139.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:


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:


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!

HaWe
08.09.2018, 21:09
hi,
zuallererst:
die SR04 werden am Arduino angeschlossen, nicht an der Batterie, das gleiche gilt für IR Sensoren, und daher haben sie immer 5V, egal wie die Batteriespannng ist.

Poste mal bitte deinen Schaltplan, als Zeichnung!

Und dann bitte einen kompletten (!) aber vereinfachten Sketch, OHNE MOTOREN, wo einfach nur die Sensoren ausgelesen und die Werte angezeigt werden!

Moppi
08.09.2018, 21:15
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: 33618
Infrarot: https://www.mymakerstuff.de/2017/03/03/arduino-tutorial-der-infrarotsensor/
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).

avr_racer
09.09.2018, 12:12
while ( digitalRead(ECHO_PIN) == 0 );

t1 = micros();
while ( digitalRead(ECHO_PIN) == 1);
t2 = micros();
pulse_width = t2 - t1;

Warum wird die Zeit gesmessen wo der Sender sendet ??
Absolut unnötig, du fragst den Echopin auf 0 ab und machst gar nix in dieser Zeit. Sind nun die 8x40kHz durch,
wird der Echopin auf 1 gesetzt dieser bleibt solange 1 bis ein Echo empfangen wird.

Interrupts GLOBAL deaktivieren
Trigger = 1
warte 50µs
Trigger = 0

EchoPin = 0
warte bis Echopin = 1
starte Timer wenn Echopin = 1
warte bis Echopin = 0
Interrupts GLOBAL aktivieren

Auslesen des Zeitwertes.

Nun kommt der zweite Kasusknacksus

Entweder wird jetzt die gemessene Zeit (in µs) mal Schallgeschwindigkeit(343 m/s) genommen = Weg (in µm)
welcher nur noch halbiert werden muss. SKALIERUNG beachten m/cm/mm/µm
Ebenso kann auch erst die Zeit halbiert werden so das der Weg gleich ein absolutes Endergebnis ist

ODER

man setzt den Timer so das ein Timerbit 58µs entspricht damit kann man die Rechnung umgehen. Auflösung beträgt dann nur 1cm/bit.
Wird der Timer auf 5,8µs / Bit gesetzt beträgt die Auflösung 1mm/bit.

Hier ist auf eine Wiederholrate zu achten vom Messungsabstand von mindestens 20ms

Solltest du den HC-SR04 direkt an eine Versorgungspannung angeschloßen haben die mehr als 5V lieferte besteht die Möglichkeit das dieser defekt ist

HaWe
09.09.2018, 19:53
ich warte ja immer noch aufs Schaltbild, welche Sensoren an welche Pins angeschlossen sind.
Und vor allem, ob US und IR an verschiedenen Pins hängen, denn aus dem Code werde ich nicht schlau ;)

Moppi
09.09.2018, 20:52
Wie es ausschaut, stimmt was mit der Ultraschallmessung in UltraSonic::sendSignal() nicht. Laut der Seite, die ich schon rausgesucht hatte, soll das eigentlich so funktionieren:



digitalWrite(trigger, LOW); //Hier nimmt man die Spannung für kurze Zeit vom Trigger-Pin, damit man später beim senden des Trigger-Signals ein rauschfreies Signal hat.
delay(5); //Dauer: 5 Millisekunden
digitalWrite(trigger, HIGH); //Jetzt sendet man eine Ultraschallwelle los.
delay(10); //Dieser „Ton“ erklingt für 10 Millisekunden.
digitalWrite(trigger, LOW);//Dann wird der „Ton“ abgeschaltet.
dauer = pulseIn(echo, HIGH); //Mit dem Befehl „pulseIn“ zählt der Mikrokontroller die Zeit in Mikrosekunden, bis der Schall zum Ultraschallsensor zurückkehrt.
entfernung = (dauer/2) * 0.03432; //Nun berechnet man die Entfernung in Zentimetern. Man teilt zunächst die Zeit durch zwei (Weil man ja nur eine Strecke berechnen möchte und nicht die Strecke hin- und zurück). Den Wert multipliziert man mit der Schallgeschwindigkeit in der Einheit Zentimeter/Mikrosekunde und erhält dann den Wert in Zentimetern.

HaWe
09.09.2018, 22:42
er schrieb doch, dass angeblich alles funktioniert (also auch der USS), wenn kein IR Sensor angeschlossen ist, erst dann gäbe es Probleme.
Abgesehen davon, dass ich weder seinen USS Code verstehe noch seine UltraSonic:: Klasse noch seinen IR Code irgendwo.
Also würde ich vorschlagen, wir warten jetzt erst mal auf einen vereinfachten lauffähigen Code und Schaltbild, bevor wir weiter mit unseren Kristallkugeln spekulieren ;)

eniddelemaj
11.09.2018, 20:03
er schrieb doch, dass angeblich alles funktioniert (also auch der USS), wenn kein IR Sensor angeschlossen ist, erst dann gäbe es Probleme.
Abgesehen davon, dass ich weder seinen USS Code verstehe noch seine UltraSonic:: Klasse noch seinen IR Code irgendwo.
Also würde ich vorschlagen, wir warten jetzt erst mal auf einen vereinfachten lauffähigen Code und Schaltbild, bevor wir weiter mit unseren Kristallkugeln spekulieren


Ja es funktioniert alles, wenn der infrarot Sensor Nicht angeschlossen ist UND die alte Stromversorgung von 4x 1.5 V angeschlossen ist.
Als ich dann die 6x 1.2V 2600mAh Akkus angeschlossen habe, hat der Sensor angefangen verrückt zu spielen und die Motoren drehten sich schneller.

Womit zeichne ich einen Schaltplan? Gibt es dafür ein Programm, das ich nutzen könnte? Hab mir TinyCad runtergeladen, bin
mir aber nicht sicher ob ich das damit richtig darstellen kann. Hatte schon Probleme ne normale Stromquelle zu zeichnen. Ansonsten habe ich den
Schaltplan aus dem Video eins zu eins übernommen.

Und bei dem Code funktioniert alles. Es kann einfach nicht daran liegen, da der Roboter bzw. der Code
normal funktioniert wenn ich die 1.5V Stromversorgung angeschlossen habe. Es hat also nur was mit der
neuen Stromversorgung zu tun, also vielleicht zu viel Strom oder wenn ich bei der alten Stromversorgung einen weiteren
Sensor anschließe, also zu wenig Strom. Und die neue Stromversorgung sieht dabei ehere aus wie ein Overkill

HaWe
11.09.2018, 20:06
Schaltskizze einfach auf ein Blatt Papier mit Bleistift und Lineal ;)

Und bitte einen kompletten, lauffähigen, möglichst weit heruntergekürzten Sketch Testcode.

Solange wir deinen Code nicht haben und keine Schaltskizze, kannst du keine brauchbare Hilfe erwarten,
denn unsere Kristallkugeln haben eine geringe Treffsicherheit 8)

Moppi
11.09.2018, 22:05
Der Arduino kann mit 7 bis 9V versorgt werden. Der Infrarotsensor wird mit 5V vom Arduino gespeist. Der Ultraschallsensor ebenfalls. So weit sehe ich das bis jetzt, durch meine Kristallkugel. Da ist irgendwo ein Verdrahtungsfehler oder was kaputt. Oder umgebogene Pins (dann ohne Kontakt) und keiner hat's gemerkt. ;-) Für nicht bemerkte Fehler muss jeder seine eigene Kristallkugel haben. Aber wenn wir mehrere Kugeldeutungen zusammenschmeißen, dann kommt doch auch was raus?

HaWe
12.09.2018, 09:51
Der Arduino kann mit 7 bis 9V versorgt werden. Der Infrarotsensor wird mit 5V vom Arduino gespeist. Der Ultraschallsensor ebenfalls...So weit sehe ich das bis jetzt, durch meine Kristallkugel. Da ist irgendwo ein Verdrahtungsfehler oder was kaputt. Oder umgebogene Pins (dann ohne Kontakt) und keiner hat's gemerkt..
schrieb ich ja auch bereits (sogar bis 12V tolerant), daher die Bitte um ein Schaltbild plus zugehörigen Code.

edit:
auch ein Foto, auf dem man die Kabel sauber von den Sensoren zum µC samt Pin-Nummer/Name erkennen kann, könne noch sinnvoll sein.


Aber wenn wir mehrere Kugeldeutungen zusammenschmeißen, dann kommt doch auch was raus?
ein Scherbenhaufen? :p

eniddelemaj
12.09.2018, 20:02
Kann ich bei der Schaltskizze mehrere Zeichnungen machen? Eine, die nur die Stromversorgung betrifft und eine andere,
die die Verbindungen von dem Shield zu den Sensoren zeigt?

Und sorry, dass ich in solch großen Abständen antworte:D
Ich habe viel zu tun gerade, deswegen kann ich nicht immer sofort antworten.

Moppi
12.09.2018, 20:13
Ja, Hauptsache, man sieht erst mal was. Man muss erkennen können, wo was angeschlossen ist.