Autonomes RC Car - Problem

Hallo,

ich möchte ein rc car autonom fahren lassen. Ich nutze dazu ein aurduino motorshield, einen hc-sr04 ultraschallsensor und folgenden motor

Als Stromversorgung für das Motor Shield nutze ich 8 AA Batterien und für den Arduino einen 7,2V Akku.

mein aufbau funktioniert auch schon soweit das das auto “aufgebockt” alles richtig macht, nur wenn ich das auto auf dem boden stelle und der motor das gewicht des autos beschleunigen muss, liefert der ultraschallsensor einen falschen wert und ich kann somit die entfernung nicht genau messen und das auto hält an bzw beschleunigt erst garnicht.

Mein Code und ein Bild vom Aufbau:

#define PWM_A     3
#define DIR_A     12
#define BRAKE_A   9
#define TRIG      4
#define ECHO      2
#define FRONT     0
#define REAR      1
#define SPEED     180

#include <Servo.h>

const int trigPin = 10;
const int echoPin = 7;

long dist[1][3];

Servo servoSteer;
Servo servoFront;

void setup()
{
  pinMode(BRAKE_A, OUTPUT);
  pinMode(DIR_A, OUTPUT);
  
  // sensor init
  
  servoSteer.attach(6); // Attach Servo pins
  servoFront.attach(5);
  //servoRear.attach(5); 
}

void loop()
{ 
  driveHalt();
  
  //Serial.println(getDistance());
  
  scanDistances();
  
  if(dist[0][1] > 100) // Front distance check
  {
    driveForward();
  }
  else if(dist[0][2] > 80) // Front-Left distance check
  {
    driveForwardLeft();
  }
  else if(dist[0][0] > 80) // Front-Right distance check
  {
    driveForwardRight();
  }
}

void driveForward()
{
  servoSteer.write(94);
  servoFront.write(85);
  
  delay(500);
  
  while(getDistance() > 100)
  {
    digitalWrite(BRAKE_A, LOW);
    digitalWrite(DIR_A, HIGH);
    
    analogWrite(PWM_A, SPEED);
  }
  
  driveHalt();
}

void driveForwardLeft()
{
  servoSteer.write(67); 
  servoFront.write(120);

  delay(800);
  
  while(getDistance() > 40)
  {
    digitalWrite(BRAKE_A, LOW);
    digitalWrite(DIR_A, HIGH);
    
    analogWrite(PWM_A, SPEED - 10); 
  }
  
  driveHalt();
}

void driveForwardRight()
{
  servoSteer.write(121);
  servoFront.write(58);
  
  delay(800);  
  
  while(getDistance() > 40)
  {
    digitalWrite(BRAKE_A, LOW);
    digitalWrite(DIR_A, HIGH);
    
    analogWrite(PWM_A, SPEED - 10); 
  }
  
  driveHalt();
}

void driveHalt()
{
  digitalWrite(DIR_A, LOW);
  digitalWrite(BRAKE_A, HIGH);
  
  delay(1000);
  
  digitalWrite(BRAKE_A, LOW);
  analogWrite(PWM_A, 0);
      
  delay(200);  
}

void scanDistances()
{
  servoFront.write(58);
  //servoRear.write(0);
  
  delay(1000);
  
  dist[0][0] = getDistance();
  //getDistance(REAR);
  //Serial.print("Rechts: ");
  //Serial.println(dist[0][0]);

  servoFront.write(120);
  //servoRear.write(179);
  
  delay(1000);
  
  dist[0][2] = getDistance();
  //getDistance(REAR);
  //Serial.print("Links: ");
  //Serial.println(dist[0][2]);

  servoFront.write(85);
  //servoRear.write(90);
  
  delay(1000);
  
  dist[0][1] = getDistance();
  //getDistance(REAR);
  //Serial.print("Mitte: ");
  //Serial.println(dist[0][1]);
}

long getDistance()
{   
  // establish variables for duration of the ping,
  // and the distance result in inches and centimeters:
  long duration, inches, cm;
   
  // The sensor is triggered by a HIGH pulse of 10 or more microseconds.
  // Give a short LOW pulse beforehand to ensure a clean HIGH pulse:
  pinMode(trigPin, OUTPUT);
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
   
  // Read the signal from the sensor: a HIGH pulse whose
  // duration is the time (in microseconds) from the sending
  // of the ping to the reception of its echo off of an object.
  pinMode(echoPin, INPUT);
  duration = pulseIn(echoPin, HIGH);
   
  // convert the time into a distance
  inches = microsecondsToInches(duration);
  cm = microsecondsToCentimeters(duration);
  
  return cm;
}

long microsecondsToInches(long microseconds)
{
  // According to Parallax's datasheet for the PING))), there are
  // 73.746 microseconds per inch (i.e. sound travels at 1130 feet per
  // second). This gives the distance travelled by the ping, outbound
  // and return, so we divide by 2 to get the distance of the obstacle.
  // See: http://www.parallax.com/dl/docs/prod/acc/28015-PING-v1.3.pdf
  return microseconds / 74 / 2;
}
 
