Вопрос по датчику GY-521

Mdeme
Offline
Зарегистрирован: 15.09.2017

Доброго времени, пришол датчик GY-521. 
Подключил всё по схеме, библиотеку подключил, код скопировал (для теста), но ардуино словно игнорирует датчик.  
В COM числа просто набираются и при достижении X:271 Y:272 постоянно  выводит это значение, что бы я не делал с датчиком. Может я кривой или ещё, что. Подскажите пожалуйста. 

Подключал по схеме для Arduino(UNO),  но использовал  Arduino nano:

Gy-521 (mpu6050) Arduino(UNO)
VCC 3.3 V
GND GND
SCL A5
SDA A4



#include <Wire.h>
#include "Kalman.h"
Kalman kalmanX;
Kalman kalmanY;
uint8_t IMUAddress = 0x68;
/* IMU Data */
int16_t accX;
int16_t accY;
int16_t accZ;
int16_t tempRaw;
int16_t gyroX;
int16_t gyroY;
int16_t gyroZ;
double accXangle; // Angle calculate using the accelerometer
double accYangle;
double temp;
double gyroXangle = 180; // Angle calculate using the gyro
double gyroYangle = 180;
double compAngleX = 180; // Calculate the angle using a Kalman filter
double compAngleY = 180;
double kalAngleX; // Calculate the angle using a Kalman filter
double kalAngleY;
uint32_t timer;
void setup() {
  Wire.begin();
  Serial.begin(9600);
  i2cWrite(0x6B,0x00); // Disable sleep mode      
  kalmanX.setAngle(180); // Set starting angle
  kalmanY.setAngle(180);
  timer = micros();
}
void loop() {
  /* Update all the values */
  uint8_t* data = i2cRead(0x3B,14);
  accX = ((data[0] << 8) | data[1]);
  accY = ((data[2] << 8) | data[3]);
  accZ = ((data[4] << 8) | data[5]);
  tempRaw = ((data[6] << 8) | data[7]);
  gyroX = ((data[8] << 8) | data[9]);
  gyroY = ((data[10] << 8) | data[11]);
  gyroZ = ((data[12] << 8) | data[13]);
  /* Calculate the angls based on the different sensors and algorithm */
  accYangle = (atan2(accX,accZ)+PI)*RAD_TO_DEG;
  accXangle = (atan2(accY,accZ)+PI)*RAD_TO_DEG;  
  double gyroXrate = (double)gyroX/131.0;
  double gyroYrate = -((double)gyroY/131.0);
  gyroXangle += kalmanX.getRate()*((double)(micros()-timer)/1000000); // Calculate gyro angle using the unbiased rate
  gyroYangle += kalmanY.getRate()*((double)(micros()-timer)/1000000);
  kalAngleX = kalmanX.getAngle(accXangle, gyroXrate, (double)(micros()-timer)/1000000); // Calculate the angle using a Kalman filter
  kalAngleY = kalmanY.getAngle(accYangle, gyroYrate, (double)(micros()-timer)/1000000);
  timer = micros();
Serial.println();
    Serial.print("X:");
    Serial.print(kalAngleX,0);
    Serial.print(" ");
    Serial.print("Y:");
    Serial.print(kalAngleY,0);
    Serial.println(" ");
  // The accelerometer's maximum samples rate is 1kHz
}
void i2cWrite(uint8_t registerAddress, uint8_t data){
  Wire.beginTransmission(IMUAddress);
  Wire.write(registerAddress);
  Wire.write(data);
  Wire.endTransmission(); // Send stop
}
uint8_t* i2cRead(uint8_t registerAddress, uint8_t nbytes) {
  uint8_t data[nbytes];
  Wire.beginTransmission(IMUAddress);
  Wire.write(registerAddress);
  Wire.endTransmission(false); // Don't release the bus
  Wire.requestFrom(IMUAddress, nbytes); // Send a repeated start and then release the bus after reading
  for(uint8_t i = 0; i < nbytes; i++)
    data [i]= Wire.read();
  return data;
}

 

 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

попробуйте адрес 0x69

Mdeme
Offline
Зарегистрирован: 15.09.2017

Тот же результат. 
Так же при обоих адресах постоянно горит индикатор TX (красным). 

sadman41
Offline
Зарегистрирован: 19.10.2016

Не надо подключать на Arduino Nano (UNO, Mini Pro, etc) датчики на 3.3V, если на ней нет отдельного стабилизатора. Пациент будет скорее мертв, чем жив.

Еще есть такой замечательный скетч: I2C Scanner.

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015
Mdeme
Offline
Зарегистрирован: 15.09.2017

На датчике горит синий диод, я так пологаю он по мимо индикации служит и предохранителем. 

Mdeme
Offline
Зарегистрирован: 15.09.2017

