Перейти к содержанию

MPU-6050 — акселерометр и гироскоп с I²C

MPU-6050 объединяет в корпусе 4 × 4 мм трёхосевой акселерометр, трёхосевой гироскоп и датчик температуры и отдаёт 16-битные отсчёты по I²C. Разбираем по спецификации и карте регистров TDK InvenSense выводы, питание, ключевые регистры, пересчёт кодов в g, °/с и градусы Цельсия и ошибки, из-за которых датчик молчит или врёт.

Обновлено Редакция GAW

MPU-6050 — шестиосевой датчик движения InvenSense: трёхосевой гироскоп и трёхосевой акселерометр с 16-битными АЦП на каждую ось, датчик температуры, буфер FIFO на 1024 байта и встроенный процессор движения DMP. Корпус — QFN-24 размером 4 × 4 × 0,9 мм. Его близнец MPU-6000 устроен так же, но умеет ещё SPI и не имеет отдельного вывода VLOGIC; ниже всё сказано про MPU-6050, работающий только по I²C.

Коротко

  • Питание — VDD 2,375–3,46 В, VLOGIC от 1,71 В до VDD; типовой ток 3,8 мА с гироскопом и акселерометром.
  • Шина — I²C до 400 кГц, адрес 0x68 или 0x69 по выводу AD0.
  • Акселерометр — шкалы ±2, ±4, ±8 и ±16 g, от 16 384 до 2048 LSB/g.
  • Гироскоп — шкалы от ±250 до ±2000 °/с, от 131 до 16,4 LSB/(°/с).
  • Ещё — датчик температуры, FIFO 1024 байта, DMP, вспомогательная шина I²C для магнитометра.

Статус и документы

На сайте TDK InvenSense на 18 октября 2026 года у MPU-6050 нет страницы продукта: поиск по сайту находит только спецификацию PS-MPU-6000A-00 ред. 3.4 и карту регистров RM-MPU-6000A-00 ред. 4.2, обе обновлены 19 августа 2013 года, а старый адрес страницы продукта перенаправляет на страницу «Page Not Found». Отметки EOL или NRND там нет, поэтому статус производства мы подтвердить не можем — для серийного изделия уточняйте его у дистрибьютора.

Все цифры ниже взяты из этих двух документов. Сама спецификация в разделе 2 оговаривает, что электрические характеристики получены расчётом и моделированием, а таблицы разделов 6.1–6.7 даны для VLOGIC = 1,8 В ± 5 % или VLOGIC = VDD при 25 °C.

Выводы QFN-24

ВыводОбозначениеНазначение
1CLKINвход внешнего тактового сигнала; если не нужен — на общий провод
2–5, 14–17NCвнутри не подключены; их площадки можно использовать для разводки дорожек
6AUX_DAданные вспомогательной шины I²C для внешних датчиков
7AUX_CLтакт вспомогательной шины I²C
8VLOGICпитание цифровых входов и выходов, не выше VDD
9AD0младший бит адреса I²C
10REGOUTконденсатор фильтра внутреннего стабилизатора
11FSYNCвход синхронизации кадров; если не нужен — на общий провод
12INTвыход прерывания, двухтактный или с открытым стоком
13VDDпитание
18GNDобщий провод
19, 21, 22RESVзарезервированы, не подключать
20CPOUTконденсатор накачки
23SCLтактовая линия I²C
24SDAлиния данных I²C

Обвязка по разделу 7.3 спецификации — керамика X7R: 0,1 мкФ на REGOUT, 0,1 мкФ на VDD, 2,2 нФ на 50 В на CPOUT и 10 нФ на VLOGIC. Шаг выводов — 0,5 мм. Центральную площадку корпуса паять не следует: InvenSense пишет, что электрически она с кристаллом не связана, а пайка создаёт механическое напряжение в корпусе и меняет характеристики. Дорожки и переходные отверстия под корпусом тоже запрещены — их сигналы наводятся на гироскопы. Гироскопы возбуждаются на частотах 33, 30 и 27 кГц по осям X, Y и Z с разбросом ±3 кГц, то есть где-то в полосе 24–36 кГц (разд. 6.1 и 11.4.3).

