lesto:
guarda che il PID serve proprio per evitare valori così hardcodati..setpoint è l'inclinazione desisderata, x è la tua angolazione rilevata, e vel è la velocità a cui muovere il motore. Tu devi giocare con i valori di P I e D (in teoria solo P, ed eentualmente un pizzico di I, bastano)
cosa vuoi dire? che devo rendere tutto + semplice?
Ad esempio così?
int sampleTime =9;
unsigned long lastTime = 0;
double output;
double input;
double setpoint = 0;
double error;
double iTerm, lastValue,pTerm,dTerm;
int updatePid(double targetValue, double currentValue) {
/*How long since we last calculated*/
unsigned long now = millis();
float pidTerm;
int timeChange = (now - lastTime);
if (timeChange >= sampleTime) {
/*Compute all the working error variables*/
error = targetValue - currentValue;
iTerm += Ki * error;
iTerm = constrain(iTerm, -50, 50);
pTerm = Kp * error;
dTerm = Kd * (currentValue - lastValue);
/*Compute PID Output*/
pidTerm = (pTerm - dTerm + iTerm) * K;
lastValue = currentValue;
lastTime = now;
}
return constrain(round(pidTerm), -255, 255);
}
void loop(){
input = VALORE DALLA IMU;
output = updatePid(setpoint,input);
AmotorNXT.setMotor(output);
BmotorNXT.setMotor(output);
}