Liste der Anhänge anzeigen (Anzahl: 1)
Hab ich gemacht, zumindest so halbwegs.
Ich glaube es ist logisch: Am ersten weißen Kreis soll sich der Robo(das Quadrat) links drehen, dann ab dann per Infrarot den Boden scannen und sich am schwarzen Kreis(Wert >180) rechts drehen, damit er auf das nächste Hindernis zu fahren kann. Danach dasselbe in grün nur umgekehrt, also erst rechts drehen, dann links. Wie gesagt, ich hab was für das Infrarot geschrieben, nur will es nicht. Wie kann ich das anders machen?
Und noch eine Frage: Wie kann ich es machen, dass sich der Robo genau 90° dreht? Irgendwie macht der das nur manchmal...
So sieht das Programm derzeit aus:
Code:
while(1)
{
int abstand = robot.analog(1);
//int infrarot = robot.analog(3);
if( drehrichtung == geradeaus)
{
robot.motors(25,25); //geradeaus fahren
if( abstand < hindernis)
{
if(schonNachLinksAusgewichen == False)
drehrichtung = linksDrehung;
else
drehrichtung = rechtsDrehung;
}
}
if( drehrichtung == linksDrehung )
{
robot.motors(-255, 255); // nach links drehen
if( abstand >= freieSicht )
{
robot.motors(125,125);
schonNachLinksAusgewichen = True;
//if( infrarot > 180){
//robot.motors(100,-100);
//msleep(500);
//}
}
}
if( drehrichtung == rechtsDrehung )
{
robot.motors(200, -200); // nach rechts drehen
if( abstand >= freieSicht )
{
robot.motors(100,100);
schonNachLinksAusgewichen = False;
//msleep(500);
//if( infrarot > 180){
//robot.motors(-100,100);
//}
// Er ist zwar schon mal nach links ausgewichen, aber inzwischen auch schon rechtsrum, also wieder von vorne
}
}
}
}
____
Leider habe ich im Alltag nicht all zu viel Zeit dafür, mich einzulesen und jetzt ist zu spät, Ferienende. Zudem sollte das Ding eigentlich bis Mittwoch fertig sein, werd ich aber wohl nicht schaffen. Nun gut, kann man nix machen...
Liste der Anhänge anzeigen (Anzahl: 2)
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