Hola cheyenne, antes de ponerme con esto he visto los ejemplos de PID introduciendo algún valor, introduzco un valor X y el PID me devuelve la corrección del error que presenta ese valor, visto esos ejemplo me meto con esto por ver si es mas fácil la estabilización ya que introduciendo algún dato el PID me devolverán a la salida un valor para compensar ese valor.
Uso Setpoint = power para que la salida del pid devuelva un valor que sea la diferencia osea el error que tiene la estabilización y me devuelva un valor para incrementar la potencia de los motores.
Como solo estoy probando el Roll de quadcopter establezco dos lados, osea que dos motores dependiendo de la inclinación aumentaran su potencia para equilibrar el quadcopter, y como puede ser que los motores no todos tendran la misma potencia dependiendo de lo que se valla a hacer, por ejemplo girarlo sobre su propio eje, o cualquier otro movimiento establezco las variables p1,p2,p3,p4 que haran referencia a la potencia de cada motor, cada uno de ellas con su correspondiente numero de motor.
Lo de los incrementos divido por dos y por tres, por hacer una prueba reduciendo el incremento y que no fuese tan brusco el cambio, al principio no dividia la variable inc, y tampoco existia inc2, pero al ver que sucedia eso probe con un valor mas pequeño al incrementar y por eso divido.
Este es mi codigo basico:
//pid declaracion
PID myPID(&Inputpid, &Output, &Setpoint,1,0,0, DIRECT);
//power variable de potencia
Setpoint = power;
//PID
//el roll mide el angulo de inclinacion desde 0 a +-90
Inputpid = roll;
myPID.Compute();
//incremento de los motores
if(Output > Setpoint)
{
//lado 2
inc = Output - Setpoint;
p1 = power;
p2 = power;
p3 = power + inc;
p4 = power + inc;
}
else if (Output <= Setpoint)
{
//inc lado1
inc = Setpoint - Output;
p1 = power + inc;
p2 = power + inc;
p3 = power;
p4 = power;
}
motor1.write(p1);
motor2.write(p2);
motor3.write(p3);
motor4.write(p4);
Un ejemplo de lo que hace este código es que si sitúas tu setpoint = power y el valor de power es 40 por ejemplo, cuando haya una inclinación X la salida del PID devuelva Y va a incrementar la potencia de los dos motores del lado que esta descompensado en la diferencia de la velocidad y lo que ha devuelto el PID osea si era 40 - Y = inc , por lo cual un lado del quadcopter tendrá el valor de los motores igual a power + inc y otro a power, a medida que se este estabilizando ira disminuyendo ese incremento y quedara estabilizado.Pero el resultado como sale en el vídeo demuestra que no, que es demasiada potencia y acaba por desequilibrar el otro lado.
Por ultimo no uso el PID como la salida de un sensor, intento que el PID me devuelva la corrección de un error de equilibrio y aplique esa salida como incremento de la potencia de los motores, si es verdad que dependiendo de esa salida aplico el incremento en un lado o en otro, que puede ser que me equivoque ya que al PID se le indica el valor deseado y yo le indico como valor la velocidad estable del quadcopter por lo cual, ahí puede estar uno de los problemas, ya que no va a ser estable con la velocidad de los motores iguales porque puede haber una descompensacion de peso en un lado y deben tener una potencia mayor para estabilizarlo, pero entonces como introduciendo un valor deseado de estabilidad por ejemplo quiero que este a un valor 0 en el eje X, para que este estable tendría que indicar en vez de la potencia el angulo de inclinación para que devuelva la corrección de ese angulo de inclinación, y con ese valor ya aplicar una potencia de incremento para los motores descompensados?