Banner Ausblenden
Kleines Logo

Willkommen auf PSI-Online

Sie befinden sich in: Unterrichtsangebote Fächer Fachbereich III Informatik Arduino Fahrzeuge Fahrzeug auf einem Tisch

Fahrzeug auf einem Tisch

Projekt: Bei unserem Projekt soll ein Fahrzeug über einen Tisch fahren ohne von diesem runterzufallen.

Probleme beim Programmieren und Aufbauen:

  1. Befestigungen der Abstandssensoren.
    Durch die Halterung der Sensoren ist gewährleistet, dass die Abstandsmessung etwa 10 cm vom Rand des Roboters erfolgt. (Siehe Bild 2)
  2. An alle Möglichkeiten des Runterfallens zu denken.
  3. Das Drehen des Fahrzeuges funktioniert nicht. Die dabei entstehende Reibung scheint zu groß zu sein. Vielleicht sind die Batterien zu schwach. Wenn der Roboter hoch gehalten wird, drehen sich die Räder richtig.

        Bild 1                                                                                         Bild2

Htc One S 7799.jpg

Programm:

const int anzeige = 0;   //  Wenn für die Testphase Werte auf dem Monitor angezeigt werden sollen, dann 1 eintragen.
                                         // Achtung wegen der Lesbarkeit wird dann am Ende von loop() ein delay(1000) ausgeführt.
                                         // Dies führt zu einer Verzögerung und es kann auf kleinen Tischen zu Problemen kommen.

const int echovorne = 6;  // Pins zur Messung mit dem vorderen Entfernungssensor
const int triggervorne = 7;
const int echohinten = 2;  // Pins zur Messung mit dem hinteren Entfernungssensor
const int triggerhinten = 3;
const int echolinks = 5;  // Pins zur Messung mit dem linken Entfernungssensor
const int triggerlinks = 4;
const int echorechts = 22;  // Pins zur Messung mit dem rechten Entfernungssensor
const int triggerrechts = 8;


// Pins zur Motorsteuerung
const int links_richtung = 9; //   IN 4,  HIGH = Vorwärts, LOW = Rückwärts
const int rechts_richtung = 10; //  IN 1,  HIGH = Vorwärts, LOW = Rückwärts
const int rechts_geschwindigkeit = 11; //   IN 2, 0 = langsam,  255 = schnell
const int links_geschwindigkeit = 12; //   IN 3, 0 = langsam,  255 = schnell


int mittel = 150;
int status_ = 0;
int status_alt = 0;
float cmvorne = 0;
float cmhinten = 0;
float cmlinks = 0;
float cmrechts = 0;
float abstand = 30;

void setup () {
  Serial.begin(9600);
  pinMode(links_richtung,OUTPUT);
  pinMode(rechts_richtung,OUTPUT);
  pinMode(links_geschwindigkeit,OUTPUT);
  pinMode(rechts_geschwindigkeit,OUTPUT);
  pinMode(triggervorne,OUTPUT);
  pinMode(echovorne,INPUT);
  pinMode(triggerhinten,OUTPUT);
  pinMode(echohinten,INPUT);
  pinMode(triggerlinks,OUTPUT);
  pinMode(echolinks,INPUT);
  pinMode(triggerrechts,OUTPUT);
  pinMode(echorechts,INPUT)
}

void linksvor(int v)      {  digitalWrite(links_richtung,HIGH); analogWrite(links_geschwindigkeit,255-v);}  //Rechte Seite wird dadurch nicht beeinflusst
void linkszurueck(int v)  {  digitalWrite(links_richtung,LOW);  analogWrite(links_geschwindigkeit,v);}  //Rechte Seite wird dadurch nicht beeinflusst
void rechtsvor(int v)     {  digitalWrite(rechts_richtung,HIGH); analogWrite(rechts_geschwindigkeit,255-v);}  //Linke Seite wird dadurch nicht beeinflusst
void rechtszurueck(int v) {  digitalWrite(rechts_richtung,LOW);  analogWrite(rechts_geschwindigkeit,v);}  //Linke Seite wird dadurch nicht beeinflusst

void vorwaerts (int v)    {  linksvor(v); rechtsvor(v);              }
void rueckwaerts (int v)  {  linkszurueck(v); rechtszurueck(v);      }
void rechtsdrehen (int v) {  linksvor(v); rechtszurueck(v);          }
void linksdrehen (int v)  {  linkszurueck(v); rechtsvor(v);          }
void halt()               {  linkszurueck(0);   rechtszurueck(0);      }


