Example program of decoding the DF Robotics xbee joystick serial output
Weapons and Systems Engineering mbed DFRobotJoystick Interface
This page provides an example of reading an ASCII comma separated variable string from the DR Robot Wireless Gamepad using the mbed micro-controller. The DF Robbot Wireless Gamepad is an Arduino programmable game controller with an on-board xbee wireless transceiver module. The gamepads used in the Weapons and Systems Engineering Department have been reprogrammed with the arduino sketch listed below.
/media/uploads/jebradshaw/joes_dfrobot_gamepad_example_20141021_mode.ino
The output of the joystick follows the GPS NMEA 0183 protocol as an ASCII string preceded by an "$JOYSTK", and terminated with an asterisk and a two character checksum (hex representation).
Below is a screen shot of the data streaming in TeraTerminal when the gamepad is connected directly to the PC (through a virtual COM port).
mbed_DFRobot_joystick_parse.cpp
- Committer:
- jebradshaw
- Date:
- 2015-02-06
- Revision:
- 0:ce988e55f00d
- Child:
- 1:bc6098f1dd1a
File content as of revision 0:ce988e55f00d:
#include "mbed.h" DigitalOut myled(LED1); Serial pc(USBTX, USBRX); //tx, rx via USB connection Serial xbee(p13, p14); //tx, rx via Xbee socket int main() { char joystr[100]; //used to store the whole joystick string char header[20]; //stores header - not very useful here char *tok; //pointer used for string token function int buttonsAll; //16bit representation of all buttons int button[16]; //individual button states (normally high) int js_lr_L; //Left Joystick Left/Right movement int js_ud_L; //Left Joystick Up/Down movement int js_lr_R; //Right Joystick Left/Right movement int js_ud_R; //Right Joystick Up/Down movement int chksum; //checksum for error correction pc.baud(921600); //crank up the PC baudrate (USB) to avoid latency between data acquisition xbee.baud(9600); pc.printf("\r\n\r\n%s\r\n", __FILE__); while(1) { //read the serial string from the xbee (starts with '$', ends with \r\n xbee.scanf("$%s\r\n", &joystr); while(xbee.readable()) //clear out the remaining characters in the buffer char c = xbee.getc(); // pc.printf("%s ", joystr); //used for debugging //First pass strtok() the string address to parse, then NULLs to iterate through string tok=strtok(joystr, ","); //Extract the header strcpy(header, tok); //copy the header tok=strtok(NULL, ","); //Extract buttons string buttonsAll=strtol(tok, NULL, 16); //turn the 0xXXXX string into a decimal variable tok=strtok(NULL, ","); //Extract Left joystick string L/R string js_lr_L=atoi(tok); //turn ASCII to integer for left joystick Left/Right tok=strtok(NULL, ","); //Extract Left joystick string U/D string js_ud_L=atoi(tok); //turn ASCII to integer for left joystick Up/Down tok=strtok(NULL, ","); //Extract Right joystick string L/R string js_lr_R=atoi(tok); //turn ASCII to integer for right joystick Left/Right tok=strtok(NULL, "*"); //Extract Right joystick string U/D string when asterisk is reached js_ud_R=atoi(tok); //turn ASCII to integer for right joystick Up/Down tok=strtok(NULL, "\0"); //end of string chksum = strtol(tok, NULL, 16); //turn hex string checksumn into integer //print the variables pc.printf("%s %7d %5d %5d %5d %5d 0x%02X ", header, buttonsAll, js_lr_L, js_ud_L, js_lr_R, js_ud_R, chksum); // iterate through buttonsAll (each bit) to assign value MSB first for(int i=15;i>=0;i--){ if(buttonsAll & (1 << i)) button[i] = 1; else button[i] = 0; pc.printf("%1d ", button[i]); } pc.printf("\r\n"); myled = !myled; //toggle LED for activity verification }//while(1) }//main