6-осевой сенсорный модуль GY-6500 (MPU-6500) в

6-осевой сенсорный модуль gy-6500 (mpu-6500)

Доставка по Москве: 300 руб

Самовывоз: ПН-ПТ 10.00-18.00 бесплатно

Оплата: Наличные, Банковская карта, Online

Доставка по РФ: 3000 пунктов выдачи

I2c и spi

SPI и i2c — это протоколы связи (BUS) между процессором и гироскопом . В зависимости от того, какой будет протокол, будет зависеть скорость работы самого гироскопа. Гироскоп сможет работать на частоте 32KHz с протоколом SPI, в то время как на i2c можно рассчитывать на «потолок» в 4 KHz. Поэтому выбирайте ПК с SPI.

Mpu 6500 на алиэкспресс — купить онлайн по выгодной цене

Перед покупкой сравните цены на mpu 6500, прочитайте реальные отзывы покупателей, ознакомьтесь с техническими характеристиками.

Закажите mpu 6500 онлайн с доставкой по России: товары с пометкой Plus доступны с ускоренной доставкой и улучшенными условиями возврата.

На Алиэкспресс mpu 6500 всегда в наличии в большом ассортименте: на площадке представлены как надежные мировые бренды, так и перспективные молодые.

Выбор гироскопа: частота опроса и шумы

Есть два критерия, которые нужно учитывать при выборе полетного контроллера с конкретным гироскопом, это частота работы и чувствительность к шумам (электро- и механическим).

На сегодня самыми популярными и надежными считаются гироскопы MPU6000, у них частота работы 8KHz, а также они достаточно не чувствительны к шумам. Советуем не покупать полетные контроллеры с гироскопами MPU6500 и MPU9250, у них хоть и частота выше, но они больше подвержены воздействию шумов.

Серия гироскопов ICM работает лучше и плавнее, чем MPU6000 на 32KHz, но из-за шумных двигателей и регуляторов оборотов производительность ICM будет ниже, чем MPU6000. Например, ICM20602 на Raceflight Revolt V2 или ICM20689 на Kakute F4, оба этих гироскопа могут работать на частоте 32KHz, но с регуляторами оборотов, которые генерируют много шума, они работать будут хуже, чем MPU6000. По этой причине на полетные контроллеры устанавливают сетевые фильтры для частичного удаления шумов.

Чтобы частично убрать механические шумы (вибрацию), полетный контроллер следует устанавливать на резиновые подушки или любой другой пористый материал, который сможет гасить вибрацию, например кусок резины или вспененного материала.

Гироскоп и акселерометр полетного контроллера

Гироскоп и акселерометр — очень важные датчики, они определяют положение квадрокоптера в пространстве, а также движется ли он, посылают эти данные процессору, а тот уже решает, какому двигателю поддать газа, а какому наоборот, снизить обороты.

Акселерометр выполняет роль стабилизатора в пространстве, есть даже такой режим полета — «Режим стабилизации», при котором квадрокоптер невозможно будет перевернуть в воздухе и он всегда будет держаться параллельно земле (если просто отпустить стики на пульте). Опытные пилоты почти всегда летают в режиме АКРО, поэтому они отключают акселерометр или используют его крайне редко.

Гироскоп же выполняет роль определения положения квадрокоптера в пространстве.

Какие самые популярные гироскопы используются в полетных контроллерах? Смотрим таблицу ниже:

ГироскопПротокол коммуникации (BUS)Макс. частота работы гироскопа
MPU6000SPI, i2c8K
MPU6050i2c4K
MPU6500SPI, i2c32K
MPU9150*i2c4K
MPU9250*SPI, i2c32K
ICM20602SPI, i2c32K
ICM20608SPI, i2c32K
ICM20689SPI, i2c32K

MPU9150 — это MPU6050 со встроенным магнитометром AK8975, а MPU9250 — это MPU6500 и тоже с магнитометром.

Номер и название гироскопа можно найти на самом чипе, например это — MPU-6000:

Гоночные полетные контроллеры

Полетный контроллер, для чего он нуженОбычно имеют минимум расширенных функций, так как всякие компасы и барометры просто не используются при гонках.

Naze32, также на базе этого контроллера есть SP Racing F3:

На нем присутствуют все стандартные датчики – гироскоп и акселерометр, а в расширенной версии DELUXE также есть барометр и компас.

Гироскоп и акселерометр определяют текущее расположение дрона в пространстве. Барометр определяет высоту по давлению (чтобы удерживать высоту, например), компас для удержания направления полета.