Питание и логические уровни

VDD — от 2,375 до 3,46 В. VLOGIC задаёт уровни шины I²C и вывода INT: от 1,71 В до VDD, причём VLOGIC не должен превышать VDD ни в какой момент. Единицу на входе микросхема распознаёт от 0,7·VLOGIC, ноль — до 0,3·VLOGIC, а рабочий диапазон напряжения на SCL и SDA — от −0,5 В до VLOGIC + 0,5 В (разд. 6.4 и 6.5). При включении VDD нарастает от 10 до 90 % не дольше 100 мс, VLOGIC — не дольше 3 мс и не раньше VDD, оба фронта монотонные (разд. 7.4).

Предельные режимы (разд. 6.9): VDD — от −0,5 до +6 В, напряжение на SCL, SDA, AD0, INT и других входах — от −0,5 В до VDD + 0,5 В. Это границы, за которыми микросхема может выйти из строя; работа при них не гарантируется, а долгое пребывание у этих границ снижает надёжность.

РежимТок, тип.
Гироскоп, акселерометр и DMP3,9 мА
Гироскоп и акселерометр3,8 мА
Только гироскоп3,6 мА
Только акселерометр500 мкА
Акселерометр в режиме малого потребления: 1,25 / 5 / 20 / 40 Гц10 / 20 / 70 / 140 мкА
Ожидание5 мкА
Ток по выводу VLOGIC100 мкА

Токи — типовые, из таблицы разд. 6.3. В перечне возможностей (разд. 5.2) для 20 и 40 Гц указаны 60 и 110 мкА, но, по истории изменений, токи режима малого потребления в разд. 6.3 обновили в ред. 3.2, поэтому опираемся на таблицу.

Акселерометр и гироскоп

ПараметрАкселерометрГироскоп
Шкалы±2, ±4, ±8, ±16 g±250, ±500, ±1000, ±2000 °/с
Чувствительность16 384, 8192, 4096, 2048 LSB/g131, 65,5, 32,8, 16,4 LSB/(°/с)
Допуск чувствительности±3 %, тип.от −3 до +3 %, мин. и макс.
Смещение нуля при 25 °C, тип.±50 мg по X и Y, ±80 мg по Z±20 °/с
Изменение нуля с температурой, тип.±35 мg по X и Y, ±60 мg по Z (0…70 °C)±20 °/с (−40…+85 °C)
Нелинейность, тип.0,5 %0,2 %
Межосевая чувствительность, тип.±2 %±2 %
Плотность шума на 10 Гц, тип.400 мкg/√Гц при AFS_SEL = 0 и данных 1 кГц0,005 °/с/√Гц при FS_SEL = 0
Полоса фильтра, мин. и макс.5–260 Гц5–256 Гц
Частота данных, мин. и макс.4–1000 Гц4–8000 Гц

В таблицах разд. 6.1 и 6.2 гарантированные границы — столбцы MIN и MAX — заданы только у допуска чувствительности гироскопа, диапазонов фильтра и частоты данных и у самотеста: от −14 до +14 % от заводского значения. Остальное стоит в столбце TYP, это типовые значения, а не пределы. Для смещения нуля акселерометра сноска 1 прямо называет его типовым значением после предварительной подготовки по MSL3.

Данные — 16-битные числа в дополнительном коде. Лежащий горизонтально датчик показывает 0 g по X и Y и +1 g по Z. Полный шум гироскопа спецификация приводит для FS_SEL = 0 и фильтра около 100 Гц (DLPF_CFG = 2): типовые 0,05 °/с среднеквадратично. Это число совпадает с произведением плотности на корень из полосы фильтра: 0,005 · √98 ≈ 0,05 °/с. Для акселерометра документ даёт только плотность. Если так же оценить его шум с фильтром 44 Гц, получится 400 · √44 ≈ 2650 мкg, около 2,7 мg, — но это оценка для идеальной прямоугольной полосы, реальный шум с фильтром конечной крутизны больше.

