- Akku Tests und Balkonkraftwerk Speicher         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 15 von 15

Thema: Servo mit Geschwindigkeitsregelung?

  1. #11
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.693
    Anzeige

    E-Bike
    Hallo JeyBee,

    Zitat Zitat von JeyBee
    ... Also soll ich einfach nur drei Positionen messen ...
    Das musst Du schon selbst entscheiden. Ich weiß nicht, mit welcher Auflösung Du die Umgebung absuchen willst. Diese drei Positionen waren eigentlich nicht die message.

    Du sollst, egal wieviel Positionen Du anfährst, eben die erforderliche Zeit warten - sonst misst Du Mist *ggggg*. Möglicherweise kennst Du (auch) die Störempfindlichkeit der Sharpfamilie noch nicht - aber es gibt Möglichkeiten zum Entstören.

    Im Übrigen gibt die Suchfunktion (obere Statuszeile, dritter Link : •Suchen• ) ne ganze Menge her, hier drei Beispiele, die sich mit dem Sharp, dem Scannen der Umgebung und entsprechenden Landkarten beschäftigen:
    https://www.roboternetz.de/phpBB2/viewtopic.php?t=36647
    https://www.roboternetz.de/phpBB2/viewtopic.php?t=11848
    https://www.roboternetz.de/phpBB2/vi...?p=15756#15756

    Du musst halt selber mal intensiv suchen. Im Übrigen: viel Erfolg
    Ciao sagt der JoeamBerg

  2. #12
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.02.2007
    Beiträge
    277
    Danke für die Links, oberallgeier.

    Ich habe mich jetzt dazu entschieden, den Sensor auf dem Servo immer auf 0 (100) zu stellen. Sobald der Sensor aber etwas "sieht", soll der Roboter stehen bleiben, auf beide seiten den Servo schwenken (50-150), zwei messerte nehmen, und beide vergleichen, bei dem der weniger hoch ist, soll der Roboter hinfahren. Also quazi soll der Roboter den "Besten Weg" finden. Ich weiss, die Sensoren sind nur auf 30cm ausgelegt, trotzdem soll es dem Roboter helfen, sich nicht in eine Ecke zu verfahren.

    Ich habe das Programm geschriben . Jedoch funktioniert das mit dem Servo noch nicht so ganz. Es schlägt nur auf eine Seite aus.

    Der Sensor ist bei der Servoposition "100" nach gerade aus gerichtet.

    Könntest du mal bitte kruz drüber schauen? *Keks gib*

    Code:
    $regfile "m16def.dat"
    $crystal = 16000000
    $baud = 9600
    $swstack = 16
    $hwstack = 16
    $framesize = 16
    
    Dim A As Word
    Dim B As Word
    Dim C As Word
    Dim X As Word
    Dim Y As Word
    Dim Z As Word
    
    Config Portd.4 = Output
    Config Portd.5 = Output
    Config Porta.4 = Output
    Config Porta.5 = Output
    Config Porta.6 = Output
    Config Portc.7 = Output
    Config Portc.6 = Output
    Config Portc.5 = Output
    Config Portb.2 = Output
    
    M1 Alias Porta.5
    M2 Alias Porta.6
    M3 Alias Portc.6
    M4 Alias Portc.5
    
    Config Servos = 1 , Servo1 = Portb.2 , Reload = 10
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    Start Adc
    Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1
    
    Enable Interrupts
    
    Servo(1) = 100
    Wait 1
    
    Do
    
    Pwm1a = 64
    Pwm1b = 64
    
    A = Getadc(1)
    B = Getadc(2)
    C = Getadc(3)
    
    If A > 250 Then
    Gosub Brems
    Waitms 500
    Gosub Rueck
    Waitms 200
    Gosub Rueckr
    Waitms 400
    Else
    Gosub Vor
    End If
    
    If B > 250 Then
    Gosub Brems
    Waitms 500
    Gosub Way
    Gosub Rueck
    Waitms 200
    Gosub Rueckl
    Waitms 400
    Else
    Gosub Vor
    End If
    
    
    If C > 250 Then
    Gosub Brems
    Waitms 500
    Gosub Rueck
    Waitms 200
    Gosub Rueckr
    Waitms 400
    Else
    Gosub Vor
    End If
    
    Waitms 40
    
    
    Vor:
    M1 = 0
    M2 = 1
    M3 = 0
    M4 = 1
    Return
    
    Rueck:
    M1 = 1
    M2 = 0
    M3 = 1
    M4 = 0
    Return
    
    Brems:
    M1 = 1
    M2 = 1
    M3 = 1
    M4 = 1
    Return
    
    Rueckr:
    M1 = 1
    M2 = 0
    M3 = 0
    M4 = 0
    Return
    
    Rueckl:
    M1 = 0
    M2 = 0
    M3 = 1
    M4 = 0
    Return
    
    Vorr:
    M1 = 0
    M2 = 1
    M3 = 0
    M4 = 0
    Return
    
    Vorl:
    M1 = 0
    M2 = 0
    M3 = 0
    M4 = 1
    Return
    
    Way:
    Servo(1) = 100
    Waitms 100
    X = Getadc(2)
    Waitms 100
    Servo(1) = 150
    Y = Getadc(2)
    Waitms 100
    Servo(1) = 50
    Waitms 300
    Z = Getadc(2)
    Waitms 100
    
    If Y > Z Then
    Gosub Rueckr
    Waitms 500
    Gosub Brems
    Waitms 300
    Gosub Vor
    End If
    
    If Y < Z Then
    Gosub Rueckl
    Waitms 500
    Gosub Brems
    Waitms 300
    Gosub Vor
    End If
    
    Loop


    Mfg JeyBee

  3. #13
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.693
    Ach JeyBee,

    das mit dem Keks ist nett gedacht, ich würde das sogar ohne Keks machen. Blos sprech ich kein Bascom - da bin ich leider keine Hilfe. Selbst mein C ist eher Cäh.

    Vielleicht könnte Dir mein Lösungsansatz etwas helfen (ja, ich weiß, man lobt immer die eigenen Ideen/Kinder/Töchter), der auf dem Dottie zu sehen ist: einfache, nicht sehr genaue Sensoren geben "erste" Hinweise, der Sharp macht die Feinarbeit. Dabei müssen die Sensoren natürlich nicht "von oben herab" schauen - einfach nach vorne geht auch. Diese Blindenstockphilosophie ist eben (m)eine etwas spezielle Geschichte. Die ganze Geschichte fängt ungefähr hier an.
    Ciao sagt der JoeamBerg

  4. #14
    Erfahrener Benutzer Roboter Experte Avatar von ikarus_177
    Registriert seit
    31.12.2007
    Ort
    Grein
    Alter
    31
    Beiträge
    601
    Hi,

    hab mir dein Programm auch mal angesehen.

    Mir ist aufgefallen, dass die Endlosschleife (Do...Loop) über den ganzen Programmcode geht auch über die Unterfunktionen, die mit "gosub" angesprochen werden. Ich würde die Schleife nur über die "Aufrufe" der Unterfunktionen stellen, also in etwa so:

    Code:
    $regfile "m16def.dat"
    $crystal = 16000000
    $baud = 9600
    $swstack = 16
    $hwstack = 16
    $framesize = 16
    
    Dim A As Word
    Dim B As Word
    Dim C As Word
    Dim X As Word
    Dim Y As Word
    Dim Z As Word
    
    Config Portd.4 = Output
    Config Portd.5 = Output
    Config Porta.4 = Output
    Config Porta.5 = Output
    Config Porta.6 = Output
    Config Portc.7 = Output
    Config Portc.6 = Output
    Config Portc.5 = Output
    Config Portb.2 = Output
    
    M1 Alias Porta.5
    M2 Alias Porta.6
    M3 Alias Portc.6
    M4 Alias Portc.5
    
    Config Servos = 1 , Servo1 = Portb.2 , Reload = 10
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    Start Adc
    Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1
    
    Enable Interrupts
    
    Servo(1) = 100
    Wait 1
    
    Do
    
    Pwm1a = 64
    Pwm1b = 64
    
    A = Getadc(1)
    B = Getadc(2)
    C = Getadc(3)
    
    If A > 250 Then
    Gosub Brems
    Waitms 500
    Gosub Rueck
    Waitms 200
    Gosub Rueckr
    Waitms 400
    Else
    Gosub Vor
    End If
    
    If B > 250 Then
    Gosub Brems
    Waitms 500
    Gosub Way
    Gosub Rueck
    Waitms 200
    Gosub Rueckl
    Waitms 400
    Else
    Gosub Vor
    End If
    
    
    If C > 250 Then
    Gosub Brems
    Waitms 500
    Gosub Rueck
    Waitms 200
    Gosub Rueckr
    Waitms 400
    Else
    Gosub Vor
    End If
    
    Waitms 40
    
    
    Loop
    
    
    Vor:
    M1 = 0
    M2 = 1
    M3 = 0
    M4 = 1
    Return
    
    Rueck:
    M1 = 1
    M2 = 0
    M3 = 1
    M4 = 0
    Return
    
    Brems:
    M1 = 1
    M2 = 1
    M3 = 1
    M4 = 1
    Return
    
    Rueckr:
    M1 = 1
    M2 = 0
    M3 = 0
    M4 = 0
    Return
    
    Rueckl:
    M1 = 0
    M2 = 0
    M3 = 1
    M4 = 0
    Return
    
    Vorr:
    M1 = 0
    M2 = 1
    M3 = 0
    M4 = 0
    Return
    
    Vorl:
    M1 = 0
    M2 = 0
    M3 = 0
    M4 = 1
    Return
    
    Way:
    Servo(1) = 100
    Waitms 100
    X = Getadc(2)
    Waitms 100
    Servo(1) = 150
    Y = Getadc(2)
    Waitms 100
    Servo(1) = 50
    Waitms 300
    Z = Getadc(2)
    Waitms 100
    
    If Y > Z Then
    Gosub Rueckr
    Waitms 500
    Gosub Brems
    Waitms 300
    Gosub Vor
    End If
    
    If Y < Z Then
    Gosub Rueckl
    Waitms 500
    Gosub Brems
    Waitms 300
    Gosub Vor
    End If
    
    Return
    Keine Ahnung, ob das zur Lösung des "Ausschlagproblems" beiträgt, mir ist es nur ins Auge gestochen


    Viele Grüße

  5. #15
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.02.2007
    Beiträge
    277
    So, jetzt funktioniert soweit alles. Ich brauche jetzt nur noch eine Richtige Spannungsversorgung etc.

    Wenn's interessiert, hier der Code:
    Code:
    $regfile "m16def.dat"
    $crystal = 16000000
    $baud = 9600
    $swstack = 16
    $hwstack = 16
    $framesize = 16
    
    Dim A As Word
    Dim B As Word
    Dim C As Word
    Dim X As Word
    Dim Y As Word
    Dim Z As Word
    
    Config Porta.4 = Output
    Config Porta.5 = Output
    Config Porta.6 = Output
    Config Portc.7 = Output
    Config Portc.6 = Output
    Config Portc.5 = Output
    Config Portb.2 = Output
    
    M1 Alias Porta.5
    M2 Alias Porta.6
    M3 Alias Portc.6
    M4 Alias Portc.5
    
    Config Servos = 1 , Servo1 = Portb.2 , Reload = 10
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    Start Adc
    Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1
    
    Enable Interrupts
    
    Servo(1) = 100
    Wait 1
    
    Do
    
    Pwm1a = 64
    Pwm1b = 64
    
    A = Getadc(1)
    B = Getadc(2)
    C = Getadc(3)
    
    If A > 200 Then
    Gosub Brems
    Waitms 500
    Gosub Way
    Waitms 100
    Else
    Gosub Vor
    End If
    
    If B > 200 Then
    Gosub Brems
    Waitms 500
    Gosub Way
    Waitms 100
    Else
    Gosub Vor
    End If
    
    If C > 200 Then
    Gosub Brems
    Waitms 500
    Gosub Way
    Waitms 100
    Else
    Gosub Vor
    End If
    
    Loop
    
    Vor:
    M1 = 0
    M2 = 1
    M3 = 0
    M4 = 1
    Return
    
    Rueck:
    M1 = 1
    M2 = 0
    M3 = 1
    M4 = 0
    Return
    
    Brems:
    M1 = 1
    M2 = 1
    M3 = 1
    M4 = 1
    Return
    
    Rueckr:
    M1 = 1
    M2 = 0
    M3 = 0
    M4 = 0
    Return
    
    Rueckl:
    M1 = 0
    M2 = 0
    M3 = 1
    M4 = 0
    Return
    
    Vorr:
    M1 = 0
    M2 = 1
    M3 = 0
    M4 = 0
    Return
    
    Vorl:
    M1 = 0
    M2 = 0
    M3 = 0
    M4 = 1
    Return
    
    Way:
    Servo(1) = 150
    Waitms 300
    Y = Getadc(2)
    Waitms 300
    Servo(1) = 50
    Waitms 300
    Z = Getadc(2)
    Waitms 300
    
    If Y > Z Then
    Gosub Vorl
    Waitms 500
    Gosub Brems
    Waitms 300
    Gosub Vor
    End If
    
    If Y < Z Then
    Gosub Vorr
    Waitms 500
    Gosub Brems
    Waitms 300
    Gosub Vor
    End If
    Servo(1) = 100
    Return
    
    End

    Danke an Alle.


    Mfg JeyBee

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress