Compare commits

...

5 Commits

Author SHA1 Message Date
pascallanger
565aaed0c7 New XK2/P10 sub protocol 2025-02-09 12:01:28 +01:00
pascallanger
2f520f2e91 Update Protocols_Details.md 2025-02-06 12:03:15 +01:00
pascallanger
f1470a80dd Update Protocols_Details.md 2025-02-06 12:00:07 +01:00
pascallanger
b6f78e93a0 Yuxiang multi IDs/Freqs 2025-02-06 11:57:40 +01:00
pascallanger
58bfd3b8b0 New JIABAILE/Gyro subprotocol 2025-02-06 11:56:24 +01:00
9 changed files with 310 additions and 83 deletions

View File

@ -195,6 +195,7 @@
62,1,XK,X420,1,FMode,TakeOf,Emerg,3D_6G,Pict,Video,Flip,Light 62,1,XK,X420,1,FMode,TakeOf,Emerg,3D_6G,Pict,Video,Flip,Light
62,2,XK,Cars,0,FMode,TakeOf,Emerg,3D_6G,Pict,Video,Flip,Light 62,2,XK,Cars,0,FMode,TakeOf,Emerg,3D_6G,Pict,Video,Flip,Light
99,0,XK2,X4,0,Rate,Mode,Hover,Light 99,0,XK2,X4,0,Rate,Mode,Hover,Light
99,1,XK2,P10,0,Rate,Mode,Hover,Light
8,0,YD717,Std,1,Flip,Light,Pict,Video,HLess 8,0,YD717,Std,1,Flip,Light,Pict,Video,HLess
8,1,YD717,SkyWlkr,1,Flip,Light,Pict,Video,HLess 8,1,YD717,SkyWlkr,1,Flip,Light,Pict,Video,HLess
8,2,YD717,Simax4,1,Flip,Light,Pict,Video,HLess 8,2,YD717,Simax4,1,Flip,Light,Pict,Video,HLess
@ -227,5 +228,6 @@
61,0,EazyRC 61,0,EazyRC
98,0,Kyosho3,ASF,0 98,0,Kyosho3,ASF,0
100,0,YuXiang,Std,0,Lock,Rate,Land,Manual,Flip,Mode,Pitch 100,0,YuXiang,Std,0,Lock,Rate,Land,Manual,Flip,Mode,Pitch
102,0,JIABAILE,Std,1,Speed,Light,Flash 102,0,JIABAILE,Std,0,Speed,Light,Flash
102,1,JIABAILE,Gyro,0,Speed,Light,Flash,Tr_ST
103,0,H36,Std,1,Flip,HLess,RTH 103,0,H36,Std,1,Flip,HLess,RTH

View File