На сегодня, полетные контроллеры серии F4 являются самыми популярными полетными контроллерами для мини и гоночных квадрокоптеров, так как прекрасно работают с такими программами, как CleanFlight, Betaflight и Raceflight. На их смену уже выходит серия F7, становясь все более популярной.

Разработка прошивок для полетного контроллера F3 уже прекратилась из-за ограничения ресурсов, поэтому выбирайте для покупки F4 или F7:

Betaflight прекращает разработку ПО для полетных контроллеров F3 c STM32F3

Также еще два популярных контроллера:

KISS – прошивать своей прошивкой нельзя. Имеет графический интерфейс с минимумом настроек.

LUX – такой же гибкий, как Naze32, но все же уступает ему. Прошивать можно.

Датчик тока (current sensor)

На плате разводки обычно есть контакты VBAT, куда подключаются контакты полетного контроллера и ПК снимает данные о текущем напряжении, но свой собственный датчик тока  эффективнее.

Инвентированный сигнал и uart

Инвентированный сигнал поддерживают полетные контроллеры 3-го и 7-го поколения, а вот 1-е и 4-е поколения не могут.

Передатчики FrSky с протоколом работы SBUS и SmartPort на выходе инвертируют свой сигнал, и их могут обработать только процессоры нового поколения, такие установлены на 7-м и 3-м поколении (F3 и F7), так как у них уже есть встроенный инвертор.

А вот для устаревших поколений (F1 и F4) нужно перед портом UART устанавливать инвертор, который будет обрабатывать и преобразовывать сигнал и передавать его уже в UART. Хотя в некоторых полетных контроллерах F4 производители сразу устанавливают инверторы для SBUS и SmartPort, пилоту можно сразу подключать приемник к ПК.

Если у вас закончились UART порты, то можно воспользоваться функцией в Betaflight «soft-serial», благодаря которой можно создавать виртуальные UART. С помощью ПО Betaflight создается эмуляция этого порта, как будто он есть физически, но на самом деле его нет.

Какие бывают полетные контроллеры?

Ниже рассмотрим вопрос — какие бывают полетные контроллеры, а точнее, для каких целей.

Кнопка для перехода в режим прошивки

Без такой кнопки не обойтись ни одному полетному контроллеру. Для прошивки замыкают 2 контакта, затем подключают к компьютеру и запускают Betaflight конфигуратор или любой другой. Есть два типа:

С кнопкой удобнее — нажал отверткой и все, а вот для контактов нужно использовать пинцет или скрепку, чтобы закоротить их.

Смотрите про коптеры:  Как управлять квадрокоптером с пульта управления. Управление дроном с телефона

Контроллеры для автономных полетов

3DR Pixhawk — самый популярный контроллер для автономных полетов. На его борту есть резервная система, а также он поддерживает все известные датчики для дронов.

MultiWii Pro — дешевый и доступный, позволяет отлично стабилизировать коптер, также на нем есть барометр, магнитометр и GPS.

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

Контроллеры для съемки видео и фото с дрона

Полетный контроллер, для чего он нуженСамым популярным в этом сегменте коптеров является DJI NAZA-M V2: тот самый, что стоит в Фантомах. Идеальный контроллер для фото- и видеосъемки с качественной стабилизацией. На нем спокойно сможет летать новичок, который до этого ни разу не брал пульт в руки. В настройки полета лезть не требуется, все уже настроено, нужно будет просто откалибровать. Даже без навыков у новичка-пилота получится отличный кадр.

Поддерживает весь набор датчиков (GPS, телеметрию, OSD  и т.д.)

ArduPilot AMP поддерживает GPS и автономный полет по заданным координатам. Тоже достаточно популярный контроллер, но стоит дороже обычных из-за наличия более важных датчиков.

Vector Flight Controller-  профессиональный полетный контроллер с встроенной системой Eagle Tree.

Новичок тоже сможет на таком летать. Эти контроллеры стоят дорого, а вес и размер стремятся к идеалу для аэросъемки.

Модуль gy-6500 гироскоп/акселерометр mpu-6500 — » интернет-магазин arduino