void loop () {

//  Vorne Abstand messen
     digitalWrite(triggervorne, LOW);
     delayMicroseconds(2);
     digitalWrite(triggervorne, HIGH);
     delayMicroseconds(10);
     digitalWrite(triggervorne, LOW);
     cmvorne = pulseIn(echovorne, HIGH) / 58.0;
     cmvorne = (int(cmvorne * 100.0)) / 100.0;

// Hinten Abstand messen
     digitalWrite(triggerhinten, LOW);
     delayMicroseconds(2);
     digitalWrite(triggerhinten, HIGH);
     delayMicroseconds(10);
     digitalWrite(triggerhinten, LOW);
     cmhinten = pulseIn(echohinten, HIGH) / 58.0;
     cmhinten = (int(cmhinten * 100.0)) / 100.0;
    
// Links Abstand messen
     digitalWrite(triggerlinks, LOW);
     delayMicroseconds(2);
     digitalWrite(triggerlinks, HIGH);
     delayMicroseconds(10);
     digitalWrite(triggerlinks, LOW);
     cmlinks = pulseIn(echolinks, HIGH) / 58.0;
     cmlinks = (int(cmlinks * 100.0)) / 100.0;
    
// Rechts Abstand messen
     digitalWrite(triggerrechts, LOW);
     delayMicroseconds(2);
     digitalWrite(triggerrechts, HIGH);
     delayMicroseconds(10);
     digitalWrite(triggerrechts, LOW);
     cmrechts = pulseIn(echorechts, HIGH) / 58.0;
     cmrechts = (int(cmrechts * 100.0)) / 100.0;
    
  if (ausgabe !=0) {Serial.print("Abstand vorne: "); Serial.print(cmvorne); Serial.print("      Abstand hinten: "); Serial.println(cmhinten); Serial.print("      Abstand rechts: "); Serial.print(cmrechts); Serial.print("      Abstand links: "); Serial.println(cmlinks);}

//Status    0 = Halt, 1 = Vorwärts,  2 = Rückwärts, 3 = Rechtsdrehen, 4 = Linksdrehen, 5 = Linksdrehen+Rückwärts,  6 = Linksdrehen+Vorwärts, 7 = Rechtsdrehen+Rückwärts, 8 = Rechtsdrehen+Vorwärts

  if (((((cmvorne < abstand) or (cmhinten < abstand) or (cmrechts < abstand) or (cmlinks < abstand) and (status_alt == 0))))) { status_ = 1;}
  if (cmvorne > abstand) { status_ = 2;}
  if (cmhinten > abstand) { status_ = 1;}
  if (cmrechts > abstand) { status_ = 4;}
  if (cmlinks > abstand) { status_ = 3;}

  if ((cmrechts > abstand) and (cmlinks > abstand)) { status_ = 1;}
  if ((cmvorne > abstand) and (cmhinten > abstand)) { status_ = 4;}
  if ((cmrechts > abstand) and (cmhinten > abstand)) { status_ = 6;}
  if ((cmlinks > abstand) and (cmhinten > abstand)) { status_ = 8;}
  if ((cmrechts > abstand) and (cmvorne > abstand)) { status_ = 5;}
  if ((cmlinks > abstand) and (cmvorne > abstand)) { status_ = 7;}

  if (((cmrechts > abstand) and (cmlinks > abstand) and (cmvorne > abstand))) { status_ = 2;}
  if (((cmrechts > abstand) and (cmlinks > abstand) and (cmhinten > abstand))) { status_ = 1;}
  if (((cmrechts > abstand) and (cmhinten > abstand) and (cmvorne > abstand))) { status_ = 4;}
  if (((cmlinks > abstand) and (cmhinten > abstand) and (cmvorne > abstand))) { status_ = 3;}

  if ((((cmrechts > abstand) and (cmlinks > abstand) and (cmvorne > abstand) and (cmhinten > abstand)))) { status_ = 0;}
 

 if (ausgabe !=0) {Serial.print("status_alt: "); Serial.print(status_alt);  Serial.print("      status: "); Serial.println(status_);}

if (status_alt != status_) {
  halt();
  delay(50);
  if (status_ == 1)  { vorwaerts(mittel);}
  if (status_ == 2)  { rueckwaerts(mittel);}
  if (status_ == 3)  { rechtsdrehen(mittel);}
  if (status_ == 4)  { linksdrehen(mittel);}
  if (status_ == 5)  { linksdrehen(mittel); delay(1000); rueckwaerts(mittel);}
  if (status_ == 6)  { linksdrehen(mittel); delay(1000); vorwaerts(mittel);}
  if (status_ == 7)  { rechtsdrehen(mittel); delay(1000); rueckwaerts(mittel);}
  if (status_ == 8)  { rechtsdrehen(mittel); delay(1000); vorwaerts(mittel);}
  if (status_ == 0)  { halt();}
  status_alt = status_;
}

  if (ausgabe !=0) {  delay(1000);  }

}

 

Ein Projekt von Franzi und TImo

Erstellt: Andreas Hecker (03.07.2014) Letzte Änderung: Andreas Hecker (03.12.2014)