Flysky AFHDS2A: 16 channels + LQI

Use the 2 new sub protocols to extend the protocol to 16 channels on IBUS
This commit is contained in:
Pascal Langer 2020-07-15 23:58:41 +02:00
parent f8ac406a94
commit d6da230369
8 changed files with 97 additions and 53 deletions

View File

@ -51,6 +51,8 @@
28,1,Flysky_AFHDS2A,PPM_IBUS,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14 28,1,Flysky_AFHDS2A,PPM_IBUS,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14
28,2,Flysky_AFHDS2A,PWM_SBUS,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14 28,2,Flysky_AFHDS2A,PWM_SBUS,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14
28,3,Flysky_AFHDS2A,PPM_SBUS,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14 28,3,Flysky_AFHDS2A,PPM_SBUS,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14
28,4,Flysky_AFHDS2A,PWM_IB16,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16
28,5,Flysky_AFHDS2A,PPM_IB16,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16
56,0,Flysky2A_RX,RX,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14 56,0,Flysky2A_RX,RX,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14
53,0,Flyzone,FZ-410,0 53,0,Flyzone,FZ-410,0
25,0,FrSkyV,V8,0,CH5,CH6,CH7,CH8 25,0,FrSkyV,V8,0,CH5,CH6,CH7,CH8

View File