Модуль GY-6500 это 3-х осевой гироскоп и 3-х осевой акселерометр на микропроцессоре MPU-6500. 6DOF Axis Sensor Module (RKP-GY-6500-MPU6500).

  • Модуль характеризуется низким потреблением, низкой стоимостью и высокой производительностью.
  • В основе модуля RKP-GY-6500-MPU6500 заложен чип MPU-6500, что позволяет интегрировать шести осевую обработку движения проектируемого робота.
  • Алгоритмы MotionFusion обрабатывают все внутренние сенсоры и собирают полный набор данных.
  • Для наиболее точного трекинга быстрых и медленных движений возможно самостоятельно запрограммировать необходимые режимы: ±250, ±500, ±1000, ±2000°/сек для гироскопа, а также ±2g, ±4g, ±8g, ±16g для акселерометра.
  • Обмен данными с роботизированным контроллером управления осуществляется по шине IIC (I2C).

6-осевой сенсорный модуль GY-6500 (MPU-6500) вПосмотреть DataSheet микросхемы MPU6500 (формат PDF размер 1 MБ)

Характеристики модуля GY-6500:
Модуль: GY-6500
Чип: MPU-6500, 16 битный АЦП, 16-ти битный вывод данных
Напряжение питания: 3 — 5 Вольт
Интерфейс: стандартный I2C (400кГц) / SPI (1 МГц) протокол связи
Рабочие диапазоны акселерометра: /- 2G, /- 4G, /- 8G, /- 16 G
Рабочие диапазоны гироскопа: /- 250, /- 500, /- 1000, /- 2000°/с
Рабочий ток: гироскоп – 3,2 мА, акселерометр – 450 мкА
Ток в режиме сна: 8 8 мкА (гироскоп акселерометр)
Габариты: 25 х 16 x 3 мм
Вес модуля: 2 грамма
Диаметр отверстий для монтажа: 3 мм (2 шт.)
Шаг распиновки: 2.54 мм

Комплектация:
Модуль GY-6500 — 1 шт.
Линейки с контактами (пинами) — 1 шт.»

Плата разводки питания (pdb)

К плате разводки питания подключаются аккумулятор и двигатели с регуляторами оборотов, а также полетный контроллер и прочая периферия. У некоторых ПК такая плата уже есть, они совмещены. Это, конечно, плюс, но где плюсы, там и минусы — в такой компоновке будет мало места, и в случае поломки ее будет сложнее устранять.

Порт uart в полетном контроллере

Аббревиатура UART с английского расшифровывается как (Universal Asynchronous Receiver/Transmitter) — универсальный асинхронный приемник/передатчик.

К порту UART подключаются различные периферийные устройства, такие как, приемник, различная телеметрия и так далее. У порта есть два контакта для обмена данными — прием и передача.

На фото ниже вы можете увидеть пример UART порта и их настройки в Betaflight, точнее, вы можете назначить в этой вкладке порту любое устройство, которое поддерживает обмен данными:

Процессор полетного контроллера

От процессора будет зависеть то, насколько быстро будут обрабатываться поступающие к нему данные. Процессоры делятся по поколениям: F1, F3, F4, F6. Вот такие странные поколения, где пропущены 2-е и 6-е поколения. Отличаются они частотой работы и архитектурой:

  • F1 — 72MHz;
  • F3 — 72MHz;
  • F4 — 168MHz;
  • F7 — 216MHz.

Сейчас все новые полетные контроллеры поставляются с процессором 7-го поколения, так как обрабатывать фильтры и PID становится все труднее, прогресс шагает километровыми шагами в этой сфере. Но у многих пилотов ПК на процессорах 3-го поколения, так как F3 был самым (да и остается) массовым поколением со стабильной работой.

Прошивки полетного контроллера, их виды

Полетные контроллеры отличаются не только по типу компонентов, из которых они состоят, но и по прошивкам, на которых они работают, то есть программным обеспечением, на котором работает полетный контроллер.

Как уже написано выше, на сегодня самыми популярными прошивками являются:

Что из себя представляет программное обеспечение полетного контроллера — прошивка? Это набор правил и алгоритмов, которые обрабатывает процессор.

А теперь ответ на вопрос, как прошить полетный контроллер? Конкретно для каждой прошивки разработан свой конфигуратор — это специальная программа, которая загружает в полетный контроллер программное обеспечение, а зачем конфигуратор работает в роли графического интерфейса прошивки — чтобы вам было наглядно и удобно настраивать свой квадрокоптер.

Работа с arduino и mpu6050


Для достижения максимальной точности измерений нужно откалибровать акселерометр и гироскоп. Калибровка акселерометра позволяет выставить «ноль» для вектора силы тяжести, а калибровка гироскопа уменьшает его «дрифт», то есть статическое отклонение в режиме покоя. Идеально откалиброванный и лежащий горизонтально датчик должен показывать ускорение ~16384 по оси Z и нули по всем остальным осям ускорения и угловой скорости. Но это фантастика =)

