Hawk Eye
/
ROVReceiver
Receiver for rc ROV
main.cpp@1:e11cc38ef502, 2018-09-10 (annotated)
- 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?
User | Revision | Line number | New 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 | } |