Помогите с I2c сенсорами.

Тема в разделе "Arduino & Shields", создана пользователем AlisherRobotRex, 19 мар 2018.

  1. У меня исправно работает дисплей по I2c и часы DS1307(потому что в setup прописал tim.period(1)), но акселерометр-гироскоп gy-521 mpu-6050 не работает: сначала показывает разные значения, потом значения зацикливаются. Как это исправить в коде? Проблема с адресами I2c устройств? Вот такой код акселерометра внедрил в общий код.
    Код (C++):
    #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 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;
    }
    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);
        Serial.print(" ");
        //Serial.print("Y:");
        Serial.print(kalAngleY);
        Serial.println(" ");
      // The accelerometer's maximum samples rate is 1kHz
    }
     
     
  2. Дисплей у меня OLED White 128*32
     
  3. Адрес у акселерометра по умолчанию 0x68 и у часов 0x68?
     
  4. ostrov

    ostrov Гуру

    Или адреса конфоиктуют или слишком большой трафик на шине для двух устройств.
     
  5. На шине 3 устроства
     
  6. И я к RTC часам обращаюсь через period
     
  7. Как узнать, какой адрес у DS1307?
     
  8. Похоже, адреса у них одинаковые
     

    Вложения:

    • DS1307.pdf
      Размер файла:
      387,8 КБ
      Просмотров:
      379
  9. Belkin

    Belkin Гик

    Там все написано, читаем внимательно.. ;)
     
  10. Там написано, нужно соединить с контактом питания. Это значит соединить с 5v?
     
  11. ostrov

    ostrov Гуру

    Перемычки обычно бывают на устройствах, которые следует коротить для комбинации адреса.
     
  12. Belkin

    Belkin Гик

    Наводящий вопрос: что есть "питание" ? ;)
     
  13. Belkin

    Belkin Гик

    В модуле DS1307 перемычек нет, адресный пин выведен наружу.
     
  14. Я не совсем понимаю, что такое контакт питания.
    Для изменения адреса gy-521 на 0x69 мне нужно соединить проводом AD0 с 5v на самой ардуино или можно с 5v линией для сенсоров?
     
  15. Belkin

    Belkin Гик

    Что такое "5v" ? ;)
     
  16. ostrov

    ostrov Гуру

    Ну на одном нет, на другом есть, впервые вижу, что растащить адреса такая уж проблема.
     
  17. Belkin

    Belkin Гик

    Кому как... ;)
    Тут некоторые понятия "5v" и "питание" в одно связать не могут, а тут - "растащить адреса" ! ;)
    Иностранцы повесятся при попытке перевода... ;)
     
  18. ostrov

    ostrov Гуру

    Кто юзал i2c, то эт знает что на разные устройства надо разные адреса, если они а одной шине, понятное дело. У меня вот в крайнем часы и 1602 на одной шине висят, работают отлично.
     
  19. Вроде подключил AD0 к 5v, поменял IMUAddress на 0x69, но не получилось исправить ситуацию