/* * v2main.cpp */ #include #include #include #include "v2Parser.h" #include "PCA9685.h" #include "DSM2.h" #include "PID.h" #include "MPU6050_6Axis_MotionApps20.h" #include "wiringPi.h" using namespace std; #define DEFAULT_TCP_PORT 51717 #define MOTOR_OFF 200 #define MOTOR_MIN 220 #define MOTOR_MAX 600 double pitchP = 2; double pitchI = 0; double pitchD = 0; double rollP = 2; double rollI = 0; double rollD = 0; double yawP = 0.0001; double yawI = 0; double yawD = 0; PCA9685 pca; v2Parser tcp; DSM2 dsm; MPU6050 mpu; PID pitchPID; PID rollPID; PID yawPID; VectorFloat gravity; int fifoPacketSize; void setAllMotorsOff() { int i; for( i = 0; i < 16; i++ ) pca.setPwm( i, 0, MOTOR_OFF ); } void setup( int tcpPort ) { cout << "\nsetting up PCA9685 (motor controller)..." << endl; pca = PCA9685( 0x40 ); pca.setFrequency( 60 ); setAllMotorsOff(); delay( 250 ); setAllMotorsOff(); cout << "motors set to " << MOTOR_OFF << " (OFF)" << endl; cout << "PCA9685 set up\n" << endl; cout << "setting up TCP link..." << endl; tcp = v2Parser( tcpPort ); cout << "TCP set up" << endl; /*cout << "setting up RC receiver..." << endl; dsm = DSM2(); //dsm.values = tcp.controlValues; cout << "RC receiver set up" << endl;*/ cout << "\nsetting up MPU6050..." << endl; cout << "initializing MPU6050..." << endl; mpu.initialize(); cout << "testing MPU6050 connection..." << flush; if( mpu.testConnection() ) { cout << "SUCCESS" << endl; } else { cout << "FAILURE" << endl; exit( EXIT_FAILURE ); } cout << "initializing DMP..." << flush; if( mpu.dmpInitialize() == 0 ) { cout << "SUCCESS" << endl; cout << "Enabling DMP..." << endl; mpu.setDMPEnabled( true ); fifoPacketSize = mpu.dmpGetFIFOPacketSize(); } else { cout << "FAILURE" << endl; exit( EXIT_FAILURE ); } cout << "MPU6050 set up" << endl; cout << "\nsetting up PID..." << endl; pitchPID = PID( pitchP, pitchI, pitchD ); rollPID = PID( rollP, rollI, rollD ); yawPID = PID( yawP, yawI, yawD ); cout << "PID set up\n" << endl; atexit( setAllMotorsOff ); } bool updateMpu() { int fifoCount; uint8_t fifoBuffer[64]; fifoCount = mpu.getFIFOCount(); if( fifoCount == 1024 ) { cout << "FIFO overflow" << endl; } else if( fifoCount >= 42 ) { while( fifoCount >= 84 ) { mpu.getFIFOBytes( fifoBuffer, fifoPacketSize ); fifoCount = mpu.getFIFOCount(); } mpu.getFIFOBytes( fifoBuffer, fifoPacketSize ); mpu.dmpGetQuaternion( &(tcp.q), fifoBuffer ); mpu.dmpGetGravity( &gravity, &(tcp.q) ); return true; } return false; } void constrainValue( int* in, int low, int high ) { if( *in < low ) { *in = low; } else if( *in > high ) { *in = high; } } int main( int argc, char* argv[] ) { float pitchAngle; float rollAngle; int16_t yawRate; float pitchMod = 1; float rollMod = 1; float yawMod = 1; setup( DEFAULT_TCP_PORT ); cout << "starting loop" << endl; while( true ) { dsm.update(); cout << "dsm rx: " << dsm.values[0] << "\t" << dsm.values[1] << "\t" << dsm.values[2] << "\t" << dsm.values[3] << "\t" << dsm.values[4] << "\t" << dsm.values[5] << "\t" << endl; //tcp.send(); //cout << "tcp send done" << endl; //cout<< tcp.recieve() <