Gut, dass du endlich eine Skizze lieferst. Das mit den Hindernissen habe ich erst nicht so verstanden, erst wie du das Infrarot erklärt hast. Dafür habe ich dann das Infrarot nicht kapiert. So sieht man gleich was Sache ist, und es ist ganz klar, dass das vorherige Programm hierfür nicht geeignet ist.
Da du es zumindest versucht hast gibts auch als Belohnung (auch im Anhang nochmal als tmp.c, damit die Einrückungen korrekt erhalten bleiben):
Code:
#include "qfixMiniBoard.h"
#include "qfixLCD.h"
MiniBoard robot;
// Müssen evtl. angepasst werden:
#define HindernisAbstand 85
#define Schwarzwert 180
#define Drehgeschwindigkeit 25
#define Drehzeit 3000 // in ms
#define Fahrgeschwindigkeit 25
// Feste Konstanten:
#define SensorAbstand 1
#define SensorInfrarot 3
#define Links 1
#define Rechts 2
int main()
{
// Es wird davon ausgegangen, dass der Robo so los fährt wie auf deiner Skizze, also auf der rechten Seite (und somit als erstes nach links muss):
unsigned char naechsteAbbiegungNach = Links
while(1)
{
robot.motors(Fahrgeschwindigkeit,Fahrgeschwindigkeit); // Zuerst mal geradeaus fahren
while(robot.analog(SensorAbstand)>HindernisAbstand); // Und so lange kein Hindernis in sicht nichts anderes tun
robot.motors(0,0); // Jetzt muss ein Hindernis da sein, also erst mal stehen bleiben
if(naechsteAbbiegungNach == Links) // Wenn wir jetzt als nächstes nach links müssen...
robot.motors(-Drehgeschwindigkeit, Drehgeschwindigkeit); // ..drehen wir mal nach links
else if(naechsteAbbiegungNach == Rechts)
robot.motors(Drehgeschwindigkeit, -Drehgeschwindigkeit);
msleep(Drehzeit); // Da es keinen Anhaltspunkt gibt, wie weit nach links, einfach mal eine bestimmte Zeit lang...
robot.motors(Fahrgeschwindigkeit,Fahrgeschwindigkeit); // Und wenn fertig gedreht wieder geradeaus fahren (jetzt bewegt sich der Robo von einer Seite zur anderen)
while(robot.analog(SensorInfrarot)<Schwarzwert); // Solange der Infrarotwert nicht "schwarz" bedeuted, nichts weiter machen
robot.motors(0,0); // Jetzt muss der schwarze Punkt da sein, also erst mal stehen bleiben
// Bsp. für Linksabbiegung: Um die Linksabbiegung abzuschließen muss der Robo sich jetzt wieder nach rechts drehen, damit er wieder gerade steht.
if(naechsteAbbiegungNach == Links)
robot.motors(Drehgeschwindigkeit, -Drehgeschwindigkeit);
else if(naechsteAbbiegungNach == Rechts) // Und um die Rechtsabbiegung abzuschließen nach links drehen
robot.motors(-Drehgeschwindigkeit, Drehgeschwindigkeit);
msleep(Drehzeit); // Da es keinen Anhaltspunkt gibt, wie weit nach links, einfach mal eine bestimmte Zeit lang...
robot.motors(0,0); // fertig gedreht
// So, jetzt hat der Roboter entweder von der rechten auf die linke Seite gewechselt (Linksabbiegung) oder anders herum. Da er durch das zweite Drehen in die andere Richtung
// jetzt auch wieder gerade steht und auf das nächste Hindernis zufahren kann, geht das ganze wieder von vorne losgehen. Nur müssen wir vorher noch die nächste Abbiegung bestimmen,
// die logischerweise genau das Gegenteil von der letzten Abbiegung ist:
if(naechsteAbbiegungNach == Links)
naechsteAbbiegungNach == Rechts;
else if(naechsteAbbiegungNach == Rechts)
naechsteAbbiegungNach == Links;
}
return 0; // Keine Relevanz für den Programmablauf, gehört sich aber für ein sauberes C-Programm
}
Auch wenn du deine Hausaufgabe jetz (zumindest zum Großteil hast), musst du noch an deinen Fähigkeiten in Sachen Programmierung arbeiten. Denn wenn ihr darüber auch Prüfungen schreibt, wirst du da mit Ach und Krach durchrasseln.. (Ich würde vorschlagen, du übst weiter mit dem Robo, aber mit einfacheren Aufgabenstellungen)
Viele Grüße
schumi
PS: das #define ist einfach nur Textersetzung, die vom sogenannten Preprozessor durchgeführt wird. Der entfernt auch alle Kommentare usw. und bereitet so den Quellcode zum kompilieren (übersetzen in Maschinensprache) vor. Wie das Programm mit den Ersetzungen aussieht kannst du auch im Anhang sehen (ich habe nur die #include weggelassen, weil die auch der Preprozessor behandelt, die aber nicht auf meinem Computer installiert sind)
[EDIT]
Habe noch Fehler gefunden:
Bei den msleep muss es natürlich nicht Drehgeschwindigkeit sondern Drehzeit heißen! Kann ich aber in den Anhängen anscheinend nicht mehr ändern.. Und das #define True/False ist jetzt auch überflüssig
Lesezeichen