2016-12-19 3 views
-8

私は、大学のマイクロプロセッサープロジェクトのクアドコプターを作っています。私はすべてのハードウェアをセットアップしましたが、今はBalancing Algorithmでスタッキングしています。 このプロジェクトで働いていた人がいれば、このパートのコードを教えてください。ところで、私はセンサーL3G4200を使用します。 ありがとうございます。L3G4200とPID制御を使ったクアドコプターのバランス調整方法

+1

"私はこのプロジェクトに取り組んでいた人なら誰でもこの部分のコードを教えてください。"それはこのサイトの仕組みではありません。怠け者ではなく、あなたの仕事をしよう! –

+0

私はその仲間を知っていますが、このプロジェクトは私がこの用語を渡す必要がある大学の私の科目の一つに過ぎず、それは私の専攻でもありません。私はこれに十分な時間をあきらめることができませんでした。 –

+4

@NguyễnVănHưngあなたがそれを行うのに十分重要だと考えるので、故意に質問を投稿しないでください。努力して、それを解決しようとしたときに助けを求め、特定の質問をしてください。 – Carcigenicate

答えて

0

私はあなたと同じセンサーを持っていませんが、このコードは私が取り組んできたスニペットです。あなたはそれを見ることができます...多分それは助けることができます。もしそうなら、良い:

/* 

    Project goal: 

    Arduino built quadcopter. 



    Motor diagram: 
    Legend: 

    num : motor number 
    -> : clockwise 
    <- : counter-clockwise 

    2 ->  <- 1 
    \  /
     \ -/
     | | 
    /- \ 
    /  \ 
    3 <-  -> 4 

    By : Dat HA 

    Date : 2016/11/09 
     yyyy/mm/dd 

*/ 

//////////////////////////////////////////////////////////////////////////////////////////////////////// 

#include <Wire.h>      //include I2C library 
#include <Servo.h> 
#include "I2Cdev.h"      //include another I2C library 
#include "Wire.h"      //include another I2C library (yes, again) 
#include "MPU6050_6Axis_MotionApps20.h" //include the MPU6050 library 

//////////////////////////////////////////////////////////////////////////////////////////////////////// 

bool dmpReady = false;    //state of the mpu6050 
volatile bool mpuInterrupt = false; //some random bool 

uint8_t mpuIntStatus;    //holds actual interrupt status byte from MPU 
uint8_t devStatus;     //return status after each device operation 
uint8_t motorPins[4] = {3, 9, 10, 11}; //yaw, pitch, roll 
uint8_t fifoBuffer[64];    //FIFO storage buffer 

uint16_t packetSize;    //expected DMP packet size (default is 42 bytes) 
uint16_t fifoCount;     //count of all bytes currently in FIFO 

MPU6050 mpu;      //change mpu's adress 
Quaternion q;      //quaternion container 
VectorFloat gravity;    //gravity vector 

//////////////////////////////////////////////////////////////////////////////////////////////////////// 

Servo motor1; 
Servo motor2; 
Servo motor3; 
Servo motor4; 

//////////////////////////////////////////////////////////////////////////////////////////////////////// 

void setup() { 
    Serial.begin(115200); //start serial communication 
    Wire.begin();   //start I2C communication 

    TWBR = 24; 
    mpu.initialize(); 
    devStatus = mpu.dmpInitialize(); 
    mpu.setXGyroOffset(0); 
    mpu.setYGyroOffset(0); 
    mpu.setZGyroOffset(0); 
    mpu.setZAccelOffset(0); 

    if (devStatus == 0) 
    { 
    mpu.setDMPEnabled(true); 
    mpuInterrupt = true; 
    mpuIntStatus = mpu.getIntStatus(); 
    dmpReady = true; 
    packetSize = mpu.dmpGetFIFOPacketSize(); 
    } 

    motor1.attach(motorPins[0]); 
    motor2.attach(motorPins[1]); 
    motor3.attach(motorPins[2]); 
    motor4.attach(motorPins[3]); 
} 

//////////////////////////////////////////////////////////////////////////////////////////////////////// 

void loop() { 
    //controller 
    int p = analogRead(A0); 
    int r = analogRead(A1); 

    p = map(p, 0, 1023, -50, 50); 
    r = map(r, 0, 1023, -50, 50); 

    //gyro 
    int motorSpeed = 50; 
    int ypr[3]; 
    float yprFlo[3]; //ypr as a float 
    mpu.resetFIFO(); 
    mpuInterrupt = false; 
    mpuIntStatus = mpu.getIntStatus(); 
    fifoCount = mpu.getFIFOCount(); 

    if (mpuIntStatus & 0x02) 
    { 
    while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount(); 
    mpu.getFIFOBytes(fifoBuffer, packetSize); 
    fifoCount -= packetSize; 
    mpu.dmpGetQuaternion(&q, fifoBuffer); 
    mpu.dmpGetGravity(&gravity, &q); 
    mpu.dmpGetYawPitchRoll(yprFlo, &q, &gravity); 

    for (int i = 0; i < 3; i++) 
    { 
     ypr[i] = map((yprFlo[i] * 180/M_PI), -90, 90, -50, 50); 
    } 
    } 

    //print 
    Serial.print(ypr[0]); 
    Serial.print(" "); 
    Serial.print(ypr[1]); 
    Serial.print(" "); 
    Serial.print(ypr[2]); 
    Serial.print("   "); 

    //motor 
    int motorSpeed1 = map(motorSpeed - ypr[1] + ypr[2], -100, 200, 90, 0); 
    int motorP1 = map(motorSpeed1,90,0,0,100); 
    Serial.print(motorP1); 
    Serial.print(" "); 
    motor1.write(motorSpeed1); 

    int motorSpeed2 = map(motorSpeed - ypr[1] - ypr[2], -100, 200, 90, 180); 
    int motorP2 = map(motorSpeed2,90,180,0,100); 
    Serial.print(motorP2); 
    Serial.print(" "); 
    motor2.write(motorSpeed2); 

    int motorSpeed3 = map(motorSpeed + ypr[1] - ypr[2], -100, 200, 90, 0); 
    int motorP3 = map(motorSpeed2,90,0,0,100); 
    Serial.print(motorP3); 
    Serial.print(" "); 
    motor3.write(motorSpeed3); 

    int motorSpeed4 = map(motorSpeed + ypr[1] + ypr[2], -100, 200, 90, 180); 
    int motorP4 = map(motorSpeed2,90,180,0,100); 
    Serial.print(motorP4); 
    Serial.print(" "); 
    motor4.write(motorSpeed4); 

    Serial.println(); 

} 
+0

Cảmnơ:D ありがとう、たぶん役立ちます。 –

関連する問題