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!
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!