Максимально правильно использовать калибровку в проекте нужно так: калибровка по запросу (кнопка, меню, и т.д.), затем запись калибровочных значений в EEPROM. При запуске — чтение и настройка оффсетов из. Рассмотрим несколько примеров калибровки, первый — из библиотеки. Калибрует долго, но максимально точно. При малых вибрациях и движениях датчика в процессе калибровки (даже от громкого звука) калибровка может не закончиться. Второй вариант — мой упрощённый алгоритм калибровки, калибрует быстро, без возможности зависнуть при тряске, но даёт менее точный результат. Я делюсь примерами, в свой проект их нужно будет переносить вручную и аккуратно =)

// положи датчик горизонтально, надписями вверх
// ДАЖЕ НЕ ДЫШИ НА НЕГО
// отправь любой символ в сериал, чтобы начать калибровку
// жди результатов

// --------------------- НАСТРОЙКИ ----------------------
const int buffersize = 70;     // количество итераций калибровки
const int acel_deadzone = 10;  // точность калибровки акселерометра (по умолчанию 8)
const int gyro_deadzone = 6;   // точность калибровки гироскопа (по умолчанию 2)
// --------------------- НАСТРОЙКИ ----------------------

#include "I2Cdev.h"
#include "MPU6050.h"
#include "Wire.h"

MPU6050 mpu(0x68);

int16_t ax, ay, az, gx, gy, gz;

int mean_ax, mean_ay, mean_az, mean_gx, mean_gy, mean_gz, state = 0;
int ax_offset, ay_offset, az_offset, gx_offset, gy_offset, gz_offset;

///////////////////////////////////   SETUP   ////////////////////////////////////
void setup() {
  Wire.begin();
  Serial.begin(9600);
  mpu.initialize();

  // ждём очистки сериал
  while (Serial.available() && Serial.read()); // чистим
  while (!Serial.available()) {
    Serial.println(F("Send any character to start sketch.n"));
    delay(1500);
  }
  while (Serial.available() && Serial.read()); // чистим ещё на всякий

  Serial.println("nMPU6050 Calibration Sketch");
  delay(2000);
  Serial.println("nYour MPU6050 should be placed in horizontal position, with package letters facing up. nDon't touch it until you see a finish message.n");
  delay(3000);
  // проверка соединения
  Serial.println(mpu.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");
  delay(1000);
  // сбросить оффсеты
  mpu.setXAccelOffset(0);
  mpu.setYAccelOffset(0);
  mpu.setZAccelOffset(0);
  mpu.setXGyroOffset(0);
  mpu.setYGyroOffset(0);
  mpu.setZGyroOffset(0);
}

///////////////////////////////////   LOOP   ////////////////////////////////////
void loop() {
  if (state == 0) {
    Serial.println("nReading sensors for first time...");
    meansensors();
    state  ;
    delay(1000);
  }

  if (state == 1) {
    Serial.println("nCalculating offsets...");
    calibration();
    state  ;
    delay(1000);
  }

  if (state == 2) {
    meansensors();
    Serial.println("nFINISHED!");
    Serial.print("nSensor readings with offsets:t");
    Serial.print(mean_ax);
    Serial.print("t");
    Serial.print(mean_ay);
    Serial.print("t");
    Serial.print(mean_az);
    Serial.print("t");
    Serial.print(mean_gx);
    Serial.print("t");
    Serial.print(mean_gy);
    Serial.print("t");
    Serial.println(mean_gz);
    Serial.print("Your offsets:t");
    Serial.print(ax_offset);
    Serial.print(", ");
    Serial.print(ay_offset);
    Serial.print(", ");
    Serial.print(az_offset);
    Serial.print(", ");
    Serial.print(gx_offset);
    Serial.print(", ");
    Serial.print(gy_offset);
    Serial.print(", ");
    Serial.println(gz_offset);
    Serial.println("nData is printed as: acelX acelY acelZ giroX giroY giroZ");
    Serial.println("Check that your sensor readings are close to 0 0 16384 0 0 0");
    Serial.println("If calibration was succesful write down your offsets so you can set them in your projects using something similar to mpu.setXAccelOffset(youroffset)");
    while (1);
  }
}

///////////////////////////////////   FUNCTIONS   ////////////////////////////////////
void meansensors() {
  long i = 0, buff_ax = 0, buff_ay = 0, buff_az = 0, buff_gx = 0, buff_gy = 0, buff_gz = 0;

  while (i < (buffersize   101)) { // read raw accel/gyro measurements from device mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); if (i > 100 && i <= (buffersize   100)) { //First 100 measures are discarded
      buff_ax = buff_ax   ax;
      buff_ay = buff_ay   ay;
      buff_az = buff_az   az;
      buff_gx = buff_gx   gx;
      buff_gy = buff_gy   gy;
      buff_gz = buff_gz   gz;
    }
    if (i == (buffersize   100)) {
      mean_ax = buff_ax / buffersize;
      mean_ay = buff_ay / buffersize;
      mean_az = buff_az / buffersize;
      mean_gx = buff_gx / buffersize;
      mean_gy = buff_gy / buffersize;
      mean_gz = buff_gz / buffersize;
    }
    i  ;
    delay(2);
  }
}

