-         
+ Antworten
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: hat schon mal wer mehr als 16 Servos mit Bascom angesteuert?

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.11.2003
    Ort
    Langen / Hessen
    Alter
    51
    Beiträge
    393

    hat schon mal wer mehr als 16 Servos mit Bascom angesteuert?

    Hallo Gemeinde,

    meine Frage wie oben im Topic ! Wer hat das schon mal gemacht? Oder könnt Ihr mal erzählen wie Ihr Eure Servos mit Bascom ansteuert? Hintergrund der Frage ist ein kleines Tutorial welches ich zu Bascom schreiben möchte.

    Gruß LuK

  2. #2
    Gast
    Bascom hat doch einen Servo Befehl, oder täusche ich mich da?

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.11.2003
    Ort
    Langen / Hessen
    Alter
    51
    Beiträge
    393
    Stimmt, aber der ist für max. 16 Servos und hat kein so genaues Timing, je mehr Servos angesteuert werden desto schlechter wird die Genauigkeit und Kraft der Servos.

  4. #4
    Gast
    Wozu braucht man denn mehr als 16 Servos?

  5. #5
    Gast
    Hallo,

    das Problem ist das Updateinterval für die Servos. Normalerweise wird
    ein Servo alle 20ms refreshed.
    Der Steuerbereich eines Servos geht von 0,2ms bis 2,4ms (bei Fernsteuerungen wird 1ms bis 2ms benutzt und 1,5ms ist Mitte).
    16 x 2,4ms = 38,4ms ! bedeutet, daß man das Updateinerval schon
    untypisch auf mind. 40ms hochsetzen muss. (alte Servos werden dann weich). Bei 32 Servos wäre das Interval dann schon 80ms usw.

    Ich habe mit Bascom "Servo" diverse Probleme gehabt, und benutze
    deshalb eine eigene Routine, die beliebige Servos ansteuern lässt.
    (Nur unter der Premisse des verlängerten Intervals!!!)

    Lass den Timer0 überlaufen und in eine Sub verzweigen.
    In der Sub gibst Du "Pulsout pinb,0,Servo0" usw für jedes Servo
    einen Pulsout auf verschieden Pins.
    Servo0 ist eine Variable, die Du in Deiner Hauptschleife beliebig
    füllst.
    Den Timer0 musst Du nur immer wieder in der ÜberlaufSub
    auf einen festen Wert setzen, um damit das Updateinterval
    festzulegen. (Eben, wann soll der TImer überlaufen) .
    Die Servo0 Var kannst Du dann per Seriell oder sonst wie füllen.

    Hoffe ich konnte helfen.
    Gruß
    Frank

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    24.05.2004
    Ort
    Schönaich
    Alter
    40
    Beiträge
    315
    Ich habe es gerade mal mit einem Interval von 120ms probiert und man merkt deutlich , daß der Servo deutlich schwächer wird.
    Hängt aber sicher von der Anwendung ab.
    Bei 40 ms konnte ich subjektiv keinen Unterschied feststellen.
    Hab am Servo aber keine wirklich Last hängen.
    -------
    Übrigens funktioniert auch ein Updateintervall von 10ms oder 5ms
    (macht natürlich nicht viel Sinn.)
    Spinoza sagt (epist.62), daß der durch einen Stoß in die Luft fliegende Stein, wenn er Bewußtseyn hätte, meinen würde, aus seinem eigenen Willen zu fliegen. Schopenhauer

  7. #7
    Gast
    ja klar, das geht schon, aber die Technik in den Servos stammt eben aus
    den 60,70gern. Heute würde man einen Wert schicken und das Servo hält den Wert bis zum nächsten Urknall. Leider ist es aber nicht so.

    Wer mehr als 16 Servos braucht, der sollte einfach einen
    zweiten Atmel "Huckepack" aufsetzen und beim Versenden der Daten
    einfach eine ID vergeben "A1" "A2" um den Chip zu selektieren.
    Der Andere wartet eben solange bis er wieder dran ist und updated
    seine Servos solange mit den alten Werten.

    Wer genug Geld hat, kann auch Servos mit höherem Interval kaufen.
    Diese liegen bei rund 3KHz (300ns) und werden für den Heckrotor
    in Hubschraubern eingesetzt. Jeder Hersteller hat so welche.
    Manchmal aber nur in Verbindung mit einem Kreisel.
    Mit denen sollten 32 oder mehr kein Problem sein. Aber eben teuer !
    Der Standard (20ms) wird sich sicher in den nächsten Jahren nicht ändern, da im Modellbau dafür eigentlich kein Bedarf ist (ausser Hubi).

    Hier mein Code um per RS232 zwei Servos zu steuern.
    Kann durch Erweitern von Var "Servo3..4..5" ,
    den Abfragen "$S3..,4...,5" und pulsout auf
    mehr Servos ausgelegt werden.
    Mit Hyperterm (o.ä.) können die Servos gesteuert werden.
    Ich benutze einen STK200.

    $crystal = 4000000
    $baud = 1200

    Config Portb = Output
    Config Serialin = Buffered , Size = 20

    Dim Servo1 As Integer
    Dim Servo2 As Integer
    Dim Scount As Byte
    Dim Sinp As String * 20
    Dim Stemp As Byte
    Dim Temp As String * 20

    Config Timer0 = Timer , Prescale = 1024
    On Timer0 Timover
    Enable Interrupts
    Enable Timer0
    Portb = 0
    Servo1 = 1000
    Servo2 = 1000

    'Anfang:

    'kleine Testschleife
    'For Servo1 = 200 To 2400 Step 1
    'Waitms 1
    'Next Servo1
    'For Servo1 = 2400 To 200 Step -1
    'Waitms 1
    'Next Servo1

    Do
    If Ischarwaiting() = 1 Then
    Gosub Check
    End If
    Loop

    Check:
    Stemp = Inkey()
    If Stemp <> 13 Then
    Sinp = Sinp + Chr(stemp)
    Return
    End If

    If Left(sinp , 3) = "$S1" Then
    Temp = mid(sinp , 4 , 4)
    Servo1 = Val(temp)
    Print "Servo1 = " ; Temp
    End If

    If Left(sinp , 3) = "$S2" Then
    Temp = mid(sinp , 4 , 4)
    Servo2 = Val(temp)
    Print "Servo2 = " ; Temp
    End If

    If Left(sinp , 3) = "$S?" Then
    Print "Servo1 = " ; Str(servo1)
    Print "Servo2 = " ; Str(servo2)
    End If

    Sinp = ""
    Return

    'Goto Anfang


    Timover:
    Pulseout Portb , 0 , Servo1
    Pulseout Portb , 1 , Servo2
    Timer0 = 180
    Return


    Gruß
    Frank

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    24.05.2004
    Ort
    Schönaich
    Alter
    40
    Beiträge
    315
    So ähnlich wollte ich das auch machen, aber mit I²C.
    Frage mich nur ob das in Bascom so funktioniert, da bei RS232 die Eingangswerte ja gepuffert werden, aber bei I²C ???

    Wenn man sich pro CoController auf ne kleinere Anzahl Servos konzentriert, sollte es doch vom Timing gerade so reichen um das über I²C zu machen.
    Spinoza sagt (epist.62), daß der durch einen Stoß in die Luft fliegende Stein, wenn er Bewußtseyn hätte, meinen würde, aus seinem eigenen Willen zu fliegen. Schopenhauer

  9. #9
    Gast
    verstehe ich das richtig.
    Der AVR soll als I2C Slave laufen ?

    Wenn ja, dann sollte das eigentlich gehen, sofern Du nicht wie
    oben lange Strings zum Auswerten nimmst, sondern
    nach der Adresse ein Byte für den Servo und ein (evtl.2) für
    die Position.
    Das Update wird ja trotzdem immer weiter durchgeführt.

    Aber vorsicht !
    ich bin gerade auf nen Hammer gestoßen.
    Leider beschreibt der gute Mark in seinem Help nicht welche
    Timer er für die diversen Befehle benutzt.
    z.B. läuft TCP nicht mit Timer0 und TImer1.
    Die Servos werden zwar geupdated, aber die TCP Kommondos
    machen dann murks.

    Das könnte auch bei den I2C Befehlen passieren !?

    Ich werde jetzt nochmal seine Servo Routine versuchen.
    Bis jetzt habe ich noch nicht rausgefunden ob er innerhalb
    seiner Befehle die Timer und anderes gegenseitig schützt
    und rettet ?!
    Unter Umständen muss man halt seine Servo Routine nehmen
    und evtl. mit den Fehlern leben.

    Leider scheint Mark nicht mehr erreichbar zu sein, da ich ihm
    schon mehrere Anfragen geschickt habe, aber bis dato
    keine Antwort erhalten habe.

    Ist da was bekannt ????

    Gruß
    Frank

  10. #10
    Gast
    Hab das gerade mal probiert.

    Mit Mark's Servo gehts jetzt.
    Er lässt anscheinend die Timer immer laufen und holt sich den
    nötigen Wert dann im richtigen Moment dann raus.
    (Hätte ich auch so gemacht
    Leider geht dann meine eigene Timer Routine nicht.
    Na ja egal. Aber bei RS232 gehts sie einwandfrei.

    Mit I2C musst Du das mal testen. Sag mal bescheid ob er
    wüstes Zeug macht oder sich normal verhält.
    Achtung, bei mir gings mal ne Weile gut und dann wieder gar nicht.
    Mehrfach starten !

    Bei Servo habe ich festgestellt, daß die Werte die Mark angibt nicht stimmen. Bei Reload 10 sind es glaube 60 ms. (Er sagt 20).
    Bei 5 habe ich 32ms (reicht völlig)
    Unter Umständen muss er da mal nachbessern.
    Kannst Ihm ja mal schreiben, vieleicht bekommst Du ja ne Antwort ?

    Gruß
    Frank

+ Antworten
Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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