@ -17,12 +17,14 @@ Multiprotocol is distributed in the hope that it will be useful,
#include "iface_xn297.h" #include "iface_xn297.h"
//#define FORCE_JIABAILE_ORIGINAL_ID //#define FORCE_JIABAILE_ORIGINAL_ID
//#define FORCE_JIABAILE_GYRO_ORIGINAL_ID
#define JIABAILE_PAYLOAD_SIZE 8 #define JIABAILE_PAYLOAD_SIZE 8
#define JIABAILE_RX_PAYLOAD_SIZE 7 #define JIABAILE_RX_PAYLOAD_SIZE 7
#define JIABAILE_RF_NUM_CHANNELS 3 #define JIABAILE_RF_NUM_CHANNELS 3
#define JIABAILE_BIND_PACKET_PERIOD 12700 #define JIABAILE_BIND_PACKET_PERIOD 12700
#define JIABAILE_PACKET_PERIOD 2408 #define JIABAILE_PACKET_PERIOD 2408
#define JIABAILE_GYRO_PACKET_PERIOD 8205
#define JIABAILE_BIND_COUNT 160 //2 sec #define JIABAILE_BIND_COUNT 160 //2 sec
#define JIABAILE_WRITE_TIME 1000 #define JIABAILE_WRITE_TIME 1000
@ -50,12 +52,17 @@ static uint8_t __attribute__((unused)) JIABAILE_channel(uint8_t num)
} }
static void __attribute__((unused)) JIABAILE_send_packet() static void __attribute__((unused)) JIABAILE_send_packet()
{
if(!(sub_protocol == JIABAILE_GYRO && IS_BIND_IN_PROGRESS))
{ {
hopping_frequency_no++; hopping_frequency_no++;
if(hopping_frequency_no > 2) if(hopping_frequency_no > 2)
hopping_frequency_no = 0; hopping_frequency_no = 0;
XN297_Hopping(hopping_frequency_no); XN297_Hopping(hopping_frequency_no);
}
if(sub_protocol == JIABAILE_STD)
{//Std
memcpy(packet,rx_tx_addr,3); memcpy(packet,rx_tx_addr,3);
memset(&packet[3], 0x00, 4); memset(&packet[3], 0x00, 4);
if(IS_BIND_DONE) if(IS_BIND_DONE)
@ -83,11 +90,61 @@ static void __attribute__((unused)) JIABAILE_send_packet()
packet[7] = 0x55 + hopping_frequency[hopping_frequency_no]; packet[7] = 0x55 + hopping_frequency[hopping_frequency_no];
for(uint8_t i=0;i<JIABAILE_PAYLOAD_SIZE-1;i++) for(uint8_t i=0;i<JIABAILE_PAYLOAD_SIZE-1;i++)
packet[7] += packet[i]; packet[7] += packet[i];
}
else
{//Gyro
if(bind_counter)
{
bind_counter--;
if(!bind_counter)
{
BIND_DONE;
XN297_SetTXAddr(rx_tx_addr, 4);
}
}
uint8_t crc_pos;
if(IS_BIND_IN_PROGRESS)
{
memcpy(packet,rx_tx_addr,4);
packet[4] = hopping_frequency[1];
packet[5] = hopping_frequency[2];
crc_pos = 6;
packet[7] = 0x55;
}
else
{
packet[0] = convert_channel_16b_limit(CH2,0x60,0xA0); //Throttle
packet[1] = convert_channel_16b_limit(CH1,0x40,0xC0); //Steering
if(Channel_data[CH5] < CHANNEL_MIN_COMMAND)
packet[2] = 0x02; //High speed
else if(CH5_SW)
packet[2] = 0x00; //Low speed
else
packet[2] = 0x01; //Mid speed
packet[3] = convert_channel_8b(CH3) ^0xFF; //Gyro
uint8_t val = GET_FLAG(CH6_SW, 0x04) //Light
|GET_FLAG(CH7_SW, 0x08); //Flash
if(Channel_data[CH4] > CHANNEL_MAX_COMMAND)
val |= 0x01; //Trim right
else if(Channel_data[CH4] < CHANNEL_MIN_COMMAND)
val |= 0x02; //Trim left
packet[4] = val;
packet[5] = packet[6] = 0x00; //?
crc_pos = 7;
}
uint8_t sum=0;
for(uint8_t i=0; i<crc_pos; i++)
sum += packet[i];
sum ^= 0xFF;
packet[crc_pos] = sum;
}
// Send // Send
XN297_SetPower(); XN297_SetPower();
XN297_SetTxRxMode(TX_EN); XN297_SetTxRxMode(TX_EN);
XN297_WritePayload(packet, JIABAILE_PAYLOAD_SIZE); XN297_WritePayload(packet, JIABAILE_PAYLOAD_SIZE);
#ifdef DEBUG_SERIAL #if 0
debug("B%d ",bind_counter);
debug("H%d RF%d",hopping_frequency_no,hopping_frequency[hopping_frequency_no]); debug("H%d RF%d",hopping_frequency_no,hopping_frequency[hopping_frequency_no]);
for(uint8_t i=0; i < JIABAILE_PAYLOAD_SIZE; i++) for(uint8_t i=0; i < JIABAILE_PAYLOAD_SIZE; i++)
debug(" %02X", packet[i]); debug(" %02X", packet[i]);
@ -97,6 +154,8 @@ static void __attribute__((unused)) JIABAILE_send_packet()
static void __attribute__((unused)) JIABAILE_initialize_txid() static void __attribute__((unused)) JIABAILE_initialize_txid()
{ {
if(sub_protocol == JIABAILE_STD)
{//Std
rx_tx_addr[0] = rx_tx_addr[3]; rx_tx_addr[0] = rx_tx_addr[3];
#ifdef FORCE_JIABAILE_ORIGINAL_ID #ifdef FORCE_JIABAILE_ORIGINAL_ID
memcpy(rx_tx_addr,(uint8_t *)"\xCB\x03\xA5",3); memcpy(rx_tx_addr,(uint8_t *)"\xCB\x03\xA5",3);
@ -108,15 +167,44 @@ static void __attribute__((unused)) JIABAILE_initialize_txid()
//Bind frequencies //Bind frequencies
memcpy(hopping_frequency,(uint8_t *)"\x07\x27\x45",3); //7,39,69 memcpy(hopping_frequency,(uint8_t *)"\x07\x27\x45",3); //7,39,69
} }
else
{//Gyro
rx_tx_addr[0] += RX_num;
uint8_t val = (rx_tx_addr[0] & 0x0F) + 5; //5..20
for(uint8_t i=0; i<3; i++)
hopping_frequency[i] = val+ 20*i; //hopping_frequency[1,2] could be whatever but...
#ifdef FORCE_JIABAILE_GYRO_ORIGINAL_ID
if(RX_num)
{
memcpy(rx_tx_addr,(uint8_t *)"\x7D\x82\x28\xC2",4);
memcpy(hopping_frequency,(uint8_t *)"\x12\x1B\x35",3); //18,27,53
}
else
{
memcpy(rx_tx_addr,(uint8_t *)"\x0C\xF3\x59\xB3",4);
memcpy(hopping_frequency,(uint8_t *)"\x11\x1C\x36",3); //17,28,54
}
#endif
debugln("ID: %02X %02X %02X %02X, HOP: %2d %2d %2d",rx_tx_addr[0],rx_tx_addr[1],rx_tx_addr[2],rx_tx_addr[3],hopping_frequency[0],hopping_frequency[1],hopping_frequency[2]);
}
}
static void __attribute__((unused)) JIABAILE_RF_init() static void __attribute__((unused)) JIABAILE_RF_init()
{ {
XN297_Configure(XN297_CRCEN, XN297_SCRAMBLED, XN297_1M); XN297_Configure(XN297_CRCEN, XN297_SCRAMBLED, XN297_1M);
//Bind address //Bind address
if(sub_protocol == JIABAILE_STD)
{//Std
memcpy(rx_id,(uint8_t*)"\xA7\x07\x57\xA7\x26", 5); memcpy(rx_id,(uint8_t*)"\xA7\x07\x57\xA7\x26", 5);
XN297_SetTXAddr(rx_id, 5); XN297_SetTXAddr(rx_id, 5);
XN297_SetRXAddr(rx_id, JIABAILE_RX_PAYLOAD_SIZE); XN297_SetRXAddr(rx_id, JIABAILE_RX_PAYLOAD_SIZE);
} }
else
{//Gyro
XN297_SetTXAddr((uint8_t*)"\x14\x41\x11\x13", 4);
XN297_RFChannel(0x29); //41
}
}
uint16_t JIABAILE_callback() uint16_t JIABAILE_callback()
{ {
@ -216,18 +304,20 @@ uint16_t JIABAILE_callback()
phase++; phase++;
default: //JIABAILE_DATA default: //JIABAILE_DATA
#ifdef MULTI_SYNC #ifdef MULTI_SYNC
telemetry_set_input_sync(JIABAILE_PACKET_PERIOD); telemetry_set_input_sync(packet_period);
#endif #endif
JIABAILE_send_packet(); JIABAILE_send_packet();
break; break;
} }
return JIABAILE_PACKET_PERIOD; return packet_period;
} }
void JIABAILE_init() void JIABAILE_init()
{ {
JIABAILE_initialize_txid(); JIABAILE_initialize_txid();
JIABAILE_RF_init(); JIABAILE_RF_init();
if(sub_protocol == JIABAILE_STD)
{//Std
if(IS_BIND_IN_PROGRESS) if(IS_BIND_IN_PROGRESS)
{ {
phase = JIABAILE_BIND; phase = JIABAILE_BIND;
@ -235,6 +325,14 @@ void JIABAILE_init()
} }
else else
phase = JIABAILE_PREP_DATA; phase = JIABAILE_PREP_DATA;
packet_period = JIABAILE_PACKET_PERIOD;
}
else
{//Gyro
phase = JIABAILE_DATA;
bind_counter = IS_BIND_IN_PROGRESS?JIABAILE_BIND_COUNT>>2:1;
packet_period = JIABAILE_GYRO_PACKET_PERIOD;
}
hopping_frequency_no = 0; hopping_frequency_no = 0;
} }