void calibration() {
  ax_offset = -mean_ax / 8;
  ay_offset = -mean_ay / 8;
  az_offset = (16384 - mean_az) / 8;

  gx_offset = -mean_gx / 4;
  gy_offset = -mean_gy / 4;
  gz_offset = -mean_gz / 4;
  while (1) {
    int ready = 0;
    mpu.setXAccelOffset(ax_offset);
    mpu.setYAccelOffset(ay_offset);
    mpu.setZAccelOffset(az_offset);

    mpu.setXGyroOffset(gx_offset);
    mpu.setYGyroOffset(gy_offset);
    mpu.setZGyroOffset(gz_offset);

    meansensors();
    Serial.println("...");

    if (abs(mean_ax) <= acel_deadzone) ready  ;
    else ax_offset = ax_offset - mean_ax / acel_deadzone;

    if (abs(mean_ay) <= acel_deadzone) ready  ;
    else ay_offset = ay_offset - mean_ay / acel_deadzone;

    if (abs(16384 - mean_az) <= acel_deadzone) ready  ;
    else az_offset = az_offset   (16384 - mean_az) / acel_deadzone;

    if (abs(mean_gx) <= gyro_deadzone) ready  ;
    else gx_offset = gx_offset - mean_gx / (gyro_deadzone   1);

    if (abs(mean_gy) <= gyro_deadzone) ready  ;
    else gy_offset = gy_offset - mean_gy / (gyro_deadzone   1);

    if (abs(mean_gz) <= gyro_deadzone) ready  ;
    else gz_offset = gz_offset - mean_gz / (gyro_deadzone   1);

    if (ready == 6) break;
  }
}
#include "Wire.h"
#include "I2Cdev.h"
#include "MPU6050.h"
MPU6050 mpu;

#define BUFFER_SIZE 100

int16_t ax, ay, az;
int16_t gx, gy, gz;

void setup() {
  Wire.begin();
  Serial.begin(9600);
  mpu.initialize();

  mpu.setXAccelOffset(0);
  mpu.setYAccelOffset(0);
  mpu.setZAccelOffset(0);
  mpu.setXGyroOffset(0);
  mpu.setYGyroOffset(0);
  mpu.setZGyroOffset(0);

  Serial.println(F("Send any character to start sketch"));
  delay(100);
  while (1) {  						  //входим в бесконечный цикл
    if (Serial.available() > 0) {     //если нажата любая кнопка
      Serial.read();                  //прочитать (чтобы не висел в буфере)
      break;                          //выйти из цикла
    }
  }
  delay(1000);
}


void loop() {
  // выводим начальные значения
  mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
  Serial.print(ax); Serial.print(" ");
  Serial.print(ay); Serial.print(" ");
  Serial.print(az); Serial.print(" ");
  Serial.print(gx); Serial.print(" ");
  Serial.print(gy); Serial.print(" ");
  Serial.println(gz);

  calibration();

  // выводим значения после калибровки
  mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
  Serial.print(ax); Serial.print(" ");
  Serial.print(ay); Serial.print(" ");
  Serial.print(az); Serial.print(" ");
  Serial.print(gx); Serial.print(" ");
  Serial.print(gy); Serial.print(" ");
  Serial.println(gz);
  delay(20);

  while (1);
}

