diff --git a/Multiprotocol/FrSky_cc2500.ino b/Multiprotocol/FrSky_cc2500.ino index 035383e..40b0f6c 100644 --- a/Multiprotocol/FrSky_cc2500.ino +++ b/Multiprotocol/FrSky_cc2500.ino @@ -151,7 +151,7 @@ static void frsky2way_init(uint8_t bind) cc2500_writeReg(CC2500_08_PKTCTRL0, 0x05); cc2500_writeReg(CC2500_3E_PATABLE, 0xff); cc2500_writeReg(CC2500_0B_FSCTRL1, 0x08); - cc2500_writeReg(CC2500_0C_FSCTRL0, fine); + cc2500_writeReg(CC2500_0C_FSCTRL0, option); //base freq FREQ = 0x5C7627 (F = 2404MHz) cc2500_writeReg(CC2500_0D_FREQ2, 0x5c); cc2500_writeReg(CC2500_0E_FREQ1, 0x76); diff --git a/Multiprotocol/Hisky_nrf24l01.ino b/Multiprotocol/Hisky_nrf24l01.ino index d7a3fde..4076f7a 100644 --- a/Multiprotocol/Hisky_nrf24l01.ino +++ b/Multiprotocol/Hisky_nrf24l01.ino @@ -18,21 +18,21 @@ #include "iface_nrf24l01.h" -#define BIND_COUNT 1000 -#define TXID_SIZE 5 -#define FREQUENCE_NUM 20 +#define HISKY_BIND_COUNT 1000 +#define HISKY_TXID_SIZE 5 +#define HISKY_FREQUENCE_NUM 20 // uint8_t bind_buf_arry[4][10]; // HiSky protocol uses TX id as an address for nRF24L01, and uses frequency hopping sequence // which does not depend on this id and is passed explicitly in binding sequence. So we are free // to generate this sequence as we wish. It should be in the range [02..77] -static void calc_fh_channels(uint32_t seed) +static void calc_fh_channels() { uint8_t idx = 0; - uint32_t rnd = seed; + uint32_t rnd = MProtocol_id; - while (idx < FREQUENCE_NUM) + while (idx < HISKY_FREQUENCE_NUM) { uint8_t i; uint8_t count_2_26 = 0, count_27_50 = 0, count_51_74 = 0; @@ -41,7 +41,7 @@ static void calc_fh_channels(uint32_t seed) // Use least-significant byte. 73 is prime, so channels 76..77 are unused uint8_t next_ch = ((rnd >> 8) % 73) + 2; // Keep the distance 2 between the channels - either odd or even - if (((next_ch ^ (uint8_t)seed) & 0x01 )== 0) + if (((next_ch ^ (uint8_t)rx_tx_addr[3]) & 0x01 )== 0) continue; // Check that it's not duplicated and spread uniformly for (i = 0; i < idx; i++) { @@ -195,7 +195,7 @@ uint16_t hisky_cb() NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, rx_tx_addr, 5); NRF24L01_WriteReg(NRF24L01_05_RF_CH, hopping_frequency[hopping_frequency_no]); hopping_frequency_no++; - if (hopping_frequency_no >= FREQUENCE_NUM) + if (hopping_frequency_no >= HISKY_FREQUENCE_NUM) hopping_frequency_no = 0; break; case 7: @@ -213,15 +213,19 @@ uint16_t hisky_cb() return 1000; // send 1 binding packet and 1 data packet per 9ms } -// Generate internal id from TX id and manufacturer id (STM32 unique id) static void initialize_tx_id() { //Generate frequency hopping table if(sub_protocol==HK310) - for(uint8_t i=0;i. */ +// compatible with Hubsan H102D, H107/L/C/D and H107P/C+/D+ // Last sync with hexfet new_protocols/hubsan_a7105.c dated 2015-12-11 #if defined(HUBSAN_A7105_INO) diff --git a/Multiprotocol/Multiprotocol.ino b/Multiprotocol/Multiprotocol.ino index c10128d..ea19440 100644 --- a/Multiprotocol/Multiprotocol.ino +++ b/Multiprotocol/Multiprotocol.ino @@ -4,7 +4,7 @@ http://www.rcgroups.com/forums/showthread.php?t=2165676 https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/edit/master/README.md - Thanks to PhracturedBlue + Thanks to PhracturedBlue, Hexfet, Goebish and all protocol developers Ported from deviation firmware This project is free software: you can redistribute it and/or modify @@ -23,71 +23,10 @@ #include #include #include +#include "Multiprotocol.h" -//****************************************************** -//****************************************************** -// Multiprotocol module configuration starts here - -//Uncomment the type of TX -#define TX_ER9X //ER9X AETR (988<->2012µs) -//#define TX_DEVO7 //DEVO7 EATR (1120<->1920µs) -//#define TX_SPEKTRUM //Spektrum TAER (1100<->1900µs) -//#define TX_HISKY //HISKY AETR (1100<->1900µs) - -#include "multiprotocol.h" - -//Uncomment to enable 8 channels serial protocol, 16 otherwise -//#define NUM_SERIAL_CH_8 - -//Uncomment to enable telemetry -#define TELEMETRY - -//Comment protocols to exclude from compilation -#define BAYANG_NRF24L01_INO -#define CG023_NRF24L01_INO -#define CX10_NRF24L01_INO -#define DEVO_CYRF6936_INO -#define DSM2_CYRF6936_INO -#define ESKY_NRF24L01_INO -#define FLYSKY_A7105_INO -#define FRSKY_CC2500_INO -#define HISKY_NRF24L01_INO -#define HUBSAN_A7105_INO -#define KN_NRF24L01_INO -#define SLT_NRF24L01_INO -#define SYMAX_NRF24L01_INO -#define V2X2_NRF24L01_INO -#define YD717_NRF24L01_INO -//#define FRSKYX_CC2500_INO - -//Update this table to set which protocol/sub_protocol is called for the corresponding dial number -static const uint8_t PPM_prot[15][2]= { {MODE_FLYSKY , Flysky }, //Dial=1 - {MODE_HUBSAN , 0 }, //Dial=2 - {MODE_FRSKY , 0 }, //Dial=3 - {MODE_HISKY , Hisky }, //Dial=4 - {MODE_V2X2 , 0 }, //Dial=5 - {MODE_DSM2 , DSM2 }, //Dial=6 - {MODE_DEVO , 0 }, //Dial=7 - {MODE_YD717 , YD717 }, //Dial=8 - {MODE_KN , WLTOYS }, //Dial=9 - {MODE_SYMAX , SYMAX }, //Dial=10 - {MODE_SLT , 0 }, //Dial=11 - {MODE_CX10 , CX10_BLUE }, //Dial=12 - {MODE_CG023 , CG023 }, //Dial=13 - {MODE_BAYANG , 0 }, //Dial=14 - {MODE_SYMAX , SYMAX5C } //Dial=15 - }; - -//CC2500 RF module frequency adjustment, use in case you cannot bind with Frsky RX -//Note: this is set via Option when serial protocol is used -//values from 0-127 offset increase frequency, values from 255 to 127 decrease base frequency -//uint8_t fine = 0x00; -uint8_t fine = 0xd7; //* 215=-41 * - -// Multiprotocol module configuration ends here -//****************************************************** -//****************************************************** - +//Multiprotocol module configuration file +#include "_Config.h" //Global constants/variables @@ -132,11 +71,7 @@ uint8_t mode_select; uint8_t protocol_flags=0,protocol_flags2=0; // Serial variables -#if defined(NUM_SERIAL_CH_8) //8 channels serial protocol -#define RXBUFFER_SIZE 14 -#else //16 channels serial protocol #define RXBUFFER_SIZE 25 -#endif #define TXBUFFER_SIZE 12 volatile uint8_t rx_buff[RXBUFFER_SIZE]; volatile uint8_t rx_ok_buff[RXBUFFER_SIZE]; @@ -213,18 +148,22 @@ void setup() LED_SET_OUTPUT; // Read or create protocol id - MProtocol_id=random_id(10,false); - MProtocol_id_master=MProtocol_id; + MProtocol_id_master=random_id(10,false); + - //Set power transmission flags - POWER_FLAG_on; //By default high power for everything - //Protocol and interrupts initialization if(mode_select != MODE_SERIAL) { // PPM - cur_protocol[0]= PPM_prot[mode_select-1][0]; - sub_protocol = PPM_prot[mode_select-1][1]; - protocol_init(cur_protocol[0]); + mode_select--; + cur_protocol[0] = PPM_prot[mode_select].protocol; + sub_protocol = PPM_prot[mode_select].sub_proto; + MProtocol_id = PPM_prot[mode_select].rx_num + MProtocol_id_master; + option = PPM_prot[mode_select].option; + if(PPM_prot[mode_select].power) POWER_FLAG_on; + if(PPM_prot[mode_select].autobind) AUTOBIND_FLAG_on; + mode_select++; + + protocol_init(); //Configure PPM interrupt EICRA |=(1<>2)+860; //range 860-2140; -#else //16 channels serial protocol + // decode channel values volatile uint8_t *p=rx_ok_buff+2; uint8_t dec=-3; for(uint8_t i=0;i>dec)&0x7FF)*5)/8+860; //value range 860<->2140 -125%<->+125% } -#endif RX_FLAG_off; //data has been processed } @@ -617,16 +543,6 @@ uint16_t limit_channel_100(uint8_t ch) return Servo_data[ch]; } -// Convert 32b id to rx_tx_addr -static void set_rx_tx_addr(uint32_t id) -{ // Used by almost all protocols - rx_tx_addr[0] = (id >> 24) & 0xFF; - rx_tx_addr[1] = (id >> 16) & 0xFF; - rx_tx_addr[2] = (id >> 8) & 0xFF; - rx_tx_addr[3] = (id >> 0) & 0xFF; - rx_tx_addr[4] = 0xC1; // for YD717: always uses first data port -} - #if defined(TELEMETRY) void Serial_write(uint8_t data) { @@ -641,21 +557,12 @@ void Serial_write(uint8_t data) static void Mprotocol_serial_init() { -#if defined(NUM_SERIAL_CH_8) //8 channels serial protocol - #define BAUD 125000 - #include - UBRR0H = UBRRH_VALUE; - UBRR0L = UBRRL_VALUE; - //Set frame format to 8 data bits, no parity, 1 stop bit - UCSR0C |= (1< UBRR0H = UBRRH_VALUE; UBRR0L = UBRRL_VALUE; //Set frame format to 8 data bits, even parity, 2 stop bits UCSR0C |= (1<> 24) & 0xFF; + rx_tx_addr[1] = (id >> 16) & 0xFF; + rx_tx_addr[2] = (id >> 8) & 0xFF; + rx_tx_addr[3] = (id >> 0) & 0xFF; + rx_tx_addr[4] = 0xC1; // for YD717: always uses first data port +} + static uint32_t random_id(uint16_t adress, uint8_t create_new) { uint32_t id; @@ -694,6 +611,7 @@ static uint32_t random_id(uint16_t adress, uint8_t create_new) /**************************/ /**************************/ +//PPM ISR(INT1_vect) { // Interrupt on PPM pin static int8_t chan=-1; @@ -722,53 +640,7 @@ ISR(INT1_vect) Prev_TCNT1+=Cur_TCNT1; } -#if defined(TELEMETRY) -ISR(USART_UDRE_vect) -{ // Transmit interrupt - uint8_t t = tx_tail; - if(tx_head!=t) - { - if(++t>=TXBUFFER_SIZE)//head - t=0; - UDR0=tx_buff[t]; - tx_tail=t; - } - if (t == tx_head) - UCSR0B &= ~(1<>8) ^ rx_buff[idx++]) & 0xFF]); - } - else - { // A frame has been received and needs to be checked before giving it to main - TIMSK1 &=~(1<=TXBUFFER_SIZE)//head + t=0; + UDR0=tx_buff[t]; + tx_tail=t; + } + if (t == tx_head) + UCSR0B &= ~(1<. + */ + +/** Multiprotocol module configuration file ***/ + +//Uncomment your TX type +#define TX_ER9X //ER9X AETR (988<->2012µs) +//#define TX_DEVO7 //DEVO7 EATR (1120<->1920µs) +//#define TX_SPEKTRUM //Spektrum TAER (1100<->1900µs) +//#define TX_HISKY //HISKY AETR (1100<->1900µs) + +//Uncomment to enable telemetry +#define TELEMETRY + +//Comment a protocol to exclude it from compilation +#define BAYANG_NRF24L01_INO +#define CG023_NRF24L01_INO +#define CX10_NRF24L01_INO +#define DEVO_CYRF6936_INO +#define DSM2_CYRF6936_INO +#define ESKY_NRF24L01_INO +#define FLYSKY_A7105_INO +#define FRSKY_CC2500_INO +#define HISKY_NRF24L01_INO +#define HUBSAN_A7105_INO +#define KN_NRF24L01_INO +#define SLT_NRF24L01_INO +#define SYMAX_NRF24L01_INO +#define V2X2_NRF24L01_INO +#define YD717_NRF24L01_INO +//#define FRSKYX_CC2500_INO + +//Update this table to set which protocol and all associated settings are called for the corresponding dial number +static const PPM_Parameters PPM_prot[15]= +{ +// Protocol Sub protocol RX_Num Power Auto Bind Option + {MODE_FLYSKY, Flysky , 0 , P_HIGH , NO_AUTOBIND , 0 }, //Dial=1 + {MODE_HUBSAN, 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, //Dial=2 + {MODE_FRSKY , 0 , 0 , P_HIGH , NO_AUTOBIND , 0xD7 }, //Dial=3 + {MODE_HISKY , Hisky , 0 , P_HIGH , NO_AUTOBIND , 0 }, //Dial=4 + {MODE_V2X2 , 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, //Dial=5 + {MODE_DSM2 , DSM2 , 0 , P_HIGH , NO_AUTOBIND , 0 }, //Dial=6 + {MODE_DEVO , 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, //Dial=7 + {MODE_YD717 , YD717 , 0 , P_HIGH , NO_AUTOBIND , 0 }, //Dial=8 + {MODE_KN , WLTOYS , 0 , P_HIGH , NO_AUTOBIND , 0 }, //Dial=9 + {MODE_SYMAX , SYMAX , 0 , P_HIGH , NO_AUTOBIND , 0 }, //Dial=10 + {MODE_SLT , 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, //Dial=11 + {MODE_CX10 , CX10_BLUE , 0 , P_HIGH , NO_AUTOBIND , 0 }, //Dial=12 + {MODE_CG023 , CG023 , 0 , P_HIGH , NO_AUTOBIND , 0 }, //Dial=13 + {MODE_BAYANG, 0 , 0 , P_HIGH , NO_AUTOBIND , 0 }, //Dial=14 + {MODE_SYMAX , SYMAX5C , 0 , P_HIGH , NO_AUTOBIND , 0 } //Dial=15 +}; +/* Available protocols and associated sub protocols: + MODE_FLYSKY + Flysky + V9X9 + V6X6 + V912 + MODE_HUBSAN + NONE + MODE_FRSKY + NONE + MODE_HISKY + Hisky + HK310 + MODE_V2X2 + NONE + MODE_DSM2 + DSM2 + DSMX + MODE_DEVO + NONE + MODE_YD717 + YD717 + SKYWLKR + SYMAX4 + XINXUN + NIHUI + MODE_KN + WLTOYS + FEILUN + MODE_SYMAX + SYMAX + SYMAX5C + MODE_SLT + NONE + MODE_CX10 + CX10_GREEN + CX10_BLUE + DM007 + Q282 + JC3015_1 + JC3015_2 + MK33041 + MODE_CG023 + CG023 + YD829 + H8_3D + MODE_BAYANG + NONE + MODE_FRSKYX + NONE + MODE_ESKY + NONE + +RX_Num value between 0 and 15 + +Power P_HIGH or P_LOW + +Auto Bind AUTOBIND or NO_AUTOBIND + +Option value between 0 and 255. 0xD7 or 0x00 for Frsky fine tuning. +*/ + +//****************** +//TX definitions with timing endpoints and channels order + +// Turnigy PPM and channels +#if defined(TX_ER9X) +#define PPM_MAX 2140 +#define PPM_MIN 860 +#define PPM_MAX_100 2012 +#define PPM_MIN_100 988 +enum chan_order{ + AILERON =0, + ELEVATOR, + THROTTLE, + RUDDER, + AUX1, + AUX2, + AUX3, + AUX4, + AUX5, + AUX6, + AUX7, + AUX8 +}; +#endif + +// Devo PPM and channels +#if defined(TX_DEVO7) +#define PPM_MAX 2100 +#define PPM_MIN 900 +#define PPM_MAX_100 1920 +#define PPM_MIN_100 1120 +enum chan_order{ + ELEVATOR=0, + AILERON, + THROTTLE, + RUDDER, + AUX1, + AUX2, + AUX3, + AUX4, + AUX5, + AUX6, + AUX7, + AUX8 +}; +#endif + +// SPEKTRUM PPM and channels +#if defined(TX_SPEKTRUM) +#define PPM_MAX 2000 +#define PPM_MIN 1000 +#define PPM_MAX_100 1900 +#define PPM_MIN_100 1100 +enum chan_order{ + THROTTLE=0, + AILERON, + ELEVATOR, + RUDDER, + AUX1, + AUX2, + AUX3, + AUX4, + AUX5, + AUX6, + AUX7, + AUX8 +}; +#endif + +// HISKY +#if defined(TX_HISKY) +#define PPM_MAX 2000 +#define PPM_MIN 1000 +#define PPM_MAX_100 1900 +#define PPM_MIN_100 1100 +enum chan_order{ + AILERON =0, + ELEVATOR, + THROTTLE, + RUDDER, + AUX1, + AUX2, + AUX3, + AUX4, + AUX5, + AUX6, + AUX7, + AUX8 +}; +#endif + +#define PPM_MIN_COMMAND 1250 +#define PPM_SWITCH 1550 +#define PPM_MAX_COMMAND 1750 diff --git a/Multiprotocol/multiprotocol.h b/Multiprotocol/multiprotocol.h index 3fab255..389a862 100644 --- a/Multiprotocol/multiprotocol.h +++ b/Multiprotocol/multiprotocol.h @@ -87,101 +87,21 @@ enum CG023 H8_3D = 2 }; -//****************** -//TX definitions with timing endpoints and channels order -//****************** +#define NONE 0 +#define P_HIGH 1 +#define P_LOW 0 +#define AUTOBIND 1 +#define NO_AUTOBIND 0 -// Turnigy PPM and channels -#if defined(TX_ER9X) -#define PPM_MAX 2140 -#define PPM_MIN 860 -#define PPM_MAX_100 2012 -#define PPM_MIN_100 988 -enum chan_order{ - AILERON =0, - ELEVATOR, - THROTTLE, - RUDDER, - AUX1, - AUX2, - AUX3, - AUX4, - AUX5, - AUX6, - AUX7, - AUX8 +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; }; -#endif - -// Devo PPM and channels -#if defined(TX_DEVO7) -#define PPM_MAX 2100 -#define PPM_MIN 900 -#define PPM_MAX_100 1920 -#define PPM_MIN_100 1120 -enum chan_order{ - ELEVATOR=0, - AILERON, - THROTTLE, - RUDDER, - AUX1, - AUX2, - AUX3, - AUX4, - AUX5, - AUX6, - AUX7, - AUX8 -}; -#endif - -// SPEKTRUM PPM and channels -#if defined(TX_SPEKTRUM) -#define PPM_MAX 2000 -#define PPM_MIN 1000 -#define PPM_MAX_100 1900 -#define PPM_MIN_100 1100 -enum chan_order{ - THROTTLE=0, - AILERON, - ELEVATOR, - RUDDER, - AUX1, - AUX2, - AUX3, - AUX4, - AUX5, - AUX6, - AUX7, - AUX8 -}; -#endif - -// HISKY -#if defined(TX_HISKY) -#define PPM_MAX 2000 -#define PPM_MIN 1000 -#define PPM_MAX_100 1900 -#define PPM_MIN_100 1100 -enum chan_order{ - AILERON =0, - ELEVATOR, - THROTTLE, - RUDDER, - AUX1, - AUX2, - AUX3, - AUX4, - AUX5, - AUX6, - AUX7, - AUX8 -}; -#endif - -#define PPM_MIN_COMMAND 1250 -#define PPM_SWITCH 1550 -#define PPM_MAX_COMMAND 1750 //******************* //*** Pinouts *** @@ -523,86 +443,5 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p -- 1843 +100% 2047 +125% Channels bits are concatenated to fit in 22 bytes like in SBUS protocol - - -************************** -8 channels serial protocol -************************** -Serial: 125000 Baud 8n1 _ xxxx xxxx - --- - Channels: - Nbr=8 - 10bits=0..1023 - 0 -125% - 96 -100% - 512 0% - 928 +100% - 1023 +125% - Stream[0] = sub_protocol|BindBit|RangeCheckBit|AutoBindBit; - sub_protocol is 0..31 (bits 0..4) - => 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 - BindBit=> 0x80 1=Bind/0=No - AutoBindBit=> 0x40 1=Yes /0=No - RangeCheck=> 0x20 1=Yes /0=No - Stream[1] = 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 - sub_protocol==CG023 - CG023 0 - YD829 1 - H8_3D 2 - Power value => 0x80 0=High/1=Low - Stream[2] = option_protocol; - option_protocol value is -127..127 - Stream[i+3] = lowByte(channel[i]) // with i[0..7] - Stream[11] = highByte(channel[0])<<6 | highByte(channel[1])<<4 | highByte(channel[2])<<2 | highByte(channel[3]) - Stream[12] = highByte(channel[4])<<6 | highByte(channel[5])<<4 | highByte(channel[6])<<2 | highByte(channel[7]) - Stream[13] = lowByte(CRC16(Stream[0..12]) */ - + \ No newline at end of file diff --git a/README.md b/README.md index f3eba31..e890937 100644 --- a/README.md +++ b/README.md @@ -26,12 +26,21 @@ The source code is partly based on the Deviation TX project, thanks to all the d ###Using standard PPM output (trainer port) The multiprotocol TX module can be used on any TX with a trainer port. -Channels order is AETR by default but can be changed in the source code. +Channels order is AETR by default but can be changed in the _Config.h. -The protocol selection is done via a dip switch or a rotary dip switch for access to up to 15 different protocols. +The protocol selection is done via a dip switch or a rotary dip switch. ![Screenshot](http://media.digikey.com/photos/Grayhill%20Photos/94HBB16T_sml.jpg) +You can access to up to 15 different protocols and associated settings. + +Settings per selection are located in _Config.h: + - Protocol and type: many main protocols have variants + - RX Num: number your different RXs and make sure only one model will react to the commands + - Power: High or low, enables to lower the power setting of your TX (indoor for example). + - Option: -127..+127 allowing to set specific protocol options. Like for Hubsan to set the video frequency. + - Autobind: Yes or No. At the model selection (or power applied to the TX) a bind sequence will be initiated + ###Using a serial output The multiprotocol TX module takes full advantage of being used on a Turnigy 9X, 9XR, 9XR Pro, Taranis, 9Xtreme, AR9X, ... running [er9x or ersky9X](https://github.com/MikeBland/mbtx/tree/next). (A version for OpenTX is being looked at) @@ -50,8 +59,8 @@ Options are: Notes: - Using this solution does not need any modification of the TX since it uses the TX module slot PPM pin for serial transfer. - - There are 2 versions of serial protocol either 8 or 16 channels. 16 channels is the latest version. Make sure to use the right version based on your version of er9x/ersky9x. - - Channels order is AETR by default but can be changed in the source code. + - There are 2 versions of serial protocol either 8 or 16 channels. 16 channels is the latest and only available version going forward. Make sure to use the right version based on your version of er9x/ersky9x. + - Channels order is AETR by default but can be changed in _Config.h. ###Telemetry Telemetry is available for er9x and ersky9x TXs. @@ -85,7 +94,7 @@ Notes: ###Protocol selection ####Using the dial for PPM input -PPM is only allowing access to a subset of existing protocols & sub_protocols. +PPM is only allowing access to a subset of existing protocols. The default association dial position / protocol is listed below. Dial|Protocol|Sub_protocol|RF Module @@ -109,7 +118,7 @@ Dial|Protocol|Sub_protocol|RF Module Notes: - The dial selection must be done before the power is applied. -- The protocols and subprotocols accessible by the dial can be personalized by modifying the source code. +- The protocols, subprotocols and all other settings can be personalized by modifying the _Config.h file. ####Using serial input with er9x/ersky9x Serial is allowing access to all existing protocols & sub_protocols listed below. @@ -455,7 +464,7 @@ Arduino 1.6.5 Compilation of the code posted here works. So if it doesn't for you this is a problem with your setup, please double check everything before asking. -Multiprotocol.ino header can be modified to compile with/without some protocols, change protocols/sub_protocols associated with dial for PPM input, different channel orders, different channels timing, 8 or 16 channels serial protocol, Telemetry or not, ... +_Config.h file can be modified to compile with/without some protocols, change protocols/sub_protocols/settings associated with dial for PPM input, different channel orders, different channels timing, Telemetry or not, ... ###Upload the code using ISP (In System Programming) It is recommended to use an external programmer like [USBASP](http://www.banggood.com/USBASP-USBISP-3_3-5V-AVR-Downloader-Programmer-With-ATMEGA8-ATMEGA128-p-934425.html) to upload the code in the Atmega328. The programmer should be set to 3.3V or nothing to not supply any over voltage to the multimodule and avoid any damages.