Exemple #1
0
void computeRC() {
  static uint16_t rcData4Values[RC_CHANS][4], rcDataMean[RC_CHANS];
  static uint8_t rc4ValuesIndex = 0;
  uint8_t axis;
  uint8_t chan,a;
  
#if defined(TRACE)
    Serial.println(">computeRC");
#endif 

    rc4ValuesIndex++;
    if (rc4ValuesIndex == 4) rc4ValuesIndex = 0;
    
    for (chan = 0; chan < RC_CHANS; chan++) { // read data from all channels
        rcData4Values[chan][rc4ValuesIndex] = readRawRC(chan);
#if defined(TRACE2)  
        Serial.print("rcData4Values[");Serial.print((int)chan);Serial.print("][");
        Serial.print((int)rc4ValuesIndex);Serial.print("]:");Serial.println(rcData4Values[chan][rc4ValuesIndex]);
#endif
        rcDataMean[chan] = 0;
        for (a=0;a<4;a++) rcDataMean[chan] += rcData4Values[chan][a];  // make average on 4 values
        
        rcDataMean[chan]= (rcDataMean[chan]+2)>>2;
        if ( rcDataMean[chan] < (uint16_t)rcData[chan] -3)  rcData[chan] = rcDataMean[chan]+2; // filter in current value outside +/- 3 previous value
        if ( rcDataMean[chan] > (uint16_t)rcData[chan] +3)  rcData[chan] = rcDataMean[chan]-2;
#if defined(TRACE)  
        Serial.print("rcData[");Serial.print((int)chan);Serial.print("]:");Serial.println(rcData[chan]);
#endif       
    } // end read data from all channels

    //ROLL & PITCH & YAW 
    for(axis=0;axis<3;axis++) { 
        rcCommand[axis] = min(abs(rcData[axis]-MIDRC),500);         // interval [#1000;#2000] 
        if (rcData[axis]<MIDRC) rcCommand[axis] = -rcCommand[axis]; // translated to interval [-500; +500]
           
#if defined(TRACE) 
        Serial.print("rcCommand[");Serial.print((int)axis);Serial.print("]:");Serial.println(rcCommand[axis]);
#endif         
    }  // end for ROLL & PITCH & YAW
    
    // THROTTLE
    rcCommand[THROTTLE] = constrain(rcData[THROTTLE],MINTHROTTLE,MAXTHROTTLE);  // interval  [#1000;#2000] restricted to interval [MINTHROTTLE; MAXTHROTTLE]
                                                                // usually MINTHROTTLE = 1150, MAXTHROTTLE = 1850
          
#if defined(TRACE) 
    Serial.print("rcCommand[");Serial.print((int)THROTTLE);Serial.print("]:");Serial.println(rcCommand[THROTTLE]);
#endif
}
Exemple #2
0
void computeRC() {
  static uint16_t rcData4Values[RC_CHANS][4], rcDataMean[RC_CHANS];
  static uint8_t rc4ValuesIndex = 0;
  uint16_t tmp,tmp2;
  uint8_t axis,prop1,prop2;
  uint8_t chan,a;
  
#if defined(TRACE)
    Serial.println(">computeRC");
#endif 

    rc4ValuesIndex++;
    if (rc4ValuesIndex == 4) rc4ValuesIndex = 0;
    
    for (chan = 0; chan < RC_CHANS; chan++) { // read data from all channels
        rcData4Values[chan][rc4ValuesIndex] = readRawRC(chan);
#if defined(TRACE2)  
        Serial.print("rcData4Values[");Serial.print((int)chan);Serial.print("][");
        Serial.print((int)rc4ValuesIndex);Serial.print("]:");Serial.println(rcData4Values[chan][rc4ValuesIndex]);
#endif
        rcDataMean[chan] = 0;
        for (a=0;a<4;a++) rcDataMean[chan] += rcData4Values[chan][a];  // make average on 4 values
        
        rcDataMean[chan]= (rcDataMean[chan]+2)>>2;
        if ( rcDataMean[chan] < (uint16_t)rcData[chan] -3)  rcData[chan] = rcDataMean[chan]+2; // filter in current value outside +/- 3 previous value
        if ( rcDataMean[chan] > (uint16_t)rcData[chan] +3)  rcData[chan] = rcDataMean[chan]-2;
#if defined(TRACE)  
        Serial.print("rcData[");Serial.print((int)chan);Serial.print("]:");Serial.println(rcData[chan]);
#endif       
    } // end read data from all channels
 
    
    // PITCH & ROLL only dynamic PID adjustemnt, depending on throttle value
    prop2 = 128; 
    if (rcData[THROTTLE]>1500) { // breakpoint is fix: 1500
        if (rcData[THROTTLE]<2000) {
            prop2 -=  ((uint16_t)conf.dynThrPID*(rcData[THROTTLE]-1500)>>9); 
        } else {