// ======= ФУНКЦИЯ КАЛИБРОВКИ ======= 
void calibration() {
  long offsets[6];
  long offsetsOld[6];
  int16_t mpuGet[6];

  // используем стандартную точность
  mpu.setFullScaleAccelRange(MPU6050_ACCEL_FS_2);
  mpu.setFullScaleGyroRange(MPU6050_GYRO_FS_250);

  // обнуляем оффсеты
  mpu.setXAccelOffset(0);
  mpu.setYAccelOffset(0);
  mpu.setZAccelOffset(0);
  mpu.setXGyroOffset(0);
  mpu.setYGyroOffset(0);
  mpu.setZGyroOffset(0);
  delay(10);
  Serial.println("Calibration start. It will take about 5 seconds");

  for (byte n = 0; n < 10; n  ) {     // 10 итераций калибровки
    for (byte j = 0; j < 6; j  ) {    // обнуляем калибровочный массив
      offsets[j] = 0;
    }
    for (byte i = 0; i < 100   BUFFER_SIZE; i  ) { // делаем BUFFER_SIZE измерений для усреднения mpu.getMotion6(&mpuGet[0], &mpuGet[1], &mpuGet[2], &mpuGet[3], &mpuGet[4], &mpuGet[5]); if (i >= 99)                         // пропускаем первые 99 измерений
        for (byte j = 0; j < 6; j  ) {
          offsets[j]  = (long)mpuGet[j];   // записываем в калибровочный массив
        }
    }
    for (byte i = 0; i < 6; i  ) {      
      offsets[i] = offsetsOld[i] - ((long)offsets[i] / BUFFER_SIZE); // учитываем предыдущую калибровку
      if (i == 2) offsets[i]  = 16384;                               // если ось Z, калибруем в 16384
      offsetsOld[i] = offsets[i];
    }
    // ставим новые оффсеты
    mpu.setXAccelOffset(offsets[0] / 8);
    mpu.setYAccelOffset(offsets[1] / 8);
    mpu.setZAccelOffset(offsets[2] / 8);
    mpu.setXGyroOffset(offsets[3] / 4);
    mpu.setYGyroOffset(offsets[4] / 4);
    mpu.setZGyroOffset(offsets[5] / 4);
    delay(2);
  }
  /*
  // выводим в порт
  Serial.println("Calibration end. Your offsets:");
  Serial.println("accX accY accZ gyrX gyrY gyrZ");
  Serial.print(mpu.getXAccelOffset()); Serial.print(", ");
  Serial.print(mpu.getYAccelOffset()); Serial.print(", ");
  Serial.print(mpu.getZAccelOffset()); Serial.print(", ");
  Serial.print(mpu.getXGyroOffset()); Serial.print(", ");
  Serial.print(mpu.getYGyroOffset()); Serial.print(", ");
  Serial.print(mpu.getZGyroOffset()); Serial.println(" ");
  Serial.println(" ");
  */
}
// калибровка и запись в EEPROM
// при запуске настраиваем оффсеты

// послать символ в сериал - начать повторную калибровку

#include "Wire.h"
#include "I2Cdev.h"
#include "MPU6050.h"
#include "EEPROMex.h"
MPU6050 mpu;

#define BUFFER_SIZE 100
#define START_BYTE 1010

int16_t ax, ay, az;
int16_t gx, gy, gz;

void setup() {
  Wire.begin();
  Serial.begin(9600);
  mpu.initialize();

  //----------------- ВСПОМИНАЕМ ОФФСЕТЫ ------------------------
  int offsets[6];
  for (byte i = 0; i < 6; i  ) { // обнуляем калибровочный массив // по умолч оффсеты хранятся в ячейках 1010, 1012, 1014, 1016, 1018, 1020 offsets[i] = EEPROM.readInt(START_BYTE   i * 2); } // ставим оффсеты из памяти mpu.setXAccelOffset(offsets[0]); mpu.setYAccelOffset(offsets[1]); mpu.setZAccelOffset(offsets[2]); mpu.setXGyroOffset(offsets[3]); mpu.setYGyroOffset(offsets[4]); mpu.setZGyroOffset(offsets[5]); //----------------- ВСПОМИНАЕМ ОФФСЕТЫ ------------------------ Serial.println(F("Send any character to start sketch")); delay(100); while (1) { //входим в бесконечный цикл if (Serial.available() > 0) {     //если нажата любая кнопка
      Serial.read();                  //прочитать (чтобы не висел в буфере)
      break;                          //выйти из цикла
    }
  }
  delay(1000);
}

