Receiver for rc ROV

Dependencies:   mbed nRF24L01P

Committer:
spin7ion
Date:
Mon Sep 10 20:11:24 2018 +0000
Revision:
1:e11cc38ef502
Parent:
0:a8a417d50cc7
Child:
2:ce397d92f68e
Communication works

Who changed what in which revision?

UserRevisionLine numberNew contents of line
spin7ion 0:a8a417d50cc7 1 #include "mbed.h"
spin7ion 0:a8a417d50cc7 2 #include "nRF24L01P.h"
spin7ion 0:a8a417d50cc7 3
spin7ion 0:a8a417d50cc7 4 #define CHANNELS_NUMBER 12
spin7ion 0:a8a417d50cc7 5 #define CMD_VALUE 65535
spin7ion 0:a8a417d50cc7 6 #define CMD_GET_STATUS 1
spin7ion 1:e11cc38ef502 7 #define CMD_INITIALIZE 2
spin7ion 0:a8a417d50cc7 8
spin7ion 1:e11cc38ef502 9 #define RCV_TIMEOUT_MS 1000
spin7ion 0:a8a417d50cc7 10
spin7ion 0:a8a417d50cc7 11 #define SERVO_MAX 2500
spin7ion 0:a8a417d50cc7 12 #define SERVO_MIN 800
spin7ion 0:a8a417d50cc7 13 #define SERVO_CENTER SERVO_MAX-SERVO_MIN
spin7ion 0:a8a417d50cc7 14
spin7ion 1:e11cc38ef502 15 #define STATE_INITILIZATION 0x00
spin7ion 1:e11cc38ef502 16 #define STATE_RUN 0x01
spin7ion 1:e11cc38ef502 17 #define STATE_FAILSAFE 0x02
spin7ion 1:e11cc38ef502 18
spin7ion 0:a8a417d50cc7 19 Serial pc(USBTX, USBRX); // tx, rx
spin7ion 0:a8a417d50cc7 20
spin7ion 0:a8a417d50cc7 21 nRF24L01P radio(D11, D12, D13, D10, D9, D8); // mosi, miso, sck, csn, ce, irq
spin7ion 0:a8a417d50cc7 22
spin7ion 0:a8a417d50cc7 23 uint16_t channels[CHANNELS_NUMBER];
spin7ion 0:a8a417d50cc7 24 uint16_t buffer [CHANNELS_NUMBER];
spin7ion 1:e11cc38ef502 25 int bytesWritten;
spin7ion 0:a8a417d50cc7 26
spin7ion 1:e11cc38ef502 27 uint16_t state = ((uint16_t)0x00 << 8)|(uint8_t)STATE_INITILIZATION;
spin7ion 1:e11cc38ef502 28
spin7ion 1:e11cc38ef502 29 /*
spin7ion 1:e11cc38ef502 30 PwmOut depthEsc1(PTC2);
spin7ion 1:e11cc38ef502 31 PwmOut depthEsc2(PTC2);
spin7ion 1:e11cc38ef502 32 PwmOut leftEsc(PTC2);
spin7ion 1:e11cc38ef502 33 PwmOut rightEsc(PTC2);
spin7ion 1:e11cc38ef502 34 */
spin7ion 1:e11cc38ef502 35
spin7ion 1:e11cc38ef502 36 Timer t;
spin7ion 1:e11cc38ef502 37
spin7ion 1:e11cc38ef502 38 void setState(uint8_t newState) {
spin7ion 1:e11cc38ef502 39 state=state | newState;
spin7ion 1:e11cc38ef502 40 }
spin7ion 1:e11cc38ef502 41
spin7ion 1:e11cc38ef502 42 void initialize() {
spin7ion 1:e11cc38ef502 43 state=((uint16_t)0x01 << 8) | state;
spin7ion 1:e11cc38ef502 44 }
spin7ion 1:e11cc38ef502 45
spin7ion 1:e11cc38ef502 46 bool isInitializated() {
spin7ion 1:e11cc38ef502 47 return (state>>8) & 0x01;
spin7ion 1:e11cc38ef502 48 }
spin7ion 0:a8a417d50cc7 49
spin7ion 0:a8a417d50cc7 50 void zeroBuffer(){
spin7ion 0:a8a417d50cc7 51 memset(buffer, 0, sizeof(buffer));
spin7ion 0:a8a417d50cc7 52 }
spin7ion 0:a8a417d50cc7 53
spin7ion 0:a8a417d50cc7 54 int main() {
spin7ion 1:e11cc38ef502 55 /*
spin7ion 1:e11cc38ef502 56 depthEsc1.period_us(20000); // servo requires a 20ms period
spin7ion 1:e11cc38ef502 57 depthEsc1.pulsewidth_us(SERVO_CENTER);
spin7ion 1:e11cc38ef502 58 depthEsc2.period_us(20000); // servo requires a 20ms period
spin7ion 1:e11cc38ef502 59 depthEsc2.pulsewidth_us(SERVO_CENTER);
spin7ion 1:e11cc38ef502 60 leftEsc.period_us(20000); // servo requires a 20ms period
spin7ion 1:e11cc38ef502 61 leftEsc.pulsewidth_us(SERVO_CENTER);
spin7ion 1:e11cc38ef502 62 rightEsc.period_us(20000); // servo requires a 20ms period
spin7ion 1:e11cc38ef502 63 rightEsc.pulsewidth_us(SERVO_CENTER);
spin7ion 1:e11cc38ef502 64
spin7ion 1:e11cc38ef502 65 */
spin7ion 0:a8a417d50cc7 66 //v_servo.pulsewidth_us(pulse); // servo position determined by a pulsewidth between 1-2ms
spin7ion 0:a8a417d50cc7 67
spin7ion 0:a8a417d50cc7 68 radio.powerUp();
spin7ion 0:a8a417d50cc7 69 pc.baud(115200);
spin7ion 0:a8a417d50cc7 70 pc.printf("We all live in a yellow submarine!\r\n");
spin7ion 0:a8a417d50cc7 71
spin7ion 0:a8a417d50cc7 72 radio.setRxAddress(0xDEADBEEF0F);
spin7ion 0:a8a417d50cc7 73 radio.setTxAddress(0xDEADC0DE0F);
spin7ion 0:a8a417d50cc7 74 radio.setRfFrequency(2405);
spin7ion 0:a8a417d50cc7 75 radio.powerUp();
spin7ion 0:a8a417d50cc7 76
spin7ion 0:a8a417d50cc7 77 pc.printf( "nRF24L01+ Frequency : %d MHz\r\n", radio.getRfFrequency() );
spin7ion 0:a8a417d50cc7 78 pc.printf( "nRF24L01+ Output power : %d dBm\r\n", radio.getRfOutputPower() );
spin7ion 0:a8a417d50cc7 79 pc.printf( "nRF24L01+ Data Rate : %d kbps\r\n", radio.getAirDataRate() );
spin7ion 0:a8a417d50cc7 80 pc.printf( "nRF24L01+ TX Address : 0x%010llX\r\n", radio.getTxAddress() );
spin7ion 0:a8a417d50cc7 81 pc.printf( "nRF24L01+ RX Address : 0x%010llX\r\n", radio.getRxAddress() );
spin7ion 0:a8a417d50cc7 82
spin7ion 0:a8a417d50cc7 83 radio.setTransferSize( CHANNELS_NUMBER*sizeof(uint16_t) );
spin7ion 0:a8a417d50cc7 84
spin7ion 0:a8a417d50cc7 85 radio.setReceiveMode();
spin7ion 0:a8a417d50cc7 86
spin7ion 0:a8a417d50cc7 87 radio.enable();
spin7ion 0:a8a417d50cc7 88
spin7ion 0:a8a417d50cc7 89 pc.printf("Greetings, capitain!\r\n");
spin7ion 1:e11cc38ef502 90 pc.printf("is initializated: %s\r\n", isInitializated()?"true":"false");
spin7ion 1:e11cc38ef502 91 pc.printf( "0x%X\r\n", state );
spin7ion 1:e11cc38ef502 92 t.start();
spin7ion 0:a8a417d50cc7 93
spin7ion 0:a8a417d50cc7 94 while (1)
spin7ion 0:a8a417d50cc7 95 {
spin7ion 1:e11cc38ef502 96 int startTime=t.read_ms();
spin7ion 1:e11cc38ef502 97 while( !radio.readable() && t.read_ms()-startTime < RCV_TIMEOUT_MS);
spin7ion 1:e11cc38ef502 98
spin7ion 1:e11cc38ef502 99 if(!radio.readable()) {
spin7ion 1:e11cc38ef502 100 //failsafe
spin7ion 1:e11cc38ef502 101 setState(STATE_FAILSAFE);
spin7ion 1:e11cc38ef502 102 pc.printf("Failsafe\n\r", channels[0],channels[1],channels[2],channels[3]);
spin7ion 1:e11cc38ef502 103 channels[0]=512;
spin7ion 1:e11cc38ef502 104 channels[1]=512;
spin7ion 1:e11cc38ef502 105 channels[2]=512;
spin7ion 1:e11cc38ef502 106 channels[3]=512;
spin7ion 1:e11cc38ef502 107 } else {
spin7ion 0:a8a417d50cc7 108 int rxDataCnt = radio.read( NRF24L01P_PIPE_P0, (char*)buffer, sizeof( buffer ) );
spin7ion 0:a8a417d50cc7 109
spin7ion 0:a8a417d50cc7 110 if (buffer[0] == CMD_VALUE) {
spin7ion 0:a8a417d50cc7 111 pc.printf("Command: %d\r\n", buffer[1]);
spin7ion 0:a8a417d50cc7 112 switch(buffer[1]){
spin7ion 0:a8a417d50cc7 113 case CMD_GET_STATUS:
spin7ion 0:a8a417d50cc7 114 zeroBuffer();
spin7ion 1:e11cc38ef502 115 //strcpy((char*)buffer,"I'm alive");
spin7ion 1:e11cc38ef502 116 buffer[0]=state;
spin7ion 1:e11cc38ef502 117 buffer[1]=t.read_us();
spin7ion 0:a8a417d50cc7 118 radio.setTransmitMode();
spin7ion 0:a8a417d50cc7 119 //wait(0.1);
spin7ion 1:e11cc38ef502 120 bytesWritten = radio.write( NRF24L01P_PIPE_P0, (char*)buffer, sizeof( buffer ) );
spin7ion 0:a8a417d50cc7 121 if (bytesWritten<2*CHANNELS_NUMBER){
spin7ion 0:a8a417d50cc7 122 pc.printf("Transmit error\r\n");
spin7ion 0:a8a417d50cc7 123 } else {
spin7ion 1:e11cc38ef502 124 //pc.printf("Sent telemetry: %s\r\n",(char*)buffer);
spin7ion 0:a8a417d50cc7 125 }
spin7ion 0:a8a417d50cc7 126 radio.setReceiveMode();
spin7ion 0:a8a417d50cc7 127 //wait(0.1);
spin7ion 0:a8a417d50cc7 128 break;
spin7ion 1:e11cc38ef502 129 case CMD_INITIALIZE:
spin7ion 1:e11cc38ef502 130 initialize();
spin7ion 1:e11cc38ef502 131 setState(STATE_RUN);
spin7ion 1:e11cc38ef502 132 break;
spin7ion 0:a8a417d50cc7 133 }
spin7ion 0:a8a417d50cc7 134 } else {
spin7ion 0:a8a417d50cc7 135 for(int i=0; i<CHANNELS_NUMBER; i++){
spin7ion 0:a8a417d50cc7 136 channels[i] = buffer[i];
spin7ion 0:a8a417d50cc7 137 }
spin7ion 0:a8a417d50cc7 138 pc.printf("received channels: %d %d %d %d\n\r", channels[0],channels[1],channels[2],channels[3]);
spin7ion 0:a8a417d50cc7 139 }
spin7ion 0:a8a417d50cc7 140 }
spin7ion 1:e11cc38ef502 141
spin7ion 1:e11cc38ef502 142
spin7ion 0:a8a417d50cc7 143 }
spin7ion 0:a8a417d50cc7 144
spin7ion 0:a8a417d50cc7 145 }