PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RP6 mit Servo Modul SD21



Mex78
08.12.2007, 10:45
Hallo!

Vorweg ich bin *Newbe* was das programmieren von Robotern angeht.
Ich bin gerade dabei das Servo Driver Modul SD21 an meinem RP6 zu testen. Zuerst möchte ich den Servo nur mal in eine gewünschte Position Rechts und Links drehen. Sollte normalerweise über I2C kein Problem sein. Bis jetzt dreht der Servo irgendwo hin und bleibt da auch.

In der Anleitung hab ich gelesen ich muß mit einem Register arbeiten. Das so aus sieht:
Register 0, Servo 1, Speed
Register 1, Servo 1, Low byte
Register 2, Servo 1, High byte
Register 3, Servo 2, Speed
usw... bis Servo 21 und noch zus. Funktionen.

Hier stellt sich mir schon mal die erste Frage. Was sind Low byte und High byte? Wie verwende ich die?

Das diese für die Servo Position zuständig sind ist mir klar, aber was bedeuten die 2 Werte?

Hier noch mein derzeitiger Code:



#include "RP6RobotBaseLib.h"
#include "RP6I2CmasterTWI.h"

uint8_t servo1a;
uint8_t servo1b;
uint8_t servo1c;

char buffer1[1];

#define servoboard 0xC2

void servo(void)
{
I2CTWI_initMaster(100);
powerON();

while(true)
{

receiveBytes(5);
waitUntilReceptionComplete();
copyReceivedBytesToBuffer(&buffer1[0]);

I2CTWI_transmit2Bytes(servoboard, 7, buffer[0]);


}

}

int main(void)

{
initRobotBase();

servo();

return 0;
}


Für Hilfe an nen *Newbe*, der sein Wissen wieder um ein kleines Stückchen erweitern kann, währe ich Dankbar.

Es grüßt

MeX

Dirk
08.12.2007, 10:57
Hallo Mex78,

ich kenne nicht das genaue Protokoll des Servotreibers.
Ich gehe aber davon aus, dass einzelne Bytes nacheinander (wohl 3 pro Servo) übertragen werden.

Die Servoposition ist dabei eine 16-Bit-Zahl (z.B. Integer), deren Low-Byte zuerst, danach das High-Byte übertragen wird.
Das wäre dann:
Lowbyte1 = Servoposition1 & 0x0f;
Highbyte1 = Servoposition1 >> 8;

Gruß Dirk

radbruch
08.12.2007, 11:01
Hallo

Willkommen im RN-Forum. Ein nettes Board hast du da. *grins*

Aus dem SD21-Datenblatt (http://blog.ref6.com/files/Datasheets/sd21.pdf):

Servo Position
The position (low byte/high byte) is a 16 bit number which directly sets the output pulse
width in uS. Setting the position to 1500 (1500uS or 1.5mS) will set most servo's to their
center position. The range of pulse widths that are normally supported are from 1000uS
(1mS) to 2000uS (2mS). It is usually possible to go beyond these limits though. On a Hitec
HS311 servo, we can set the position from 800 to 2200 to give a nice wide range of
movement. Take care though as its easy to make the servo run into its internal stops if
you give it pulse widths at the upper or lower extremes. The registers can also be read
back. The position will be the current position of the servo during a speed controlled
movement, so you can track its progress towards the requested position.
Das bedeutet, die Position wird in Mikrosekunden angegeben, Werte von ca. 1000 bis 2000 (je nach Servo etwas unterschiedlich). Da die SD21-Register aber nur 8Bit groß sind (0-255) werden die Werte auf zwei Register verteilt (16 Bit). Dabei unterscheidet man zwischen Low-Byte(das niederwertige Byte) und High-Byte(das hochwertige Byte). Die Position errechnet sich dann so:

Position=256*highbyte+lowbyte

bzw

Position mod 256=lowbyte und Position div 256=highbyte.

(mod(%) ist der ganzzahlige Rest und div(\) ist der ganzzahlige Teiler oder so ähnlich)

Das kann man übrigens auch googlen...

Gruß

mic

Mex78
08.12.2007, 11:32
Danke für die schnellen Antworten. Bei mir ist jetzt der Groschen gefallen. Das muß ich jetzt gleich mal testen.

Danke!

Es grüßt

MeX