Шум мал по сравнению со смещением нуля гироскопа: типовое значение — ±20 °/с, а гарантированного предела спецификация не даёт, поэтому смещение каждого экземпляра измеряют в покое и вычитают.

Адрес I²C

Адрес — 110100X: младший бит задаёт вывод AD0. AD0 на общем проводе — 0x68, на VLOGIC — 0x69, так что на одной шине уживаются два датчика. Шина работает в режимах Standard-mode 100 кГц и Fast-mode 400 кГц, ёмкость каждой линии — до 400 пФ. Линиям SDA и SCL обычно нужны подтягивающие резисторы, у MPU-6050 — к VLOGIC: уровни всех его логических выводов задаёт это напряжение (разд. 10.2). Байты записи и чтения — 0xD0 и 0xD1 при AD0 = 0; чем семибитный адрес отличается от байта, рассказано на странице «Адрес I²C».

Регистр WHO_AM_I (0x75) читается как 0x68 при любом уровне AD0: по нему убеждаются, что ответила именно MPU-60X0, но отличить по нему два датчика на одной шине нельзя.

Запись: START, адрес с битом записи, номер регистра, данные, STOP; если байты данных продолжаются, номер регистра растёт сам. Чтение: START, адрес с битом записи, номер регистра, повторный START, адрес с битом чтения, затем байты; последний байт ведущий не подтверждает (NACK) и ставит STOP.

Ключевые регистры

АдресРегистрЧто в нём
0x19SMPLRT_DIVделитель частоты отсчётов
0x1ACONFIGDLPF_CFG — биты 2:0, фильтр; EXT_SYNC_SET — биты 5:3
0x1BGYRO_CONFIGFS_SEL — биты 4:3, шкала гироскопа; биты 7:5 — самотест
0x1CACCEL_CONFIGAFS_SEL — биты 4:3, шкала акселерометра; биты 7:5 — самотест
0x23FIFO_ENкакие данные писать в FIFO
0x37INT_PIN_CFGуровень и тип выхода INT, защёлка, режим обхода I2C_BYPASS_EN
0x38INT_ENABLEDATA_RDY_EN — бит 0, FIFO_OFLOW_EN — бит 4
0x3AINT_STATUSфлаги прерываний, сбрасываются чтением
0x3B–0x40ACCEL_XOUT_H … ACCEL_ZOUT_Lускорение по X, Y, Z
0x41–0x42TEMP_OUT_H, TEMP_OUT_Lтемпература
0x43–0x48GYRO_XOUT_H … GYRO_ZOUT_Lугловая скорость по X, Y, Z
0x6AUSER_CTRLFIFO_EN — бит 6, I2C_MST_EN — бит 5; I2C_IF_DIS у MPU-6050 всегда 0
0x6BPWR_MGMT_1DEVICE_RESET — бит 7, SLEEP — бит 6, CYCLE — бит 5, TEMP_DIS — бит 3, CLKSEL — биты 2:0
0x6CPWR_MGMT_2частота пробуждений и отключение отдельных осей
0x72–0x73FIFO_COUNTH, FIFO_COUNTLчисло байт в FIFO
0x74FIFO_R_Wданные FIFO
0x75WHO_AM_I0x68

После сброса все регистры равны 0x00, кроме PWR_MGMT_1 — 0x40 и WHO_AM_I — 0x68. Значение 0x40 означает SLEEP = 1: датчик включается в режиме сна. В том же регистре выбирают тактирование: после включения работает внутренний генератор 8 МГц, но InvenSense настоятельно рекомендует перейти на PLL от одного из гироскопов, CLKSEL = 1…3, — так частота стабильнее. Запись 0x01 в PWR_MGMT_1 делает оба дела сразу.

Шкалы задают биты 4:3: в GYRO_CONFIG значения 0x00, 0x08, 0x10 и 0x18 дают ±250, ±500, ±1000 и ±2000 °/с, в ACCEL_CONFIG те же значения — ±2, ±4, ±8 и ±16 g.

Частота отсчётов и фильтр

