- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 4 von 4

Thema: Roboter mit Bascom Steuern ?!

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.10.2004
    Ort
    GRAZ
    Alter
    57
    Beiträge
    576

    Roboter mit Bascom Steuern ?!

    Anzeige

    Praxistest und DIY Projekte
    Hallo Leute

    Habe mir da so einen kleinen Bot gebaut:
    https://www.roboternetz.de/phpBB2/ze...ag.php?t=13915

    Den habe ich mal so gesteuert:
    Code:
    '--------Roboter KKL Steuerung --------------------
    ' Mit externen 10MHz Quarz
    
    $regfile = "m8def.dat"
    $crystal = 8000000
    
    
    '---Config Port's--------------------
    Config Portd = Input
    Portd = 255
    
    Config Portb = Output
    
    
    
    '---Sonstiges------------------------
    Dim A As Word
    
    Links_vorne Alias Pind.3
    Links_hinten Alias Pind.4
    Rechts_vorne Alias Pind.1
    Rechts_hinten Alias Pind.0
    
    '========================================================================
    '========= Hauptprogramm ================================================
    '========================================================================
    Portb = 0
    Gosub Vor
    Do
    
    
    If Links_vorne = 0 Then
       Gosub Zurueck
       Wait 2
       Gosub Rechts
       Wait 2
       Gosub Vor
    End If
    
    If Rechts_vorne = 0 Then
       Gosub Zurueck
       Wait 2
       Gosub Links
       Wait 2
       Gosub Vor
    End If
    
    
    
    Loop
    
    
    End
    
    
    
    '===============UnterProgramme===========================================
    Links:
    Portb.1 = 1
    Portb.2 = 1
    Portb.3 = 0
    Return
    
    
    Rechts:
    Portb.1 = 1
    Portb.2 = 0
    Portb.3 = 1
    Return
    
    
    Zurueck:
    Portb.1 = 1
    Portb.2 = 1
    Portb.3 = 1
    Return
    
    
    Vor:
    Portb.1 = 1
    Portb.2 = 0
    Portb.3 = 0
    Return
    
    
    Stopen:
    Portb.1 = 0
    Portb.2 = 0
    Portb.3 = 0
    Return
    Noch mit Waits.... aber es funktionierte schonmal

    Nächster Schritt:
    Code:
    '--------Roboter KKL Steuerung --------------------
    ' Mit externen 10MHz Quarz
    '$sim
    
    $regfile = "m8def.dat"
    $crystal = 8000000
    
    
    '---Config Port's--------------------
    Config Portd = Input
    Portd = 255
    
    Config Portb = Output
    
    
    '---Config Timer -------------------
    Config Timer0 = Timer , Prescale = 64
    
    
    
    
    '---Sonstiges------------------------
    Dim Sensor As Byte
    
    Links_vorne Alias Pind.0
    Rechts_vorne Alias Pind.1
    Links_hinten Alias Pind.2
    Rechts_hinten Alias Pind.3
    
    
    On Timer0 Sensoren_auswerten
    Enable Timer0
    Enable Interrupts
    
    
    '========================================================================
    '========= Hauptprogramm ================================================
    '========================================================================
    
    Portb = 0
    Gosub Vor
    
    Do
    
    
    If Sensor = 1 Then
       Gosub Zurueck
       Wait 2
       Gosub Rechts
       Wait 2
       Gosub Vor
    End If
    
    If Sensor = 2 Then
       Gosub Zurueck
       Wait 2
       Gosub Links
       Wait 2
       Gosub Vor
    End If
    
    If Sensor = 3 Then
       Gosub Vor
       Waitms 500
       Gosub Links
       Waitms 500
       Gosub Vor
    End If
    
    If Sensor = 4 Then
       Gosub Vor
       Waitms 500
       Gosub Rechts
       Waitms 500
          Gosub Vor
    End If
    
    
    
    Loop
    
    
    End
    
    
    
    '===============UnterProgramme===========================================
    
    
    Sensoren_auswerten:
    'Timer0 = 0
    Sensor = 0
    If Links_vorne = 0 Then Sensor = 1
    If Rechts_vorne = 0 Then Sensor = 2
    If Links_hinten = 0 Then Sensor = 3
    If Rechts_hinten = 0 Then Sensor = 4
    
    
    'Gosub Zurueck
    Return
    
    
    
    
    Links:
    Portb.1 = 1
    Portb.2 = 1
    Portb.3 = 0
    Return
    
    
    Rechts:
    Portb.1 = 1
    Portb.2 = 0
    Portb.3 = 1
    Return
    
    
    Zurueck:
    Portb.1 = 1
    Portb.2 = 1
    Portb.3 = 1
    Return
    
    
    Vor:
    Portb.1 = 1
    Portb.2 = 0
    Portb.3 = 0
    Return
    
    
    Stopen:
    Portb.1 = 0
    Portb.2 = 0
    Portb.3 = 0
    Return
    Da verwende ich einen Timer0 als interrupt,.
    der Soll mir immer die Sensoren (bei Überlauf)
    (derzeit noch 4 Mikroschalter, später vielleicht mehr Sensoren..),
    Life auslesen und auch Life reagieren.

    Natürlich passen hier die Waits noch nicht, weil er so seinen Ausweichschritt fertig macht und dann erst neu auf Sensoren reagiert.

    Habe das mal so probiert, funktioniert aber nicht, weil man aus einem Interrupt wohl nicht verzweigen darf.




    Code:
    '--------Roboter KKL Steuerung --------------------
    '$sim
    
    $regfile = "m8def.dat"
    $crystal = 8000000
    
    
    '---Config Port's--------------------
    Config Portd = Input
    Portd = 255
    
    Config Portb = Output
    
    
    '---Config Timer -------------------
    Config Timer0 = Timer , Prescale = 64
    
    
    
    
    '---Sonstiges------------------------
    Dim Sensor As Byte
    
    Links_vorne Alias Pind.0
    Rechts_vorne Alias Pind.1
    Links_hinten Alias Pind.2
    Rechts_hinten Alias Pind.3
    
    
    On Timer0 Sensoren_auswerten
    Enable Timer0
    Enable Interrupts
    
    
    '========================================================================
    '========= Hauptprogramm ================================================
    '========================================================================
    
    Portb = 0
    Gosub Vor
    
    Do
    
    Goto Sprung
    Ausweichen_rechts:
       Gosub Zurueck
       Wait 2
       Gosub Rechts
       Wait 2
       Gosub Vor
      Goto Sprung
    
    Ausweichen_links:
       Gosub Zurueck
       Wait 2
       Gosub Links
       Wait 2
       Gosub Vor
     Goto Sprung
    
    R_ausweichen_links:
       Gosub Vor
       Waitms 500
       Gosub Links
       Waitms 500
       Gosub Vor
      Goto Sprung
    
    R_ausweichen_rechst:
       Gosub Vor
       Waitms 500
       Gosub Rechts
       Waitms 500
          Gosub Vor
       Goto Sprung
    
    Sprung:
    
    
    Loop
    
    
    End
    
    
    
    '===============UnterProgramme===========================================
    
    
    Sensoren_auswerten:
    'Timer0 = 0
    Sensor = 0
    If Links_vorne = 0 Then Goto Ausweichen_rechts
    If Rechts_vorne = 0 Then Goto Ausweichen_links
    If Links_hinten = 0 Then Goto R_ausweichen_rechst
    If Rechts_hinten = 0 Then Goto R_ausweichen_links
    
    
    Return
    
    
    
    
    Links:
    Portb.1 = 1
    Portb.2 = 1
    Portb.3 = 0
    Return
    
    
    Rechts:
    Portb.1 = 1
    Portb.2 = 0
    Portb.3 = 1
    Return
    
    
    Zurueck:
    Portb.1 = 1
    Portb.2 = 1
    Portb.3 = 1
    Return
    
    
    Vor:
    Portb.1 = 1
    Portb.2 = 0
    Portb.3 = 0
    Return
    
    
    Stopen:
    Portb.1 = 0
    Portb.2 = 0
    Portb.3 = 0
    Return
    Mein Ziel wäre es, dass er z.B.:
    Wenn z.B. der Linke vordere Schalter schaltet, soll er ein Stück rückwärts und dann nach rechts ausweichen.
    Während er aber ausweicht, sollte er auf alle anderen Sensoren auch noch reagieren. (z.B. die hinteren. )

    Hat jemand eine Idee/Vorschlag wie man das am besten aufbauen kann?!
    Es sollte auch Modular sein..

    Ich dachte zuerst so:
    Der Interrupt fragt immer die Sensoren selbstständig ab, und speichert einen Wert für einen Sensor in einer Variablen namens "Sensor"
    z.B. Taster Links_vorne = 1 u.s.w. (wie im vorletzten Beispiel)

    Die Variable Sensor, müsste ich dann extra im Hauptprogramm abfragen und dann je nach Wert, in ein Unterprogramm verzweigen... (z.B nach ausweichen_rechts)

    Im Unterprogramm selbst,müsste ich auch wieder den Sensorwert auswerten (nach allen möglichkeiten)...um das Unterprogramm abzubrechen, falls sich ein Sensor ändert..

    Irgendwie wird das dann alles zu aufgebläht

    Geht das irgendwie einfacher ?

    Irgendwie sollte das dann auch so funktionieren, dass man im einfach auch was lernen kann... (also nicht nur "fixer" Code..)
    Also bestimmte Bedingungen einfach beschreiben kann, auf die er dann reagieren soll...
    Irgendwie sehe ich noch keinen rechten Weg, wie es funktionieren könnte...
    Vielleicht mit Tabellen ..?!

    Vielleicht wisst ihr ja mehr..

    l.G. aus Graz

  2. #2
    Gast
    hallo.
    bei timer0 kann es passieren das der schalter geschaltet hat, aber die timerroutine noch nicht angesprungen wurde zum auswerten.

    zum sofortigen reagieren kannst du nur den interrupt0 oder einen anderen weiteren nehmen, dann wird sofort die routine angesprungen wenn ein schalter kontakt hat.

    das ausweichen geht auch nur genau, wenn du zb sharpsensoren nehmen tust und dann nach einem bestimten wert den robby steuerst.

    die wait-schleifen sind relativ, weil auch mal die räder rutschen usw.

    einfacher gehen die auswertungen nicht, es muss schon ein bisschen code entstehen. so mir nichts dir nichts geht es nicht. die Sensoren anbringen ist einfach, aber das proggen nachher ist etwas anderes.

    mfg psf

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.10.2004
    Ort
    GRAZ
    Alter
    57
    Beiträge
    576
    Hallo psf

    bei timer0 kann es passieren das der schalter geschaltet hat, aber die timerroutine noch nicht angesprungen wurde zum auswerten.
    Ich glaube das müsste von der Zeit her schon reichen..



    zum sofortigen reagieren kannst du nur den interrupt0 oder einen anderen weiteren nehmen, dann wird sofort die routine angesprungen wenn ein schalter kontakt hat.
    Aber ich habe nicht so viele Interrupts..
    Nachher kommen (können) ja noch mehr Sensoren (sharp) und das ghet dann mit Interrupt nicht mehr..


    die wait-schleifen sind relativ, weil auch mal die räder rutschen usw.
    Ja finde ich auch.
    Aber auch eine Drehkontrolle, durch z.B. Encoder oder durch Stepper, bringt meines achtens auch nicht viel (wie manche so machen)
    Weil da eben wieder die datenverfelschung entsteht, wenn das Rad durchdreht.
    Alternative könnte man zwei zusätzliche Räder anbringen, mit Encoder, die nur mitlaufen und den Weg messen.

    Aber eigentlich sollte es in die Richtung gehen, dass er sich an der Umgebung orientiert und nicht an seinem Weg..

    einfacher gehen die auswertungen nicht, es muss schon ein bisschen code entstehen. so mir nichts dir nichts geht es nicht. die Sensoren anbringen ist einfach, aber das proggen nachher ist etwas anderes.
    Ja, genau.
    Darum frage ich auch Euch, wie ihr das so gemacht habt.
    Finde da leider im Forum nicht viel darüber..

    Vielleicht ein paar Beispiele, Lösungsansetze ?!

    Mir schebt das irgendwie Modular vor.
    Nicht dass ich in einem Unterprogramm, alle anderen Sensoren auch immer mitabfragen/auswerten muss.

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.10.2004
    Ort
    GRAZ
    Alter
    57
    Beiträge
    576
    Hallo
    Hab es jetzt doch mit einem Interrupt gemacht.
    Da bleibt mir dann auch ein Timmer frei
    Mit Vier Dioden zum Interrupt pin Int0

    Code:
    '--------Roboter KKL Steuerung --------------------
    '$sim
    
    $regfile = "m8def.dat"
    $crystal = 8000000
    
    
    '---Config Port's--------------------
    Config Portd = Input
    Portd = 255
    
    Config Portb = Output
    
    
    '---Config Timer -------------------
    Config Timer0 = Timer , Prescale = 64
    
    
    '---Config Interrupt-----------------
    Config Int0 = Falling
    
    
    '---Sonstiges------------------------
    Dim Sensor As Byte
    Dim A1 As Word
    Dim A2 As Word
    
    
    
    
    
    'On Timer0 Sensoren_auswerten
    'Enable Timer0
    Enable Interrupts
    
    
    '========================================================================
    '========= Hauptprogramm ================================================
    '========================================================================
    Portb = 0
    'Gosub Vor
    
    On Int0 Sensoren_auswerten
    Enable Int0
    
    
    Do
    
    Anfang:
    Select Case Sensor
    Case 1:
         Gosub Zurueck
                For A1 = 1 To 5
                    If Sensor <> 1 Then Goto Anfang
                For A2 = 1 To 65500
                Next A2
                Next A1
         Gosub Rechts
                For A1 = 1 To 5
                    If Sensor <> 1 Then Goto Anfang
                For A2 = 1 To 65500
                Next A2
                Next A1
         Gosub Vor
                Sensor = 0
    Case 2:
         Gosub Zurueck
                For A1 = 1 To 5
                    If Sensor <> 2 Then Goto Anfang
                For A2 = 1 To 65500
                Next A2
                Next A1
         Gosub Links
                For A1 = 1 To 5
                    If Sensor <> 2 Then Goto Anfang
                For A2 = 1 To 65500
                Next A2
                Next A1
         Gosub Vor
                Sensor = 0
    Case 3:
         Gosub Vor
                For A1 = 1 To 1
                    If Sensor <> 3 Then Goto Anfang
                For A2 = 1 To 65500
                Next A2
                Next A1
         Gosub Links
                For A1 = 1 To 1
                    If Sensor <> 3 Then Goto Anfang
                For A2 = 1 To 65500
                Next A2
                Next A1
         Gosub Vor
            Sensor = 0
    Case 4:
         Gosub Vor
                For A1 = 1 To 1
                    If Sensor <> 4 Then Goto Anfang
                For A2 = 1 To 65500
                Next A2
                Next A1
         Gosub Rechts
                For A1 = 1 To 1
                    If Sensor <> 4 Then Goto Anfang
                For A2 = 1 To 65500
                Next A2
                Next A1
         Gosub Vor
                Sensor = 0
    End Select
    
    
    
    
    
    Loop
    
    
    End
    
    
    
    '===============UnterProgramme===========================================
    
    
    Sensoren_auswerten:
    If Pind.4 = 0 Then Sensor = 1           'Sensor links vorne
    If Pind.5 = 0 Then Sensor = 2           'Sensor rechts vorne
    If Pind.6 = 0 Then Sensor = 3           'Sensor links hinten
    If Pind.7 = 0 Then Sensor = 4           'Sensor rechts hinten
    Return
    
    
    Links:
    Portb.1 = 1
    Portb.2 = 1
    Portb.3 = 0
    Return
    
    
    Rechts:
    Portb.1 = 1
    Portb.2 = 0
    Portb.3 = 1
    Return
    
    
    Zurueck:
    Portb.1 = 1
    Portb.2 = 1
    Portb.3 = 1
    Return
    
    
    Vor:
    Portb.1 = 1
    Portb.2 = 0
    Portb.3 = 0
    Return
    
    
    Stopp:
    Portb.1 = 0
    Portb.2 = 0
    Portb.3 = 0
    Return
    Das Wait mal durch For-next Schleifen ersetzt.
    (später vielleicht durch Timer0)
    und überrall eine Abfrage drinnen, ob die Sensor Werte noch aktuell sind.

    Gibt es eine Möglichkeit, dass ich durch den Interrupt an den "Anfang" springen kann ?
    Aus der ISR kann ich nicht mit Goto springen

    Habt ihr noch Vorschläge ??

Berechtigungen

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

12V Akku bauen