void loop() {
  calibration();

  Serial.println("Current offsets:");
  Serial.println("accX accY accZ gyrX gyrY gyrZ");
  Serial.print(mpu.getXAccelOffset()); Serial.print(", ");
  Serial.print(mpu.getYAccelOffset()); Serial.print(", ");
  Serial.print(mpu.getZAccelOffset()); Serial.print(", ");
  Serial.print(mpu.getXGyroOffset()); Serial.print(", ");
  Serial.print(mpu.getYGyroOffset()); Serial.print(", ");
  Serial.print(mpu.getZGyroOffset()); Serial.println(" ");
  Serial.println(" ");  

  // выводим значения после калибровки
  Serial.println("Readings:");
  mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
  Serial.print(ax); Serial.print(" ");
  Serial.print(ay); Serial.print(" ");
  Serial.print(az); Serial.print(" ");
  Serial.print(gx); Serial.print(" ");
  Serial.print(gy); Serial.print(" ");
  Serial.println(gz);
  delay(20);

  while (1);
}

// =======  ФУНКЦИЯ КАЛИБРОВКИ И ЗАПИСИ В ЕЕПРОМ ======= 
void calibration() {
  long offsets[6];
  long offsetsOld[6];
  int16_t mpuGet[6];

  // используем стандартную точность
  mpu.setFullScaleAccelRange(MPU6050_ACCEL_FS_2);
  mpu.setFullScaleGyroRange(MPU6050_GYRO_FS_250);

  // обнуляем оффсеты
  mpu.setXAccelOffset(0);
  mpu.setYAccelOffset(0);
  mpu.setZAccelOffset(0);
  mpu.setXGyroOffset(0);
  mpu.setYGyroOffset(0);
  mpu.setZGyroOffset(0);
  delay(5);

  for (byte n = 0; n < 10; n  ) {     // 10 итераций калибровки
    for (byte j = 0; j < 6; j  ) {    // обнуляем калибровочный массив
      offsets[j] = 0;
    }
    for (byte i = 0; i < 100   BUFFER_SIZE; i  ) { // делаем BUFFER_SIZE измерений для усреднения mpu.getMotion6(&mpuGet[0], &mpuGet[1], &mpuGet[2], &mpuGet[3], &mpuGet[4], &mpuGet[5]); if (i >= 99)                         // пропускаем первые 99 измерений
        for (byte j = 0; j < 6; j  ) {
          offsets[j]  = (long)mpuGet[j];   // записываем в калибровочный массив
        }
    }
    for (byte i = 0; i < 6; i  ) {
      offsets[i] = offsetsOld[i] - ((long)offsets[i] / BUFFER_SIZE); // учитываем предыдущую калибровку
      if (i == 2) offsets[i]  = 16384;                               // если ось Z, калибруем в 16384
      offsetsOld[i] = offsets[i];
    }
    // ставим новые оффсеты
    mpu.setXAccelOffset(offsets[0] / 8);
    mpu.setYAccelOffset(offsets[1] / 8);
    mpu.setZAccelOffset(offsets[2] / 8);
    mpu.setXGyroOffset(offsets[3] / 4);
    mpu.setYGyroOffset(offsets[4] / 4);
    mpu.setZGyroOffset(offsets[5] / 4);
    delay(2);
  }

  // запись в память
  for (byte i = 0; i < 6; i  ) {    // обнуляем калибровочный массив
    // оффсеты хранятся в ячейках 1010, 1012, 1014, 1016, 1018, 1020
    if (i < 3)
      EEPROM.updateInt(START_BYTE   i * 2, offsets[i] / 8);
    else
      EEPROM.updateInt(START_BYTE   i * 2, offsets[i] / 4);
  }
}

Также в библиотеке есть готовые функции для калибровки акселя и гиро, они принимают количество итераций калибровки (до 15):

mpu.CalibrateAccel(6);
mpu.CalibrateGyro(6);

Функции блокирующие, выполняются и автоматически выставляют оффсеты, т.е. датчик сразу калибруется. Для чтения оффсетов (например для записи в EEPROM) можно воспользоваться тем же способом, что и раньше:

mpu.getXAccelOffset();
mpu.getYAccelOffset();
mpu.getZAccelOffset();
mpu.getXGyroOffset();
mpu.getYGyroOffset();
mpu.getZGyroOffset();

Размеры платы полетного контроллера

Монтажная схема полетного контроллера — это расстояние между отверстиями для крепления ПК к раме дрона. В этом вопросе есть стандарт, который состоит из 3 схем:

  • 30,5 × 30,5 мм,
  • 20 × 20 мм,
  • 16 × 16 мм.