От частоты отсчётов зависят регистры данных, FIFO и DMP:

fотсч=fгир1+SMPLRT_DIV,f_\text{отсч} = \frac{f_\text{гир}}{1 + \text{SMPLRT\_DIV}},

где частота гироскопа fгир — 8 кГц при выключенном фильтре (DLPF_CFG = 0 или 7) и 1 кГц при включённом. Акселерометр обновляется с частотой 1 кГц, поэтому при частоте отсчётов выше 1 кГц один и тот же его отсчёт выдаётся несколько раз. Пример: DLPF_CFG = 3 и SMPLRT_DIV = 9 дают 1000 / (1 + 9) = 100 Гц.

DLPF_CFGАкселерометр: полоса, ГцЗадержка, мсГироскоп: полоса, ГцЗадержка, мсЧастота гироскопа, кГц
026002560,988
11842,01881,91
2943,0982,81
3444,9424,81
4218,5208,31
51013,81013,41
6519,0518,61
7зарезервировано—зарезервировано—8

Пересчёт кодов

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

a=ACCEL_xOUTSa,ω=GYRO_xOUTSω,T=TEMP_OUT340+36,53 ∘C.a = \frac{\text{ACCEL\_xOUT}}{S_a}, \qquad \omega = \frac{\text{GYRO\_xOUT}}{S_\omega}, \qquad T = \frac{\text{TEMP\_OUT}}{340} + 36{,}53\ ^\circ\text{C}.

Формула температуры — из раздела 4.18 карты регистров. Она согласуется со спецификацией: там при 35 °C указан типовой код −521, и −521 / 340 + 36,53 = 35,0 °C.

Пример: шкалы ±2 g и ±250 °/с, датчик лежит на столе, пакетное чтение 14 байт с адреса 0x3B вернуло:

РегистрыБайтыЧисло со знакомДелениеРезультат
0x3B, 0x3C — ускорение X0xFE, 0x0C−50016 384−0,031 g
0x3D, 0x3E — ускорение Y0x01, 0x4832816 3840,020 g
0x3F, 0x40 — ускорение Z0x3F, 0xA016 28816 3840,994 g
0x41, 0x42 — температура0xF1, 0x50−3760340, затем + 36,5325,5 °C
0x43, 0x44 — гироскоп X0x02, 0x0C5241314,0 °/с
0x45, 0x46 — гироскоп Y0xFF, 0x7D−131131−1,0 °/с
0x47, 0x48 — гироскоп Z0x00, 0x41651310,5 °/с

Как получился знак: 0xFE0C = 65 036, это больше 32 767, значит число отрицательное: 65 036 − 65 536 = −500. Температура: 0xF150 = 61 776 → −3760; −3760 / 340 = −11,06; −11,06 + 36,53 = 25,5 °C. Показания акселерометра отличаются от идеальных 0, 0 и 1 g на 6–31 мg, гироскоп в покое показывает до 4 °/с — оба отклонения меньше типовых значений смещения нуля из спецификации.

Пример для Arduino

Скетч будит датчик и проверяет WHO_AM_I — если ответ не 0x68, останавливается и печатает прочитанное значение. Затем он настраивает фильтр, частоту и шкалы и десять раз в секунду читает 14 байт одним пакетом. Значения регистров — из карты регистров RM-MPU-6000A-00. Метод endTransmission() возвращает 0, когда датчик подтвердил адрес и данные.

#include <Wire.h>

// Register addresses: RM-MPU-6000A-00 rev. 4.2, section 3
const uint8_t MPU_ADDR     = 0x68;  // AD0 low; 0x69 with AD0 high
const uint8_t SMPLRT_DIV   = 0x19;
const uint8_t CONFIG       = 0x1A;
const uint8_t GYRO_CONFIG  = 0x1B;
const uint8_t ACCEL_CONFIG = 0x1C;
const uint8_t ACCEL_XOUT_H = 0x3B;
const uint8_t PWR_MGMT_1   = 0x6B;
const uint8_t WHO_AM_I     = 0x75;

