PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : hat schon mal wer mehr als 16 Servos mit Bascom angesteuert?



LuK-AS
11.03.2004, 19:25
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

11.03.2004, 23:37
Bascom hat doch einen Servo Befehl, oder täusche ich mich da?

LuK-AS
12.03.2004, 06:11
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.

12.03.2004, 11:22
Wozu braucht man denn mehr als 16 Servos?

04.06.2004, 21:42
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

matren
04.06.2004, 22:50
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.)

06.06.2004, 10:05
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

matren
06.06.2004, 10:17
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.

11.06.2004, 00:52
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

11.06.2004, 01:53
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

11.06.2004, 12:45
Die Servos werde ich erstmal ne Weile ruhen lassen,
da ich da jetzt noch keine Verwendung dazu habe und mir das momentan noch zu viel ist.
Könnte alles noch ne gute Weile dauern, da ich mich erstmal mit der Elektronik selber beschäftigen will und die Mechanik bei mir das größere Problem darstellt.
Das mit dem programmieren hat noch Zeit. Das kriege ich dann schon irgendwie hin.