نمایش نتایج: از 1 به 6 از 6
Like Tree6 لایک
  • 2 Post By Rasool65
  • 2 Post By aminta
  • 1 Post By aminta
  • 1 Post By Rasool65

موضوع: پروژه نگه داشتن در حالت تعادل دوربین

Threaded View

  1. #5
    Member
    تاریخ عضویت
    Feb 2017
    محل سکونت
    Usa
    نوشته ها
    47
    من پروژه ام رو درست کردم ولی نمیدونم چرا بعد از 5 دقیقه که در حالت اجرا میمونه هنگ میکنه ؟؟ کسی میتونه کمکم کنه ؟
    کدم هم اینه :
    کد:
    #include <Servo.h>
    #include "I2Cdev.h"
    #include "MPU6050_6Axis_MotionApps20.h"
    //#include "MPU6050.h" // not necessary if using MotionApps include file
    #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
    #include "Wire.h"
    #endif
    
    #define LED_PIN 13
    bool blinkState = true;
    
    Servo Servo1;   // First Servo off the chassis
    Servo Servo2;   // Second Servo off the chassis
    
    int Servo1Pos = 0;
    int Servo2Pos = 0;
    
    float mpuPitch = 0;
    float mpuRoll = 0;
    float mpuYaw = 0;
    
    
    // define MPU instance
    MPU6050 mpu;                    // class default I2C address is 0x68; specific I2C addresses may be passed as a parameter here
    
    // MPU control/status vars
    uint8_t mpuIntStatus;   // holds actual interrupt status byte from MPU
    uint8_t devStatus;      // return status after each device operation (0 = success, !0 = error)
    uint16_t packetSize;    // expected DMP packet size (default is 42 bytes)
    uint16_t fifoCount;     // count of all bytes currently in FIFO
    uint8_t fifoBuffer[64]; // FIFO storage buffer
    
    // orientation/motion vars
    Quaternion q;           // [w, x, y, z]         quaternion container
    VectorInt16 aa;         // [x, y, z]            accel sensor measurements
    VectorInt16 aaReal;     // [x, y, z]            gravity-free accel sensor measurements
    VectorInt16 aaWorld;    // [x, y, z]            world-frame accel sensor measurements
    VectorFloat gravity;    // [x, y, z]            gravity vector
    float ypr[3];           // [yaw, pitch, roll]   yaw/pitch/roll container and gravity vector
    
    // relative ypr[x] usage based on sensor orientation when mounted, e.g. ypr[PITCH]
    #define PITCH   1     // defines the position within ypr[x] variable for PITCH; may vary due to sensor orientation when mounted
    #define ROLL  2     // defines the position within ypr[x] variable for ROLL; may vary due to sensor orientation when mounted
    #define YAW   0     // defines the position within ypr[x] variable for YAW; may vary due to sensor orientation when mounted
    
    // ================================================================
    // ===                      INITIAL SETUP                       ===
    // ================================================================
    
    void setup()
    {
    
      Servo1.attach(10);  // attaches the servo on D11 to the servo object
      Servo2.attach(11);  // Second servo on D11
      delay(50);
      Servo1.write(0);	// These are command checks to see if the servos work and
      Servo2.write(60);	// to help w/ the initial installation.
      delay(500);		// Make sure these movements are clear from the rest of the chassis.
      Servo1.write(180);
      Servo2.write(120);
      delay(500);
      Servo1.write(0);
      Servo2.write(90);
      delay(500);
    
      // join I2C bus (I2Cdev library doesn't do this automatically)
    #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
      Wire.begin();
      TWBR = 24; // 400kHz I2C clock (200kHz if CPU is 8MHz)
    #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
      Fastwire::setup(400, true);
    #endif
    
      Serial.begin(115200);
      while (!Serial);      // wait for Leonardo enumeration, others continue immediately
    
      // initialize device
      Serial.println(F("Initializing I2C devices..."));
      mpu.initialize();
    
      // verify connection
      Serial.println(F("Testing device connections..."));
      Serial.println(mpu.testConnection() ? F("MPU6050 connection successful") : F("MPU6050 connection failed"));
    
      // load and configure the DMP
      Serial.println(F("Initializing DMP"));
      devStatus = mpu.dmpInitialize();
    
    
      // INPUT CALIBRATED OFFSETS HERE; SPECIFIC FOR EACH UNIT AND EACH MOUNTING CONFIGURATION!!!!
    
      mpu.setXGyroOffset(118);
      mpu.setYGyroOffset(-44);
      mpu.setZGyroOffset(337);
      mpu.setXAccelOffset(-651);
      mpu.setYAccelOffset(670);
      mpu.setZAccelOffset(1895);
    
      // make sure it worked (returns 0 if so)
      if (devStatus == 0)
      {
        // turn on the DMP, now that it's ready
        Serial.println(F("Enabling DMP"));
        mpu.setDMPEnabled(true);
    
        // enable Arduino interrupt detection
        Serial.println(F("Enabling interrupt detection (Arduino external interrupt 0)"));
        mpuIntStatus = mpu.getIntStatus();
    
        // get expected DMP packet size for later comparison
        packetSize = mpu.dmpGetFIFOPacketSize();
      }
      else
      {
        // ERROR!
        // 1 = initial memory load failed, 2 = DMP configuration updates failed (if it's going to break, usually the code will be 1)
        Serial.print(F("DMP Initialization failed code = "));
        Serial.println(devStatus);
      }
    
      // configure LED for output
      pinMode(LED_PIN, OUTPUT);
    
    } // setup()
    
    
    
    // ================================================================
    // ===                    MAIN PROGRAM LOOP                     ===
    // ================================================================
    
    void loop(void)
    {
      processAccelGyro();
    }   // loop()
    
    
    
    // ================================================================
    // ===                    PROCESS ACCEL/GYRO IF AVAILABLE       ===
    // ================================================================
    
    void processAccelGyro()
    {
    
      // Get INT_STATUS byte
      mpuIntStatus = mpu.getIntStatus();
    
      // get current FIFO count
      fifoCount = mpu.getFIFOCount();
    
      // check for overflow (this should never happen unless our code is too inefficient)
      if ((mpuIntStatus & 0x10) || fifoCount == 1024)
      {
        // reset so we can continue cleanly
        mpu.resetFIFO();
        Serial.println(F("FIFO overflow!"));
        return;
      }
    
      if (mpuIntStatus & 0x02)  // otherwise continue processing
      {
        // check for correct available data length
        if (fifoCount < packetSize)
          return; //  fifoCount = mpu.getFIFOCount();
    
        // read a packet from FIFO
        mpu.getFIFOBytes(fifoBuffer, packetSize);
    
        // track FIFO count here in case there is > 1 packet available
        fifoCount -= packetSize;
    
        // flush buffer to prevent overflow
        mpu.resetFIFO();
    
        // display Euler angles in degrees
        mpu.dmpGetQuaternion(&q, fifoBuffer);
        mpu.dmpGetGravity(&gravity, &q);
        mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
        mpuPitch = ypr[PITCH] * 180 / M_PI;
        mpuRoll = ypr[ROLL] * 180 / M_PI;
        mpuYaw  = ypr[YAW] * 180 / M_PI;
    
        // flush buffer to prevent overflow
        mpu.resetFIFO();
    
        // blink LED to indicate activity
        blinkState = !blinkState;
        digitalWrite(LED_PIN, blinkState);
    
        // flush buffer to prevent overflow
        mpu.resetFIFO();
    
        Servo1.write(-mpuPitch + 90);
        Servo2.write(mpuRoll + 90);
        //delay(10);
    
        // flush buffer to prevent overflow
        mpu.resetFIFO();
    
      } // if (mpuIntStatus & 0x02)
    }  // processAccelGyro()
    ویرایش توسط Rasool65 : 06-06-2017 در ساعت 08:07 PM

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •  

SEO by vBSEO