bool writeReg(uint8_t reg, uint8_t value) {
  Wire.beginTransmission(MPU_ADDR);
  Wire.write(reg);
  Wire.write(value);
  return Wire.endTransmission() == 0;     // 0 = address and data acknowledged
}

uint8_t readReg(uint8_t reg) {
  Wire.beginTransmission(MPU_ADDR);
  Wire.write(reg);
  if (Wire.endTransmission(false) != 0) return 0xFF;   // no ACK; repeated START otherwise
  if (Wire.requestFrom(MPU_ADDR, (uint8_t)1) != 1) return 0xFF;
  return Wire.read();                     // 0xFF is never a valid WHO_AM_I (bit 7 is 0)
}

void setup() {
  Serial.begin(115200);
  Wire.begin();
  Wire.setClock(400000);                  // Fast-mode, the MPU-6050 maximum

  writeReg(PWR_MGMT_1, 0x01);             // SLEEP = 0, CLKSEL = 1: PLL with X gyro reference
  delay(50);                              // PLL settles within 10 ms, gyro ZRO in about 30 ms

  uint8_t id = readReg(WHO_AM_I);         // 0x68 whatever the AD0 level
  if (id != 0x68) {
    Serial.print("No MPU-6050, WHO_AM_I = 0x");
    Serial.println(id, HEX);              // 0xFF: no answer at MPU_ADDR
    while (true) delay(1000);
  }

  writeReg(CONFIG, 0x03);                 // DLPF_CFG = 3: accel 44 Hz, gyro 42 Hz, 1 kHz gyro rate
  writeReg(SMPLRT_DIV, 9);                // sample rate = 1 kHz / (1 + 9) = 100 Hz
  writeReg(GYRO_CONFIG, 0x00);            // FS_SEL = 0: +-250 dps, 131 LSB per dps
  writeReg(ACCEL_CONFIG, 0x00);           // AFS_SEL = 0: +-2 g, 16384 LSB per g
}

void loop() {
  Wire.beginTransmission(MPU_ADDR);
  Wire.write(ACCEL_XOUT_H);
  // One burst read: all 14 bytes belong to the same sampling instant
  if (Wire.endTransmission(false) != 0 || Wire.requestFrom(MPU_ADDR, (uint8_t)14) != 14) {
    Serial.println("I2C read failed");
    delay(100);
    return;
  }

  int16_t raw[7];                         // AX, AY, AZ, TEMP, GX, GY, GZ
  for (uint8_t i = 0; i < 7; i++) {
    uint8_t hi = Wire.read();
    uint8_t lo = Wire.read();
    raw[i] = (int16_t)(((uint16_t)hi << 8) | lo);  // big-endian two's complement
  }

  float ax = raw[0] / 16384.0f, ay = raw[1] / 16384.0f, az = raw[2] / 16384.0f;  // g
  float temp = raw[3] / 340.0f + 36.53f;                                         // deg C
  float gx = raw[4] / 131.0f, gy = raw[5] / 131.0f, gz = raw[6] / 131.0f;        // dps

  Serial.print(ax, 3); Serial.print(' ');
  Serial.print(ay, 3); Serial.print(' ');
  Serial.print(az, 3); Serial.print("  ");
  Serial.print(temp, 1); Serial.print("  ");
  Serial.print(gx, 1); Serial.print(' ');
  Serial.print(gy, 1); Serial.print(' ');
  Serial.println(gz, 1);
  delay(100);
}

Если поменять шкалу, делители в loop() нужно поменять вместе с ней — сами регистры данных шкалу не сообщают.

FIFO, прерывания и DMP

FIFO. Буфер на 1024 байта заполняется с частотой отсчётов данными, выбранными в FIFO_EN (0x23), в порядке номеров регистров; включает его бит FIFO_EN в USER_CTRL. Число байт читают из FIFO_COUNTH и FIFO_COUNTL — обязательно начиная со старшего, иначе счётчик не обновится, — а сами данные из FIFO_R_W (0x74). При шести осях это 12 байт на отсчёт: буфер вмещает 85 отсчётов, при 100 Гц — 0,85 с. При переполнении теряются самые старые данные и ставится флаг FIFO_OFLOW_INT, а чтение пустого буфера возвращает последний прочитанный байт — поэтому сначала проверяют счётчик.

