From 930c26a111a61764c607b41baa38330a0d14386c Mon Sep 17 00:00:00 2001 From: Pascal Langer Date: Fri, 10 Jul 2020 15:25:32 +0200 Subject: [PATCH] Kyosho: new protocol --- Lua_scripts/MultiChan.txt | 4 +- Multiprotocol/A7105_SPI.ino | 127 ++++++++++++++++++++------------ Multiprotocol/Kyosho_a7105.ino | 116 +++++++++++++++++++++++++++++ Multiprotocol/Multi.txt | 3 +- Multiprotocol/Multi_Names.ino | 4 + Multiprotocol/Multiprotocol.h | 4 +- Multiprotocol/Multiprotocol.ino | 7 ++ Multiprotocol/Validate.h | 9 +++ Multiprotocol/_Config.h | 6 +- Protocols_Details.md | 30 +++++--- 10 files changed, 246 insertions(+), 64 deletions(-) create mode 100644 Multiprotocol/Kyosho_a7105.ino diff --git a/Lua_scripts/MultiChan.txt b/Lua_scripts/MultiChan.txt index f121bd2..4a56ccf 100644 --- a/Lua_scripts/MultiChan.txt +++ b/Lua_scripts/MultiChan.txt @@ -94,7 +94,8 @@ 26,1,Hontai,JJRCX1,1,Flip,Arm,Pict,Video,HLess,RTH,Calib 26,2,Hontai,X5C1,1,Flip,Arm,Pict,Video,HLess,RTH,Calib 26,3,Hontai,FQ777_951,1,Flip,Arm,Pict,Video,HLess,RTH,Calib -57,0,HoTT,Std,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12 +57,0,HoTT,Sync,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12 +57,1,HoTT,No_Sync,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12 2,0,Hubsan,H107,1,Flip,Light,Pict,Video,HLess 2,1,Hubsan,H301,0,RTH,Light,Stab,Video 2,2,Hubsan,H501,0,RTH,Light,Pict,Video,HLess,GPS_H,ALT_H,Flip,FModes @@ -103,6 +104,7 @@ 49,0,KF606,Std,1,Trim 9,0,KN,WLToys,0,DRate,THold,IdleUp,Gyro,Ttrim,Atrim,Etrim 9,1,KN,Feilun,0,DRate,THold,IdleUp,Gyro,Ttrim,Atrim,Etrim +73,0,Kyosho,Std,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14 18,0,MJXQ,WHL08,1,Flip,LED,Pict,Video,HLess,RTH,AuFlip,Pan,Tilt,Rate 18,1,MJXQ,X600,1,Flip,LED,Pict,Video,HLess,RTH,AuFlip,Pan,Tilt,Rate 18,2,MJXQ,X800,1,Flip,LED,Pict,Video,HLess,RTH,AuFlip,Pan,Tilt,Rate diff --git a/Multiprotocol/A7105_SPI.ino b/Multiprotocol/A7105_SPI.ino index 38ea07a..fe76637 100644 --- a/Multiprotocol/A7105_SPI.ino +++ b/Multiprotocol/A7105_SPI.ino @@ -202,6 +202,11 @@ void A7105_AdjustLOBaseFreq(uint8_t cmd) offset=(int16_t)FORCE_PELIKAN_TUNING; #endif break; + case PROTO_KYOSHO: + #ifdef FORCE_KYOSHO_TUNING + offset=(int16_t)FORCE_KYOSHO_TUNING; + #endif + break; case PROTO_AFHDS2A: case PROTO_AFHDS2A_RX: #ifdef FORCE_AFHDS2A_TUNING @@ -306,6 +311,14 @@ const uint8_t PROGMEM PELIKAN_A7105_regs[] = { 0x01, 0x0f // 30 - 31 }; #endif +#ifdef KYOSHO_A7105_INO +const uint8_t PROGMEM KYOSHO_A7105_regs[] = { + 0xff, 0x42, 0xff, 0x25, 0x00, 0xff, 0xff ,0x00, 0x00, 0x00, 0x00, 0x01, 0x21, 0x05, 0x00, 0x50, // 00 - 0f + 0x9e, 0x4b, 0x00, 0x02, 0x16, 0x2b, 0x12, 0x40, 0x62, 0x80, 0x80, 0x00, 0x0a, 0x32, 0x03, 0x1f, // 10 - 1f + 0x1e, 0x00, 0x00, 0xff, 0x00, 0x00, 0x23, 0x70, 0x1F, 0x47, 0x80, 0x57, 0x01, 0x45, 0x19, 0x00, // 20 - 2f + 0x01, 0x0f // 30 - 31 +}; +#endif #define ID_NORMAL 0x55201041 #define ID_PLUS 0xAA201041 @@ -348,13 +361,15 @@ void A7105_Init(void) #ifdef FLYSKY_A7105_INO if(protocol==PROTO_FLYSKY) A7105_Regs=(uint8_t*)FLYSKY_A7105_regs; - else #endif - { - #if defined(AFHDS2A_A7105_INO) || defined(AFHDS2A_RX_A7105_INO) - A7105_Regs=(uint8_t*)AFHDS2A_A7105_regs; - #endif - } + #if defined(AFHDS2A_A7105_INO) || defined(AFHDS2A_RX_A7105_INO) + if(protocol==PROTO_AFHDS2A) + A7105_Regs=(uint8_t*)AFHDS2A_A7105_regs; + #endif + #ifdef KYOSHO_A7105_INO + if(protocol==PROTO_KYOSHO) + A7105_Regs=(uint8_t*)KYOSHO_A7105_regs; + #endif } for (uint8_t i = 0; i < 0x32; i++) @@ -373,54 +388,68 @@ void A7105_Init(void) } A7105_Strobe(A7105_STANDBY); - //IF Filter Bank Calibration - A7105_WriteReg(A7105_02_CALC,1); - while(A7105_ReadReg(A7105_02_CALC)); // Wait for calibration to end -// A7105_ReadReg(A7105_22_IF_CALIB_I); -// A7105_ReadReg(A7105_24_VCO_CURCAL); - - if(protocol!=PROTO_HUBSAN) - { - //VCO Current Calibration - A7105_WriteReg(A7105_24_VCO_CURCAL,0x13); //Recommended calibration from A7105 Datasheet - //VCO Bank Calibration - A7105_WriteReg(A7105_26_VCO_SBCAL_II,0x3b); //Recommended calibration from A7105 Datasheet + if(protocol==PROTO_KYOSHO) + {//strange calibration... + //IF Filter Bank Calibration + A7105_WriteReg(A7105_02_CALC,0x0F); + while(A7105_ReadReg(A7105_02_CALC)); // Wait for calibration to end + // A7105_ReadReg(A7105_22_IF_CALIB_I); + // A7105_ReadReg(A7105_24_VCO_CURCAL); + // A7105_ReadReg(25_VCO_SBCAL_I); + // A7105_ReadReg(1A_RX_GAIN_II); + // A7105_ReadReg(1B_RX_GAIN_III); } - - //VCO Bank Calibrate channel 0 - A7105_WriteReg(A7105_0F_CHANNEL, 0); - A7105_WriteReg(A7105_02_CALC,2); - while(A7105_ReadReg(A7105_02_CALC)); // Wait for calibration to end - vco_calibration0 = A7105_ReadReg(A7105_25_VCO_SBCAL_I); - - //VCO Bank Calibrate channel A0 - A7105_WriteReg(A7105_0F_CHANNEL, 0xa0); - A7105_WriteReg(A7105_02_CALC, 2); - while(A7105_ReadReg(A7105_02_CALC)); // Wait for calibration to end - vco_calibration1 = A7105_ReadReg(A7105_25_VCO_SBCAL_I); - - if(protocol==PROTO_BUGS) - A7105_SetVCOBand(vco_calibration0 & 0x07, vco_calibration1 & 0x07); // Set calibration band value to best match else + { + //IF Filter Bank Calibration + A7105_WriteReg(A7105_02_CALC,1); + while(A7105_ReadReg(A7105_02_CALC)); // Wait for calibration to end + // A7105_ReadReg(A7105_22_IF_CALIB_I); + // A7105_ReadReg(A7105_24_VCO_CURCAL); + if(protocol!=PROTO_HUBSAN) { - switch(protocol) - { - case PROTO_FLYSKY: - vco_calibration1=0x08; - break; - case PROTO_FLYZONE: - vco_calibration1=0x02; - break; - case PROTO_PELIKAN: - vco_calibration1=0x0C; - break; - default: - vco_calibration1=0x0A; - break; - } - A7105_WriteReg(A7105_25_VCO_SBCAL_I,vco_calibration1); //Reset VCO Band calibration + //VCO Current Calibration + A7105_WriteReg(A7105_24_VCO_CURCAL,0x13); //Recommended calibration from A7105 Datasheet + //VCO Bank Calibration + A7105_WriteReg(A7105_26_VCO_SBCAL_II,0x3b); //Recommended calibration from A7105 Datasheet } + + //VCO Bank Calibrate channel 0 + A7105_WriteReg(A7105_0F_CHANNEL, 0); + A7105_WriteReg(A7105_02_CALC,2); + while(A7105_ReadReg(A7105_02_CALC)); // Wait for calibration to end + vco_calibration0 = A7105_ReadReg(A7105_25_VCO_SBCAL_I); + + //VCO Bank Calibrate channel A0 + A7105_WriteReg(A7105_0F_CHANNEL, 0xa0); + A7105_WriteReg(A7105_02_CALC, 2); + while(A7105_ReadReg(A7105_02_CALC)); // Wait for calibration to end + vco_calibration1 = A7105_ReadReg(A7105_25_VCO_SBCAL_I); + + if(protocol==PROTO_BUGS) + A7105_SetVCOBand(vco_calibration0 & 0x07, vco_calibration1 & 0x07); // Set calibration band value to best match + else + if(protocol!=PROTO_HUBSAN) + { + switch(protocol) + { + case PROTO_FLYSKY: + vco_calibration1=0x08; + break; + case PROTO_FLYZONE: + vco_calibration1=0x02; + break; + case PROTO_PELIKAN: + vco_calibration1=0x0C; + break; + default: + vco_calibration1=0x0A; + break; + } + A7105_WriteReg(A7105_25_VCO_SBCAL_I,vco_calibration1); //Reset VCO Band calibration + } + } A7105_SetTxRxMode(TX_EN); A7105_SetPower(); diff --git a/Multiprotocol/Kyosho_a7105.ino b/Multiprotocol/Kyosho_a7105.ino new file mode 100644 index 0000000..343c0be --- /dev/null +++ b/Multiprotocol/Kyosho_a7105.ino @@ -0,0 +1,116 @@ +/* + 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 . + */ + +#if defined(KYOSHO_A7105_INO) + +#include "iface_a7105.h" + +//#define KYOSHO_FORCE_ID + +//Kyosho constants & variables +#define KYOSHO_BIND_COUNT 2500 + +static void __attribute__((unused)) kyosho_send_packet() +{ + //ID + packet[1] = rx_tx_addr[0]; + packet[2] = rx_tx_addr[1]; + packet[3] = rx_tx_addr[2]; + packet[4] = rx_tx_addr[3]; + //unknown may be RX ID on some other remotes + memset(packet+5,0xFF,4); + + if(IS_BIND_IN_PROGRESS) + { + packet[ 0] = 0xBC; // bind indicator + packet[ 9] &= 0x01; + packet[ 9] ^= 0x01; // high/ low part of the RF table + packet[10] = 0x00; + //RF table + for(uint8_t i=0; i<16;i++) + packet[i+11]=hopping_frequency[i+(packet[9]<<4)]; + //unknwon + packet[27] = 0x05; + packet[28] = 0x00; + memset(packet+29,0xFF,8); + //frequency hop during bind + if(packet[9]) + rf_ch_num=0x8C; + else + rf_ch_num=0x0D; + } + else + { + packet[ 0] = 0x58; // normal packet + //14 channels: steering, throttle, ... + for(uint8_t i = 0; i < 14; i++) + { + uint16_t temp=convert_channel_ppm(i); + packet[9 + i*2]=temp&0xFF; // low byte of servo timing(1000-2000us) + packet[10 + i*2]=(temp>>8)&0xFF; // high byte of servo timing(1000-2000us) + } + rf_ch_num=hopping_frequency[hopping_frequency_no]; + hopping_frequency_no++; + packet[34] |= (hopping_frequency_no&0x0F)<<4; + packet[36] |= (hopping_frequency_no&0xF0); // last byte is ending with F on the dumps so let's see + hopping_frequency_no &= 0x1F; + } + // debug("ch=%02X P=",rf_ch_num); + // for(uint8_t i=0; i<37; i++) + // debug("%02X ", packet[i]); + // debugln(""); + A7105_WriteData(37, rf_ch_num); +} + +uint16_t ReadKyosho() +{ + #ifndef FORCE_KYOSHO_TUNING + A7105_AdjustLOBaseFreq(1); + #endif + if(IS_BIND_IN_PROGRESS) + { + bind_counter--; + if (bind_counter==0) + BIND_DONE; + } + else + { + A7105_SetPower(); + #ifdef MULTI_SYNC + telemetry_set_input_sync(3852); + #endif + } + kyosho_send_packet(); + return 3852; +} + +uint16_t initKyosho() +{ + A7105_Init(); + + // compute 32 channels from ID + calc_fh_channels(32); + hopping_frequency_no=0; + + #ifdef KYOSHO_FORCE_ID + memcpy(rx_tx_addr,"\x3A\x39\x37\x00",4); + memcpy(hopping_frequency,"\x29\x4C\x67\x92\x31\x1C\x77\x18\x23\x6E\x81\x5C\x8F\x5A\x51\x94\x7A\x12\x45\x6C\x7F\x1E\x0D\x88\x63\x8C\x4F\x37\x26\x61\x2C\x8A",32); + #endif + + if(IS_BIND_IN_PROGRESS) + bind_counter = KYOSHO_BIND_COUNT; + return 2000; +} +#endif diff --git a/Multiprotocol/Multi.txt b/Multiprotocol/Multi.txt index e7c9dd8..5eec5d6 100644 --- a/Multiprotocol/Multi.txt +++ b/Multiprotocol/Multi.txt @@ -69,4 +69,5 @@ 69,ESKYv2,150V2 70,DSM_RX 71,JJRC345 -72,Q90C \ No newline at end of file +72,Q90C +73,Kyosho \ No newline at end of file diff --git a/Multiprotocol/Multi_Names.ino b/Multiprotocol/Multi_Names.ino index 6ff53b9..d23160b 100644 --- a/Multiprotocol/Multi_Names.ino +++ b/Multiprotocol/Multi_Names.ino @@ -86,6 +86,7 @@ const char STR_XN297DUMP[] ="XN297DP"; const char STR_FRSKYR9[] ="FrSkyR9"; const char STR_PROPEL[] ="Propel"; const char STR_SKYARTEC[] ="Skyartc"; +const char STR_KYOSHO[] ="Kyosho"; const char STR_TEST[] ="Test"; const char STR_FAKE[] ="Fake"; @@ -290,6 +291,9 @@ const mm_protocol_definition multi_protocols[] = { #if defined(KN_NRF24L01_INO) {PROTO_KN, STR_KN, 2, STR_SUBTYPE_KN, OPTION_NONE }, #endif + #if defined(KYOSHO_A7105_INO) + {PROTO_KYOSHO, STR_KYOSHO, 0, NO_SUBTYPE, OPTION_NONE }, + #endif #if defined(MJXQ_NRF24L01_INO) {PROTO_MJXQ, STR_MJXQ, 7, STR_SUBTYPE_MJXQ, OPTION_RFTUNE }, #endif diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index 49bc9c4..6893d0f 100644 --- a/Multiprotocol/Multiprotocol.h +++ b/Multiprotocol/Multiprotocol.h @@ -19,7 +19,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 3 #define VERSION_REVISION 1 -#define VERSION_PATCH_LEVEL 38 +#define VERSION_PATCH_LEVEL 39 //****************** // Protocols @@ -99,6 +99,7 @@ enum PROTOCOLS PROTO_DSM_RX = 70, // =>CYRF6936 PROTO_JJRC345 = 71, // =>NRF24L01 PROTO_Q90C = 72, // =>NRF24L01 or CC2500 + PROTO_KYOSHO = 73, // =>A7105 PROTO_FAKE = 126, // =>CC2500+NRF24L01 PROTO_TEST = 127, // =>CC2500 @@ -796,6 +797,7 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p -- DSM_RX 70 JJRC345 71 Q90C 72 + KYOSHO 73 BindBit=> 0x80 1=Bind/0=No AutoBindBit=> 0x40 1=Yes /0=No RangeCheck=> 0x20 1=Yes /0=No diff --git a/Multiprotocol/Multiprotocol.ino b/Multiprotocol/Multiprotocol.ino index 961a718..45cc96e 100644 --- a/Multiprotocol/Multiprotocol.ino +++ b/Multiprotocol/Multiprotocol.ino @@ -1136,6 +1136,13 @@ static void protocol_init() remote_callback = ReadPelikan; break; #endif + #if defined(KYOSHO_A7105_INO) + case PROTO_KYOSHO: + PE1_off; //antenna RF1 + next_callback = initKyosho(); + remote_callback = ReadKyosho; + break; + #endif #endif #ifdef CC2500_INSTALLED #if defined(FRSKYD_CC2500_INO) diff --git a/Multiprotocol/Validate.h b/Multiprotocol/Validate.h index e04318a..f74730c 100644 --- a/Multiprotocol/Validate.h +++ b/Multiprotocol/Validate.h @@ -150,6 +150,11 @@ #error "The Hubsan forced frequency tuning value is outside of the range -300..300." #endif #endif +#ifdef FORCE_KYOSHO_TUNING + #if ( FORCE_KYOSHO_TUNING < -300 ) || ( FORCE_KYOSHO_TUNING > 300 ) + #error "The Kyosho forced frequency tuning value is outside of the range -300..300." + #endif +#endif #ifndef USE_A7105_CH15_TUNING #ifndef FORCE_BUGS_TUNING @@ -164,6 +169,9 @@ #ifndef FORCE_PELIKAN_TUNING #define FORCE_PELIKAN_TUNING 0 #endif + #ifndef FORCE_KYOSHO_TUNING + #define FORCE_KYOSHO_TUNING 0 + #endif #ifndef FORCE_HUBSAN_TUNING #define FORCE_HUBSAN_TUNING 0 #endif @@ -212,6 +220,7 @@ #undef FLYSKY_A7105_INO #undef FLYZONE_A7105_INO #undef HUBSAN_A7105_INO + #undef KYOSHO_A7105_INO #undef PELIKAN_A7105_INO #endif #ifndef CYRF6936_INSTALLED diff --git a/Multiprotocol/_Config.h b/Multiprotocol/_Config.h index e3ab0f0..5895dc4 100644 --- a/Multiprotocol/_Config.h +++ b/Multiprotocol/_Config.h @@ -118,8 +118,9 @@ //#define FORCE_BUGS_TUNING 0 //#define FORCE_FLYSKY_TUNING 0 //#define FORCE_FLYZONE_TUNING 0 -//#define FORCE_PELIKAN_TUNING 0 //#define FORCE_HUBSAN_TUNING 0 +//#define FORCE_KYOSHO_TUNING 0 +//#define FORCE_PELIKAN_TUNING 0 /** CYRF6936 Fine Frequency Tuning **/ //This is required in rare cases where some CYRF6936 modules and/or RXs have an inaccurate crystal oscillator. @@ -170,6 +171,7 @@ #define FLYSKY_A7105_INO #define FLYZONE_A7105_INO #define HUBSAN_A7105_INO +#define KYOSHO_A7105_INO #define PELIKAN_A7105_INO //The protocols below need a CYRF6936 to be installed @@ -656,6 +658,8 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= { PROTO_KN WLTOYS FEILUN + PROTO_KYOSHO + NONE PROTO_MJXQ WLH08 X600 diff --git a/Protocols_Details.md b/Protocols_Details.md index 442b838..d1a226c 100644 --- a/Protocols_Details.md +++ b/Protocols_Details.md @@ -110,6 +110,7 @@ CFlie|38|CFlie||||||||NRF24L01| [JJRC345](Protocols_Details.md#JJRC345---71)|71|JJRC345||||||||NRF24L01|XN297 [KF606](Protocols_Details.md#KF606---49)|49|KF606*||||||||NRF24L01|XN297 [KN](Protocols_Details.md#KN---9)|9|WLTOYS|FEILUN|||||||NRF24L01| +[Kyosho](Protocols_Details.md#Kyosho---73)|73|||||||||A7105| [MJXq](Protocols_Details.md#MJXQ---18)|18|WLH08|X600|X800|H26D|E010*|H26WH|PHOENIX*||NRF24L01|XN297 [MT99xx](Protocols_Details.md#MT99XX---17)|17|MT|H7|YZ|LS|FY805||||NRF24L01|XN297 [NCC1701](Protocols_Details.md#NCC1701---44)|44|NCC1701||||||||NRF24L01| @@ -143,6 +144,19 @@ CFlie|38|CFlie||||||||NRF24L01| If USE_A7105_CH15_TUNING is enabled, the value of channel 15 is used by all A7105 protocols for tuning the frequency. This is required in rare cases where some A7105 modules and/or RXs have an inaccurate crystal oscillator. +## BUGS - *41* +Models: MJX Bugs 3, 6 and 8 + +Telemetry enabled for RX & TX RSSI, Battery voltage good/bad + +**RX_Num is used to give a number to a given model. You must use a different RX_Num per MJX Bugs. A maximum of 16 Bugs are supported.** + +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10 +---|---|---|---|---|---|---|---|---|--- +A|E|T|R|ARM|ANGLE|FLIP|PICTURE|VIDEO|LED + +ANGLE: angle is +100%, acro is -100% + ## FLYSKY - *1* Extended limits supported @@ -254,18 +268,12 @@ H122D: FLIP H123D: FMODES -> -100%=Sport mode 1,0%=Sport mode 2,+100%=Acro -## BUGS - *41* -Models: MJX Bugs 3, 6 and 8 +## Kyosho - *73* +Transmiter: KT-531P and others -Telemetry enabled for RX & TX RSSI, Battery voltage good/bad - -**RX_Num is used to give a number to a given model. You must use a different RX_Num per MJX Bugs. A maximum of 16 Bugs are supported.** - -CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10 ----|---|---|---|---|---|---|---|---|--- -A|E|T|R|ARM|ANGLE|FLIP|PICTURE|VIDEO|LED - -ANGLE: angle is +100%, acro is -100% +CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14 +---|---|---|---|---|---|---|---|---|----|----|----|----|---- +Steering|T|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14 ## Pelikan - *60* Extended limits supported