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:

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.

Denkhilfe *

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.