ROV rc transmitter

Dependencies:   mbed nRF24L01P

Committer:
spin7ion
Date:
Mon Sep 10 20:11:12 2018 +0000
Revision:
1:a89ab6413920
Parent:
0:fb01b60e139b
Communication works

Who changed what in which revision?

UserRevisionLine numberNew contents of line
spin7ion 0:fb01b60e139b 1 #include "mbed.h"
spin7ion 0:fb01b60e139b 2 #include "nRF24L01P.h"
spin7ion 0:fb01b60e139b 3
spin7ion 0:fb01b60e139b 4 #define CHANNELS_NUMBER 12
spin7ion 0:fb01b60e139b 5 #define CMD_VALUE 65535
spin7ion 0:fb01b60e139b 6 #define CMD_GET_STATUS 1
spin7ion 1:a89ab6413920 7 #define CMD_INITIALIZE 2
spin7ion 1:a89ab6413920 8
spin7ion 1:a89ab6413920 9 #define RCV_TIMEOUT_MS 150
spin7ion 0:fb01b60e139b 10
spin7ion 0:fb01b60e139b 11 nRF24L01P radio( PB_5, // MOSI
spin7ion 0:fb01b60e139b 12 PB_4, // MISO
spin7ion 0:fb01b60e139b 13 PB_3, // SCK
spin7ion 0:fb01b60e139b 14 PB_7, // CSN
spin7ion 0:fb01b60e139b 15 PB_6, // CE
spin7ion 0:fb01b60e139b 16 PB_8); // IRQ
spin7ion 0:fb01b60e139b 17
spin7ion 0:fb01b60e139b 18
spin7ion 0:fb01b60e139b 19 DigitalOut myled(PA_7);
spin7ion 0:fb01b60e139b 20
spin7ion 0:fb01b60e139b 21 AnalogIn CH1(PC_0);
spin7ion 0:fb01b60e139b 22 AnalogIn CH2(PC_1);
spin7ion 0:fb01b60e139b 23 AnalogIn CH3(PC_2);
spin7ion 0:fb01b60e139b 24 AnalogIn CH4(PC_3);
spin7ion 0:fb01b60e139b 25
spin7ion 0:fb01b60e139b 26 Serial pc(PA_2, PA_3); // tx, rx
spin7ion 0:fb01b60e139b 27
spin7ion 0:fb01b60e139b 28 uint16_t channels[CHANNELS_NUMBER];
spin7ion 0:fb01b60e139b 29 uint16_t buffer [CHANNELS_NUMBER];
spin7ion 0:fb01b60e139b 30
spin7ion 1:a89ab6413920 31 Timer t;
spin7ion 1:a89ab6413920 32 int timeOffsetMs=0;
spin7ion 1:a89ab6413920 33
spin7ion 1:a89ab6413920 34 int getSubmarineTimeMs(){
spin7ion 1:a89ab6413920 35 return t.read_ms()+timeOffsetMs;
spin7ion 1:a89ab6413920 36 }
spin7ion 1:a89ab6413920 37
spin7ion 1:a89ab6413920 38 void updateTimeOffset(int subTime){
spin7ion 1:a89ab6413920 39 timeOffsetMs = subTime-t.read_ms();
spin7ion 1:a89ab6413920 40 }
spin7ion 1:a89ab6413920 41
spin7ion 0:fb01b60e139b 42 void readChannels() {
spin7ion 0:fb01b60e139b 43 channels[0]=(uint16_t)(1024*CH1.read());
spin7ion 0:fb01b60e139b 44 channels[1]=(uint16_t)(1024*CH2.read());
spin7ion 0:fb01b60e139b 45 channels[2]=(uint16_t)(1024*CH3.read());
spin7ion 0:fb01b60e139b 46 channels[3]=(uint16_t)(1024*CH4.read());
spin7ion 0:fb01b60e139b 47 }
spin7ion 0:fb01b60e139b 48
spin7ion 1:a89ab6413920 49 bool isInitializated(uint16_t state) {
spin7ion 1:a89ab6413920 50 if((state>>8) & 0x01) return true;
spin7ion 1:a89ab6413920 51 return false;
spin7ion 1:a89ab6413920 52 }
spin7ion 1:a89ab6413920 53
spin7ion 0:fb01b60e139b 54 void zeroBuffer(){
spin7ion 0:fb01b60e139b 55 memset(buffer, 0, sizeof(buffer));
spin7ion 0:fb01b60e139b 56 }
spin7ion 0:fb01b60e139b 57
spin7ion 1:a89ab6413920 58 bool receiveBuffer(){
spin7ion 1:a89ab6413920 59 radio.setReceiveMode();
spin7ion 1:a89ab6413920 60
spin7ion 1:a89ab6413920 61 int startTime=t.read_ms();
spin7ion 1:a89ab6413920 62
spin7ion 1:a89ab6413920 63 while( !radio.readable() && t.read_ms()-startTime < RCV_TIMEOUT_MS);
spin7ion 1:a89ab6413920 64
spin7ion 1:a89ab6413920 65 if(radio.readable())
spin7ion 1:a89ab6413920 66 {
spin7ion 1:a89ab6413920 67 pc.printf("Availiable %d\r\n",radio.readable());
spin7ion 1:a89ab6413920 68 zeroBuffer();
spin7ion 1:a89ab6413920 69 int rxDataCnt = radio.read( NRF24L01P_PIPE_P0, (char*)buffer, sizeof( buffer ) );
spin7ion 1:a89ab6413920 70
spin7ion 1:a89ab6413920 71
spin7ion 1:a89ab6413920 72 return true;
spin7ion 1:a89ab6413920 73 }
spin7ion 1:a89ab6413920 74 return false;
spin7ion 1:a89ab6413920 75 }
spin7ion 1:a89ab6413920 76
spin7ion 0:fb01b60e139b 77 void askFor(uint16_t query) {
spin7ion 0:fb01b60e139b 78 zeroBuffer();
spin7ion 0:fb01b60e139b 79 buffer[0] = CMD_VALUE;
spin7ion 0:fb01b60e139b 80 buffer[1] = query;
spin7ion 0:fb01b60e139b 81 radio.setTransmitMode();
spin7ion 0:fb01b60e139b 82 int bytesWritten=radio.write( NRF24L01P_PIPE_P1, (char*)buffer, sizeof(buffer) );
spin7ion 0:fb01b60e139b 83
spin7ion 0:fb01b60e139b 84 if (bytesWritten<sizeof(buffer)) {
spin7ion 0:fb01b60e139b 85 pc.printf("Cmd transmit error");
spin7ion 0:fb01b60e139b 86 } else {
spin7ion 0:fb01b60e139b 87 pc.printf("Sent %d bytes\r\n",bytesWritten);
spin7ion 0:fb01b60e139b 88 }
spin7ion 0:fb01b60e139b 89
spin7ion 0:fb01b60e139b 90
spin7ion 0:fb01b60e139b 91 }
spin7ion 0:fb01b60e139b 92
spin7ion 0:fb01b60e139b 93 int main() {
spin7ion 1:a89ab6413920 94 myled=0;
spin7ion 0:fb01b60e139b 95 pc.baud(115200);
spin7ion 0:fb01b60e139b 96 pc.format();
spin7ion 0:fb01b60e139b 97 pc.printf("Hello world\r\n");
spin7ion 0:fb01b60e139b 98
spin7ion 0:fb01b60e139b 99 radio.setTxAddress(0xDEADBEEF0F);
spin7ion 0:fb01b60e139b 100 radio.setRxAddress(0xDEADC0DE0F);
spin7ion 0:fb01b60e139b 101 radio.setRfFrequency(2405);
spin7ion 0:fb01b60e139b 102 radio.setRfOutputPower(NRF24L01P_TX_PWR_MINUS_18_DB);
spin7ion 0:fb01b60e139b 103 radio.powerUp();
spin7ion 0:fb01b60e139b 104 pc.printf( "nRF24L01+ Frequency : %d MHz\r\n", radio.getRfFrequency() );
spin7ion 0:fb01b60e139b 105 pc.printf( "nRF24L01+ Channel : %d \r\n", (radio.getRfFrequency() - NRF24L01P_MIN_RF_FREQUENCY ) & 0x7F );
spin7ion 0:fb01b60e139b 106 pc.printf( "nRF24L01+ Output power : %d dBm\r\n", radio.getRfOutputPower() );
spin7ion 0:fb01b60e139b 107 pc.printf( "nRF24L01+ Data Rate : %d kbps\r\n", radio.getAirDataRate() );
spin7ion 0:fb01b60e139b 108 pc.printf( "nRF24L01+ TX Address : 0x%010llX\r\n", radio.getTxAddress() );
spin7ion 0:fb01b60e139b 109 pc.printf( "nRF24L01+ RX Address : 0x%010llX\r\n", radio.getRxAddress() );
spin7ion 0:fb01b60e139b 110 radio.setTransmitMode();
spin7ion 0:fb01b60e139b 111 radio.setTransferSize( CHANNELS_NUMBER*sizeof(uint16_t) );
spin7ion 0:fb01b60e139b 112 radio.enable();
spin7ion 0:fb01b60e139b 113
spin7ion 1:a89ab6413920 114 for(int i=4;i>0;i--){
spin7ion 1:a89ab6413920 115 myled=!myled;
spin7ion 1:a89ab6413920 116 wait(0.5);
spin7ion 1:a89ab6413920 117 }
spin7ion 1:a89ab6413920 118
spin7ion 1:a89ab6413920 119 t.start();
spin7ion 0:fb01b60e139b 120
spin7ion 0:fb01b60e139b 121 while(1) {
spin7ion 0:fb01b60e139b 122 readChannels();
spin7ion 0:fb01b60e139b 123 radio.setTransmitMode();
spin7ion 0:fb01b60e139b 124 //pc.printf("Sent: %d bytes",radio.write( NRF24L01P_PIPE_P1, test, 1 ));
spin7ion 0:fb01b60e139b 125 int bytesWritten=radio.write( NRF24L01P_PIPE_P0, (char*)channels, 2*CHANNELS_NUMBER );
spin7ion 0:fb01b60e139b 126
spin7ion 0:fb01b60e139b 127 if (bytesWritten<2*CHANNELS_NUMBER){
spin7ion 0:fb01b60e139b 128 pc.printf("Transmit error");
spin7ion 0:fb01b60e139b 129 }
spin7ion 1:a89ab6413920 130
spin7ion 0:fb01b60e139b 131 askFor(CMD_GET_STATUS);
spin7ion 1:a89ab6413920 132 if (!receiveBuffer()) {
spin7ion 1:a89ab6413920 133 pc.printf("Timeout\r\n",(char*)buffer);
spin7ion 1:a89ab6413920 134 myled=1;
spin7ion 1:a89ab6413920 135 continue;
spin7ion 0:fb01b60e139b 136 }
spin7ion 1:a89ab6413920 137 myled=0;
spin7ion 1:a89ab6413920 138 pc.printf("Received telemetry: %s\r\n",(char*)buffer);
spin7ion 1:a89ab6413920 139 if (!isInitializated(buffer[0])){
spin7ion 1:a89ab6413920 140 pc.printf("Need initialization\r\n");
spin7ion 1:a89ab6413920 141 updateTimeOffset(buffer[1]);
spin7ion 1:a89ab6413920 142 askFor(CMD_INITIALIZE);
spin7ion 1:a89ab6413920 143 if (!receiveBuffer()) {
spin7ion 1:a89ab6413920 144 pc.printf("Timeout\r\n",(char*)buffer);
spin7ion 1:a89ab6413920 145 continue;
spin7ion 1:a89ab6413920 146 }
spin7ion 1:a89ab6413920 147
spin7ion 1:a89ab6413920 148 } else {
spin7ion 1:a89ab6413920 149
spin7ion 1:a89ab6413920 150 }
spin7ion 0:fb01b60e139b 151
spin7ion 1:a89ab6413920 152 /*
spin7ion 1:a89ab6413920 153 value & 0xff;
spin7ion 1:a89ab6413920 154 (value >> 8) & 0xff;
spin7ion 1:a89ab6413920 155 */
spin7ion 1:a89ab6413920 156 //pc.printf("Telem %s\r\n",(char*)buffer);
spin7ion 0:fb01b60e139b 157 }
spin7ion 0:fb01b60e139b 158 }