Periphere Sensoren werden trotz funktionierender I2C Verbindung nicht erkannt

Hallo.
Ich hab einen MPU6050 und BMP280 über I2C mit einem Arduino Nano Every verbunden, jedoch spucken mir die Sensoren keine Werte raus.
Mittels I2C-Scanners hab ich schon überprüft ob die Sensoren überhaupt erkannt werden, und das ist der Fall. Trotzdem wollen die irgendwie nicht.

Welche Geschwindigkeit auf dem Bus?
Hast Du im Code eine Abfrage, ob die Sensoren ansprechbar sind?
(Also aus dem Scanner-Tool einfach übernehmen)

Und dann musst Du Code zeigen.
Für every ist @Doc_Arduino eigentlich Spezi :wink:

9600

Das ist die Abfrage ob die Sensoren erkannt werden:

 if(!bmp.begin()) {
    for(int i=0;i<15;i++)
    {
      tone(buzzer,NOTE_C7,100); //Alarm wenn BMP nicht erkannt wird
      delay(150);
      tone(buzzer,NOTE_A6,100);
      delay(100);
    }
    while(1);
  }
  if(!dmpReady) {
    for(int i=0;i<15;i++)
    {
     tone(buzzer,NOTE_C7,100); //Alarm wenn MPU nicht erkannt wird
     delay(150);
     tone(buzzer,NOTE_A6,100);
     delay(100);
    }
    while(1);
  }

Und die Initialisierung des MPU sieht folgendermaßen aus:

mpu.initialize();
pinMode(INTERRUPT_PIN, INPUT);
devStatus = mpu.dmpInitialize();

mpu.setXGyroOffset(136);
mpu.setYGyroOffset(804);
mpu.setZGyroOffset(96);
mpu.setZAccelOffset(1134);

 if (devStatus == 0) {
        mpu.CalibrateAccel(6);
        mpu.CalibrateGyro(6);
        mpu.PrintActiveOffsets();
        mpu.setDMPEnabled(true);

 attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), dmpDataReady, RISING);
        mpuIntStatus = mpu.getIntStatus();
 dmpReady = true;
 packetSize = mpu.dmpGetFIFOPacketSize();
                     }

Wenn dieser Teil im Programm enthalten ist, passiert garnichts, auch nicht die nachfolgende Überprüfung, die oben steht. Kommentiere ich den Teil hier aus, läuft das Programm bis zu dem Zeitpunkt, an dem mir der Alarm gegeben wird.

Zur Info - das gleiche Programm hab ich bereits auf einem Mega2560 probiert und da funktionierte es

Liegen dort die I2C Signale nicht auf anderen Pins? Ich vermute, daß Du irgendwas anderes noch auf diese Pins gelegt hast.

Oder zu lange Leitung I2C Scanner schafte noch aber danach ist Leitung TOD

Am Mega sind SDA/SCL auf D20/21, am Every auf A4/5, aber das hab ich ja beachtet, sonst hätte der I2C-Scanner ja keine Antwort gegeben

Die Leitungen laufen über ein PCB, die I2C Bahnen sind nicht länger als 7cm und eigentlich auch ausreichend groß dimensioniert und so gerade verlaufend wie möglich

Ich vermutete auch hier das Problem, hab dann aber eine Drahtbrücke von den Sensoren zum Every angelötet um sicher zu gehen, dass nicht die Leiterbahnen schuld sind, aber das hat auch nicht funktioniert

Hast Du PullUp-Widerstände dran?

Gruß Tommy

BME, BMP 280 haben 10K PullUp-Widerstände am SDA und SCL

Gruß
Bernhard

Nicht zwingend.

Gruß Tommy

nein hab keine PullUp-Widerstände extra mitverbaut

Zwischen SDA und SCL messe ich einen Widerstand von 3,6kOhm

@ flets

Nicht zwischen SDA und SCL sondern zwischen SDA und +5V bzw SCL und +5V.

Ansonsten wären es plausible Werte.

Grüße Uwe

Die Sensoren sind am 3,3V Pin angeschlossen, messe hier aber jeweils 5,8kOhm

Und was sagt der Compiler? alles "Schwarz"?
Den das ist anormal
Gruß
Bernhard

Stopp warum nicht an 5 V ?
Oder haste 3,3V Sensoren ?

Hallo,

zeichne einmal bitte genau auf was du wie und wo angeschlossen hast und zeige möglichst einen reduzierten Code der aber noch das Problem zeigt.
Weil oben fehlt mir die I2C Adresse und die Interrupt Routine.
Links zu den Sensoren sind auch nicht falsch, wegen der 3,3V Geschichte.