Так же  на платке Arduino у меня есть выход  3V3.

sadman41
Offline
Зарегистрирован: 19.10.2016

Mdeme пишет:

Так же  на платке Arduino у меня есть выход  3V3.

На нем написано, что он для питания датчиков?

Mdeme
Offline
Зарегистрирован: 15.09.2017

А где ты там поместишь целое предложение ? :)

Mdeme
Offline
Зарегистрирован: 15.09.2017

После того как залил пробный скетч, и зашёл в COM получил всё по -1, кроме температуры. 

sadman41
Offline
Зарегистрирован: 19.10.2016

Мне - незачем. Совет вам дан. Распорядитесь ли вы им с умом - дело ваше. 

Mdeme
Offline
Зарегистрирован: 15.09.2017

За совет спасибо, но стабилизотра под рукой нету никакого. 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Mdeme пишет:

За совет спасибо, но стабилизотра под рукой нету никакого. 

Понижающего/повышающего модуля китайчатского тоже нет?

Mdeme
Offline
Зарегистрирован: 15.09.2017

Попробовал I2C, он не видит платку, я так думаю стоит перепаять контакры... 

sadman41
Offline
Зарегистрирован: 19.10.2016

Покажите фото модуля со стороны деталей. Только не наводите резкость на свои носки вместо GY-шки.

Mdeme
Offline
Зарегистрирован: 15.09.2017

Вот, держите, извиняюсь за качество пайки, флюса под рукой нет, приходится возится с канифолью. 

https://drive.google.com/open?id=1T-3TZ9a3vXBQpH5f7o0i6SUk-ey62TWH

sadman41
Offline
Зарегистрирован: 19.10.2016

Похоже, что стаб на нем есть. В интернетах такие же на +5V подключают. На странице продавца стоит "Питание - 3..5V"? Если да, то запитайте от пяти вольт.

Mdeme
Offline
Зарегистрирован: 15.09.2017

Уже пробовал ему без разницы от чего питаться, похоже в контактах дело, датчик всё считывает, но не передаёт на ардуино сигнал, попробую перепаять. 
P.S. теоретически, практически сейчас проверим. 

sadman41
Offline
Зарегистрирован: 19.10.2016

С чего вы решили, что он считывает? 

Mdeme
Offline
Зарегистрирован: 15.09.2017

Один раз показания проскачили, но если это не так, то буду открывать спор с продавцом, ну и пытаться воскресить это чудо. 

sadman41
Offline
Зарегистрирован: 19.10.2016

Найдите datasheet на чип, там разрисованы его ноги. Пищалкой проверьте - ноги с пинами уверенно соединены или нет.

Mdeme
Offline
Зарегистрирован: 15.09.2017

Да, дело было в контакте,  вот только я так и не понял "прикол" того скетча который я указал в самом начале, он у меня то же саоме выдаёт, а вот этот скетч работает.  Может Кто объяснит по какому принцыпу работает код который я писал в самом начале ? (в вопросе)

 

Рабочий код:

 #include <Wire.h>

const int MPU_addr = 0x68; // I2C address of the MPU-6050
int16_t AcX, AcY, AcZ, Tmp, GyX, GyY, GyZ;

void setup() {
  Serial.begin(115200);
  Wire.begin();
  Wire.beginTransmission(MPU_addr);
  Wire.write(0x6B); // PWR_MGMT_1 register
  Wire.write(0);    // set to zero (wakes up the MPU-6050)
  Wire.endTransmission(true);
}

void loop() {
  Wire.beginTransmission(MPU_addr);
  Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(MPU_addr, 14, true); // request a total of 14 registers

  AcX = Wire.read() << 8 | Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
  AcY = Wire.read() << 8 | Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
  AcZ = Wire.read() << 8 | Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
  Tmp = Wire.read() << 8 | Wire.read(); // 0x41 (TEMP_OUT_H)  & 0x42 (TEMP_OUT_L)
  GyX = Wire.read() << 8 | Wire.read(); // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
  GyY = Wire.read() << 8 | Wire.read(); // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
  GyZ = Wire.read() << 8 | Wire.read(); // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)

  Serial.print("AcX = "); Serial.print(AcX);
  Serial.print(" | AcY = "); Serial.print(AcY);
  Serial.print(" | AcZ = "); Serial.print(AcZ);
  Serial.print(" | Tmp = "); Serial.print(Tmp / 340.00 + 36.53); // temperature in degrees C from datasheet
  Serial.print(" | GyX = "); Serial.print(GyX);
  Serial.print(" | GyY = "); Serial.print(GyY);
  Serial.print(" | GyZ = "); Serial.println(GyZ);

  delay(500);
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Перед return в строке 75 сделайте вывод всего массива data. И перед строкой 35 тоже самое сделаете. Сразу и узнаете что у вас прилетает из функции.