PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Alternativer Servo-Treiber für RNFBRA-CoController RNS1



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!

matren
06.06.2004, 16:32
d.h. für Laien erklärt:

Pin D7 am Mega16 wird momentan nicht benutzt ist aber am RNB-Bus an PIN 47 rausgeführt (der als Reserve deklariert ist).
Dieser wird dann an den Rx Eingang des CoControllers angeschlossen.

Mit Bascom kann man jeden beliebigen Pin als Tx deklarieren, was wir mit
Open "comd.7:9600,8,n,1" For Output As #2
für den Mega16 tun, und so die Befehle an den CoController schicken können.

Ist das so richtig ?

Frank
06.06.2004, 17:18
So ist es perfekt erklärt. Man kann so sehr einfach mehrere RS232 Schnittstellen verwenden - feine Sache in Bascom.

Trabukh
06.06.2004, 17:24
Kurze Frage: Muss auf dem CoController nicht noch eine passende Software drauf? Also die, die die Signale (boah, 3 mal die...) an die Servos schickt?

Frank
06.06.2004, 17:30
Ja! Dazu hab ich ja den Link oben gepostet.
https://www.roboternetz.de/phpBB2/dload.php?action=file&file_id=128

Da ist das Programm als HEX-File mit in der ZIP-Datei. Das kann man mit Pony oder Bascom einfach auf CoController übertragen. Wer Intresse hat kann das IC auch fertig programmiert für 4 Euro über robotikhardware.de bekommen. Wird demnächst dort aufgelistet

Trabukh
06.06.2004, 17:52
Und gibt es irgendwo eine Anleitung, wie man dieses Programm mit Bascom überträgt?

Frank
06.06.2004, 17:58
Das geht im Prinzip wie mit allen anderen Programmen auch. Wie das generell geht steht ja in der Doku zu RNBFRA oder RN-Control. Oder halt dem Bascom Buch von Kühnel.
Im Dialog, zum Übertragen, gibt es bei Bascom auch eine Ladefunktion wo man ein HEX-File anwählen kann. Das läd man und dann überträgt man es per ISP an den Controller.

Trabukh
06.06.2004, 18:14
Ach so, gefunden. Danke!

VictoriaOnSnow
07.06.2004, 10:37
Gibt es das Programm für den CoController auch als Source-Code? In der Zip-Datei ist nur das Hex-Format enthalten.

Man will ja auch was lernen und verstehen, wie das gemacht wurde.

