Всем добрый день. Первый раз работаю с 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