/* This project is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Multiprotocol is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Multiprotocol. If not, see . */ // Check selected board type #ifndef XMEGA #if not defined(ARDUINO_AVR_PRO) && not defined(ARDUINO_AVR_MINI) #error You must select the board type "Arduino Pro or Pro Mini" or "Arduino Mini" #endif #if F_CPU != 16000000L || not defined(__AVR_ATmega328P__) #error You must select the processor type "ATmega328(5V, 16MHz)" #endif #endif //****************** // Protocols //****************** enum PROTOCOLS { MODE_SERIAL = 0, // Serial commands MODE_FLYSKY = 1, // =>A7105 MODE_HUBSAN = 2, // =>A7105 MODE_FRSKY = 3, // =>CC2500 MODE_HISKY = 4, // =>NRF24L01 MODE_V2X2 = 5, // =>NRF24L01 MODE_DSM2 = 6, // =>CYRF6936 MODE_DEVO = 7, // =>CYRF6936 MODE_YD717 = 8, // =>NRF24L01 MODE_KN = 9, // =>NRF24L01 MODE_SYMAX = 10, // =>NRF24L01 MODE_SLT = 11, // =>NRF24L01 MODE_CX10 = 12, // =>NRF24L01 MODE_CG023 = 13, // =>NRF24L01 MODE_BAYANG = 14, // =>NRF24L01 MODE_FRSKYX = 15, // =>CC2500 MODE_ESKY = 16, // =>NRF24L01 MODE_MT99XX = 17, // =>NRF24L01 MODE_MJXQ = 18, // =>NRF24L01 MODE_SHENQI = 19, // =>NRF24L01 MODE_FY326 = 20, // =>NRF24L01 MODE_SFHSS = 21, // =>CC2500 MODE_J6PRO = 22, // =>CYRF6936 MODE_FQ777 = 23, // =>NRF24L01 MODE_ASSAN = 24 // =>NRF24L01 }; enum Flysky { Flysky = 0, V9X9 = 1, V6X6 = 2, V912 = 3 }; enum Hisky { Hisky = 0, HK310 = 1 }; enum DSM2 { DSM2 = 0, DSMX = 1 }; enum YD717 { YD717 = 0, SKYWLKR = 1, SYMAX4 = 2, XINXUN = 3, NIHUI = 4 }; enum KN { WLTOYS = 0, FEILUN = 1 }; enum SYMAX { SYMAX = 0, SYMAX5C = 1 }; enum CX10 { CX10_GREEN = 0, CX10_BLUE = 1, // also compatible with CX10-A, CX12 DM007 = 2, Q282 = 3, JC3015_1 = 4, JC3015_2 = 5, MK33041 = 6, Q242 = 7 }; enum CG023 { CG023 = 0, YD829 = 1, H8_3D = 2 }; enum MT99XX { MT99 = 0, H7 = 1, YZ = 2, LS = 3 }; enum MJXQ { WLH08 = 0, X600 = 1, X800 = 2, H26D = 3, E010 = 4 }; enum FRSKYX { CH_16 = 0, CH_8 = 1, }; #define NONE 0 #define P_HIGH 1 #define P_LOW 0 #define AUTOBIND 1 #define NO_AUTOBIND 0 struct PPM_Parameters { uint8_t protocol : 5; uint8_t sub_proto : 3; uint8_t rx_num : 4; uint8_t power : 1; uint8_t autobind : 1; uint8_t option; }; //******************* //*** Pinouts *** //******************* #define LED_pin 13 //Promini original led on B5 #define PPM_pin 3 //PPM-D3 #ifdef XMEGA #define SDI_pin 6 //SDIO-D6 #else #define SDI_pin 5 //SDIO-D5 #endif #define SCLK_pin 4 //SCK-D4 #define CS_pin 2 //CS-D2 #define SDO_pin 6 //D6 #define CC25_CSN_pin 7 #define NRF_CSN_pin 8 #define CYRF_CSN_pin 9 #define CTRL1 1 //C1 (A1) #define CTRL2 2 //C2 (A2) // #ifdef XMEGA #define CTRL1_on #define CTRL1_off #define CTRL2_on #define CTRL2_off #else #define CTRL1_on PORTC |= _BV(1) #define CTRL1_off PORTC &= ~_BV(1) #define CTRL2_on PORTC |= _BV(2) #define CTRL2_off PORTC &= ~_BV(2) #endif // #ifdef XMEGA #define CS_on PORTD.OUTSET = _BV(4) //D4 #define CS_off PORTD.OUTCLR = _BV(4) //D4 #else #define CS_on PORTD |= _BV(2) //D2 #define CS_off PORTD &= ~_BV(2) //D2 #endif // #ifdef XMEGA #define SCK_on PORTD.OUTSET = _BV(7) //D7 #define SCK_off PORTD.OUTCLR = _BV(7) //D7 #else #define SCK_on PORTD |= _BV(4) //D4 #define SCK_off PORTD &= ~_BV(4) //D4 #endif // #ifdef XMEGA #define SDI_on PORTD.OUTSET = _BV(5) //D5 #define SDI_off PORTD.OUTCLR = _BV(5) //D5 #else #define SDI_on PORTD |= _BV(5) //D5 #define SDI_off PORTD &= ~_BV(5) //D5 #endif // #ifdef XMEGA #define SDI_1 (PORTD.IN & (1< Reserved 0 Flysky 1 Hubsan 2 Frsky 3 Hisky 4 V2x2 5 DSM2 6 Devo 7 YD717 8 KN 9 SymaX 10 SLT 11 CX10 12 CG023 13 Bayang 14 FrskyX 15 ESky 16 MT99XX 17 MJXQ 18 SHENQI 19 FY326 20 SFHSS 21 J6PRO 22 FQ777 23 ASSAN 24 BindBit=> 0x80 1=Bind/0=No AutoBindBit=> 0x40 1=Yes /0=No RangeCheck=> 0x20 1=Yes /0=No Stream[2] = RxNum | Power | Type; RxNum value is 0..15 (bits 0..3) Type is 0..7 <<4 (bit 4..6) sub_protocol==Flysky Flysky 0 V9x9 1 V6x6 2 V912 3 sub_protocol==Hisky Hisky 0 HK310 1 sub_protocol==DSM2 DSM2 0 DSMX 1 sub_protocol==YD717 YD717 0 SKYWLKR 1 SYMAX4 2 XINXUN 3 NIHUI 4 sub_protocol==KN WLTOYS 0 FEILUN 1 sub_protocol==SYMAX SYMAX 0 SYMAX5C 1 sub_protocol==CX10 CX10_GREEN 0 CX10_BLUE 1 // also compatible with CX10-A, CX12 DM007 2 Q282 3 JC3015_1 4 JC3015_2 5 MK33041 6 Q242 7 sub_protocol==CG023 CG023 0 YD829 1 H8_3D 2 sub_protocol==MT99XX MT99 0 H7 1 YZ 2 LS 3 sub_protocol==MJXQ WLH08 0 X600 1 X800 2 H26D 3 E010 4 sub_protocol==FRSKYX CH_16 0 CH_8 1 Power value => 0x80 0=High/1=Low Stream[3] = option_protocol; option_protocol value is -127..127 Stream[4] to [25] = Channels 16 Channels on 11 bits (0..2047) 0 -125% 204 -100% 1024 0% 1843 +100% 2047 +125% Channels bits are concatenated to fit in 22 bytes like in SBUS protocol */