Пустой монитор порта. MPU6050

Всем добрый день. Первый раз работаю с MPU6050. Нашёл такой код:

// Определяем I2C адрес MPU6050

#define MPU_ADDR 0x68

// Переменные для хранения сырых данных

int16_t accelX, accelY, accelZ;

int16_t gyroX, gyroY, gyroZ;

void setup() {

// Инициализируем последовательный порт

Serial.begin(9600);

// Инициализируем I2C (Wire) в качестве Master

TWBR = 72; // Устанавливаем скорость I2C в 100 кГц (для 16 МHz Arduino Uno)

// Для 5V/16MHz: TWBR = 72. Для 3.3V/8MHz: можно попробовать 12.

TWSR |= (1 << TWPS0); // Делитель (Prescaler) = 4

// Функция пробуждения MPU6050

i2c_write(MPU_ADDR, 0x6B, 0x00);

}

void loop() {

// Читаем данные акселерометра

readAccel();

// Читаем данные гироскопа

readGyro();

// Выводим данные в Serial Monitor

Serial.print("A: ");

Serial.print(accelX); Serial.print(", ");

Serial.print(accelY); Serial.print(", ");

Serial.print(accelZ);

Serial.print(" | G: ");

Serial.print(gyroX); Serial.print(", ");

Serial.print(gyroY); Serial.print(", ");

Serial.println(gyroZ);

delay(500); // Задержка между измерениями

}

// Функция для записи одного байта в регистр по I2C

void i2c_write(uint8_t devAddr, uint8_t regAddr, uint8_t data) {

// Начало передачи

TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);

while (!(TWCR & (1 << TWINT)));

// Отправка адреса устройства + бит записи (0)

TWDR = (devAddr << 1) | 0x00;

TWCR = (1 << TWINT) | (1 << TWEN);

while (!(TWCR & (1 << TWINT)));

// Отправка адреса регистра

TWDR = regAddr;

TWCR = (1 << TWINT) | (1 << TWEN);

while (!(TWCR & (1 << TWINT)));

// Отправка данных

TWDR = data;

TWCR = (1 << TWINT) | (1 << TWEN);

while (!(TWCR & (1 << TWINT)));

// Стоп-условие

TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN);

delayMicroseconds(100);

}

// Функция для чтения нескольких байтов из регистра по I2C

void i2c_read(uint8_t devAddr, uint8_t regAddr, uint8_t* data, uint8_t length) {

// Начало передачи для указания регистра

TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);

while (!(TWCR & (1 << TWINT)));

// Отправка адреса устройства + бит записи (0)

TWDR = (devAddr << 1) | 0x00;

TWCR = (1 << TWINT) | (1 << TWEN);

while (!(TWCR & (1 << TWINT)));

// Отправка адреса регистра, который хотим прочитать

TWDR = regAddr;

TWCR = (1 << TWINT) | (1 << TWEN);

while (!(TWCR & (1 << TWINT)));

// Повторный старт

TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);

while (!(TWCR & (1 << TWINT)));

// Отправка адреса устройства + бит чтения (1)

TWDR = (devAddr << 1) | 0x01;

TWCR = (1 << TWINT) | (1 << TWEN);

while (!(TWCR & (1 << TWINT)));

// Чтение данных

for (uint8_t i = 0; i < length; i++) {

if (i == length - 1) {

  // Последний байт - отправляем NACK

  TWCR = (1 << TWINT) | (1 << TWEN);

} else {

  // Не последний байт - отправляем ACK

  TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWEA);

}

while (!(TWCR & (1 << TWINT)));

data\[i\] = TWDR;

}

// Стоп-условие

TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN);

delayMicroseconds(100);

}

void readAccel() {

uint8_t rawData[6]; // Буфер для 6 байт данных (X, Y, Z)

i2c_read(MPU_ADDR, 0x3B, rawData, 6); // Читаем начиная с регистра 0x3B

// Объединяем старший и младший байты в одно 16-битное целое

accelX = (rawData[0] << 8) | rawData[1];

accelY = (rawData[2] << 8) | rawData[3];

accelZ = (rawData[4] << 8) | rawData[5];

}

void readGyro() {

uint8_t rawData[6]; // Буфер для 6 байт данных (X, Y, Z)

i2c_read(MPU_ADDR, 0x43, rawData, 6); // Читаем начиная с регистра 0x43

// Объединяем старший и младший байты

gyroX = (rawData[0] << 8) | rawData[1];

gyroY = (rawData[2] << 8) | rawData[3];

gyroZ = (rawData[4] << 8) | rawData[5];

float ax_g = accelX / 16384.0;

float gz_dps = gyroZ / 131.0;

}

Должен быть вывод в монитор порта. Загрузилось всё без проблем. Открываю Serial Monitor - пусто. Скажите пожалуйста, с чем это может быть связано+как решить? С ардуино работаю не так давно, могу спрашивать очевидное.

Плата Mega 2560

Попробуйте сначала прочитать, что вам пишут в окне ввода.

Посмотрел, ещё попробовал другой скетч, заработал.

#include <Wire.h> // Используем встроенную библиотеку для I2C

#define MPU_ADDR 0x68

// Переменные для хранения сырых данных
int16_t accelX, accelY, accelZ;
int16_t gyroX, gyroY, gyroZ;

void setup() {
  Serial.begin(9600);
  while (!Serial); // Ожидаем, пока откроется Serial Monitor (для Arduino Leonardo, Micro)

  Wire.begin();        // Инициализация I2C в качестве Master
  Wire.setClock(100000); // Устанавливаем скорость 100 кГц

  // Настройка MPU6050
  Wire.beginTransmission(MPU_ADDR); // Начинаем передачу к устройству
  Wire.write(0x6B);                 // Обращаемся к регистру 0x6B (PWR_MGMT_1)
  Wire.write(0x00);                 // Записываем 0 для "пробуждения"
  Wire.endTransmission(true);       // Завершаем передачу

  // Небольшая задержка для инициализации датчика
  delay(100);
}

void loop() {
  readAccel();
  readGyro();

  Serial.print("A: ");
  Serial.print(accelX); Serial.print(", ");
  Serial.print(accelY); Serial.print(", ");
  Serial.print(accelZ);
  Serial.print(" | G: ");
  Serial.print(gyroX); Serial.print(", ");
  Serial.print(gyroY); Serial.print(", ");
  Serial.println(gyroZ);

  delay(500);
}

void readAccel() {
  Wire.beginTransmission(MPU_ADDR);
  Wire.write(0x3B); // Указываем на первый регистр данных акселерометра
  Wire.endTransmission(false); // false означает, что мы отправляем повторный старт
  Wire.requestFrom(MPU_ADDR, 6, true); // Запрашиваем 6 байт и отпускаем шину (true)

  // Читаем данные. Каждое значение - 2 байта (старший и младший)
  accelX = Wire.read() << 8 | Wire.read();
  accelY = Wire.read() << 8 | Wire.read();
  accelZ = Wire.read() << 8 | Wire.read();
}

void readGyro() {
  Wire.beginTransmission(MPU_ADDR);
  Wire.write(0x43); // Указываем на первый регистр данных гироскопа
  Wire.endTransmission(false);
  Wire.requestFrom(MPU_ADDR, 6, true);

  gyroX = Wire.read() << 8 | Wire.read();
  gyroY = Wire.read() << 8 | Wire.read();
  gyroZ = Wire.read() << 8 | Wire.read();
}

“Молодцом”(с)

ты бы в начальном посту поправил код, ну невозможно смотреть

Жаль, что ТС так и не разобрался