Hallo
Für die Übertragung der Daten kenne ich eigentlich nur zwei grundsätzliche Möglichkeiten: Direkte Übertragung von Bytewerten oder als Zeichenkette.
Bytewerte wäre für den RP6 wohl die einfachste Lösung. Das VB-Programm auf dem PC rechnet den Joystickwert in einen Wert von 0 bis 255 um und sendet das Ergebniss zum RP6. Bei zwei Joystickachsen errechnet der PC die Mischerwerte für jede Seite getrennt und sendet dann die Ergebnisse zum RP6. Dieser errechnet aus dem empfangenen Byte die Drehrichtung (< oder > als 127) und die Geschwindigkeit (0-210).
Mit einem kleinen Protokoll sollte das einfach umzusetzen sein. Entweder mit Start- und Ende-Kennung, z.B.:
print "*"; Wert_links; Wert_rechts; "#"
Wenn der RP6 im Eingang ein * erkennt, sind die nächsten beiden Bytes die gesuchten Werte. Das # zeigt das Ende der Übertagung und ist gleichzeitig ein Indiz für eine fehlerfreie Übertragung der zuvor gesendeten Bytes. Alternativ wäre auch ein solches Protokoll sinnvoll:
Print "L"; Wert_links
Print "R"; Wert_rechts
Der RP6 prüft dann immer auf L oder R und interpretiert den darauffolgenden Wert das Parameter. Das könnte man auch einfach mit dem RP6Loader testen. Dieser beherrscht beim Senden auch verschiedene Zahlenformate (mit .help im Terminalfenster zu erfahren), ein Test im Terminalfenster des RP6Loader könnte dann so aussehen:
L
.n100
R
.n100
Sendet ein 'L', ein Byte mit 100, ein 'R', ein Byte mit 100. Das angepasste Programm der Potiauswertung würde dann etwa so aussehen:
Code:
// Steuerung beider Antriebe 0-255 18.9.10 mic
// Einlesen über die serielle Schnittstelle fehlt noch!
// Die für jede Seite getrennt eingelesen Werte werden in Richtung
// und Geschwindigkeit umgerechnet.
#include "RP6RobotBaseLib.h"
#define joy_x_min 0
#define joy_x_max 255
#define joy_x_mid 127
#define joy_y_min 0
#define joy_y_max 255
#define joy_y_mid 127
uint8_t speed_l, speed_r;
uint8_t dir_l, dir_r;
uint8_t VB_wert_l, VB_wert_r; // empfangene Werte von 0-255
uint16_t joy_x, joy_y;
int main (void)
{
initRobotBase();
powerON();
while(1)
{
joy_x=VB_wert_l;
joy_y=VB_wert_r;
writeInteger(joy_x, 10);
writeChar(':');
writeInteger(joy_y, 10);
writeChar(' ');
if(joy_x > joy_x_mid)
{ // vorwärts
writeChar('F');
dir_l=FWD;
speed_l=(joy_x-joy_x_mid)*105/(joy_x_max-joy_x_mid);
}
else
{ // rückwärts
writeChar('B');
dir_l=BWD;
speed_l=(joy_x_mid-joy_x)*105/(joy_x_mid-joy_x_min);
}
writeInteger(speed_l*2, 10);
writeChar('\n');
if(joy_y > joy_y_mid)
{ // vorwärts
writeChar('F');
dir_r=FWD;
speed_r=(joy_y-joy_y_mid)*105/(joy_y_max-joy_y_mid);
}
else
{ // rückwärts
writeChar('B');
dir_r=BWD;
speed_r=(joy_y_mid-joy_y)*105/(joy_y_mid-joy_y_min);
}
writeInteger(speed_r*2, 10);
writeChar('\n');
setMotorDir(dir_l,dir_r);
moveAtSpeed(speed_l*2,speed_r*2);
task_motionControl();
mSleep(200);
}
return(0);
}
Bei der byteweisen Übertagung wird jeweils ein Wert in einem Byte übertragen. Als Alternative kann man auch den zu übertragenden Wert in eine Zeichenfolge (=String) umwandeln und dann die Zeichen der Zeichenkette übertragen. Zur Optimierung kann man bei diesem Verfahren noch jeweils zwei Zifffern in einem Byte übertragen (BCD) oder eine andere Zahlenbasis verwenden (Hex). Das wollte ich der Form halber erwähnen. Großer Vorteil ist dabei, dass man den Datenstrom quasi im Klartext mitlesen könnte, Nachteil der erhebliche Aufwand bei der Stringumwandlung und die größere zu übertragende Datenmenge.
Um sicherzustellen, dass der RP6 alles richtig verstanden hat, wäre es einfach, wenn der RP6 das empfangene Zeichen bzw. das Byte direkt zurückschickt. Der PC kann dann erkennen, ob das Byte richtig übertragen wurde (Echo). Schneller und etwas komplizierter und deshalb erst bei größeren Datenmengen sinnvoll wäre ein Blockcheck. Ein Block mehrerer Bytes wird übertragen und nach der Übertragung antwortet der RP6 mit einer Prüfsumme die er aus dem empfangenen Block errechnet hat. Der PC vergleicht diesen Wert dann mit dem von ihm selbst errechneten Wert (CRC)
Eine kleine Linkliste zum Thema Zahlendarstellungen hatte ich hier mal zusammengestellt:
https://www.roboternetz.de/phpBB2/ze...g.php?p=353264
Sorry, der Beitrag wurde irgendwie immer länger.
Gruß
mic
Lesezeichen