Am sichersten ist die Messung des Kurzschlußstroms von SCL/SDA gegen GND. Damit erfaßt man alle Pullups auf allen angeschlossenen Modulen. Da dürfen bis zu 3mA rauskommen, mindestens 0,5mA.

Siehe oben, mit der Strommessung bekommt man alle mit.

Aber ob ein 3,3V Sensor auch 5V SCL/SDA verträgt, das steht in den Sternen oder im Datenblatt. Welche Spannung bekommst Du denn im Leerlauf, die 5V vom Nano oder 3,3V vom Sensor? Zumindest kann das ein Problem bei der Datenübertragung sein. Ich würde da sicherheitshalber einen I2C Level Shifter dazwischenhängen.

MPU: https://www.az-delivery.de/products/gy-521-6-achsen-gyroskop-und-beschleunigungssensor#description

BMP: https://www.az-delivery.de/products/azdelivery-bmp280-barometrischer-sensor-luftdruck-modul-fur-arduino-und-raspberry-pi?_pos=2&_sid=81eeffdc4&_ss=r

Hier der Anschluss der Sensoren - korrespondierend für den Every und den BMP280 hier der Nano und BMP180

Dieselben Sensoren hab ich schon oft in anderen Versionen verbaut - ebenfalls immer an 3,3V angeschlossen, und bis jetzt hat es immer einwandfrei funktioniert

Adafruit_BMP280 bmp;
MPU6050 mpu;

#define MPU6050_ADDR              0x68
#define MPU6050_ACCEL_CONFIG      0x1C 
#define MPU6050_PWR_MGT_1         0x6B 
#define MPU6050_INT_PIN_CFG       0x37 
#define MPU6050_INT_ENABLE        0x38 
#define MPU6050_LATCH_INT_EN      0x05  
#define MPU6050_ACTL              0x07 
#define MPU6050_WOM_EN            0x06 
#define MPU6050_WOM_THR           0x1F 
#define MPU6050_MOT_DUR           0x20 
#define MPU6050_ACCEL_INTEL_CTRL  0x69 
#define MPU6050_SIGNAL_PATH_RESET 0x68 
#define INTERRUPT_PIN 2

#define BMP_SCK  (13)
#define BMP_MISO (12)
#define BMP_MOSI (11)
#define BMP_CS   (10)

byte interruptPin = 3;

volatile bool mpuInterrupt = false; 
bool dmpReady = false;
uint8_t mpuIntStatus;   
uint8_t devStatus;      
uint16_t packetSize;    
uint16_t fifoCount;     
uint8_t fifoBuffer[64]; 


Und der eigentliche Teil an dem das Programm hängen bleibt:

*mpu.initialize();
pinMode(INTERRUPT_PIN, INPUT);
devStatus = mpu.dmpInitialize();

mpu.setXGyroOffset(136);
mpu.setYGyroOffset(804);
mpu.setZGyroOffset(96);
mpu.setZAccelOffset(1134);

 if (devStatus == 0) {
        mpu.CalibrateAccel(6);
        mpu.CalibrateGyro(6);
        mpu.PrintActiveOffsets();
        mpu.setDMPEnabled(true);

 attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), dmpDataReady, RISING);
        mpuIntStatus = mpu.getIntStatus();
 dmpReady = true;
 packetSize = mpu.dmpGetFIFOPacketSize();
                     }

Hallo,

der BMP280 verträgt an Ub und an seinen I/Os nur 3,3V.

Das MPU6050 Board hat einen Spannungsregler drauf. Kann man mit 5V betrieben. Aber die I/Os vertragen dennoch nur 3,3V. Solche Mischmaschplatinen sind eigentlich Mist und Irreführend. Denn das dort verlinkte Datenblatt bezieht sich rein auf den MPU. Vom Board gibts keine klare Beschreibung. Oder kennt die jemand? Allerdings zeigt das AZ-Delivery Connection Diagramm den reinen Betrieb an 5V. Ich weiß ehrlich gesagt nicht was ich davon halten soll. Ich weiß nicht was das Board sonst noch drauf hat.

Ich würde Levelshifter verwenden.

Tja und dann fehlt noch die Interrupt Routine für "dmpDataReady".
Wenn die fehlt macht das Programm Bockmist.

attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), dmpDataReady, RISING);

Übrigens, wenn das dein kompletter Code ist fehlt noch viel mehr.

Sowas hier ist auch sehr schnell Irreführend.

#define INTERRUPT_PIN 2
byte interruptPin = 3;