APM, Arducopter Mehrkanal Pid tuning.

Dieses Projekt nutzt einen Arduino mit nrf24l01 als Empfänger für einen Sender mit 3 Potis (Siehe Bild) um die Potistellungen in fertige PID Werte umzuwandeln und als I2C Slave über den USERCODE des Arducopter zur Verfügung zu stellen.

7272241428662241465

Hier nur mit cc3d, ein Arduino Empfänger über i2C am FCU-Board mit 3 Kanal Sender:

Potiwerte via nrf24l01 in ppm[] als i2c-Slave request Antwort

float low_P_value = 0.15;
float high_P_value = 0.2;
float low_I_value = 0.002;
float high_I_value = 0.010;
float low_D_value = 0.0;
float high_D_value = 0.5;


void requestEvent()
{
  ppm[0] = (int)(fscale( 1100, 1900, low_P_value, high_P_value, ppm[0], 0.0) * 1000);
  ppm[1] = (int)(fscale( 1100, 1900, low_I_value, high_I_value, ppm[1], 0.0) * 1000);
  ppm[2] = (int)(fscale( 1100, 1900, low_D_value, high_D_value, ppm[2], 0.0) * 1000);
  char check[6];

  check[0] = (ppm[0] >> 8);
  check[1] = (ppm[0] & 255);
  check[2] = (ppm[1] >> 8);
  check[3] = (ppm[1] & 255);
  check[4] = (ppm[2] >> 8);
  check[5] = (ppm[2] & 255);
  Wire.write(check, 6);
}

Usercode.pde Related Code

void userhook_SuperSlowLoop()
{
uint8_t check[6];
// hal.console->print("USERHOOK\n");
    if (failsafe.radio || failsafe.radio_counter != 0) {
        return;
    }
if(g.radio_tuning > 0){
   hal.scheduler->delay(1);

    _i2c_sem = hal.i2c->get_semaphore();
    if (!_i2c_sem->take(HAL_SEMAPHORE_BLOCK_FOREVER)) {
      //  hal.scheduler->panic(PSTR("Failed to get Atmega328p"));
    }
    if(hal.i2c->read(0x99, (int8_t)6, check) != 0)
{

}else
{
 int16_t ch1_value = check[0] << 8 | check[1];
 int16_t ch2_value = check[2] << 8 | check[3];
 int16_t ch3_value = check[4] << 8 | check[5];

   
float ch1f_value= (float) ch1_value/ 1000.0f;
float ch2f_value= (float) ch2_value/ 1000.0f;
float ch3f_value= (float) ch3_value/ 1000.0f;
  hal.console->print("P");
hal.console->print(ch1f_value);
  hal.console->print("I");
hal.console->print(ch2f_value);
  hal.console->print("D");
hal.console->print(ch3f_value);
  hal.console->print("\n");

        g.pid_rate_roll.kP(ch1f_value);
        g.pid_rate_pitch.kP(ch1f_value);
        g.pid_rate_roll.kI(ch2f_value);
        g.pid_rate_pitch.kI(ch2f_value);
        g.pid_rate_roll.kD(ch3f_value);
        g.pid_rate_pitch.kD(ch3f_value);
       

}
 _i2c_sem->give();
}
}
#endif

 

 

In der Usercode Datei wird sobald im Missionplanner ein beliebiges CH6 Tuning gesetzt wird alle 3 Sekunden beliebig viele über Poti gesteuerte PID-Werte gesetzt.

Codebeispiele:

 

cc3d PID TUNING BOX

Dieses Projekt nutzt den 2ten Receiver-Input Anschluß eines cc3d Atom zur Einspeisung von PID-Tx Kanälen. An meinem cc3d nutze ich 6PWM Inputs für meine Fernsteuerung, der trick ist den zweiten unbenutzen PPM Input über 2 Arduinos und eine beliebige Funkstrecke als „TX-Pid Bypass“ zu nutzen.

Anleitung: https://hackaday.io/project/5212-diy-3channel-ppm-quadcopter-calibration-box

So sieht dann das Ergebnis aus:

7272241428662241465

Hier sieht man einen eigenen ProMini Clone mit nrf24l01 Platine und ppm Output am Flexiport. Dazu noch den Sender mit 3Potis der die Werte in 1100-1900 sendet.

Erklärungsvideo:

auf Wunsch kann ich das Projekt zur Weitergabe Beautifiern!