Racing Robots remote control using xbee and API mode
Dependencies: XBeeLib mbed racing_robots
main.cpp@1:47dae7bc4964, 2016-05-19 (annotated)
- Committer:
- sillevl
- Date:
- Thu May 19 13:18:03 2016 +0000
- Revision:
- 1:47dae7bc4964
- Parent:
- 0:cff20bebf3e4
Remote control features added to racing robots using Xbee API mode
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sillevl | 0:cff20bebf3e4 | 1 | #include "robot_logic.h" |
sillevl | 0:cff20bebf3e4 | 2 | |
sillevl | 0:cff20bebf3e4 | 3 | #include <cstdint> |
sillevl | 0:cff20bebf3e4 | 4 | #include "mbed.h" |
sillevl | 0:cff20bebf3e4 | 5 | #include "XBeeLib.h" |
sillevl | 0:cff20bebf3e4 | 6 | #if defined(ENABLE_LOGGING) |
sillevl | 0:cff20bebf3e4 | 7 | #include "DigiLoggerMbedSerial.h" |
sillevl | 0:cff20bebf3e4 | 8 | using namespace DigiLog; |
sillevl | 0:cff20bebf3e4 | 9 | #endif |
sillevl | 0:cff20bebf3e4 | 10 | |
sillevl | 0:cff20bebf3e4 | 11 | using namespace XBeeLib; |
sillevl | 0:cff20bebf3e4 | 12 | |
sillevl | 0:cff20bebf3e4 | 13 | DigitalOut led1(LED1); |
sillevl | 0:cff20bebf3e4 | 14 | |
sillevl | 0:cff20bebf3e4 | 15 | Serial *log_serial; |
sillevl | 0:cff20bebf3e4 | 16 | |
sillevl | 0:cff20bebf3e4 | 17 | Timeout stopper; |
sillevl | 0:cff20bebf3e4 | 18 | |
sillevl | 0:cff20bebf3e4 | 19 | /** Callback function, invoked at packet reception */ |
sillevl | 0:cff20bebf3e4 | 20 | static void receive_cb(const RemoteXBeeZB& remote, bool broadcast, const uint8_t *const data, uint16_t len) |
sillevl | 0:cff20bebf3e4 | 21 | { |
sillevl | 0:cff20bebf3e4 | 22 | const uint64_t remote_addr64 = remote.get_addr64(); |
sillevl | 0:cff20bebf3e4 | 23 | |
sillevl | 0:cff20bebf3e4 | 24 | log_serial->printf("\r\nGot a %s RX packet [%08x:%08x|%04x], len %d\r\nData: ", broadcast ? "BROADCAST" : "UNICAST", UINT64_HI32(remote_addr64), UINT64_LO32(remote_addr64), remote.get_addr16(), len); |
sillevl | 0:cff20bebf3e4 | 25 | |
sillevl | 0:cff20bebf3e4 | 26 | for (int i = 0; i < len; i++) |
sillevl | 0:cff20bebf3e4 | 27 | log_serial->printf("%02x ", data[i]); |
sillevl | 0:cff20bebf3e4 | 28 | |
sillevl | 0:cff20bebf3e4 | 29 | log_serial->printf("\r\n"); |
sillevl | 0:cff20bebf3e4 | 30 | |
sillevl | 0:cff20bebf3e4 | 31 | switch(data[0]){ |
sillevl | 0:cff20bebf3e4 | 32 | case 0x10: // speed + turnradius |
sillevl | 0:cff20bebf3e4 | 33 | |
sillevl | 0:cff20bebf3e4 | 34 | int speed = int32_t((int8_t) data[1]); |
sillevl | 0:cff20bebf3e4 | 35 | int turnspeed = int32_t((int8_t) data[2]); |
sillevl | 0:cff20bebf3e4 | 36 | drive(speed); |
sillevl | 0:cff20bebf3e4 | 37 | turn(turnspeed); |
sillevl | 0:cff20bebf3e4 | 38 | stopper.attach(&stop, 0.1); |
sillevl | 0:cff20bebf3e4 | 39 | break; |
sillevl | 0:cff20bebf3e4 | 40 | } |
sillevl | 0:cff20bebf3e4 | 41 | } |
sillevl | 0:cff20bebf3e4 | 42 | |
sillevl | 0:cff20bebf3e4 | 43 | |
sillevl | 0:cff20bebf3e4 | 44 | int speed; |
sillevl | 0:cff20bebf3e4 | 45 | |
sillevl | 0:cff20bebf3e4 | 46 | void init() |
sillevl | 0:cff20bebf3e4 | 47 | { |
sillevl | 0:cff20bebf3e4 | 48 | |
sillevl | 0:cff20bebf3e4 | 49 | } |
sillevl | 0:cff20bebf3e4 | 50 | |
sillevl | 0:cff20bebf3e4 | 51 | void loop() |
sillevl | 0:cff20bebf3e4 | 52 | { |
sillevl | 0:cff20bebf3e4 | 53 | log_serial = new Serial(DEBUG_TX, DEBUG_RX); |
sillevl | 0:cff20bebf3e4 | 54 | log_serial->baud(9600); |
sillevl | 0:cff20bebf3e4 | 55 | log_serial->printf("Sample application to demo how to receive unicast and broadcast data with the XBeeZB\r\n\r\n"); |
sillevl | 0:cff20bebf3e4 | 56 | log_serial->printf(XB_LIB_BANNER); |
sillevl | 0:cff20bebf3e4 | 57 | |
sillevl | 0:cff20bebf3e4 | 58 | #if defined(ENABLE_LOGGING) |
sillevl | 0:cff20bebf3e4 | 59 | new DigiLoggerMbedSerial(log_serial, LogLevelInfo); |
sillevl | 0:cff20bebf3e4 | 60 | #endif |
sillevl | 0:cff20bebf3e4 | 61 | |
sillevl | 0:cff20bebf3e4 | 62 | XBeeZB xbee = XBeeZB(RADIO_TX, RADIO_RX, RADIO_RESET, NC, NC, 9600); |
sillevl | 0:cff20bebf3e4 | 63 | |
sillevl | 0:cff20bebf3e4 | 64 | /* Register callbacks */ |
sillevl | 0:cff20bebf3e4 | 65 | xbee.register_receive_cb(&receive_cb); |
sillevl | 0:cff20bebf3e4 | 66 | |
sillevl | 0:cff20bebf3e4 | 67 | RadioStatus const radioStatus = xbee.init(); |
sillevl | 0:cff20bebf3e4 | 68 | MBED_ASSERT(radioStatus == Success); |
sillevl | 0:cff20bebf3e4 | 69 | |
sillevl | 0:cff20bebf3e4 | 70 | /* Wait until the device has joined the network */ |
sillevl | 0:cff20bebf3e4 | 71 | log_serial->printf("Waiting for device to join the network: "); |
sillevl | 0:cff20bebf3e4 | 72 | while (!xbee.is_joined()) { |
sillevl | 0:cff20bebf3e4 | 73 | wait_ms(1000); |
sillevl | 0:cff20bebf3e4 | 74 | log_serial->printf("."); |
sillevl | 0:cff20bebf3e4 | 75 | } |
sillevl | 0:cff20bebf3e4 | 76 | log_serial->printf("OK\r\n"); |
sillevl | 0:cff20bebf3e4 | 77 | led1 = 1; |
sillevl | 0:cff20bebf3e4 | 78 | |
sillevl | 0:cff20bebf3e4 | 79 | while (true) { |
sillevl | 0:cff20bebf3e4 | 80 | xbee.process_rx_frames(); |
sillevl | 0:cff20bebf3e4 | 81 | } |
sillevl | 0:cff20bebf3e4 | 82 | |
sillevl | 0:cff20bebf3e4 | 83 | delete(log_serial); |
sillevl | 0:cff20bebf3e4 | 84 | |
sillevl | 0:cff20bebf3e4 | 85 | } |