I came up with some test code, does it look correct?
#include <PID_v1.h>
double m1PWM,m2PWM,m3PWM,m4PWM,m5PWM,m6PWM;//m1 is at 30 deg, m6 is at 330.
double m1PitchK, m2PitchK, m3PitchK, m4PitchK, m5PitchK, m6PitchK;
double mo1RollK, mo2RollK, mo3RollK, mo4RollK, mo5RollK, mo6RollK;
double mot1YawK, mot2YawK, mot3YawK, mot4YawK, mot5YawK, mot6YawK;
double offset;
int pwmPitch,pwmRoll,pwmYaw,pwmThrottle;
// The sign used to reverse the axes, valid values are 1, and -1.
int PitchSign = 1, RollSign = 1, YawSign = 1;
double upperLimit= 10; //max: 10 degrees from normal
int minPitch=600, rangePitch=1200;
int minRoll=600, rangeRoll=1200;
int minYaw=600, rangeYaw=1200;
double outPitchPID, outRollPID, outYawPID;
double inPitchPID, inRollPID, inYawPID;
double tgtPitchPID, tgtRollPID, tgtYawPID;
PID PitchPID(&inPitchPID, &outPitchPID, &tgtPitchPID,0,0,0,DIRECT);
PID RollPID(&inRollPID, &outRollPID, &tgtRollPID,0,0,0,DIRECT);
PID YawPID(&inYawPID, &outYawPID, &tgtYawPID,0,0,0,DIRECT);
void setup() {
PitchPID.SetMode(MANUAL);
PitchPID.SetSampleTime(100);
RollPID.SetMode(MANUAL);
RollPID.SetSampleTime(100);
YawPID.SetMode(MANUAL);
YawPID.SetSampleTime(100);
m1PitchK=cos(PI/3)*PitchSign;
m2PitchK=cos(PI/2)*PitchSign;
m3PitchK=cos(5*PI/6)*PitchSign;
m4PitchK=cos(7*PI/6)*PitchSign;
m5PitchK=cos(3*PI/2)*PitchSign;
m6PitchK=cos(11*PI/6)*PitchSign;
mo1RollK=sin(PI/3)*RollSign;
mo2RollK=sin(PI/2)*RollSign;
mo3RollK=sin(5*PI/6)*RollSign;
mo4RollK=sin(7*PI/6)*RollSign;
mo5RollK=sin(3*PI/2)*RollSign;
mo6RollK=sin(11*PI/6)*RollSign;
mot1YawK=-YawSign;
mot2YawK=YawSign;
mot3YawK=-YawSign;
mot4YawK=YawSign;
mot5YawK=-YawSign;
mot6YawK=YawSign;
}
void loop() {
inPitchPID = getPitch();
inRollPID = getRoll();
inYawPID = getYaw();
tgtPitchPID = ((pwmPitch-minPitch)/rangePitch)*upperLimit;//((pwmPitch-minPitch)/rangePitch) gives a -1 to 1 value (percentage) and Upper limit turns that into a degree measurement.
tgtRollPID = ((pwmRoll-minRoll)/rangeRoll)*upperLimit;
tgtYawPID = ((pwmYaw-minYaw)/rangeYaw)*upperLimit;
m1PWM =pwmThrottle + degToPWM(outPitchPID)*m1PitchK + degToPWM(outRollPID)*mo1RollK + degToPWM(outYawPID)*mot1YawK;
m2PWM =pwmThrottle + degToPWM(outPitchPID)*m2PitchK + degToPWM(outRollPID)*mo2RollK + degToPWM(outYawPID)*mot2YawK;
m3PWM =pwmThrottle + degToPWM(outPitchPID)*m3PitchK + degToPWM(outRollPID)*mo3RollK + degToPWM(outYawPID)*mot3YawK;
m4PWM =pwmThrottle + degToPWM(outPitchPID)*m4PitchK + degToPWM(outRollPID)*mo4RollK + degToPWM(outYawPID)*mot4YawK;
m5PWM =pwmThrottle + degToPWM(outPitchPID)*m5PitchK + degToPWM(outRollPID)*mo5RollK + degToPWM(outYawPID)*mot5YawK;
m6PWM =pwmThrottle + degToPWM(outPitchPID)*m6PitchK + degToPWM(outRollPID)*mo6RollK + degToPWM(outYawPID)*mot6YawK;
}
int degToPWM(double d){
return 0;
}
//TODO: return sensor values
double getPitch(){
return 0;
}
double getRoll(){
return 0;
}
double getYaw(){
return 0;
}