Прерывания. Вывод INT настраивают в INT_PIN_CFG (0x37): активный уровень, двухтактный выход или открытый сток, импульс 50 мкс или удержание до сброса флага. Бит DATA_RDY_EN в INT_ENABLE (0x38) включает прерывание по готовности нового отсчёта, флаги читают из INT_STATUS (0x3A).

DMP. По разделу 7.9 спецификации встроенный процессор движения берёт данные акселерометра, гироскопа и внешних датчиков, например магнитометра, обрабатывает их, а результат отдаёт из своих регистров или через FIFO. InvenSense пишет, что алгоритмы обработки движения должны работать с высокой частотой, часто около 200 Гц, чтобы результат был точным и с малой задержкой, и DMP снимает эту нагрузку с микроконтроллера; с ним типовой ток растёт с 3,8 до 3,9 мА. В карте регистров RM-MPU-6000A-00 регистры DMP не описаны.

Вспомогательная шина. Выводы AUX_DA и AUX_CL — отдельная шина I²C, на которой MPU-6050 сам опрашивает до четырёх внешних датчиков, читая с них до 24 байт. В режиме обхода (I2C_BYPASS_EN = 1 при I2C_MST_EN = 0) эти выводы соединяются с основной шиной, и микроконтроллер обращается к датчику на ней напрямую.

Малое потребление. Если в PWR_MGMT_1 установить CYCLE и TEMP_DIS, сбросить SLEEP, а в PWR_MGMT_2 отключить три оси гироскопа, датчик просыпается только ради одного отсчёта акселерометра с частотой 1,25, 5, 20 или 40 Гц по полю LP_WAKE_CTRL и потребляет типовые 10–140 мкА.

Типичные ошибки

  1. 5 В на VDD или на линиях шины. Рабочий диапазон VDD — 2,375–3,46 В; 5 В ниже абсолютного предела 6 В, но это граница повреждения, а не рабочий режим. На линиях шины рабочее напряжение — не больше VLOGIC + 0,5 В (разд. 6.5), то есть 3,8 В при VLOGIC = 3,3 В, а абсолютный предел — VDD + 0,5 В; подтяжка к 5 В превышает и то и другое. Если микросхема стоит на готовом модуле, по его схеме проверяют, чем питается VDD и к чему подтянуты линии.
  2. Датчик не разбудили. После включения PWR_MGMT_1 = 0x40, бит SLEEP установлен, в регистрах данных — значение сброса 0x00. Первая запись после включения — 0x01 в регистр 0x6B.
  3. Не та шкала в пересчёте. Делитель должен соответствовать полям AFS_SEL и FS_SEL. Если в ACCEL_CONFIG записано 0x10 (±8 g), земное ускорение даёт около 4096 единиц, и деление на 16 384 «покажет» 0,25 g вместо 1 g. У гироскопа делители не круглые: 65,5 и 32,8, а не 64 и 32.
  4. Число без знака. Регистры данных — дополнительный код. Если собрать два байта в беззнаковую переменную или в 32-битный int без приведения к int16_t, отрицательные значения превратятся в числа от 32 768 до 65 535.
  5. Чтение по одному байту. Карта регистров гарантирует, что пакетное чтение возвращает значения одного момента измерения. При отдельных чтениях старший и младший байты могут оказаться из разных отсчётов — тогда нужно ждать флага готовности данных.
  6. Ожидание нуля в покое. Типовой разброс нуля по спецификации — ±20 °/с у гироскопа и ±50…±80 мg у акселерометра, а гарантированных пределов документ не приводит. Смещения измеряют на неподвижном датчике и вычитают; без этого угол, полученный интегрированием угловой скорости, быстро уходит.
  7. Ошибки своей платы. Центральную площадку припаяли или провели под корпусом дорожки — спецификация запрещает и то и другое: механическое напряжение меняет характеристики, а сигналы дорожек наводятся на гироскопы.
  8. Лишняя единица в USER_CTRL. Бит I2C_IF_DIS (бит 4 регистра 0x6A) у MPU-6050 по карте регистров всегда записывают нулём. Значения для USER_CTRL собирают из нужных битов — FIFO_EN, I2C_MST_EN и битов сброса, — а не копируют из примеров для MPU-6000, где этот бит включает SPI.

