Engineer Notes
  • Главная
  • Заметки
    • Градусник
      • Вывод информации на дисплей (семи сегмент)
      • Вывод информации на ЖК дисплей
      • Градусник DS18B20
    • Работа с датчиком освещенности
      • Работа с реле
      • Создание удлинителя, который работает только в темноте
    • Перехват кодов с пульта управления (IR)
      • Передача сигнала
    • Серво привод
    • Разбираемся с мотором
    • Подключение гироскопа
    • Сохраним файлы на SD карту
    • Часы реального времени
    • Контроллер ATTINY85
    • Доступ к датчикам через Web
  • Проекты
Powered by GitBook
On this page
  • Необходимые элементы
  • Схема подключения
  • Написание кода
  • Идеи применения

Was this helpful?

  1. Заметки

Подключение гироскопа

PreviousРазбираемся с моторомNextСохраним файлы на SD карту

Last updated 5 years ago

Was this helpful?

Необходимые элементы

  • рабочее напряжение датчика 3 - 5V. Этот датчик может маркироваться как GY-541

  • рабочее напряжение датчика 2.3 - 3.4V

  • этот датчик помимо акселерометра и гироскопа на борту имеет компас и датчик давления

  • датчик ещё может изменять температуру

  • датчик может измерять все. В нем имеется акселерометр, гироскоп, барометр и термометр

Для желающих собрать какую-то машинку, коптер или ещё какую технику уже есть готовая плата которая на борту уже имеет гироскоп MPU-6000 и барометр MS5611. Компас и GPS к сожалению отсутствует на данной плате, но их можно подключить при такой необходимости.

Схема подключения

Датчик MPU-6050 подключается по I2C порту (ранее мы уже подключали ). При подключении надо точно быть уверенным от какого напряжение питается плата и подавать необходимое напряжение. Часто встречаются платы работающие от 3.3V. Конкретно эта плата может работать от 3 до 5V. Поэтому если в схеме будет всплеск напряжения, то волшебный дым на котором работает вся электроника может выйти. При желании можно красный провод подключить к 3.3V.

При желании мы так же можем подключить и дисплей так же по порту I2C. Так как устройства имеют разные адреса, то можно подключить и дисплей или другие датчики работающие через I2C.

Написание кода

#include <Arduino.h>
#include "Wire.h"
#include "I2Cdev.h"
#include "MPU6050_6Axis_MotionApps20.h"

MPU6050 mpu(0x68);

#define INTERRUPT_PIN 2

// MPU control/status vars
bool dmpReady = false; // set true if DMP init was successful
uint8_t mpuIntStatus; // holds actual interrupt status byte from MPU
uint8_t dmpInitializeStatus; // 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 quaternionContainer; // quaternion container
VectorFloat gravity; // gravity vector
float ypr[3]; // yaw/pitch/roll container and gravity vector

int32_t temperature;

volatile bool mpuInterrupt = false; // indicates whether MPU interrupt pin has gone high
void dmpDataReady() {
    mpuInterrupt = true;
}

void setup() {
    Wire.begin();
    Wire.setClock(400000); // 400kHz I2C clock.

    Serial.begin(9600);

    // initialize device
    Serial.println(F("Initializing I2C devices..."));
    mpu.initialize();
    pinMode(INTERRUPT_PIN, INPUT);

    // 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..."));
    dmpInitializeStatus = mpu.dmpInitialize();

    // make sure it worked (returns 0 if so)
    if (dmpInitializeStatus == 0) {
        // Calibration Time: generate offsets and calibrate our MPU6050
        mpu.CalibrateAccel(6);
        mpu.CalibrateGyro(6);
        mpu.PrintActiveOffsets();
        // turn on the DMP, now that it's ready
        Serial.println(F("Enabling DMP..."));
        mpu.setDMPEnabled(true);

        // enable Arduino interrupt detection
        Serial.print(F("Enabling interrupt detection (Arduino external interrupt "));
        Serial.print(digitalPinToInterrupt(INTERRUPT_PIN));
        Serial.println(F(")..."));
        attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), dmpDataReady, RISING);
        mpuIntStatus = mpu.getIntStatus();

        // set our DMP Ready flag so the main loop() function knows it's okay to use it
        Serial.println(F("DMP ready! Waiting for first interrupt..."));
        dmpReady = true;

        // 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.print(dmpInitializeStatus);
        Serial.println(F(")"));
    }
}