long microsecondsToCentimeters(long microseconds)
{
  // The speed of sound is 340 m/s or 29 microseconds per centimeter.
  // The ping travels out and back, so to find the distance of the
  // object we take half of the distance travelled.
  return microseconds / 29 / 2;
}

Ohne den Code jetzt verstanden zu haben klingt das für mich so als hättest du ein Problem mit der Stromversorgung. Miss doch mal die Stromaufnahme bzw die Versorgungsspannungen beim Anfahren.

Gruß

Hey, cooles Teil!

Vermutlich kommen durch die belasteten Motoren Störungen rein. Entweder induktiv über die Sensorkabel, oder über die Versorgungsspannung.

Bau mal ein paar größere Kondensatoren vor den Ultra-Sensor. Und parallel zum Motor 10nF-100nF.

http://www.modellbau-weissensee.de/technik/seiten/motorentstoerung.htm

http://www.google.de/search?q=dc+motor+entstören

Hey vielen Dank schonmal soetwas hatte ich auch vermutet.

Kann ich auch ELKO Kondensatoren benutzen und nicht die Keramik Kondesatoren wie in dem Beispiel? Und wenn ja, wie mache ich das mit der Polung?

Sorry ich habe noch nicht viel Ahnung von der Materie ;-)

Shaft88: Hey vielen Dank schonmal soetwas hatte ich auch vermutet.

Kann ich auch ELKO Kondensatoren benutzen und nicht die Keramik Kondesatoren wie in dem Beispiel? Und wenn ja, wie mache ich das mit der Polung?

Sorry ich habe noch nicht viel Ahnung von der Materie ;-)

Nein. Verschieden große Kondensatoren haben veschiedene Eigenschaften. Ein Elko geht nicht gut. Es müssen 0,1µF Keramikkondensatoren sein. Kauf Dir einige davon; Du brauchst sie immer wieder. Grüße Uwe

Zu Spannungs-Stabilisierung, Elkos.

An dem Motor geht das nicht. Da muss es ein Keramikkondi sein. Du willst ja auch Rückwärtsfahren!

Alles klar! Dann muss ich mir jetzt erst welche besorgen.

Was genau würdet ihr für den Ultraschallsensor verwenden? Und muss ich nur vcc und ground vom sensor "abschirmen" oder auch den echo/trigger pin?

100µ Sollten am Ultraschall reichen. An Signalleitungen haben Elkos nichts zu suchen. Je nach dem, um welches Signal es sich handelt, eher abgeschirmtes Kabel verwenden...

Jetzt hab ich die Kondensatoren am motor und am sensor, doch das Problem ist immernoch das gleiche....

Auto fährt los -> Sensor bekommt falschen Wert und hält an

Der Motor fängt dann auch nach kurzer Zeit an zu brummen. Dann fährt das Auto garnichtmehr los sondern es "zuckt" nurnoch kurz und scannt dann wieder die Entfernungen...

Wenn´s hilft kann ich nochmal Bilder zur verkabelung posten

Hallo,

mal eine Frage: Kann es sein, dass der Sensor Reflektionen vom Boden empfängt, die er eben nicht bekommt, wenn Dein Auto aufgebockt ist?

Gruß, Ralf

hab jetzt mal den sensor etwas nach oben gerichtet und es passiert immernoch das gleiche.

der sensor liefert ohne motor richtige werte auch auf dem boden.

mit motor kommen in der anlaufzeit falsche werte an danach aber wieder richtige.

Ich verstehe aber auch nicht ganz wieso das sein kann ich betreibe den motor ja mit dem motor shield und die stromversorgungen laufen getrennt. Wie kann der Motor dann die pins am arduino beeinflussen?

Der Motor dürfte rund 1A ziehn- bei optimaler Auslegung des Antriebsstranges. Das packen deine Batterien vermutlich nicht, jedenfalls nicht auf Dauer. Versuchs mal mit guten Akkus, z.B. Eneloop. Die normalen NiMh für Digicams usw. sind auch ungeeignet. Eventuell überlastest du auch das Motorshield- weiss grade nicht, wieviel Leistung die bereitstellen, aber so doll wars auch nicht.

Shaft88: Ich verstehe aber auch nicht ganz wieso das sein kann ich betreibe den motor ja mit dem motor shield und die stromversorgungen laufen getrennt. Wie kann der Motor dann die pins am arduino beeinflussen?

Naja, zumindest an GND müssen sie ja verbunden sein. Außerdem steckt das Motorshield ja auf dem Arduino, auch da gibt es Berührungspunkte.

Aber ohne das ich mal hier und da ein Oszilloskop dranhalten kann, fällt mir im Moment nichts sinnvolles mehr ein.

Gruß, Ralf

  • Mach bitte nochmal ein Foto.
  • Verwende mal versuchsweise für die Sensorleitung des Ultraschallsensors ein Mikrofonkabel und lege den Schirm nur an einem Ende am Arduino auf Masse.
  • Wo ist der 7,2V Akku für den Arduino zu sehen?