
ROV rc transmitter
main.cpp@1:a89ab6413920, 2018-09-10 (annotated)
- 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?
User | Revision | Line number | New 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 | } |