Teensy SDA1 und SCL1 auslesen

Hallo, ich benutze momentan den Teensy 3.2 und möchte auf den zweiten Bus zugreifen. Also über die Pins SDA1 und SCL1. Dafür füge ich den zweiten Bus im Code über Wire1 hinzu. Jedoch musste ich bei der Ausgabe der Messwerte feststellen, dass die Messwerte von Sensor 2 über den ersten Bus genau dieselben waren, wie die Messwerte vom Sensor 3 über den zweiten Bus.
Woran kann das liegen bzw. kann mir jemand helfen, das Problem zu lösen und sagen, wie ich beim Teensy auf den zweiten Bus zugreife?

Das Problem ist vermutlich dort, wo du nicht hinschaust!

Meine Glaskugel sagt:
Deine geheime Lib, für deinen geheimen Sensor, arbeitet intern mit Wire und nicht mit Wire1.

Auch der geheime Sketch hilft nicht bei der Fehlersuche.

Hier ist der Code!

#include "I2Cdev.h"
#include "MPU6050.h"
#include "Wire.h"

extern TwoWire Wire1;

const int MPU_addr1=0x68,MPU_addr2=0x69,MPU_addr3=0x68;

MPU6050 accelgyro1(MPU_addr1);
MPU6050 accelgyro2(MPU_addr2);
MPU6050 accelgyro3(MPU_addr3);

int16_t ax1, ay1, az1, gx1, gy1, gz1;
int16_t ax2, ay2, az2, gx2, gy2, gz2;
int16_t ax3, ay3, az3, gx3, gy3, gz3;


double timeStep, time, timePrev;
double arx1, ary1, arz1, grx1, gry1, grz1, gsx1, gsy1, gsz1, rx1, ry1, rz1;
double arx2, ary2, arz2, grx2, gry2, grz2, gsx2, gsy2, gsz2, rx2, ry2, rz2;
double arx3, ary3, arz3, grx3, gry3, grz3, gsx3, gsy3, gsz3, rx3, ry3, rz3;

int i;
double gyroScale = 131;

void setup() {

  Wire.begin(MPU_addr1);
  Wire.begin(MPU_addr2);
  Wire1.begin(MPU_addr3);
  Serial.begin(9600);
  accelgyro1.initialize();
  accelgyro2.initialize();
  accelgyro3.initialize();
    
  time = millis();

  i = 1;

}

void loop() {  
  
 //set up time for integration
  timePrev = time;
  time = millis();
  timeStep = (time - timePrev)/1000;//time-step in s

 //collect readings
  accelgyro1.getMotion6(&ax1, &ay1, &az1, &gx1, &gy1, &gz1);
  accelgyro2.getMotion6(&ax2, &ay2, &az2, &gx2, &gy2, &gz2);
  accelgyro2.getMotion6(&ax3, &ay3, &az3, &gx3, &gy3, &gz3);

 //apply gyro scale from datasheet
  gsx1 = gx1/gyroScale;   gsy1 = gy1/gyroScale;   gsz1 = gz1/gyroScale;
  gsx2 = gx2/gyroScale;   gsy2 = gy2/gyroScale;   gsz2 = gz2/gyroScale;
  gsx3 = gx3/gyroScale;   gsy3 = gy3/gyroScale;   gsz3 = gz3/gyroScale;

 //calculate accelerometer angles
  ary1 = -(180/3.141592) * atan(ax1/sqrt((ay1*ay1) + (az1*az1))); 
  arx1 =  (180/3.141592) * atan(ay1/sqrt((ax1*ax1) + (az1*az1)));

  ary2 = -(180/3.141592) * atan(ax2/sqrt((ay2*ay2) + (az2*az2))); 
  arx2 =  (180/3.141592) * atan(ay2/sqrt((ax2*ax2) + (az2*az2)));

  ary3 = -(180/3.141592) * atan(ax3/sqrt((ay3*ay3) + (az3*az3))); 
  arx3 =  (180/3.141592) * atan(ay3/sqrt((ax3*ax3) + (az3*az3)));
  
 // arz1 = (180/PI) * atan(sqrt((ay1*ay1)+(ax1*ax1))/az1);
 
 //set initial values equal to accel values
   if (i == 1) {
    grx1 = arx1;
    gry1 = ary1;
    grz1 = arz1;

    grx2 = arx2;
    gry2 = ary2;
    grz2 = arz2;

    grx3 = arx3;
    gry3 = ary3;
    grz3 = arz3;
  }
 //integrate to find the gyro angle
  else{
    grx1 = rx1 + (timeStep * gsx1);
    gry1 = ry1 + (timeStep * gsy1);
    grz1 = rz1 + (timeStep * gsz1);

    grx2 = rx2 + (timeStep * gsx2);
    gry2 = ry2 + (timeStep * gsy2);
    grz2 = rz2 + (timeStep * gsz2);

    grx3 = rx3 + (timeStep * gsx3);
    gry3 = ry3 + (timeStep * gsy3);
    grz3 = rz3 + (timeStep * gsz3);
  }  

 //apply filter
  rx1 = (0.01 * arx1) + (0.99 * grx1);
  ry1 = (0.01 * ary1) + (0.99 * gry1);
  rz1 = (0.01 * arz1) + (0.99 * grz1);

  rx2 = (0.01 * arx2) + (0.99 * grx2);
  ry2 = (0.01 * ary2) + (0.99 * gry2);
  rz2 = (0.01 * arz2) + (0.99 * grz2);

  rx3 = (0.01 * arx3) + (0.99 * grx3);
  ry3 = (0.01 * ary3) + (0.99 * gry3);
  rz3 = (0.01 * arz3) + (0.99 * grz3);

  // print result
  //Serial.print(i);   Serial.print("\t");
  //Serial.print(timePrev);   Serial.print("\t");
  //Serial.print(time);   Serial.print("\t");
  //Serial.print(timeStep, 5);   Serial.print("\t\t");
  //Serial.print(ax1);   Serial.print("\t");
  //Serial.print(ay1);   Serial.print("\t");
  //Serial.print(az1);   Serial.print("\t\t");
  //Serial.print(gx1);   Serial.print("\t");
  //Serial.print(gy1);   Serial.print("\t");
  //Serial.print(gz1);   Serial.print("\t\t");
  //Serial.print(arx1);   Serial.print("\t");
  //Serial.print(ary1);   Serial.print("\t");
  //Serial.print(arz1);   Serial.print("\t\t");
  //Serial.print(grx1);   Serial.print("\t");
  //Serial.print(gry1);   Serial.print("\t");
  //Serial.print(grz1);   Serial.print("\t\t");
  
//  Serial.println("SENSOR1-----------------------------------------------------");
  Serial.print(rx1);   
  Serial.print(",");
  Serial.print(ry1);  
  Serial.print(",");
  Serial.print(rz1);
  Serial.print(",");
   
 // Serial.println("SENSOR2-----------------------------------------------------");
  Serial.print(rx2);  
  Serial.print(",");
  Serial.print(ry2);   
  Serial.print(",");
  Serial.print(rz2);
  Serial.print(",");
  
  //Serial.println("SENSOR3-----------------------------------------------------");
  Serial.print(rx3);  
  Serial.print(",");
  Serial.print(ry3);   
  Serial.print(",");
  Serial.println(rz3);
  
  i = i + 1;
  
   }
