Frank
06.06.2004, 15:48
Hallo,
mal ein paar Dinge zu der Servo-Ansteuerung über das RNBFRA-Board. Ursprünglich war angedacht das der CoController diese Aufgabe übernimmt und dieser über den I2C Bus angesteuert wird.
Leider ist dies in der Praxis nicht so ganz einfach, daher hat auch Kjion´s Entwicklung ein bischen länger gedauert als gedacht. Das Problem ist das Timing. Der softwaremäßige I2C-Port und das genaue Servo-Timing läßt sich äußerst schwer kombinieren.
Kjion hat das Problem weitgehend gelöst indem er die I2C-Bus Geschwindigkeit herabgesetzt hat. Leider hat diese Methode den Nachteil das alle Bausteine mit herabgesetzter Geschwindigkeit angesteuert werden müssten. Zudem würden dann die normalen Bascom Befehle nicht mehr funktionieren.
Leider gab es aber auch da momentan noch einige Harken bei bestimmten I2C-Bausteinen.
Da wir bislang dafür keine optimale Lösung gefunden haben, hab ich nochmal eine etwas andere Variante des Servo Treibers bereitgestellt.
RNS1.
Servotreiber und Doku findet man hier:
https://www.roboternetz.de/phpBB2/dload.php?action=file&file_id=128
Er verzichtet vollständig auf den I2C-Bus, so das dieser nach wie vor mit Bascom-Befehlen und voller Geschwindigkeit genutzt werden kann.
Die Ansteuerung erfolgt über eine einzige Leitung der RS232. Durch einfache 4 Byte Befehle (ich hab mich da an den von Kjion´s orintiert) können 255 Positionen bei allen 10 Servos einfach und schnell per Print-Befehl übertragen werden.
Das ganze hab ich auch noch als Beispiel in einer Subroutine gekapselt, so ist es auch für Einsteiger übersichtlich.
Nicht immer möchte man jedoch die Servo-Befehle ständig auf der normalen RS232 übertragen, schließlich braucht man diese Schnittstelle eventuell auch für andere Dinge. Auch dafür gibt es eine Lösung. Beim RNBFRA-Board gibt es einen Pin auf dem Roboternetz-Bus der als Reserve deklariert ist. Wenn dieser Pin mit einem Pin von JP16 verbunden wird (kann man über steckbares Kabel erreichen), dann kann man dafür eine unabhängige zweite RS232 nutzen. Klingt kompliziert ist aber kinderleicht.
So wüde in diesem Fall die Brücke aussehen. Die Ansteuerung erfolgt dann ganz einfach mit der Subfunktion ServoB
https://www.roboternetz.de/bilder/rnbfra/cors232b.gif
Braucht man die normale RS232 nicht, dann kann man einen normalen Jumper schräg aufstecken. In diesem Fall nimmt man einfach die Subfunktion Servo (ohne b) zur Ansteuerung.
https://www.roboternetz.de/bilder/rnbfra/cors232.gif
Diese Methode scheint mir derzeit am besten, da so die komplette Performance des Boards und des I2C-Bus besser genutzt wird.
Hier noch das Beispielprogramm:
'################################################# ##
'servotreibertestrns1.bas
'für
'RoboterNetz Standard-Roboter Board RBNFRA ab V1.1
'Achtung, dieses Demo ist nur für Servotreiber RNS1 (siehe Download) gedacht
'
'Aufgabe:
'10 Servos über CoController ansteueren
'Für die Ansteuerung muss ein RS232 Jumper oder eine
'Brücke gesteckt werden, siehe Tips im Roboternetz Projektforum
'Das Demo dreht erst langsam Servo 1 von Pos 1 zu 255 und
'danach wechselt es schnell 4 mal die Seite. Danach beginnt es von vorn
'Natürlich kann man auch 10 Servos gleichzeitig ansteuern, der
'Übersicht wegen hier nur das Beispiel mit einem Servo
'
'Autor: Frank
'Weitere Beispiele und Beschreibung zur rnbfra
'unter http://www.Roboternetz.de + robotikhardware.de
'################################################# ##
$regfile = "m16def.dat"
Declare Sub Rnb_servo(byval Servonummer As Byte , Byval Position As Byte)
Declare Sub Rnb_servob(byval Servonummer As Byte , Byval Position As Byte)
Dim I As Byte
Dim Pos As Byte
$crystal = 8000000 'Quarzfrequenz
$baud = 9600
Wiederhole:
For I = 1 To 255
Call Rnb_servo(1 , I)
Waitms 50
Next I
For I = 1 To 4
Pos = 1
Call Rnb_servo(1 , Pos)
Wait 2 'Warte 2 Sekundne
Pos = 255
Call Rnb_servo(1 , Pos)
Wait 2
Next I
Goto Wiederhole
Sub Rnb_servo(byval Servonummer As Byte , Byval Position As Byte)
Print "#s" ; Chr(servonummer) ; Chr(position)
End Sub
Sub Rnb_servob(byval Servonummer As Byte , Byval Position As Byte)
Open "comd.7:9600,8,n,1" For Output As #2
Print #2 , "#s" ; Chr(servonummer) ; Chr(position)
Close #2
End Sub
End
Der Servobaustein bzw. das Servoprogramm RNS1 kann natürlich auch mit anderen Schaltungen oder Boards (z.B. RN-Control, C-Control) genutzt werden.
Somit haben wir erst mal eine gute Lösung gefunden!
mal ein paar Dinge zu der Servo-Ansteuerung über das RNBFRA-Board. Ursprünglich war angedacht das der CoController diese Aufgabe übernimmt und dieser über den I2C Bus angesteuert wird.
Leider ist dies in der Praxis nicht so ganz einfach, daher hat auch Kjion´s Entwicklung ein bischen länger gedauert als gedacht. Das Problem ist das Timing. Der softwaremäßige I2C-Port und das genaue Servo-Timing läßt sich äußerst schwer kombinieren.
Kjion hat das Problem weitgehend gelöst indem er die I2C-Bus Geschwindigkeit herabgesetzt hat. Leider hat diese Methode den Nachteil das alle Bausteine mit herabgesetzter Geschwindigkeit angesteuert werden müssten. Zudem würden dann die normalen Bascom Befehle nicht mehr funktionieren.
Leider gab es aber auch da momentan noch einige Harken bei bestimmten I2C-Bausteinen.
Da wir bislang dafür keine optimale Lösung gefunden haben, hab ich nochmal eine etwas andere Variante des Servo Treibers bereitgestellt.
RNS1.
Servotreiber und Doku findet man hier:
https://www.roboternetz.de/phpBB2/dload.php?action=file&file_id=128
Er verzichtet vollständig auf den I2C-Bus, so das dieser nach wie vor mit Bascom-Befehlen und voller Geschwindigkeit genutzt werden kann.
Die Ansteuerung erfolgt über eine einzige Leitung der RS232. Durch einfache 4 Byte Befehle (ich hab mich da an den von Kjion´s orintiert) können 255 Positionen bei allen 10 Servos einfach und schnell per Print-Befehl übertragen werden.
Das ganze hab ich auch noch als Beispiel in einer Subroutine gekapselt, so ist es auch für Einsteiger übersichtlich.
Nicht immer möchte man jedoch die Servo-Befehle ständig auf der normalen RS232 übertragen, schließlich braucht man diese Schnittstelle eventuell auch für andere Dinge. Auch dafür gibt es eine Lösung. Beim RNBFRA-Board gibt es einen Pin auf dem Roboternetz-Bus der als Reserve deklariert ist. Wenn dieser Pin mit einem Pin von JP16 verbunden wird (kann man über steckbares Kabel erreichen), dann kann man dafür eine unabhängige zweite RS232 nutzen. Klingt kompliziert ist aber kinderleicht.
So wüde in diesem Fall die Brücke aussehen. Die Ansteuerung erfolgt dann ganz einfach mit der Subfunktion ServoB
https://www.roboternetz.de/bilder/rnbfra/cors232b.gif
Braucht man die normale RS232 nicht, dann kann man einen normalen Jumper schräg aufstecken. In diesem Fall nimmt man einfach die Subfunktion Servo (ohne b) zur Ansteuerung.
https://www.roboternetz.de/bilder/rnbfra/cors232.gif
Diese Methode scheint mir derzeit am besten, da so die komplette Performance des Boards und des I2C-Bus besser genutzt wird.
Hier noch das Beispielprogramm:
'################################################# ##
'servotreibertestrns1.bas
'für
'RoboterNetz Standard-Roboter Board RBNFRA ab V1.1
'Achtung, dieses Demo ist nur für Servotreiber RNS1 (siehe Download) gedacht
'
'Aufgabe:
'10 Servos über CoController ansteueren
'Für die Ansteuerung muss ein RS232 Jumper oder eine
'Brücke gesteckt werden, siehe Tips im Roboternetz Projektforum
'Das Demo dreht erst langsam Servo 1 von Pos 1 zu 255 und
'danach wechselt es schnell 4 mal die Seite. Danach beginnt es von vorn
'Natürlich kann man auch 10 Servos gleichzeitig ansteuern, der
'Übersicht wegen hier nur das Beispiel mit einem Servo
'
'Autor: Frank
'Weitere Beispiele und Beschreibung zur rnbfra
'unter http://www.Roboternetz.de + robotikhardware.de
'################################################# ##
$regfile = "m16def.dat"
Declare Sub Rnb_servo(byval Servonummer As Byte , Byval Position As Byte)
Declare Sub Rnb_servob(byval Servonummer As Byte , Byval Position As Byte)
Dim I As Byte
Dim Pos As Byte
$crystal = 8000000 'Quarzfrequenz
$baud = 9600
Wiederhole:
For I = 1 To 255
Call Rnb_servo(1 , I)
Waitms 50
Next I
For I = 1 To 4
Pos = 1
Call Rnb_servo(1 , Pos)
Wait 2 'Warte 2 Sekundne
Pos = 255
Call Rnb_servo(1 , Pos)
Wait 2
Next I
Goto Wiederhole
Sub Rnb_servo(byval Servonummer As Byte , Byval Position As Byte)
Print "#s" ; Chr(servonummer) ; Chr(position)
End Sub
Sub Rnb_servob(byval Servonummer As Byte , Byval Position As Byte)
Open "comd.7:9600,8,n,1" For Output As #2
Print #2 , "#s" ; Chr(servonummer) ; Chr(position)
Close #2
End Sub
End
Der Servobaustein bzw. das Servoprogramm RNS1 kann natürlich auch mit anderen Schaltungen oder Boards (z.B. RN-Control, C-Control) genutzt werden.
Somit haben wir erst mal eine gute Lösung gefunden!