View File

@ -95,7 +95,7 @@
96,BumbleB 96,BumbleB
97,SGF22,F22,F22S,J20 97,SGF22,F22,F22S,J20
98,Kyosho3 98,Kyosho3
99,XK2 99,XK2,X4,P10
100,YuXiang 100,YuXiang
102,JIABAILE 102,JIABAILE,STD,GYRO
103,H36 103,H36

View File

@ -165,6 +165,7 @@ const char STR_SUBTYPE_ESKY150[] = "\x03""4ch""7ch";
const char STR_SUBTYPE_ESKY150V2[] = "\x05""150V2"; const char STR_SUBTYPE_ESKY150V2[] = "\x05""150V2";
const char STR_SUBTYPE_V911S[] = "\x05""V911S""E119\0"; const char STR_SUBTYPE_V911S[] = "\x05""V911S""E119\0";
const char STR_SUBTYPE_XK[] = "\x04""X450""X420""Cars"; const char STR_SUBTYPE_XK[] = "\x04""X450""X420""Cars";
const char STR_SUBTYPE_XK2[] = "\x03""X4\0""P10";
const char STR_SUBTYPE_FRSKYR9[] = "\x07""915MHz\0""868MHz\0""915 8ch""868 8ch""FCC\0 ""--\0 ""FCC 8ch""-- 8ch\0"; const char STR_SUBTYPE_FRSKYR9[] = "\x07""915MHz\0""868MHz\0""915 8ch""868 8ch""FCC\0 ""--\0 ""FCC 8ch""-- 8ch\0";
const char STR_SUBTYPE_ESKY[] = "\x03""Std""ET4"; const char STR_SUBTYPE_ESKY[] = "\x03""Std""ET4";
const char STR_SUBTYPE_PROPEL[] = "\x04""74-Z"; const char STR_SUBTYPE_PROPEL[] = "\x04""74-Z";
@ -185,6 +186,7 @@ const char STR_SUBTYPE_KF606[] = "\x06""KF606\0""MIG320""ZCZ50\0";
const char STR_SUBTYPE_E129[] = "\x04""E129""C186"; const char STR_SUBTYPE_E129[] = "\x04""E129""C186";
const char STR_SUBTYPE_FX[] = "\x04""816\0""620\0""9630""Q560"; const char STR_SUBTYPE_FX[] = "\x04""816\0""620\0""9630""Q560";
const char STR_SUBTYPE_SGF22[] = "\x04""F22\0""F22S""J20\0"; const char STR_SUBTYPE_SGF22[] = "\x04""F22\0""F22S""J20\0";
const char STR_SUBTYPE_JIABAILE[] = "\x04""Std\0""Gyro";
#define NO_SUBTYPE nullptr #define NO_SUBTYPE nullptr
#ifdef SEND_CPPM #ifdef SEND_CPPM
@ -381,7 +383,7 @@ const mm_protocol_definition multi_protocols[] = {
{PROTO_J6PRO, STR_J6PRO, NO_SUBTYPE, 0, OPTION_NONE, 0, 1, SW_CYRF, J6PRO_init, J6PRO_callback }, {PROTO_J6PRO, STR_J6PRO, NO_SUBTYPE, 0, OPTION_NONE, 0, 1, SW_CYRF, J6PRO_init, J6PRO_callback },
#endif #endif
#if defined(JIABAILE_NRF24L01_INO) #if defined(JIABAILE_NRF24L01_INO)
{PROTO_JIABAILE, STR_JIABAILE, NO_SUBTYPE, 0, OPTION_NONE, 0, 0, SW_NRF, JIABAILE_init, JIABAILE_callback }, {PROTO_JIABAILE, STR_JIABAILE, STR_SUBTYPE_JIABAILE, 2, OPTION_NONE, 0, 0, SW_NRF, JIABAILE_init, JIABAILE_callback },
#endif #endif
#if defined(JJRC345_NRF24L01_INO) #if defined(JJRC345_NRF24L01_INO)
{PROTO_JJRC345, STR_JJRC345, STR_SUBTYPE_JJRC345, 2, OPTION_NONE, 0, 0, SW_NRF, JJRC345_init, JJRC345_callback }, {PROTO_JJRC345, STR_JJRC345, STR_SUBTYPE_JJRC345, 2, OPTION_NONE, 0, 0, SW_NRF, JJRC345_init, JJRC345_callback },
@ -511,7 +513,7 @@ const mm_protocol_definition multi_protocols[] = {
{PROTO_XK, STR_XK, STR_SUBTYPE_XK, 3, OPTION_RFTUNE, 0, 0, SW_NRF, XK_init, XK_callback }, {PROTO_XK, STR_XK, STR_SUBTYPE_XK, 3, OPTION_RFTUNE, 0, 0, SW_NRF, XK_init, XK_callback },
#endif #endif
#if defined(XK2_CCNRF_INO) #if defined(XK2_CCNRF_INO)
{PROTO_XK2, STR_XK2, NO_SUBTYPE, 0, OPTION_RFTUNE, 0, 0, SW_NRF, XK2_init, XK2_callback }, {PROTO_XK2, STR_XK2, STR_SUBTYPE_XK2, 2, OPTION_RFTUNE, 0, 0, SW_NRF, XK2_init, XK2_callback },
#endif #endif
#if defined(XN297DUMP_NRF24L01_INO) #if defined(XN297DUMP_NRF24L01_INO)
{PROTO_XN297DUMP, STR_XN297DUMP, STR_SUBTYPE_XN297DUMP, 7, OPTION_RFCHAN, 0, 0, SW_NRF, XN297Dump_init, XN297Dump_callback }, {PROTO_XN297DUMP, STR_XN297DUMP, STR_SUBTYPE_XN297DUMP, 7, OPTION_RFCHAN, 0, 0, SW_NRF, XN297Dump_init, XN297Dump_callback },

View File

@ -19,7 +19,7 @@
#define VERSION_MAJOR 1 #define VERSION_MAJOR 1
#define VERSION_MINOR 3 #define VERSION_MINOR 3
#define VERSION_REVISION 4 #define VERSION_REVISION 4
#define VERSION_PATCH_LEVEL 28 #define VERSION_PATCH_LEVEL 31
#define MODE_SERIAL 0 #define MODE_SERIAL 0
@ -495,6 +495,16 @@ enum SGF22
SGF22_F22S = 1, SGF22_F22S = 1,
SGF22_J20 = 2, SGF22_J20 = 2,
}; };
enum JIABAILE
{
JIABAILE_STD = 0,
JIABAILE_GYRO = 1,
};
enum XK2
{
XK2_X4 = 0,
XK2_P10 = 1,
};
#define NONE 0 #define NONE 0
#define P_HIGH 1 #define P_HIGH 1