Wire.begin(MPU_addr1);
  Wire.begin(MPU_addr2);
  Wire1.begin(MPU_addr3);

Wieso inizialisierst Du 2x Wire?

Wo im Sketch bentzt Du denn die Schnittstellen?

Wire.begin(MPU_addr1);

Wire.begin(MPU_addr2);
Wire1.begin(MPU_addr3);

Seit wann bekommt Wire.begin() die Adresse des auszulesenden Slave übergeben?
Nein, das ist keine gute Idee!

Wire.begin(MPU_addr1);

Richtig;
So definierst Du den Teensy als Slave und nicht als Master.
Grüße Uwe

Das

extern TwoWire Wire1;

gehört da auch nicht hin, das sollte schon in Wire.h deklariert sein.

In den Teensy Beispielen sehe ich immer nur ein

#include <Wire.h>

oder ersatzweise ein

#include <i2c_t3.h>

letzteres ist eine zu Wire kompatible alternative Bibliothek.

ArduFE:

#include <i2c_t3.h>

letzteres ist eine zu Wire kompatible alternative Bibliothek.

Ja das habe ich auch vorher schon im Internet gefunden. Leider hat dies auch nicht ganz richtig funktioniert.

uwefed:

Wire.begin(MPU_addr1);

Wire.begin(MPU_addr2);
  Wire1.begin(MPU_addr3);




Wieso inizialisierst Du 2x Wire?

Ja, ich weiß das ist unnötig. Ich hatte nur etwas rumprobiert und versucht das Problem irgendwie zu lösen.

combie:
Seit wann bekommt Wire.begin() die Adresse des auszulesenden Slave übergeben?
Nein, das ist keine gute Idee!

Ja du hast recht. Wenn ich den Teensy als Master definiere, um die Sensoren anzusteuern muss das weg oder?
Vorher hatte ich die Adressen auch nicht drin stehen, aber wie es aussieht macht es bei der Ausgabe später keinen Unterscheid für die Messwerte. Oder was sagt deine Kristallkugel dazu?

Oder was sagt deine Kristallkugel dazu?

Dafür benötige ich keine Kristallkugel ..

Ich weiß, dass die Slave Adresse eindeutig sein muss.
Es darf pro Bus nur einen geben.
Und du ignorierst das.

combie:
Dafür benötige ich keine Kristallkugel ..

Ich weiß, dass die Slave Adresse eindeutig sein muss.
Es darf pro Bus nur einen geben.
Und du ignorierst das.

Okay also einfach nur Wire.begin(); und Wire1.begin(); ohne die Adressen? Leider ändert das nichts und das Problem besteht weiterhin :confused:
Trotzdem danke für die Antwort

Leider ändert das nichts und das Problem besteht weiterhin :confused:

Natürlich nicht!

