Alternativer Servo-Treiber für RNFBRA-CoController RNS1
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/dl...le&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
Bild hier
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.
Bild hier
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:
Code:
'###################################################
'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!
Liste der Anhänge anzeigen (Anzahl: 1)
Warum es bei mir zuerst geruckelt hat:
Ich bin auch gerade furchtbar am ringen mit der Materie auf dem RNBFRA den AT90S2313 gegen einen ATtiny2313 auszutauschen.
Eine Ursache könnte sein:
Ab hier mein Halbwissen:
Der erste und riskanteste Schritt ist ja das richtige setzen der Fusebits.
Im Auslieferungszustand scheint der Tiny mit seiner internen Clock bei 8 MHz zu liegen und das intern durch 8 zu teilen. Was eine reale Taktfrequenz von 1MHz bedeuten würde.
Hier ein paar Quellen:
http://palmavr.sourceforge.net/cgi-b...=&P=ATtiny2313
und hier der Thread mit den für mich konkretesten Angaben:
https://www.roboternetz.de/phpBB2/ze...iny2313+extern
Hier wird im Letzten Post von Schokohoernl alles sehr zutreffend beschrieben.
Das einzige das man den Teiler nicht disablen braucht sehe ich mit Misstrauen weil mir ein Tiny mit dieser Einstellung und extern 4MHz Crystal weggeblieben ist. Der läuft jetzt wahrscheinlich mit 0,5MHz
Ich lese mich wegen mangelnder Kompetenz schon seit drei Tagen durch die ATiny2313 Beiträge und Datenblätter.
Da ich keine Lust habe reihenweise Tinys in die ewigen Jagdgründe zu schicken habe ich mich als vorläufige Lösung auf 4MHz intern verlegt. Siehe Grafik
Mich würde es aber sehr entspannen wenn noch jemand mit Kompetenz was dazu sagt.
Und wenn man das dann noch in die Wiki eintragen würde wäre das vermutlich sehr hilfreich. Diese Fusebitsache des ATtiny2313 hat ja inzwischen haufenweise Threads erzeugt.
Netter Gruß
Ps. Also die Grafik als Bild einbinden habe ich auch schon mal gekonnt.
Hmm..., vergessen wie es geht.
Servo ruckelt bis zum Anschlag
Hallo,
Ich versuche einen Servo mit dem Arduino Board und einem RNS1 anzusteuern.
Ich habe die Schaltung auf einem Steckboard aufgebaut (Quarz 4Mhz).
Egal was ich dem RNS1 sende der Servo ruckelt sich von 0 auf Anschlag, sobald ich die Reset-Leitung von LOW auf HIGH setze.
Hat irgendwer eine Ahnung was ich falsch mache?
Hier mein Code:
Code:
void setup() {
Serial.begin(9600);
// 7 = Reset
pinMode(7, OUTPUT);
delay(5000);
digitalWrite(7, HIGH);
delay(1000);
digitalWrite(7, LOW);
delay(1000);
digitalWrite(7, HIGH);
}
void loop() {
Serial.print((unsigned char)35);
Serial.print((unsigned char)83);
Serial.print((unsigned char)1);
Serial.print((unsigned char)200);
delay(5000);
Serial.print((unsigned char)35);
Serial.print((unsigned char)83);
Serial.print((unsigned char)1);
Serial.print((unsigned char)200);
delay(5000);
}
Und noch eine Anfängerfrage:
Wie erkennt man bei Keramikkondensatoren die Polung, oder ist die Polung egal?