8-[

Frank
07.06.2004, 12:10
Hi VictoriaOnSnow,

leider kann ich hier Source nicht veröffentlichen. Das liegt zum einen daran das das eine Co-Produktion ist und zum anderen auch daran das ich bei diesen CoController-Programmen ein spezielles Programmgrundgerüst verwende das auch kostenpflichtigen Lizenzcode vom MCS enthält, auch wenn dieser zum Teil im letzten Treiber noch nicht zum tragen kommt.

Aber was das lernen betrifft, so sind eigentlich alle wissenswerten Bestandteile eines solchen Programmes hier im Forum schon erläutert worden. Im Bascom Forum findest du schon Codeauszüge die sich zum ansteuern von Servos eignen. Das ist eigentlich nicht so sehr kompliziert. Den COd emuss man nur etwas ausbauen.
Und auch die Ansteuerung über rs232 ist keine schwierige Sache mit bascom. Also Stück für Stück ran gehen.
Bei normalen Beispielprogrammen veröffentliche ich natürlich in Zukunft weiterhin den Sourcecode, wenn es irgendwie machbar ist.

Gruß Frank

the_snoofy
11.09.2005, 19:09
Hi,

habe mir die Schaltung nachgebaut. Nur klappt es ancheinend nicht mit der Kommunikation. Servo1 ist ausgewählt, aber das Servo 10 zuckt rum.

Mfg Sascha

PicNick
11.09.2005, 19:19
Kannst du deinen Print-Befehl mal posten ?

Voraussetzungen hast du ja gecheckt ?
der CoProcessor muß haben 4 MHZ / ext. Quartz
Das Kommando MUSS mit 9600 Baud daherkommen.

the_snoofy
11.09.2005, 19:31
Hi,

Quartz am 90S2313 ist 4MHz. Angesteurt wird der von einem ATmega32 in C. Baudrate ist 9600.



#include <avr/io.h>
#include <stdio.h>
#include <string.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/delay.h>
#include "lcd.h"
#include "main.h"
#include "pwm.h"
#include "texte.h"
#include "timer.h"

void print5(unsigned int x)
{
unsigned int y;
y=x/10000;lcd_putc(y+0x30);x-=(y*10000);
y=x/1000;lcd_putc(y+0x30);x-=(y*1000);
y=x/100;lcd_putc(y+0x30);x-=(y*100);
y=x/10;lcd_putc(y+0x30);x-=(y*10);
lcd_putc(x+0x30);
}

void USART_transmit (unsigned char c)
{
while(!(UCSRA & (1<<UDRE)));
UDR = c;
}


int main(void)
{
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x67;
unsigned int temp;
sei();
for(;;)
{
USART_transmit(0x23);
USART_transmit(0x53);
USART_transmit(0x31);
USART_transmit(1);
_delay_ms(2000);
USART_transmit(0x23);
USART_transmit(0x53);
USART_transmit(0x31);
USART_transmit(255);
_delay_ms(2000);
}
}

the_snoofy
12.09.2005, 14:34
Hi,

habe jetzt mal die RSNX programmiert und siehe da, es funzt einwandfrei.

Mfg Sascha

PicNick
12.09.2005, 16:16
Alles, was funzt, funzt.

Schau dir aber in der Doku kurz nochmal die Formate an:
Du schickst :
USART_transmit(0x31); // für Servo-#-1 das ist ASCII "1"
solltest aber schicken, als braver Junge:
USART_transmit(0x01); // für Servo-#-1 das wär Hex 1

the_snoofy
12.09.2005, 18:49
Hallo PicNick

das stammte vom testen. Habe halt mehrere Sachen ausprobiert. Was auffällt, RSNX und RNS1 funktionieren tadellos. Nur RNKC10 funktioniert nicht. Obwohl mich da die I2C-Bus Funktion sehr interessiert, da zwei Servo-Controller geplant sind.

Mfg Sascha

PS. Als "guter", schicke ich ja 0x01 :cheesy:

PicNick
12.09.2005, 19:56
@Hallo, Guter !
Der RNKC10 funzt nur, wenn du auf dem Hauptcontroller den I2C-Bus schweinemäßig langsam betreibst. Es ist auch ein Testprogramm dabei, das geht an sich schon, aber eben langsam.
Wenn du einen zweiten Servokontroller anhängen willst, kann ich dir einen RNSX machen mit Servos 17-26, wenn dir das hilft.

the_snoofy
12.09.2005, 20:14
Hi PicNick

zum RNKC10, der sollte ja auch mittels UART funktionieren, oder? Weil, das tut es überhaupt nicht. Die überlegung mittels I2C war halt, das mehr Servos benötigt werden (müssen). Bin noch am überlegen, ob es ein 2 Beiner werden soll oder ein Hexabot. Und ein zweiten Uart haben nur die wenigsten ATmega's. Und ein Software-Uart ist ja auch nicht die Macht.

Mfg Sascha

PS: Vielleicht mal den Servo-Controller auf nen ATmega8 umschreiben?
Bietet ja Hardware-TWI

Kjion
13.09.2005, 01:27
zum RNKC10, der sollte ja auch mittels UART funktionieren, oder? Weil, das tut es überhaupt nicht.

Ja, sollte er.
http://www.kreatives-chaos.com/index.php?seite=rnkc10

Ich hatte vor, den Servocontroller auf einen ATTiny26 umzuschreiben. Wenn du noch zwei Wochen warten kannst, sollte der bis dahin fertig sein...

MfG Kjion

skydancing
15.06.2008, 12:48
Hallo,

ich bin neu in diese Materie eingestiegen und habe versucht den RNS1 nachzubauen. Jedoch ohne Erfolg. Als alternative zum AT90S2313 gibt es ja nur noch den ATTiny2313. Habe das Programmierkabel nachgebaut und mit Pony-Prog. lässt sich der Tiny auch programmieren aber er gibt nur ein zucken der Servos von sich. Nehme ich den RNS1 von robotikhardware.de, dann funktionieren alle Servos. Ich habe auch schon das S8IO ausprobiert jedoch mit dem gleichen Ergebnis, daß alles Servos nur zucken und nicht in Neutralstellung gehen oder sich bewegen.
Vielleicht könntet ihr einem Anfänger in der Sache weiter helfen.

MfG
Martin

marvin42x
15.06.2008, 17:03
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-bin/fc.cgi?P_PREV=&P=ATtiny2313
und hier der Thread mit den für mich konkretesten Angaben:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=20431&highlight=attiny2313+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.

skydancing
15.06.2008, 20:39
Hallo Marvin42x,
habe deine Einstellungen mal mit meinen vergliechen und siehe da ich hatte den Teiler (CKDIV8) bei mir noch aktiv. Also mit deinen Einstellungen funktioniert es jetzt super.
Nochmals vielen Dank für die schnelle Hilfe.

Grüße
Martin

tobiasR
09.03.2009, 08:01
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:



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?

fxt
22.05.2009, 22:43
Die Polung bei Keramikkondensatoren ist egal. Aber mich würde mal interessieren ob und wie du dein Problem gelöst hast, weil ich überlege mir auch den Treiber zu kaufen.

Christoph2
22.06.2010, 21:40
Hi

Ich habe jetzt auch ein RNBFRA (1.22) Board, und würde gerne Servos ansteuern. Gibt es irgendwo Programmbeispiele in C wie man die eine zweite serielle Schnittstelle macht und damit den CoController ansteuert?

lg Christoph

edit: Oder gibt es mittlerweile schon eine Version von RNS1 die auf dem ATTiny2313 mit schnellem I2C läuft?

PicNick
23.06.2010, 09:39
Ich hab da eine RNS-Version f. I2C, läuft bei mir auf einem 2313 ( eben auch ein RNBFRA-Board).
Der User Dirk hat das Zeugs schon f. einen Tiny adaptiert und, soweit ich gehört habe, läuft das auch und er war zufrieden.
Wenn du magst, kann ich dir die Zip schicken.

Christoph2
23.06.2010, 14:18
Die I2C Version für den AT90S2313 die bei dir läuft ist aber die I2C version die nur mit 20kHz geht oder?
Ich brauch nämlich full speed am I2C weil ich da noch einen Schrittmotor treiber dran habe der schnell reagieren muss.

Das mit dem Tiny2313 ist interessant, der sollte doch pinkompatibel sein zum AT90S2313 oder? Da bräuchte ich nur das IC austauschen und das wars, wär super wenn du mir die Zip schicken könntest.

friedrich.ch@gmail.com

lg Christoph

PicNick
23.06.2010, 15:23
Ich weiss, was du meinst. Aber diese Version mein' ich nicht.
Mein Zeugs hab ich mit 400 kHz in Betrieb (was mich eigentlich erstaunt hat, muss ich zugeben).
Die Sourcen sind leider Bascom + Assembler, du würdest wohl C brauchen.
Aber für den AT90S2313 brauchst du ja eigentlich nur die HEX-File

Christoph2
24.06.2010, 21:23
Danke danke danke es funktioniert!!

Heute um 3 in der Früh hab ich es zum laufen gebracht, es läuft jetzt ebenfalls mit 400 kHz auf dem AT90S2313!

lg Christoph

PicNick
25.06.2010, 08:57
Um 3 Uhr früh war das HEX wahrscheinlich schon müde und hat sich nicht mehr wehren können :-)