Nur dadurch, dass man einen Fehler behebt, ist der zweite dennoch noch da.
Du wirst auch dein eigentliches Problem angehen müssen.

ArduFE:

#include <i2c_t3.h>

letzteres ist eine zu Wire kompatible alternative Bibliothek.

Wenn ich #include <Wire.h> durch #include <i2c_t3.h> bekomme ich folgende Fehlermeldung:

In file included from C:\Users\Desktop\Arduino-Code\Projekt\sketch_jul17a\sketch_jul17a.ino:4:0:

C:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\i2c_t3/i2c_t3.h:998:15: error: conflicting declaration 'i2c_t3 Wire'

 extern i2c_t3 Wire;

               ^

In file included from C:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\Wire/Wire.h:29:0,

                 from C:\Users\Documents\Arduino\libraries\MPU6050\src/I2Cdev.h:85,

                 from C:\Users\Desktop\Arduino-Code\Projekt\sketch_jul17a\sketch_jul17a.ino:1:

C:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\Wire/WireKinetis.h:216:16: note: previous declaration as 'TwoWire Wire'

 extern TwoWire Wire;

                ^

In file included from C:\Users\Desktop\Arduino-Code\Projekt\sketch_jul17a\sketch_jul17a.ino:4:0:

C:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\i2c_t3/i2c_t3.h:1000:19: error: conflicting declaration 'i2c_t3 Wire1'

     extern i2c_t3 Wire1;

                   ^

In file included from C:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\Wire/Wire.h:29:0,

                 from C:\Users\Documents\Arduino\libraries\MPU6050\src/I2Cdev.h:85,

                 from C:\Users\Desktop\Arduino-Code\Projekt\sketch_jul17a\sketch_jul17a.ino:1:

C:\Program Files (x86)\Arduino\hardware\teensy\avr\libraries\Wire/WireKinetis.h:219:16: note: previous declaration as 'TwoWire Wire1'

 extern TwoWire Wire1;

                ^

Fehler beim Kompilieren für das Board Teensy 3.2 / 3.1.

Ich bin jetzt nicht so der Teensy Held…
Aber das Problem ist mir durchaus bekannt, von anderen µC

Und deswegen kann ich dir sagen: Du buddelst auf der falschen Baustelle.

Veränderungen an Wire bringen dich nicht weiter.
i2c_t3 bringt dich nicht weiter.
Alles falsche Baustelle…

Das Problem ist weiterhin hier:

Deine geheime Lib, für deinen geheimen Sensor, arbeitet intern mit Wire und nicht mit Wire1.

combie:
Das Problem ist weiterhin hier:

Ich denke nicht, dass das das Problem ist, denn ich habe dasselbe Problem auch mit anderem Code, in dem ich die Lib für den Sensor nicht benutze.

Ich denke nicht, dass das das Problem ist, ........

Ok...

Dazu sagt meine Glaskugel:
Dann wirds doch noch etwas länger mit dir dauern.


denn ich habe dasselbe Problem

Welches?

, dass die Messwerte von Sensor 2 über den ersten Bus genau dieselben waren, wie die Messwerte vom Sensor 3 über den zweiten Bus.

Dieses?

Dann höre auf meine Glaskugel!
Die ist recht gut.
Offensichtlich viel besser, als deine Intuition.

Man kann immer nur entweder i2c_t3 oder Wire benutzen. Wenn diese Fehlermeldung kommt, wird beides verwendet.

Damit sind wir wieder am Anfang. Wie combie schon vermutete verwendet deine Library intern irgendwo Wire.

ArduFE:
Man kann immer nur entweder i2c_t3 oder Wire benutzen. Wenn diese Fehlermeldung kommt, wird beides verwendet.

Damit sind wir wieder am Anfang. Wie combie schon vermutete verwendet deine Library intern irgendwo Wire.

Okay mist, ja das kann natürlich sein.

Hier ist mal ein Link zu der Lib, die ich verwende. Habe da leider nichts von wire gefunden und wüsste auch nicht was ich ändern sollte. Der gesamte Code baut ja leider auf der Lib auf.

Marvikov:
Habe da leider nichts von wire gefunden und wüsste auch nicht was ich ändern sollte.

Offensichtlich hier in i2cdevlib/Arduino/I2Cdev/I2Cdev.h

#ifdef ARDUINO
    #if ARDUINO < 100
        #include "WProgram.h"
    #else
        #include "Arduino.h"
    #endif
    #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
        #include <Wire.h>
    #endif
    #if I2CDEV_IMPLEMENTATION == I2CDEV_I2CMASTER_LIBRARY
        #include <I2C.h>
    #endif
	#if I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_SBWIRE
		#include "SBWire.h"
	#endif
#endif

Umbauen dürfte ziemlich aufwendig sein, diese ganze Struktur baut ja anscheinend darauf auf, dass es nur ein I2C Interface gibt.

ArduFE:
Umbauen dürfte ziemlich aufwendig sein, diese ganze Struktur baut ja anscheinend darauf auf, dass es nur ein I2C Interface gibt.

Ohje, kann man das auch irgendwie umgehen oder hat jemand eine bessere Lösung?