mirror of
				https://github.com/pascallanger/DIY-Multiprotocol-TX-Module.git
				synced 2025-11-04 06:51:03 +00:00 
			
		
		
		
	New protocol XK2 for the XK A160S
This commit is contained in:
		
							parent
							
								
									7a7b4b2e74
								
							
						
					
					
						commit
						c6ff0e27d9
					
				@ -191,6 +191,7 @@
 | 
				
			|||||||
62,0,XK,X450,1,FMode,TakeOf,Emerg,3D_6G,Pict,Video
 | 
					62,0,XK,X450,1,FMode,TakeOf,Emerg,3D_6G,Pict,Video
 | 
				
			||||||
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
 | 
				
			||||||
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
 | 
				
			||||||
 | 
				
			|||||||
@ -95,3 +95,4 @@
 | 
				
			|||||||
96,BumbleB
 | 
					96,BumbleB
 | 
				
			||||||
97,SGF22
 | 
					97,SGF22
 | 
				
			||||||
98,Kyosho3
 | 
					98,Kyosho3
 | 
				
			||||||
 | 
					99,XK2
 | 
				
			||||||
@ -82,6 +82,7 @@ const char STR_FX[]			="FX";
 | 
				
			|||||||
const char STR_BAYANG_RX[]	="BayanRX";
 | 
					const char STR_BAYANG_RX[]	="BayanRX";
 | 
				
			||||||
const char STR_PELIKAN[]	="Pelikan";
 | 
					const char STR_PELIKAN[]	="Pelikan";
 | 
				
			||||||
const char STR_XK[]			="XK";
 | 
					const char STR_XK[]			="XK";
 | 
				
			||||||
 | 
					const char STR_XK2[]		="XK2";
 | 
				
			||||||
const char STR_XN297DUMP[]	="XN297DP";
 | 
					const char STR_XN297DUMP[]	="XN297DP";
 | 
				
			||||||
const char STR_FRSKYR9[]	="FrSkyR9";
 | 
					const char STR_FRSKYR9[]	="FrSkyR9";
 | 
				
			||||||
const char STR_PROPEL[]		="Propel";
 | 
					const char STR_PROPEL[]		="Propel";
 | 
				
			||||||