However, viel spass damit !

Christoph2
26.06.2010, 01:25
Ja, es gab viele Probleme, am Anfang wollte sich z.B. der AT90S2313 nicht mit AVR Studio und dem AVRISP mkII programmieren lassen - der Controller war einfach nicht in der drop down liste aufgeführt, Atmel will wohl dass man auf den Tiny2313 umsteigt...

Für alle die das selbe Problem haben, ich hab in irgendeinem englischsprachigen Forum einen kleinen Trick gefunden:


Um AVR Studio beizubringen, auch ältere AT90 Controller zu programmieren (Z.B. AT90S2313, ...)
muss man die entsprechenden Path description files ändern.
Sie befinden sich normalerweise im Pfad:

C:\Program Files (x86)\Atmel\AVR Tools\Partdescriptionfiles

Man öffnet das Part description File von dem Controller den man mit dem mkII programmieren will und führt zwei kleine Änderungenn durch:

1. Irgendwo findet man die Zeile:

<ICE_SETTINGS>
<MODULE_LIST>[SIMULATOR:STK500:STK500_2]</MODULE_LIST>

Sie muss geändert werden auf:

<ICE_SETTINGS>
<MODULE_LIST>[ICEPRO:SIMULATOR:STK500:STK500_2:AVRISPmkII]</MODULE_LIST>

2. Irgendwo wird der Bereich <ICE_SETTINGS> wieder "geschlossen", nämlich bei der Zeile

</ICE_SETTINGS>

Genau vor dieser Zeile muss eine Zeile für den AVRISP mkII eingefügt werden, nämlich

<AVRISPmkII/>

lg Christoph