void loop() {
    // if programming failed, don't try to do anything
    if (!dmpReady) return;

    // wait for MPU interrupt or extra packet(s) available
    while (!mpuInterrupt && fifoCount < packetSize) {
        if (mpuInterrupt && fifoCount < packetSize) {
        // try to get out of the infinite loop
            fifoCount = mpu.getFIFOCount();
        }
    }

    // reset interrupt flag and get INT_STATUS byte
    mpuInterrupt = false;
    mpuIntStatus = mpu.getIntStatus();

    // get current FIFO count
    fifoCount = mpu.getFIFOCount();
    if(fifoCount < packetSize){
        //Lets go back and wait for another interrupt.
        // We shouldn't be here, we got an interrupt from another event
        // This is blocking so don't do it while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount();
    }
    // check for overflow (this should never happen unless our code is too inefficient)
    else if ((mpuIntStatus & _BV(MPU6050_INTERRUPT_FIFO_OFLOW_BIT)) || fifoCount >= 1024) {
        // reset so we can continue cleanly
        mpu.resetFIFO();
        Serial.println(F("FIFO overflow!"));

    // otherwise, check for DMP data ready interrupt (this should happen frequently)
    } else if (mpuIntStatus & _BV(MPU6050_INTERRUPT_DMP_INT_BIT)) {

        // read a packet from FIFO
        while(fifoCount >= packetSize){ // Lets catch up to NOW, someone is using the dreaded delay()!
        mpu.getFIFOBytes(fifoBuffer, packetSize);
        // track FIFO count here in case there is > 1 packet available
        // (this lets us immediately read more without waiting for an interrupt)
        fifoCount -= packetSize;
    }

    // display Euler angles in degrees
    mpu.dmpGetQuaternion(&quaternionContainer, fifoBuffer);
    mpu.dmpGetGravity(&gravity, &quaternionContainer);
    mpu.dmpGetYawPitchRoll(ypr, &quaternionContainer, &gravity);

    Serial.print("Yaw: ");
    Serial.print(ypr[0] * 180/M_PI);
    Serial.print("\tPitch: ");
    Serial.print(ypr[1] * 180/M_PI);
    Serial.print("\tRoll: ");
    Serial.println(ypr[2] * 180/M_PI);
    }
}

Данный код будет выводить три основных показателя: крен, рысканье и тангаж.

Немного картинок, что есть что:

Все картинки честно взяты с википедии.

Идеи применения

Очень часто этот датчик используется в авиомоделировании (для тех кто не понял по картинкам). Для автоматического выравнивания модели в воздухе. Так же можно сделать бота на 2х колесиках, который будет балансировать. Можно придумать ещё много всего где нужно измерять положение в пространстве.

При использовании этого датчика с платой Arduino Leonardo можно получить внешнее устройство для компьютера.

Крен (roll):

Рысканье (yaw)

Тангаж (pitch)

Цельная картина

Если нет желания покупать россыпь датчиков и думать как все объединить, то уже все придумали и выпустили плату . На данной плате уже имеется: акселерометр, гироскоп, компас, микрофон, датчик освещенности и цвета, барометр, датчик влажности и температуры. В довесок ко всему этому на плате имеется bluetooth версии 5.0 и сердцем платы является ARM® Cortex®-M4 32-битный процессор работающий на частоте 64 MHz

Arduino Nano 33 BLE Sense
MPU-6050
SparkFun - MPU-6050
GY-80
GY-LSM6DS3
GY-91
ArduPilot
дисплей по I2C порту
Flight dynamics with text ortho
roll
pitch
yaw
gyro