View File

@ -19,8 +19,10 @@ Multiprotocol is distributed in the hope that it will be useful,
#include "iface_xn297.h" #include "iface_xn297.h"
//#define FORCE_XK2_ID //#define FORCE_XK2_ID
//#define FORCE_XK2_P10_ID
#define XK2_RF_BIND_CHANNEL 71 #define XK2_RF_BIND_CHANNEL 71
#define XK2_P10_RF_BIND_CHANNEL 69
#define XK2_PAYLOAD_SIZE 9 #define XK2_PAYLOAD_SIZE 9
#define XK2_PACKET_PERIOD 4911 #define XK2_PACKET_PERIOD 4911
#define XK2_RF_NUM_CHANNELS 4 #define XK2_RF_NUM_CHANNELS 4
@ -46,7 +48,7 @@ static void __attribute__((unused)) XK2_send_packet()
//Unknown //Unknown
packet[7] = 0x00; packet[7] = 0x00;
//Checksum seed //Checksum seed
packet[8] = 0xC0; //Constant? packet[8] = 0xC0;
} }
else else
{ {
@ -74,7 +76,7 @@ static void __attribute__((unused)) XK2_send_packet()
| GET_FLAG(CH8_SW, 0x40); //Light | GET_FLAG(CH8_SW, 0x40); //Light
//Telemetry not received=00, Telemetry received=01 but sometimes switch to 1 even if telemetry is not there... //Telemetry not received=00, Telemetry received=01 but sometimes switch to 1 even if telemetry is not there...
packet[6] = 0x00; packet[6] = 0x00;
//Unknown //RXID checksum
packet[7] = crc8; //Sum RX_ID[0..2] packet[7] = crc8; //Sum RX_ID[0..2]
//Checksum seed //Checksum seed
packet[8] = num_ch; //Based on TX ID packet[8] = num_ch; //Based on TX ID
@ -82,6 +84,8 @@ static void __attribute__((unused)) XK2_send_packet()
//Checksum //Checksum
for(uint8_t i=0; i<XK2_PAYLOAD_SIZE-1; i++) for(uint8_t i=0; i<XK2_PAYLOAD_SIZE-1; i++)
packet[8] += packet[i]; packet[8] += packet[i];
if(sub_protocol == XK2_P10)
packet[8] += 0x10;
// Send // Send
XN297_SetFreqOffset(); XN297_SetFreqOffset();
@ -104,11 +108,22 @@ static void __attribute__((unused)) XK2_RF_init()
XN297_SetRXAddr((uint8_t*)"\xcc\xcc\xcc\xcc\xcc", XK2_PAYLOAD_SIZE); XN297_SetRXAddr((uint8_t*)"\xcc\xcc\xcc\xcc\xcc", XK2_PAYLOAD_SIZE);
XN297_HoppingCalib(XK2_RF_NUM_CHANNELS); XN297_HoppingCalib(XK2_RF_NUM_CHANNELS);
XN297_RFChannel(XK2_RF_BIND_CHANNEL); XN297_RFChannel(sub_protocol==XK2_X4?XK2_RF_BIND_CHANNEL:XK2_P10_RF_BIND_CHANNEL);
} }
static void __attribute__((unused)) XK2_initialize_txid() static void __attribute__((unused)) XK2_initialize_txid()
{ {
rx_tx_addr[0] = rx_tx_addr[3]; // Use RX_num
num_ch = 0x21 + rx_tx_addr[0] - rx_tx_addr[1] + rx_tx_addr[2];
//RF frequencies for X4: 65=0x41, 69=0x45, 73=0x49, 77=0x4D
//RF frequencies for P10: 67, unknown
uint8_t start = 65;
if(sub_protocol == XK2_P10) start += 2;
for(uint8_t i=0;i<XK2_RF_NUM_CHANNELS;i++)
hopping_frequency[i] = start + i*4;
#ifdef FORCE_XK2_ID #ifdef FORCE_XK2_ID
if(rx_tx_addr[3]&1) if(rx_tx_addr[3]&1)
{//Pascal {//Pascal
@ -127,13 +142,15 @@ static void __attribute__((unused)) XK2_initialize_txid()
//hopping frequencies 65=0x41, 69=0x45, 73=0x49, 77=0x4D //hopping frequencies 65=0x41, 69=0x45, 73=0x49, 77=0x4D
} }
#endif #endif
rx_tx_addr[0] = rx_tx_addr[3]; // Use RX_num #ifdef FORCE_XK2_P10_ID
rx_tx_addr[0] = 0xE8;
rx_tx_addr[1] = 0x25;
rx_tx_addr[2] = 0x3B;
num_ch = 0x1F;
//hopping frequencies 67=0x43, =0x, =0x, =0x
#endif
rx_tx_addr[3] = rx_tx_addr[4] = 0xCC; rx_tx_addr[3] = rx_tx_addr[4] = 0xCC;
num_ch = 0x21 + rx_tx_addr[0] - rx_tx_addr[1] + rx_tx_addr[2];
for(uint8_t i=0;i<XK2_RF_NUM_CHANNELS;i++) // Are these RF frequencies always the same? It looks like yes...
hopping_frequency[i] = 65 + i*4; //65=0x41, 69=0x45, 73=0x49, 77=0x4D
debugln("ID: %02X %02X %02X %02X %02X, OFFSET: %02X, HOP: %02X %02X %02X %02X",rx_tx_addr[0],rx_tx_addr[1],rx_tx_addr[2],rx_tx_addr[3],rx_tx_addr[4],num_ch,hopping_frequency[0],hopping_frequency[1],hopping_frequency[2],hopping_frequency[3]); debugln("ID: %02X %02X %02X %02X %02X, OFFSET: %02X, HOP: %02X %02X %02X %02X",rx_tx_addr[0],rx_tx_addr[1],rx_tx_addr[2],rx_tx_addr[3],rx_tx_addr[4],num_ch,hopping_frequency[0],hopping_frequency[1],hopping_frequency[2],hopping_frequency[3]);
} }
@ -160,6 +177,8 @@ uint16_t XK2_callback()
crc8 = 0xBF; crc8 = 0xBF;
for(uint8_t i=0; i<XK2_PAYLOAD_SIZE-1; i++) for(uint8_t i=0; i<XK2_PAYLOAD_SIZE-1; i++)
crc8 += packet[i]; crc8 += packet[i];
if(sub_protocol == XK2_P10)
crc8 += 0x10;
if(crc8 != packet[8]) if(crc8 != packet[8])
{ {
phase = XK2_BIND1; phase = XK2_BIND1;
@ -292,8 +311,8 @@ P[5] = flags
08=6g/3d=short_press_right sequece also switches for a few packets to C1 if 8 C0 if 0 08=6g/3d=short_press_right sequece also switches for a few packets to C1 if 8 C0 if 0
P[6] = 00 telemetry nok P[6] = 00 telemetry nok
01 telemetry ok but sometimes switch to 1 also when telemetry is nok... 01 telemetry ok but sometimes switch to 1 also when telemetry is nok...
P[7] = 5A -> ?? RX_ID checksum ?? => sum RX_ID[0..2] P[7] = 5A -> sum RX_ID[0..2]
P[8] = sum P[0..7] + 7F P[8] = sum P[0..7] + TX_ID[0] - TX_ID[1] + TX_ID[2] + 21
Telemetry Telemetry
RX on channel: 69, Time: 3408us P: 66 4F 47 00 00 00 00 00 C8 RX on channel: 69, Time: 3408us P: 66 4F 47 00 00 00 00 00 C8
@ -314,3 +333,48 @@ RF
2465 155330 3577 2465 155330 3577
*/ */
/* P10 Piper CUB
Bind
----
Phase 1
Plane sends these packets:
250K C=69 S=Y A= CC CC CC CC CC P(9)= 9C BB CC DD 84 24 20 00 97
P[0] = 9C bind phase 1
P[1] = Dummy TX_ID
P[2] = Dummy TX_ID
P[3] = Dummy TX_ID
P[4] = RX_ID[0]
P[5] = RX_ID[1]
P[6] = RX_ID[2]
P[7] = 00
P[8] = sum P[0..7] + BF + 10
Normal
------
TX sends
C=67 -> only one channel when telemetry is working
A= E8 25 3B CC CC P(9)= 32 32 00 32 A0 40 01 C8 6E
P[0] = A 00..32..64
P[1] = E 00..32..64
P[2] = T 00..64
P[3] = R 00..32..64
P[4] = alternates 20,60,A0,E0
trims
A 01..20..3F
E 41..60..7F
R 81..A0..BF
telemetry
E0 present when the telemetry works
6g/3d
C1 few times if P[6] flag 00->08
C0 few times if P[6] = flag 08->00
P[5] = flags
01=high rate
20=hover=long_press_left
40=light -> temporary
08=6g/3d=short_press_right sequece also switches for a few packets to C1 if 8 C0 if 0
P[6] = 00 telemetry nok
01 telemetry ok but sometimes switch to 1 also when telemetry is nok...
P[7] = C8 -> sum RX_ID[0..2]
P[8] = sum P[0..7] + TX_ID[0] - TX_ID[1] + TX_ID[2] + 21 +10
*/

View File

@ -17,12 +17,12 @@ Multiprotocol is distributed in the hope that it will be useful,
#include "iface_xn297.h" #include "iface_xn297.h"
#define YUXIANG_FORCE_ID //#define YUXIANG_FORCE_ID
#define YUXIANG_PACKET_PERIOD 12422 #define YUXIANG_PACKET_PERIOD 12422
#define YUXIANG_PACKET_SIZE 9 #define YUXIANG_PACKET_SIZE 9
#define YUXIANG_BIND_COUNT 150 #define YUXIANG_BIND_COUNT 150
#define YUXIANG_BIND_FREQ 0x30 #define YUXIANG_BIND_FREQ 0x30 //48
#define YUXIANG_RF_NUM_CHANNELS 4 #define YUXIANG_RF_NUM_CHANNELS 4
#define YUXIANG_WRITE_TIME 1000 #define YUXIANG_WRITE_TIME 1000
@ -118,23 +118,43 @@ static void __attribute__((unused)) YUXIANG_RF_init()
static void __attribute__((unused)) YUXIANG_initialize_txid() static void __attribute__((unused)) YUXIANG_initialize_txid()
{ {
#ifdef YUXIANG_FORCE_ID //Modify address to influence hop
if(rx_tx_addr[3] & 0x01) rx_tx_addr[0] += RX_num;
{//TX1 //Calc hop
memcpy(rx_tx_addr,(uint8_t *)"\xB3\x13\x36\xDD",4); //rx_tx_addr[4]=0xD9 uint8_t val;
memcpy(hopping_frequency,(uint8_t *)"\x49\x32\x35\x42",4); for(uint8_t i=0; i<4; i++)
{
val = i*0x06;
if(i) val |= 0x01;
val += rx_tx_addr[0];
val &= 0x1F;
val += 47;
if(val < 50)
val = 50;
if(val > 62 && val < 66)
val = 62;
hopping_frequency[i] = val;
} }
else
{//TX2 #ifdef YUXIANG_FORCE_ID
switch(RX_num)
{
case 0://TX1
memcpy(rx_tx_addr,(uint8_t *)"\xB3\x13\x36\xDD",4); //rx_tx_addr[4]=0xD9
memcpy(hopping_frequency,(uint8_t *)"\x42\x49\x32\x35",4); //66,73,50,53
break;
case 1://TX2
memcpy(rx_tx_addr,(uint8_t *)"\xEB\x13\x36\xAC",4); //rx_tx_addr[4]=0xE0 memcpy(rx_tx_addr,(uint8_t *)"\xEB\x13\x36\xAC",4); //rx_tx_addr[4]=0xE0
memcpy(hopping_frequency,(uint8_t *)"\x4D\x3A\x3E\x47",4); memcpy(hopping_frequency,(uint8_t *)"\x47\x4D\x3A\x3E",4); //58,62,71,77
break;
} }
#endif #endif
uint8_t sum=0; uint8_t sum=0;
for(uint8_t i=0; i<4; i++) for(uint8_t i=0; i<4; i++)
sum += rx_tx_addr[i]; sum += rx_tx_addr[i];
rx_tx_addr[4] = sum; rx_tx_addr[4] = sum;
debugln("ID: %02X %02X %02X %02X %02X , HOP: %02X %02X %02X %02X",rx_tx_addr[0],rx_tx_addr[1],rx_tx_addr[2],rx_tx_addr[3],rx_tx_addr[4],hopping_frequency[0],hopping_frequency[1],hopping_frequency[2],hopping_frequency[3]); debugln("ID: %02X %02X %02X %02X %02X , HOP: %2d %2d %2d %2d",rx_tx_addr[0],rx_tx_addr[1],rx_tx_addr[2],rx_tx_addr[3],rx_tx_addr[4],hopping_frequency[0],hopping_frequency[1],hopping_frequency[2],hopping_frequency[3]);
} }
uint16_t YUXIANG_callback() uint16_t YUXIANG_callback()

View File

@ -737,7 +737,8 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= {
PROTO_J6PRO PROTO_J6PRO
NONE NONE
PROTO_JIABAILE PROTO_JIABAILE
NONE JIABAILE_STD
JIABAILE_GYRO
PROTO_JJRC345 PROTO_JJRC345
JJRC345 JJRC345
SKYTMBLR SKYTMBLR
@ -872,7 +873,8 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= {
X420 X420
XK_CARS XK_CARS
PROTO_XK2 PROTO_XK2
NONE XK2_X4
XK2_P10
PROTO_YD717 PROTO_YD717
YD717 YD717
SKYWLKR SKYWLKR

View File

@ -112,7 +112,7 @@ CFlie|38|CFlie||||||||NRF24L01|
[HoTT](Protocols_Details.md#HoTT---57)|57|Sync|No_Sync|||||||CC2500| [HoTT](Protocols_Details.md#HoTT---57)|57|Sync|No_Sync|||||||CC2500|
[Hubsan](Protocols_Details.md#HUBSAN---2)|2|H107|H301|H501||||||A7105| [Hubsan](Protocols_Details.md#HUBSAN---2)|2|H107|H301|H501||||||A7105|
[J6Pro](Protocols_Details.md#J6Pro---22)|22|||||||||CYRF6936| [J6Pro](Protocols_Details.md#J6Pro---22)|22|||||||||CYRF6936|
[JIABAILE](Protocols_Details.md#JIABAILE---102)|102|||||||||NRF24L01|XN297 [JIABAILE](Protocols_Details.md#JIABAILE---102)|102|Std|Gyro|||||||NRF24L01|XN297
[JJRC345](Protocols_Details.md#JJRC345---71)|71|JJRC345|SkyTmblr|||||||NRF24L01|XN297 [JJRC345](Protocols_Details.md#JJRC345---71)|71|JJRC345|SkyTmblr|||||||NRF24L01|XN297
[JOYSWAY](Protocols_Details.md#JOYSWAY---84)|84|||||||||NRF24L01|XN297 [JOYSWAY](Protocols_Details.md#JOYSWAY---84)|84|||||||||NRF24L01|XN297
[KF606](Protocols_Details.md#KF606---49)|49|KF606|MIG320|ZCZ50||||||NRF24L01|XN297 [KF606](Protocols_Details.md#KF606---49)|49|KF606|MIG320|ZCZ50||||||NRF24L01|XN297
@ -155,7 +155,7 @@ CFlie|38|CFlie||||||||NRF24L01|
[WK2x01](Protocols_Details.md#WK2X01---30)|30|WK2801|WK2401|W6_5_1|W6_6_1|W6_HEL|W6_HEL_I|||CYRF6936| [WK2x01](Protocols_Details.md#WK2X01---30)|30|WK2801|WK2401|W6_5_1|W6_6_1|W6_HEL|W6_HEL_I|||CYRF6936|
[XERALL](Protocols_Details.md#XERALL---91)|91|Tank||||||||NRF24L01|XN297 [XERALL](Protocols_Details.md#XERALL---91)|91|Tank||||||||NRF24L01|XN297
[XK](Protocols_Details.md#XK---62)|62|X450|X420|Cars||||||NRF24L011&CC2500|XN297 [XK](Protocols_Details.md#XK---62)|62|X450|X420|Cars||||||NRF24L011&CC2500|XN297
[XK2](Protocols_Details.md#XK2---99)|99|X4||||||||NRF24L01&CC2500|XN297 [XK2](Protocols_Details.md#XK2---99)|99|X4|P10|||||||NRF24L01&CC2500|XN297
[YD717](Protocols_Details.md#YD717---8)|8|YD717|SKYWLKR|SYMAX4|XINXUN|NIHUI||||NRF24L01| [YD717](Protocols_Details.md#YD717---8)|8|YD717|SKYWLKR|SYMAX4|XINXUN|NIHUI||||NRF24L01|
[YuXiang](Protocols_Details.md#YuXiang---100)|100|||||||||NRF24L01|XN297 [YuXiang](Protocols_Details.md#YuXiang---100)|100|||||||||NRF24L01|XN297
[ZSX](Protocols_Details.md#ZSX---52)|52|280||||||||NRF24L01|XN297 [ZSX](Protocols_Details.md#ZSX---52)|52|280||||||||NRF24L01|XN297
@ -1535,6 +1535,21 @@ The plane does not need to be bound each time if it is powered on **after** the
The rudder trim is driven from the rudder channel to increase the range (Original TX rudder has no range once the motor has been turned on...). The rudder trim is driven from the rudder channel to increase the range (Original TX rudder has no range once the motor has been turned on...).
### Sub_protocol P10 - *1*
Model: Park10 J3-CUB
If a CC2500 is installed it will be used for this sub protocol. Option in this case is used for fine frequency tuning like any CC2500 protocols so check the [Frequency Tuning page](/docs/Frequency_Tuning.md).
If only a NRF24L01 is installed then this sub protocol might be problematic because it is using the xn297L emulation with a transmission speed of 250kbps which doesn't work very well with every NRF24L01, this is an hardware issue with the authenticity and accuracy of the components.
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8
---|---|---|---|---|---|---|---
A|E|T|R|Rate|Mode|Hover|Light
The plane does not need to be bound each time if it is powered on **after** the radio/protocol is on.
The rudder trim is driven from the rudder channel to increase the range (Original TX rudder has no range once the motor has been turned on...).
*** ***
# NRF24L01 RF Module # NRF24L01 RF Module
@ -1939,6 +1954,7 @@ RATE: -100% Low, 0% Mid, +100% High
## JIABAILE - *102* ## JIABAILE - *102*
### Sub_protocol Std - *0*
Models: JBL-430x 1:43 car without gyro Models: JBL-430x 1:43 car without gyro
You must assign a different RX number for each car. Otherwise the new car ID will overwrite the previous one. You must assign a different RX number for each car. Otherwise the new car ID will overwrite the previous one.
@ -1947,7 +1963,21 @@ CH1|CH2|CH3|CH4|CH5|CH6|CH7
---|---|---|---|---|---|--- ---|---|---|---|---|---|---
ST|TH|-|ST_TRIM|SPEED|LIGHT|FLASH ST|TH|-|ST_TRIM|SPEED|LIGHT|FLASH
SPEED: -100% High, 0% Mid, +100% Low - Extended Steering comparing to original
- SPEED: -100% High, 0% Mid, +100% Low
- ST_TRIM: value between -100% and +100% but using the radio steering trim looks better
### Sub_protocol Gyro - *1*
Models: JBL-430x 1:43 car with gyro
CH1|CH2|CH3|CH4|CH5|CH6|CH7
---|---|---|---|---|---|---
ST|TH|GYRO|ST_TRIM|SPEED|LIGHT|FLASH
- Extended Steering comparing to original
- SPEED: -100% High, 0% Mid, +100% Low
- GYRO: -100% Off..+100% Max
- ST_TRIM: momentary switch, -100% Trim left, 0% Idle, +100% Trim right. Configure the radio steering trim has buttons (ST- and ST+) and assign them to that channel. Don't forget to disable the steering trim in the driving modes.
## JJRC345 - *71* ## JJRC345 - *71*
@ -2256,9 +2286,8 @@ Same channels assignement as above.
## YuXiang - *100* ## YuXiang - *100*
Models: E190, F07 UH-1D Models: E190 F07 UH-1D, E186 F08 Bell-206
**Only 2 TX ID, use the RX number to switch**.
Telemetry A1=Batt voltage with a Ratio 3.5 and Offset 7, A2=Low batt with 0=OK, everything else=BAD Telemetry A1=Batt voltage with a Ratio 3.5 and Offset 7, A2=Low batt with 0=OK, everything else=BAD
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11 CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11