Und wieder "int infrarot = robot.analog(3);" in der while Schleife.
MfG Hannes
Und wieder "int infrarot = robot.analog(3);" in der while Schleife.
MfG Hannes
Danke, hab dass aber schon irgedwann heute morgen reingeschrieben. Soweit passt das jetzt auch. Jetzt brauch ich nur noch dieses blöde Infrarot. Hier der Code der Linksdrehung:
Das Infrarot ist grad noch auskommentiert, da es nicht klappt. Wie bekomm ich es hin, dass:Code:if( drehrichtung == linksDrehung ) { robot.motors(-255, 255); // nach links drehen if( abstand >= freieSicht ) { robot.motors(200,200); schonNachLinksAusgewichen = True; //if( infrarot > 180){ //robot.motors(100,-100); //msleep(500); //} }
- Der Robo nach der Linksdrehung eben wieder geradeaus in waagrechte Richtung fährt, aber währenddessen per Infrarot den Boden prüft und bei > 180 (das ist der Wert, hab ich über die LEDs geprüft) sich wieder dreht (hier nach rechts)? Wenn ich das nicht habe, komm ich gar nicht weiter und ich weiß leider nicht, was ich da noch verändern könnte, so dass er das macht. Habt ihr ne Ahnung, wie ich das hinbekommen könnte?
Was funktioniert nicht? Was macht der Roboter?
Mach einfach eine Skizze wie und wo der Roboter auf was reagieren soll. Das dein Roboter waagrechter Richtung fährt ist eigentlich logisch.
Du könntest dich auch weiter informieren (es gibt nicht nur if Schleifen) z.B. der Link den ich oben gepostet habe. Es gibt auch fußgesteuerte Schleifen, if und while sind kopfgesteuerte Schleifen da diese am Anfang überprüft werden.
Für die Skizze kannst du ein CAD Programm herunterladen oder du verwendest einfach Paint.
MfG Hannes
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...
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):
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)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 }
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
Geändert von -schumi- (06.01.2014 um 20:24 Uhr)
Für koordiniertes Drehen bräuchtest du entweder Schrittmotore oder eine Winkelrückmeldung von den Rädern, ansonsten wirst du immer Abweichungen drin haben.
Was funktioniert an den schwarzen Kreisen nicht?
Hab ich das richtig verstanden, dass der Roboter an der Unterseite irgendwo (?) einen Infrarotsensor hat, der Schwarz von nicht-Schwarz unterscheiden kann? Das wär dann doch genauso zu lösen, wie die Detektion vom Hindernis, nur, dass er sich nicht zwingend nochmal zurück bewegen muss.
Um den schwarzen Kreis sicher zu treffen, wäre wirklich gut, wenn der Roboter seine Orientierung bestimmen könne. Das Einfachste wäre wohl ein Kompasssensor, ansonsten lässt sich das wohl nur über die Radstellungen gewinnen. Gibt auch noch andere Verfahren, die dann aber meist mit zusätzlichen Raumpunkten, zB. Infrarotmarkern, arbeiten, aber das wird eben immer aufwändiger. Wenn sowas nicht zur Verfügung steht, musst du wohl oder übel hoffen, dass er beim Drehen nicht zu weit von den 90° abweicht. Gegebenenfalls die Wartezeit beim Drehen noch anpassen, sind ja noch ziemlich runde Werte. Vielleicht bringt es ja schon was, beim Drehen mit der Geschwindigkeit ein wenig runter zu gehen.
Soviel hab ich jetzt gar nicht erwartet.![]()
Aber danke!![]()
Nun, es gibt dennoch nen kleinen Fehler:
Er dreht sich ständig im Kreis(hatte das Problem schonmal, als ich den Infrarotsensor einsetzte). Könnt mir also vorstellen, dass das wieder am Infrarotsensor(?!) liegt. Er fährt nämlich solange geradeaus, bis er die Stelle gefunden hat, die über 180 ist. Wie kann man das ändern, dass der den Infrarotsensor erst nach dem ersten Drehen benutzt, also erstmal ganz normal auf das Hindernis zu fährt, sich dann dreht und dann die Stelle sucht, die über dem Wert 180 liegt? Vielleicht kann man den Infrarotsensor ja "schlafen" lassen bis zu ner bestimmten Zeit.
Kannst du noch mal ganz genau Schritt für Schritt erklären, was passiert wenn du ihn so wie in deiner Skizze hinsetzt und einschaltest? Du musst immer so präzise wie möglich beschreiben, sonst weis man nicht an welcher Stelle des Codes es hapert..
Lesezeichen