@ -495,6 +496,9 @@ const mm_protocol_definition multi_protocols[] = {
 | 
				
			|||||||
	#if defined(XK_CCNRF_INO)
 | 
						#if defined(XK_CCNRF_INO)
 | 
				
			||||||
		{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)
 | 
				
			||||||
 | 
							{PROTO_XK2,        STR_XK2,       NO_SUBTYPE,            0, OPTION_RFTUNE,  0, 0, SW_NRF,    XK2_init,        XK2_callback        },	
 | 
				
			||||||
 | 
						#endif
 | 
				
			||||||
	#if defined(XN297DUMP_NRF24L01_INO)
 | 
						#if defined(XN297DUMP_NRF24L01_INO)
 | 
				
			||||||
		{PROTO_XN297DUMP,  STR_XN297DUMP, STR_SUBTYPE_XN297DUMP, 6, OPTION_RFCHAN,  0, 0, SW_NRF,    XN297Dump_init,  XN297Dump_callback  },
 | 
							{PROTO_XN297DUMP,  STR_XN297DUMP, STR_SUBTYPE_XN297DUMP, 6, OPTION_RFCHAN,  0, 0, SW_NRF,    XN297Dump_init,  XN297Dump_callback  },
 | 
				
			||||||
	#endif
 | 
						#endif
 | 
				
			||||||
 | 
				
			|||||||
@ -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	9
 | 
					#define VERSION_PATCH_LEVEL	10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MODE_SERIAL 0
 | 
					#define MODE_SERIAL 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -126,7 +126,7 @@ enum PROTOCOLS
 | 
				
			|||||||
	PROTO_BUMBLEB	= 96,	// =>CC2500 & NRF24L01
 | 
						PROTO_BUMBLEB	= 96,	// =>CC2500 & NRF24L01
 | 
				
			||||||
	PROTO_SGF22		= 97,	// =>NRF24L01
 | 
						PROTO_SGF22		= 97,	// =>NRF24L01
 | 
				
			||||||
	PROTO_KYOSHO3	= 98,	// =>CYRF6936
 | 
						PROTO_KYOSHO3	= 98,	// =>CYRF6936
 | 
				
			||||||
 | 
						PROTO_XK2		= 99,	// =>CC2500 & NRF24L01
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	PROTO_NANORF	= 126,	// =>NRF24L01
 | 
						PROTO_NANORF	= 126,	// =>NRF24L01
 | 
				
			||||||
	PROTO_TEST		= 127,	// =>CC2500
 | 
						PROTO_TEST		= 127,	// =>CC2500
 | 
				
			||||||
 | 
				
			|||||||
@ -354,6 +354,7 @@
 | 
				
			|||||||
	#undef	SLT_CCNRF_INO
 | 
						#undef	SLT_CCNRF_INO
 | 
				
			||||||
	#undef	V911S_CCNRF_INO
 | 
						#undef	V911S_CCNRF_INO
 | 
				
			||||||
	#undef	XK_CCNRF_INO
 | 
						#undef	XK_CCNRF_INO
 | 
				
			||||||
 | 
						#undef	XK2_CCNRF_INO
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#if not defined(DSM_CYRF6936_INO)
 | 
					#if not defined(DSM_CYRF6936_INO)
 | 
				
			||||||
	#undef	LOSI_CYRF6936_INO
 | 
						#undef	LOSI_CYRF6936_INO
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										201
									
								
								Multiprotocol/XK2_ccnrf.ino
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										201
									
								
								Multiprotocol/XK2_ccnrf.ino
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,201 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 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 <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					// Compatible with XK TX X4 and model A160S.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(XK2_CCNRF_INO)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "iface_xn297.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define FORCE_XK2_ID
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define XK2_RF_BIND_CHANNEL	71
 | 
				
			||||||
 | 
					#define XK2_PAYLOAD_SIZE	9
 | 
				
			||||||
 | 
					#define XK2_PACKET_PERIOD	4911
 | 
				
			||||||
 | 
					#define XK2_RF_NUM_CHANNELS	4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum {
 | 
				
			||||||
 | 
						XK2_BIND1,
 | 
				
			||||||
 | 
						XK2_BIND2,
 | 
				
			||||||
 | 
						XK2_DATA_PREP,
 | 
				
			||||||
 | 
						XK2_DATA
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void __attribute__((unused)) XK2_send_packet()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						static uint8_t trim_ch=0;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if(IS_BIND_IN_PROGRESS)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							packet[0] = 0x9D;
 | 
				
			||||||
 | 
							//TXID
 | 
				
			||||||
 | 
							memcpy(&packet[1], rx_tx_addr, 3);
 | 
				
			||||||
 | 
							//RXID
 | 
				
			||||||
 | 
							//memcpy(&packet[4], rx_id     , 3);
 | 
				
			||||||
 | 
							//Unknown
 | 
				
			||||||
 | 
							packet[7] = 0x00;
 | 
				
			||||||
 | 
							//Checksum seed
 | 
				
			||||||
 | 
							packet[8] = 0xC0;												//Constant?
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							XN297_Hopping(hopping_frequency_no);
 | 
				
			||||||
 | 
							hopping_frequency_no++;
 | 
				
			||||||
 | 
							hopping_frequency_no &= 0x03;
 | 
				
			||||||
 | 
							//Channels
 | 
				
			||||||
 | 
							packet[0] = convert_channel_16b_limit(AILERON ,0x00,0x64);		//Aileron
 | 
				
			||||||
 | 
							packet[1] = convert_channel_16b_limit(ELEVATOR,0x00,0x64);		//Elevator
 | 
				
			||||||
 | 
							packet[2] = convert_channel_16b_limit(THROTTLE,0x00,0x64);		//Throttle
 | 
				
			||||||
 | 
							packet[3] = convert_channel_16b_limit(RUDDER  ,0x00,0x64);		//Rudder
 | 
				
			||||||
 | 
							//Center the trims
 | 
				
			||||||
 | 
							trim_ch++;
 | 
				
			||||||
 | 
							if(trim_ch > 2) trim_ch = 0;
 | 
				
			||||||
 | 
							packet[4] = 0x20 + 0x40 * trim_ch;								//Trims are A=01..20..3F/E=41..60..7F/R=81..A0..BF, E0 appears when telemetry is received, C1 when p[6] changes from 00->08, C0 when p[6] changes from 08->00
 | 
				
			||||||
 | 
							if(trim_ch == 2)												//Drive rudder trim since otherwise there is no control...
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								packet[4] = 0x80 + (convert_channel_8b(RUDDER)>>2);
 | 
				
			||||||
 | 
								if(packet[4] <= 0x81) packet[4] = 0x81;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							//Flags
 | 
				
			||||||
 | 
							packet[5] = GET_FLAG(CH5_SW, 0x01)								//Rate
 | 
				
			||||||
 | 
									  | GET_FLAG(CH6_SW, 0x08)								//Mode
 | 
				
			||||||
 | 
									  | GET_FLAG(CH7_SW, 0x20);								//Hover
 | 
				
			||||||
 | 
							//Telemetry not received=00, Telemetry received=01 but sometimes switch to 1 even if telemetry is not there...
 | 
				
			||||||
 | 
							packet[6] = 0x00;
 | 
				
			||||||
 | 
							//Unknown
 | 
				
			||||||
 | 
							packet[7] = 0x5A;												//Constant?
 | 
				
			||||||
 | 
							//Checksum seed
 | 
				
			||||||
 | 
							packet[8] = 0x7F;												//Constant?
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						//Checksum
 | 
				
			||||||
 | 
						for(uint8_t i=0; i<XK2_PAYLOAD_SIZE-1; i++)
 | 
				
			||||||
 | 
							packet[8] += packet[i];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Send
 | 
				
			||||||
 | 
						XN297_SetPower();
 | 
				
			||||||
 | 
						XN297_SetTxRxMode(TX_EN);
 | 
				
			||||||
 | 
						XN297_WritePayload(packet, XK2_PAYLOAD_SIZE);
 | 
				
			||||||
 | 
						#if 0
 | 
				
			||||||
 | 
							debug("P");
 | 
				
			||||||
 | 
							for(uint8_t i=0; i<XK2_PAYLOAD_SIZE; i++)
 | 
				
			||||||
 | 
								debug(" %02X",packet[i]);
 | 
				
			||||||
 | 
							debugln();
 | 
				
			||||||
 | 
						#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void __attribute__((unused)) XK2_RF_init()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						XN297_Configure(XN297_CRCEN, XN297_SCRAMBLED, XN297_250K);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						XN297_SetTXAddr((uint8_t*)"\xcc\xcc\xcc\xcc\xcc", 5);
 | 
				
			||||||
 | 
						XN297_SetRXAddr((uint8_t*)"\xcc\xcc\xcc\xcc\xcc", XK2_PAYLOAD_SIZE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						XN297_HoppingCalib(XK2_RF_NUM_CHANNELS);
 | 
				
			||||||
 | 
						XN297_RFChannel(XK2_RF_BIND_CHANNEL);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void __attribute__((unused)) XK2_initialize_txid()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						#ifdef FORCE_XK2_ID
 | 
				
			||||||
 | 
							rx_tx_addr[0] = 0x66;
 | 
				
			||||||
 | 
							rx_tx_addr[1] = 0x4F;
 | 
				
			||||||
 | 
							rx_tx_addr[2] = 0x47;
 | 
				
			||||||
 | 
							for(uint8_t i=0;i<XK2_RF_NUM_CHANNELS;i++)
 | 
				
			||||||
 | 
								hopping_frequency[i] = 65 + i*4;	//65=0x41, 69=0x45, 73=0x49, 77=0x4D
 | 
				
			||||||
 | 
						#endif
 | 
				
			||||||
 | 
						rx_tx_addr[3] = 0xCC;
 | 
				
			||||||
 | 
						rx_tx_addr[4] = 0xCC;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uint16_t XK2_callback()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						switch(phase)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							case XK2_BIND1:
 | 
				
			||||||
 | 
								// switch to RX mode
 | 
				
			||||||
 | 
								XN297_SetTxRxMode(TXRX_OFF);
 | 
				
			||||||
 | 
								XN297_SetTxRxMode(RX_EN);
 | 
				
			||||||
 | 
								phase++;
 | 
				
			||||||
 | 
								return 5000;
 | 
				
			||||||
 | 
							case XK2_BIND2:
 | 
				
			||||||
 | 
								if(XN297_IsRX())
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									XN297_ReadPayload(packet, XK2_PAYLOAD_SIZE);
 | 
				
			||||||
 | 
									#if 0
 | 
				
			||||||
 | 
										debug("RX");
 | 
				
			||||||
 | 
										for(uint8_t i=0; i<XK2_PAYLOAD_SIZE; i++)
 | 
				
			||||||
 | 
											debug(" %02X",packet[i]);
 | 
				
			||||||
 | 
										debugln("");
 | 
				
			||||||
 | 
									#endif
 | 
				
			||||||
 | 
									crc8 = 0xBF;
 | 
				
			||||||
 | 
									for(uint8_t i=0; i<XK2_PAYLOAD_SIZE-1; i++)
 | 
				
			||||||
 | 
										crc8 += packet[i];
 | 
				
			||||||
 | 
									//phase = XK2_BIND1;
 | 
				
			||||||
 | 
									//return 500;
 | 
				
			||||||
 | 
									if(crc8 != packet[8])
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										phase = XK2_BIND1;
 | 
				
			||||||
 | 
										return 1000;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									if(packet[0] == 0x9B)
 | 
				
			||||||
 | 
										phase++;
 | 
				
			||||||
 | 
									else
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										XN297_SetTxRxMode(TXRX_OFF);
 | 
				
			||||||
 | 
										XN297_SetTxRxMode(TX_EN);
 | 
				
			||||||
 | 
										bind_counter = 10;
 | 
				
			||||||
 | 
										phase = XK2_DATA;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return 1000;
 | 
				
			||||||
 | 
							case XK2_DATA_PREP:
 | 
				
			||||||
 | 
								XN297_SetTxRxMode(TXRX_OFF);
 | 
				
			||||||
 | 
								XN297_SetTxRxMode(TX_EN);
 | 
				
			||||||
 | 
								XN297_SetTXAddr(rx_tx_addr, 5);
 | 
				
			||||||
 | 
								BIND_DONE;
 | 
				
			||||||
 | 
							case XK2_DATA:
 | 
				
			||||||
 | 
								#ifdef MULTI_SYNC
 | 
				
			||||||
 | 
									telemetry_set_input_sync(XK2_PACKET_PERIOD);
 | 
				
			||||||
 | 
								#endif
 | 
				
			||||||
 | 
								if(bind_counter)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									bind_counter--;
 | 
				
			||||||
 | 
									if(bind_counter == 0)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										phase = XK2_DATA_PREP;
 | 
				
			||||||
 | 
										//phase = XK2_BIND1;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								XK2_send_packet();
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return XK2_PACKET_PERIOD;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void XK2_init()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						//BIND_IN_PROGRESS;	// autobind protocol
 | 
				
			||||||
 | 
						XK2_initialize_txid();
 | 
				
			||||||
 | 
						XK2_RF_init();
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if(IS_BIND_IN_PROGRESS)
 | 
				
			||||||
 | 
							phase = XK2_BIND1;
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							phase = XK2_DATA_PREP;
 | 
				
			||||||
 | 
						bind_counter = 0;
 | 
				
			||||||
 | 
						hopping_frequency_no = 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -272,6 +272,7 @@
 | 
				
			|||||||
#define	SLT_CCNRF_INO
 | 
					#define	SLT_CCNRF_INO
 | 
				
			||||||
#define	V911S_CCNRF_INO
 | 
					#define	V911S_CCNRF_INO
 | 
				
			||||||
#define	XK_CCNRF_INO
 | 
					#define	XK_CCNRF_INO
 | 
				
			||||||
 | 
					#define	XK2_CCNRF_INO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//The protocols below need a SX1276 to be installed
 | 
					//The protocols below need a SX1276 to be installed
 | 
				
			||||||
#define	FRSKYR9_SX1276_INO
 | 
					#define	FRSKYR9_SX1276_INO
 | 
				
			||||||
@ -857,6 +858,8 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]=	{
 | 
				
			|||||||
		X450
 | 
							X450
 | 
				
			||||||
		X420
 | 
							X420
 | 
				
			||||||
		XK_CARS
 | 
							XK_CARS
 | 
				
			||||||
 | 
						PROTO_XK2
 | 
				
			||||||
 | 
							NONE
 | 
				
			||||||
	PROTO_YD717
 | 
						PROTO_YD717
 | 
				
			||||||
		YD717
 | 
							YD717
 | 
				
			||||||
		SKYWLKR
 | 
							SKYWLKR
 | 
				
			||||||
 | 
				
			|||||||
@ -151,7 +151,8 @@ CFlie|38|CFlie||||||||NRF24L01|
 | 
				
			|||||||
[WFLY2](Protocols_Details.md#WFLY2---79)|79|RF20x||||||||A7105|
 | 
					[WFLY2](Protocols_Details.md#WFLY2---79)|79|RF20x||||||||A7105|
 | 
				
			||||||
[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||||||NRF24L01|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
 | 
				
			||||||
[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|
 | 
				
			||||||
[ZSX](Protocols_Details.md#ZSX---52)|52|280||||||||NRF24L01|XN297
 | 
					[ZSX](Protocols_Details.md#ZSX---52)|52|280||||||||NRF24L01|XN297
 | 
				
			||||||
* "*" Sub Protocols designated by * suffix are using a XN297L@250kbps which will be emulated by default with the NRF24L01. If option (freq tune) is diffrent from 0, the CC2500 module (if installed) will be used instead. Each specific sub protocol has a more detailed explanation.
 | 
					* "*" Sub Protocols designated by * suffix are using a XN297L@250kbps which will be emulated by default with the NRF24L01. If option (freq tune) is diffrent from 0, the CC2500 module (if installed) will be used instead. Each specific sub protocol has a more detailed explanation.
 | 
				
			||||||
@ -1474,6 +1475,24 @@ A|E|T|R|FLIP|LIGHT
 | 
				
			|||||||
### Sub_protocol Cars - *2*
 | 
					### Sub_protocol Cars - *2*
 | 
				
			||||||
Models: WLtoys cars 284131/284161/284010/124016/124017/144010 and Eachine EAT14
 | 
					Models: WLtoys cars 284131/284161/284010/124016/124017/144010 and Eachine EAT14
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## XK2 - *99*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Sub_protocol X4 - *0*
 | 
				
			||||||
 | 
					Transmitter: XK X4, model: XK A160S
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**Only 1 ID and might only work with my plane**
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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
 | 
				
			||||||
 | 
					---|---|---|---|---|---|---
 | 
				
			||||||
 | 
					A|E|T|R|Rate|Mode|Hover
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user