MPU-6050 и новые IMU

MPU-6050 прост в запуске: никаких файлов конфигурации, достаточно разбудить датчик и читать регистры. По диапазону питания и току потребления его стоит сравнить с новыми IMU. Сравнение датчиков Bosch — BMI160, BMI270, BMI323 и BNO055 со встроенным слиянием данных — в статье «Акселерометры и гироскопы: как выбрать и подключить IMU». Другие цифровые датчики с I²C — в разделе «Микросхемы датчиков».

Частые вопросы

Какой адрес I²C у MPU-6050?

Семибитный адрес — 110100X в двоичной записи: 0x68, если вывод AD0 соединён с общим проводом, и 0x69, если на нём уровень VLOGIC. Так на одной шине работают два датчика. Регистр WHO_AM_I (0x75) у обоих читается как 0x68: в нём шесть старших бит адреса, а уровень AD0 он не отражает.

Почему MPU-6050 выдаёт одни нули?

Скорее всего, он спит. После включения регистр PWR_MGMT_1 (0x6B) равен 0x40 — установлен бит SLEEP, а в регистрах данных лежит значение сброса 0x00. Запишите в 0x6B число 0x01: бит SLEEP сбросится, а тактирование переключится на PLL от гироскопа X, которое InvenSense рекомендует вместо внутреннего генератора 8 МГц.

Как перевести показания MPU-6050 в g и градусы в секунду?

Собрать из старшего и младшего байта 16-битное число со знаком и разделить на чувствительность выбранной шкалы. У акселерометра это 16 384, 8192, 4096 и 2048 LSB/g на шкалах ±2, ±4, ±8 и ±16 g, у гироскопа — 131, 65,5, 32,8 и 16,4 LSB/(°/с) на шкалах ±250, ±500, ±1000 и ±2000 °/с. Например, код 16 288 на шкале ±2 g — это 0,994 g.

Как получить температуру с MPU-6050?

По карте регистров T = TEMP_OUT / 340 + 36,53 °C, где TEMP_OUT — 16-битное число со знаком из регистров 0x41 и 0x42. Код −3760 даёт 25,5 °C. Это температура кристалла, а не воздуха; диапазон датчика — от −40 до +85 °C. Чувствительность 340 LSB/°C и линейность ±1 °C в спецификации типовые, причём чувствительность указана без заводской подстройки.

Можно ли подключить MPU-6050 к Arduino с питанием 5 В?

Напрямую — нет. Питание VDD по спецификации — 2,375–3,46 В. Уровни шины задаёт вывод VLOGIC, который не может быть выше VDD, а напряжение на входах SCL и SDA в рабочем режиме — не больше VLOGIC + 0,5 В: при VLOGIC = 3,3 В это 3,8 В. Абсолютный предел для этих выводов — VDD + 0,5 В. Микросхему питают от 3,3 В, а с 5-вольтовой шиной связывают через преобразователь уровней.

Почему гироскоп MPU-6050 в покое показывает не ноль?

Это смещение нуля. Типовой начальный разброс по спецификации — ±20 °/с при 25 °C, и ещё столько же, тоже типовое значение, добавляет изменение в диапазоне от −40 до +85 °C; гарантированного максимума документ не приводит. Смещение измеряют, пока датчик неподвижен, и вычитают из показаний. У акселерометра типовое смещение нуля — ±50 мg по осям X и Y и ±80 мg по Z.

