/* 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 }; 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 }; enum MJXQ { WLH08 = 0, X600 = 1, X800 = 2, H26D = 3 }; 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 BIND_pin 13 #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 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 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 sub_protocol==MJXQ WLH08 0 X600 1 X800 2 H26D 3 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 */