@ -39,7 +39,7 @@ static void __attribute__((unused)) AFHDS2A_Rx_build_telemetry_packet()
packet_in[idx++] = 14; // number of channels in packet packet_in[idx++] = 14; // number of channels in packet
// pack channels // pack channels
for (uint8_t i = 0; i < 14; i++) { for (uint8_t i = 0; i < 14; i++) {
uint32_t val = packet[9+i*2] | (packet[10+i*2] << 8); uint32_t val = packet[9+i*2] | ((packet[10+i*2] << 8)&0x0F);
if (val < 860) if (val < 860)
val = 860; val = 860;
// convert ppm (860-2140) to Multi (0-2047) // convert ppm (860-2140) to Multi (0-2047)

View File

@ -78,8 +78,6 @@ enum{
static void AFHDS2A_update_telemetry() static void AFHDS2A_update_telemetry()
{ {
if(packet[0]==0xAA && packet[9]==0xFD)
return; // ignore packets which contain the RX configuration: FD FF 32 00 01 00 FF FF FF 05 DC 05 DE FA FF FF FF FF FF FF FF FF FF FF FF FF FF FF
// Read TX RSSI // Read TX RSSI
int16_t temp=256-(A7105_ReadReg(A7105_1D_RSSI_THOLD)*8)/5; // value from A7105 is between 8 for maximum signal strength to 160 or less int16_t temp=256-(A7105_ReadReg(A7105_1D_RSSI_THOLD)*8)/5; // value from A7105 is between 8 for maximum signal strength to 160 or less
if(temp<0) temp=0; if(temp<0) temp=0;
@ -183,37 +181,64 @@ static void AFHDS2A_build_packet(uint8_t type)
{ {
case AFHDS2A_PACKET_STICKS: case AFHDS2A_PACKET_STICKS:
packet[0] = 0x58; packet[0] = 0x58;
for(uint8_t ch=0; ch<14; ch++) //16 channels + RX_LQI on channel 17
for(uint8_t ch=0; ch<num_ch; ch++)
{ {
uint16_t channelMicros = convert_channel_ppm(CH_AETR[ch]); if(ch == 16 // CH17=RX_LQI
packet[9 + ch*2] = channelMicros&0xFF; #ifdef AFHDS2A_LQI_CH
packet[10 + ch*2] = (channelMicros>>8)&0xFF; || ch == (AFHDS2A_LQI_CH-1) // override channel with LQI
#endif
)
val = 2000 - 10*RX_LQI;
else
val = convert_channel_ppm(CH_AETR[ch]);
if(ch<14)
{
packet[9 + ch*2] = val;
packet[10 + ch*2] = (val>>8)&0x0F;
}
else
{
packet[10 + (ch-14)*6] |= (val)<<4;
packet[12 + (ch-14)*6] |= (val)&0xF0;
packet[14 + (ch-14)*6] |= (val>>4)&0xF0;
}
} }
#ifdef AFHDS2A_LQI_CH
// override channel with LQI
val = 2000 - 10*RX_LQI;
packet[9+((AFHDS2A_LQI_CH-1)*2)] = val & 0xff;
packet[10+((AFHDS2A_LQI_CH-1)*2)] = (val >> 8) & 0xff;
#endif
break; break;
case AFHDS2A_PACKET_FAILSAFE: case AFHDS2A_PACKET_FAILSAFE:
packet[0] = 0x56; packet[0] = 0x56;
for(uint8_t ch=0; ch<14; ch++) for(uint8_t ch=0; ch<num_ch; ch++)
{ {
#ifdef FAILSAFE_ENABLE #ifdef FAILSAFE_ENABLE
uint16_t failsafeMicros = Failsafe_data[CH_AETR[ch]]; if(ch<16)
if( failsafeMicros!=FAILSAFE_CHANNEL_HOLD && failsafeMicros!=FAILSAFE_CHANNEL_NOPULSES) val = Failsafe_data[CH_AETR[ch]];
else
val = FAILSAFE_CHANNEL_NOPULSES;
if(val!=FAILSAFE_CHANNEL_HOLD && val!=FAILSAFE_CHANNEL_NOPULSES)
{ // Failsafe values { // Failsafe values
failsafeMicros = (((failsafeMicros<<2)+failsafeMicros)>>3)+860; val = (((val<<2)+val)>>3)+860;
packet[9 + ch*2] = failsafeMicros & 0xff; if(ch<14)
packet[10+ ch*2] = ( failsafeMicros >> 8) & 0xff; {
packet[9 + ch*2] = val;
packet[10 + ch*2] = (val>>8)&0x0F;
}
else
{
packet[10 + (ch-14)*6] &= 0x0F;
packet[10 + (ch-14)*6] |= (val)<<4;
packet[12 + (ch-14)*6] &= 0x0F;
packet[12 + (ch-14)*6] |= (val)&0xF0;
packet[14 + (ch-14)*6] &= 0x0F;
packet[14 + (ch-14)*6] |= (val>>4)&0xF0;
}
} }
else else
#endif #endif
{ // no values if(ch<14)
packet[9 + ch*2] = 0xff; { // no values
packet[10+ ch*2] = 0xff; packet[9 + ch*2] = 0xff;
} packet[10+ ch*2] = 0xff;
}
} }
break; break;
case AFHDS2A_PACKET_SETTINGS: case AFHDS2A_PACKET_SETTINGS:
@ -224,17 +249,14 @@ static void AFHDS2A_build_packet(uint8_t type)
if(val<50 || val>400) val=50; // default is 50Hz if(val<50 || val>400) val=50; // default is 50Hz
packet[11]= val; packet[11]= val;
packet[12]= val >> 8; packet[12]= val >> 8;
if(sub_protocol == PPM_IBUS || sub_protocol == PPM_SBUS) packet[13] = sub_protocol & 0x01; // 1 -> PPM output enabled
packet[13] = 0x01; // PPM output enabled
else
packet[13] = 0x00;
packet[14]= 0x00; packet[14]= 0x00;
for(uint8_t i=15; i<37; i++) for(uint8_t i=15; i<37; i++)
packet[i] = 0xff; packet[i] = 0xff;
packet[18] = 0x05; // ? packet[18] = 0x05; // ?
packet[19] = 0xdc; // ? packet[19] = 0xdc; // ?
packet[20] = 0x05; // ? packet[20] = 0x05; // ?
if(sub_protocol == PWM_SBUS || sub_protocol == PPM_SBUS) if(sub_protocol&2)
packet[21] = 0xdd; // SBUS output enabled packet[21] = 0xdd; // SBUS output enabled
else else
packet[21] = 0xde; // IBUS packet[21] = 0xde; // IBUS
@ -352,24 +374,19 @@ uint16_t ReadAFHDS2A()
if(packet[0] == 0xAA && packet[9] == 0xFC) if(packet[0] == 0xAA && packet[9] == 0xFC)
packet_type=AFHDS2A_PACKET_SETTINGS; // RX is asking for settings packet_type=AFHDS2A_PACKET_SETTINGS; // RX is asking for settings
else else
if(packet[0] == 0xAA || packet[0] == 0xAC) if((packet[0] == 0xAA && packet[9]!=0xFD) || packet[0] == 0xAC)
{ {// Normal telemetry packet, ignore packets which contain the RX configuration: AA FD FF 32 00 01 00 FF FF FF 05 DC 05 DE FA FF FF FF FF FF FF FF FF FF FF FF FF FF FF
if(!memcmp(&packet[1], rx_tx_addr, 4)) if(!memcmp(&packet[1], rx_tx_addr, 4))
{ // TX address validated { // TX address validated
#ifdef AFHDS2A_LQI_CH for(uint8_t sensor=0; sensor<7; sensor++)
if(packet[0]==0xAA && packet[9]!=0xFD) {//read LQI value for RX output
{// Normal telemetry packet uint8_t index = 9+(4*sensor);
for(uint8_t sensor=0; sensor<7; sensor++) if(packet[index]==AFHDS2A_SENSOR_RX_ERR_RATE && packet[index+2]<=100)
{//read LQI value for RX output {
uint8_t index = 9+(4*sensor); RX_LQI=packet[index+2];
if(packet[index]==AFHDS2A_SENSOR_RX_ERR_RATE && packet[index+2]<=100) break;
{
RX_LQI=packet[index+2];
break;
}
}
} }
#endif }
#if defined(AFHDS2A_FW_TELEMETRY) || defined(AFHDS2A_HUB_TELEMETRY) #if defined(AFHDS2A_FW_TELEMETRY) || defined(AFHDS2A_HUB_TELEMETRY)
AFHDS2A_update_telemetry(); AFHDS2A_update_telemetry();
#endif #endif
@ -416,6 +433,10 @@ uint16_t initAFHDS2A()
rx_id[i]=eeprom_read_byte((EE_ADDR)(addr+i)); rx_id[i]=eeprom_read_byte((EE_ADDR)(addr+i));
} }
hopping_frequency_no = 0; hopping_frequency_no = 0;
if(sub_protocol&0x04)
num_ch=17;
else
num_ch=14;
return 50000; return 50000;
} }
#endif #endif

View File

@ -25,7 +25,7 @@
25,FrskyV 25,FrskyV
26,HONTAI,HONTAI,JJRCX1,X5C1,FQ777_951 26,HONTAI,HONTAI,JJRCX1,X5C1,FQ777_951
27,OpnLrs 27,OpnLrs
28,AFHDS2A,PWM_IBUS,PPM_IBUS,PWM_SBUS,PPM_SBUS 28,AFHDS2A,PWM_IBUS,PPM_IBUS,PWM_SBUS,PPM_SBUS,PWM_IB16,PPM_IB16
29,Q2X2,Q222,Q242,Q282 29,Q2X2,Q222,Q242,Q282
30,WK2x01,WK2801,WK2401,W6_5_1,W6_6_1,W6_HEL,W6_HEL_I 30,WK2x01,WK2801,WK2401,W6_5_1,W6_6_1,W6_HEL,W6_HEL_I
31,Q303,Q303,CX35,CX10D,CX10WD 31,Q303,Q303,CX35,CX10D,CX10WD

View File

@ -109,7 +109,7 @@ const char STR_SUBTYPE_MT99[] = "\x06""MT99\0 ""H7\0 ""YZ\0 ""LS\0 "
const char STR_SUBTYPE_MJXQ[] = "\x07""WLH08\0 ""X600\0 ""X800\0 ""H26D\0 ""E010\0 ""H26WH\0 ""Phoenix"; const char STR_SUBTYPE_MJXQ[] = "\x07""WLH08\0 ""X600\0 ""X800\0 ""H26D\0 ""E010\0 ""H26WH\0 ""Phoenix";
const char STR_SUBTYPE_FY326[] = "\x05""Std\0 ""FY319"; const char STR_SUBTYPE_FY326[] = "\x05""Std\0 ""FY319";
const char STR_SUBTYPE_HONTAI[] = "\x07""Std\0 ""JJRC X1""X5C1\0 ""FQ_951"; const char STR_SUBTYPE_HONTAI[] = "\x07""Std\0 ""JJRC X1""X5C1\0 ""FQ_951";
const char STR_SUBTYPE_AFHDS2A[] = "\x08""PWM,IBUS""PPM,IBUS""PWM,SBUS""PPM,SBUS"; const char STR_SUBTYPE_AFHDS2A[] = "\x08""PWM,IBUS""PPM,IBUS""PWM,SBUS""PPM,SBUS""PWM,IB16""PPM,IB16";
const char STR_SUBTYPE_Q2X2[] = "\x04""Q222""Q242""Q282"; const char STR_SUBTYPE_Q2X2[] = "\x04""Q222""Q242""Q282";
const char STR_SUBTYPE_WK2x01[] = "\x06""WK2801""WK2401""W6_5_1""W6_6_1""W6_HeL""W6_HeI"; const char STR_SUBTYPE_WK2x01[] = "\x06""WK2801""WK2401""W6_5_1""W6_6_1""W6_HeL""W6_HeI";
const char STR_SUBTYPE_Q303[] = "\x06""Std\0 ""CX35\0 ""CX10D\0""CX10WD"; const char STR_SUBTYPE_Q303[] = "\x06""Std\0 ""CX35\0 ""CX10D\0""CX10WD";
@ -217,7 +217,7 @@ const mm_protocol_definition multi_protocols[] = {
{PROTO_FLYSKY, STR_FLYSKY, 5, STR_SUBTYPE_FLYSKY, OPTION_NONE }, {PROTO_FLYSKY, STR_FLYSKY, 5, STR_SUBTYPE_FLYSKY, OPTION_NONE },
#endif #endif
#if defined(AFHDS2A_A7105_INO) #if defined(AFHDS2A_A7105_INO)
{PROTO_AFHDS2A, STR_AFHDS2A, 4, STR_SUBTYPE_AFHDS2A, OPTION_SRVFREQ }, {PROTO_AFHDS2A, STR_AFHDS2A, 6, STR_SUBTYPE_AFHDS2A, OPTION_SRVFREQ },
#endif #endif
#if defined(AFHDS2A_RX_A7105_INO) #if defined(AFHDS2A_RX_A7105_INO)
{PROTO_AFHDS2A_RX, STR_AFHDS2A_RX,0, NO_SUBTYPE, OPTION_NONE }, {PROTO_AFHDS2A_RX, STR_AFHDS2A_RX,0, NO_SUBTYPE, OPTION_NONE },

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 1 #define VERSION_REVISION 1
#define VERSION_PATCH_LEVEL 39 #define VERSION_PATCH_LEVEL 40
//****************** //******************
// Protocols // Protocols
@ -129,6 +129,8 @@ enum AFHDS2A
PPM_IBUS = 1, PPM_IBUS = 1,
PWM_SBUS = 2, PWM_SBUS = 2,
PPM_SBUS = 3, PPM_SBUS = 3,
PWM_IB16 = 4,
PPM_IB16 = 5,
}; };
enum Hisky enum Hisky
{ {
@ -895,6 +897,8 @@ Serial: 100000 Baud 8e2 _ xxxx xxxx p --
PPM_IBUS 1 PPM_IBUS 1
PWM_SBUS 2 PWM_SBUS 2
PPM_SBUS 3 PPM_SBUS 3
PWM_IB16 4
PPM_IB16 5
sub_protocol==V2X2 sub_protocol==V2X2
V2X2 0 V2X2 0
JXD506 1 JXD506 1

View File

@ -263,7 +263,6 @@
//When enabled (remove the "//"), the below setting makes LQI (Link Quality Indicator) available on one of the RX ouput channel (5-14). //When enabled (remove the "//"), the below setting makes LQI (Link Quality Indicator) available on one of the RX ouput channel (5-14).
//#define AFHDS2A_LQI_CH 14 //#define AFHDS2A_LQI_CH 14
/**************************/ /**************************/
/*** FAILSAFE SETTINGS ***/ /*** FAILSAFE SETTINGS ***/
/**************************/ /**************************/
@ -508,6 +507,8 @@ const PPM_Parameters PPM_prot[14*NBR_BANKS]= {
PPM_IBUS PPM_IBUS
PWM_SBUS PWM_SBUS
PPM_SBUS PPM_SBUS
PWM_IB16
PPM_IB16
PROTO_AFHDS2A_RX PROTO_AFHDS2A_RX
NONE NONE
PROTO_ASSAN PROTO_ASSAN

View File

@ -85,7 +85,7 @@ CFlie|38|CFlie||||||||NRF24L01|
[ESky150](Protocols_Details.md#ESKY150---35)|35|ESKY150||||||||NRF24L01| [ESky150](Protocols_Details.md#ESKY150---35)|35|ESKY150||||||||NRF24L01|
[ESky150V2](Protocols_Details.md#ESKY150V2---69)|69|ESky150V2||||||||CC2500|NRF24L01 [ESky150V2](Protocols_Details.md#ESKY150V2---69)|69|ESky150V2||||||||CC2500|NRF24L01
[Flysky](Protocols_Details.md#FLYSKY---1)|1|Flysky|V9x9|V6x6|V912|CX20||||A7105| [Flysky](Protocols_Details.md#FLYSKY---1)|1|Flysky|V9x9|V6x6|V912|CX20||||A7105|
[Flysky AFHDS2A](Protocols_Details.md#FLYSKY-AFHDS2A---28)|28|PWM_IBUS|PPM_IBUS|PWM_SBUS|PPM_SBUS|||||A7105| [Flysky AFHDS2A](Protocols_Details.md#FLYSKY-AFHDS2A---28)|28|PWM_IBUS|PPM_IBUS|PWM_SBUS|PPM_SBUS|PWM_IBUS16|PPM_IBUS16|||A7105|
[Flysky AFHDS2A RX](Protocols_Details.md#FLYSKY-AFHDS2A-RX---56)|56|RX||||||||A7105| [Flysky AFHDS2A RX](Protocols_Details.md#FLYSKY-AFHDS2A-RX---56)|56|RX||||||||A7105|
[Flyzone](Protocols_Details.md#FLYZONE---53)|53|FZ410||||||||A7105| [Flyzone](Protocols_Details.md#FLYZONE---53)|53|FZ410||||||||A7105|
[FQ777](Protocols_Details.md#FQ777---23)|23|FQ777||||||||NRF24L01|SSV7241 [FQ777](Protocols_Details.md#FQ777---23)|23|FQ777||||||||NRF24L01|SSV7241
@ -195,15 +195,12 @@ Extended limits and failsafe supported
Telemetry enabled protocol: Telemetry enabled protocol:
- by defaut using FrSky Hub protocol (for example er9x): RX(A1), battery voltage FS-CVT01(A2) and RX&TX RSSI - by defaut using FrSky Hub protocol (for example er9x): RX(A1), battery voltage FS-CVT01(A2) and RX&TX RSSI
- if using erskyTX and OpenTX: full telemetry information available - if using erskyTX and OpenTX: full telemetry information available
- if telemetry is incomplete (missing RX RSSI for example), it means that you have to upgrade your RX firmware to version 1.6 or later. You can do it from an original Flysky TX or using a STLink like explained in [this tutorial](https://www.rcgroups.com/forums/showthread.php?2677694-How-to-upgrade-Flysky-Turnigy-iA6B-RX-to-firmware-1-6-with-a-ST-Link).
Option is used to change the servo refresh rate. A value of 0 gives 50Hz (min), 70 gives 400Hz (max). Specific refresh rate value can be calculated like this option=(refresh_rate-50)/5. Option is used to change the servo refresh rate. A value of 0 gives 50Hz (min), 70 gives 400Hz (max). Specific refresh rate value can be calculated like this option=(refresh_rate-50)/5.
**RX_Num is used to give a number a given RX. You must use a different RX_Num per RX. A maximum of 64 AFHDS2A RXs are supported.** **RX_Num is used to give a number a given RX. You must use a different RX_Num per RX. A maximum of 64 AFHDS2A RXs are supported.**
OpenTX suggested RSSI alarm threshold settings (Telemetry tab): Low=15, Critical=12.
If telemetry is incomplete (missing RX RSSI for example), it means that you have to upgrade your RX firmware to version 1.6 or later. You can do it from an original Flysky TX or using a STLink like explained in [this tutorial](https://www.rcgroups.com/forums/showthread.php?2677694-How-to-upgrade-Flysky-Turnigy-iA6B-RX-to-firmware-1-6-with-a-ST-Link).
AFHDS2A_LQI_CH is a feature which is disabled by defaut in the _config.h file. When enabled, it makes LQI (Link Quality Indicator) available on one of the RX ouput channel (5-14). AFHDS2A_LQI_CH is a feature which is disabled by defaut in the _config.h file. When enabled, it makes LQI (Link Quality Indicator) available on one of the RX ouput channel (5-14).
CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14 CH1|CH2|CH3|CH4|CH5|CH6|CH7|CH8|CH9|CH10|CH11|CH12|CH13|CH14
@ -216,6 +213,25 @@ Note that the RX ouput will be AETR whatever the input channel order is.
### Sub_protocol PPM_IBUS - *1* ### Sub_protocol PPM_IBUS - *1*
### Sub_protocol PWM_SBUS - *2* ### Sub_protocol PWM_SBUS - *2*
### Sub_protocol PPM_SBUS - *3* ### Sub_protocol PPM_SBUS - *3*
### Sub_protocol PWM_IBUS16 - *4*
3 additional channels
CH15|CH16|CH17
---|---|---
CH15|CH16|LQI
LQI: Link Quality Indicator
### Sub_protocol PPM_IBUS16 - *5*
3 additional channels
CH15|CH16|CH17
---|---|---
CH15|CH16|LQI
LQI: Link Quality Indicator
## FLYSKY AFHDS2A RX - *56* ## FLYSKY AFHDS2A RX - *56*
The Flysky AFHDS2A receiver protocol enables master/slave trainning, separate access from 2 different radios to the same model,... The Flysky AFHDS2A receiver protocol enables master/slave trainning, separate access from 2 different radios to the same model,...