Источники

  1. TDK InvenSense. MPU-6000 and MPU-6050 Product Specification (PS-MPU-6000A-00, Revision 3.4, 19 августа 2013) — разд. 1 — история изменений, ред. 3.2 обновила токи режима малого потребления в разд. 6.3; разд. 2 — характеристики получены расчётом и моделированием; разд. 3.1 и таблица отличий — VDD 2,375–3,46 В, VLOGIC 1,71 В…VDD, I²C 400 кГц, FIFO 1024 байта; разд. 6.1 — гироскоп: ±250…±2000 °/с, 131 / 65,5 / 32,8 / 16,4 LSB/(°/с), допуск от −3 до +3 % (мин. и макс.), типовые смещение нуля ±20 °/с, шум 0,05 °/с ср. кв. при DLPFCFG = 2 и 0,005 °/с/√Гц, механические частоты X 30–36, Y 27–33, Z 24–30 кГц, данные 4–8000 Гц, установление нуля 30 мс; разд. 6.2 — акселерометр: ±2…±16 g, 16 384…2048 LSB/g, типовые допуск ±3 %, ноль ±50 мg (X, Y) и ±80 мg (Z), 400 мкg/√Гц, сноска 1 о типовом значении нуля после MSL3, данные 4–1000 Гц; разд. 6.3 — температура: типовые 340 LSB/°C, −521 LSB при 35 °C, линейность ±1 °C; типовые токи 3,6–3,9 мА, 500 мкА, 10–140 мкА, 5 мкА; VLOGIC не выше VDD; разд. 6.4 — I²C 100 и 400 кГц, адреса 1101000 и 1101001, VIH от 0,7·VLOGIC, VIL до 0,3·VLOGIC; разд. 6.5 — вход SCL и SDA до VLOGIC + 0,5 В; разд. 6.6 — PLL до 10 мс; разд. 6.7 — ёмкость шины до 400 пФ; разд. 6.9 — предельные режимы; 7.1 — выводы QFN-24; 7.3 — внешние конденсаторы; 7.4 — порядок включения; 7.9, 7.11, 7.17, 7.19 — DMP, вспомогательная шина, FIFO, датчик температуры кристалла; 9.2–9.3 — адрес и посылки I²C; 10.2 — уровни выводов MPU-6050 задаёт VLOGIC; 11.2 и 11.4.2–11.4.3 — корпус 4 × 4 × 0,9 мм с шагом 0,5 мм, центральную площадку не паять, дорожки под корпусом запрещены, частоты возбуждения 33, 30 и 27 кГц ± 3 кГц
  2. TDK InvenSense. MPU-6000 and MPU-6050 Register Map and Descriptions (RM-MPU-6000A-00, Revision 4.2, 19 августа 2013) — разд. 3 — карта регистров, значения после сброса 0x40 у PWR_MGMT_1 и 0x68 у WHO_AM_I; разд. 4 — запуск в режиме сна; 4.2 — Sample Rate = Gyroscope Output Rate / (1 + SMPLRT_DIV); 4.3 — таблица DLPF_CFG; 4.4 и 4.5 — FS_SEL и AFS_SEL; 4.6, 4.30, 4.31 — FIFO; 4.14–4.16 — прерывания и режим обхода; 4.17 и 4.19 — данные в дополнительном коде, чувствительность, пакетное чтение одного отсчёта; 4.18 — T = TEMP_OUT / 340 + 36,53; 4.27 — I2C_IF_DIS у MPU-6050 всегда 0; 4.28 — SLEEP, CLKSEL и рекомендация тактировать от гироскопа; 4.29 — режим малого потребления; 4.32 — WHO_AM_I
  3. TDK InvenSense. Поиск по сайту invensense.tdk.com, запрос «MPU-6050» (проверено 18 октября 2026) — находятся только PS-MPU-6000A-00 ред. 3.4 и RM-MPU-6000A-00 ред. 4.2 с датой обновления 2013-08-19 и темы форума; страницы продукта нет, отметки EOL или NRND нет
  4. TDK InvenSense. Старый адрес страницы продукта MPU-6050 (проверено 18 октября 2026) — перенаправляет на https://www.invensense.tdk.com/en-us/products/motion-tracking/6-axis/mpu-6050, который отвечает кодом 200 со страницей «Page Not Found | TDK InvenSense»

Нашли ошибку?