Смотрите про коптеры:  Как собрать радиоуправляемый самолет?

Размер платы соответствует размеру дрона, который вы будете собирать, например, 30,5 х 30,5 мм устанавливаются в рамы размером от 200 мм и больше, а на меньшие рамы устанавливаются последующие размеры полетных контроллеров.

Регулятор напряжения (bec)

На современных (да и не только) ПК есть отдельные контакты для подключения источника потребления на 5V и на 12V, иногда встречаются даже на 9. Хоть сейчас почти все FPV-компоненты рассчитаны на ток в широком диапазоне и их можно подключать даже к аккумулятору, мы все же рекомендуем подключать их к отдельному входу на полетном контроллере, где ток подается стабильным, тогда как в аккумуляторе он будет постоянно «скакать» от нагрузки.

Регуляторы оборотов (esc)

Наверняка вы уже слышали или видели регуляторы оборотов 4 в 1, такая квадратная плата вместо 4 плат. Инженеры решили интегрировать регуляторы сразу в полетный контроллер и теперь, если вы купите такой ПК, вам можно будет припаять двигатели напрямую к ПК. О целесообразности такого выбора решать только вам.

Светодиод состояния

Удобная функция, которая отображает текущее состояние полетного контроллера. Обычно у светодиода есть 2 цвета — красный и синий. В зависимости от того, каким и сколько раз мигает ПК — пилот понимает, все ли в порядке. Эта спецификация всегда указывается с конкретным контроллером.

Сколько бывает портов uart на полетном контроллере?

UART портов много не бывает — чем больше, тем более гибко можно будет настраивать ваш квадрокоптер, а также они будут дублировать друг друг в случае поломки.

Но само количество портов зависит от размеров платы полетного контроллера и от того, как расположены на ней компоненты, а также от типа процессора, который использует ПК. 3-е и 4-е поколение полетных контроллеров (F3-F4) имеют от 3 до 5 UART, а 7-е поколение — 7 и более. Оно и понятно, слабый процессор не сможет физически обрабатывать столько периферии.

Смотрите про коптеры:  Строим квадрокоптер. Часть 1. Детали. | Пикабу
F1F3F4F7
2 UART3-5 UART3-6 UART7 UART

Типы коннекторов

Это, конечно, не функция, но не рассказать об этом нельзя. На полетном контроллере есть 3 типа соединений между периферией:

  • Пластиковые коннекторы
  • Контактные площадки для припаивания
  • Отверстия для припаивания

Пластиковые коннекторы в основном используются для подключения периферии, которую иногда нужно отключать и снимать, в этом их плюс — быстро снять/подключить. Они не очень прочные, но удобные.

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

Отверстия для припаивания удобны тем, что провод гораздо прочнее будет «сидеть» в пазу. Также можно использовать угловые штифты для более удобного подключения периферии.

Черный ящик (blackbox)

Черный ящик нужен для записи логов работы квадрокоптера, туда записываются всевозможные данные, которые обрабатывает полетный контроллер. Есть два места, куда можно вести запись логов, это флеш-память полетного контроллера и SD-карта (флешка).

Плюсывстроенной флеш-памяти:

  • Экономия места,
  • Не нужен отдельный разъем.

Минусы встроенной флеш-памяти:

  • Маленький размер хранилища,
  • Маленькая скорость обмена данными (скачивание логов).

Заключение

Как вы заметили, полетный контроллер — это очень важный узел в квадрокоптере и занимает очень много места в теории. И на вопрос, как правильно выбрать полетный контроллер, у вас не должно оставаться этих самых вопросов, а если остались, вы должны понять, для чего вам нужен квадрокоптер, для каких нужд.

Если для гонок и драйва, то одни контроллеры, если для съемки, то другие. Также стоит учитывать ваши навыки, если вы новичок, то не стоит брать дорогие контроллеры с кучей датчиков или наоборот те, в которых абсолютно ничего не настроено и даже нет прошивки.

Также стоит учитывать бюджет, который вы можете потратить, так как цены очень сильно разнятся. Например, SP Racing F7 с OSD для гоночных дронов стоит от 1600 до 2500 рублей, а вот DJI A3 для профессиональной фото- и видеосъемки стоит 50 000 – 60 000 тысяч рублей.

Подведем итоги:

Выбирать полетный контроллер следует из ваших потребностей – для гонок, для съемки или для автономных полетов, а также, а также, на основе статьи, что написана выше.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector