Fahrzeug auf einem Tisch
Projekt: Bei unserem Projekt soll ein Fahrzeug über einen Tisch fahren ohne von diesem runterzufallen.
Probleme beim Programmieren und Aufbauen:
-
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) - An alle Möglichkeiten des Runterfallens zu denken.
- 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
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