Могу ли я соединить DS3231 и MPU6050?
Можно ли соединить DS3231 и MPU6050 с помощью Arduino Mega 2560? Я подключил его:
MPU 6050 Arduino Mega 2560
SDA = SDA
SCL = SCL
GND = GND
VCC = 5V
И я подключил DS3231 к SDA и SCL рядом с выводом AREF:
DS3231 Arduino Mega 2560
SDA = SDA
SCL = SCL
GND = GND
VCC = 5V
Проблема в том, что когда я подключаю их оба, MPU6050 печатает nan, после открытия контакта DS3231 от arduino MPU6050 печатает правильные углы. Кто-нибудь может мне помочь?
Код:
#include "MPU6050.h"
#include "Wire.h"
#include <DS3231.h>
MPU6050 accelgyro;
int16_t ax, ay, az, gx, gy, gz;
DS3231 rtc(SDA, SCL);
double timeStep, time, timePrev;
double arx, ary, arz, grx, gry, grz, gsx, gsy, gsz, rx, ry, rz;
int i;
double gyroScale = 131;
void setup() {
Wire.begin();
accelgyro.initialize();
Serial.begin(9600);
rtc.begin();
}
void loop() {
timePrev = time;
time = millis();
timeStep = (time - timePrev) / 1000;
accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
gsx = gx/gyroScale; gsy = gy/gyroScale; gsz = gz/gyroScale;
arx = (180/3.141592) * atan(ax / sqrt(square(ay) + square(az)));
ary = (180/3.141592) * atan(ay / sqrt(square(ax) + square(az)));
arz = (180/3.141592) * atan(sqrt(square(ay) + square(ax)) / az);
if (i == 1) {
grx = arx;
gry = ary;
grz = arz;
}
else{
grx = grx + (timeStep * gsx);
gry = gry + (timeStep * gsy);
grz = grz + (timeStep * gsz);
}
rx = (0.1 * arx) + (0.9 * grx);
ry = (0.1 * ary) + (0.9 * gry);
rz = (0.1 * arz) + (0.9 * grz);
Serial.print("X axis == ");
Serial.println(arx);
Serial.print("Y axis == ");
Serial.println(ary);
Serial.print("Z axis == ");
Serial.println(arz);
Serial.println(rtc.getTimeStr());
i = i + 1;
delay(1000);
}
2 ответа
Библиотека DS3231, которую вы используете, работает (по какой-то странной причине) исключительно с собственной внутренней реализацией I2C. Это нельзя использовать на тех же контактах, что и аппаратная библиотека Wire, которую использует MPU6050.
Либо переместите DS3231 на другую пару контактов, либо найдите лучшую библиотеку DS3231, которая использует для связи библиотеку Wire.
Да. Используя i2c, вам нужно изменить адрес MPU6050, потому что по умолчанию используется (0x68), который также является значением по умолчанию и может использовать только адрес DS3231.
Пример изменения адреса из личного скетча:
MPU6050 mpu(0x69);
Попробуйте:
Ускоряющий гироскоп MPU6050 (0x69);
- Как разделить входящую строку?
- Как использовать SPI на Arduino?
- Как сбросить или отформатировать Arduino?
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Arduino Due vs Mega 2560
- Как получить уникальный идентификатор для всех плат Arduino?
- Почему я получаю avrdude: stk500v2_ReceiveMessage(): timeout error when uploading to Arduino Mega?
- Тайм-аут связи Arduino Mega с ошибкой программатора
запустить скетч сканера I2C, @Juraj
Какую библиотеку DS3231.h вы используете и почему указываете, какие контакты использовать? Это, вероятно, переводит его в программный режим I2C и ломает аппаратный I2C., @Majenko
Я использую этот DS3231, ссылка = http://www.rinkydinkelectronics.com/library.php?id=73..., @Abhrajeet Sarder
А как запустить сканер I2C, что это такое?, @Abhrajeet Sarder