- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 10 von 52

Thema: "Hindernisfahrt"

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #14
    Erfahrener Benutzer Roboter-Spezialist Avatar von -schumi-
    Registriert seit
    30.12.2009
    Ort
    Wasserburg am Inn / Bayern
    Alter
    31
    Beiträge
    449
    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
    Angehängte Dateien Angehängte Dateien
    Geändert von -schumi- (06.01.2014 um 20:24 Uhr)

Ähnliche Themen

  1. Antworten: 10
    Letzter Beitrag: 01.11.2017, 12:53
  2. Antworten: 2
    Letzter Beitrag: 15.06.2011, 21:18
  3. LPC1114 (Cortex M0): "sei()" und "cli()"
    Von Jaecko im Forum ARM - 32-bit-Mikrocontroller-Architektur
    Antworten: 1
    Letzter Beitrag: 02.07.2010, 12:25
  4. "Soft-Reset?" und "Finger-Interrupt?"
    Von trapperjohn im Forum Asuro
    Antworten: 8
    Letzter Beitrag: 10.06.2008, 23:02
  5. ASM: was machen "swap" und "cbr" genau?
    Von RHS im Forum AVR Hardwarethemen
    Antworten: 3
    Letzter Beitrag: 18.08.2004, 17:16

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen