Arduino Due und I2C multiplexer geht nicht

Hi guys,
I am trying to run a sketch on my Due to control 2 OLEDs - later 12.

On my Arduino Mega the Sketch works fine, but on the Arduino Due it doesn't work.
Only the display I define at first work. It seems so that all commands send to the first display.

My code: #include <Wire.h>#include <I2CMux.h>#include <U8glib.h>#include <Arduino - Pastebin.com

Hallo Leute,
Ich versuche einen Sketch auf dem Due zum laufen zu bekommen um 2 und mehr OLEDs zu steuern.
Auf dem Mega funktioniert der Test Sketch ohne Probleme, aber auf dem Due geht nur ein Display an. Und zwar immer das mit der Anstöße welches ich zuerst anspreche. Alle Befehle egal auf welches Display gesendet gehen dann immer zum erstangespeochenden Display

Wir sind hier im deutschen Teil des Forums, somit reicht es, wenn du deine Post auch in deutsch schreibst.

Setze deinen Sketch bitte direkt ins Forum und verwende dazu Code-Tags.
Das geht mit der Schaltfläche </> oben links im Editorfenster.
Dann können alle User den Sketch lesen.

Hier der Code

#include <Wire.h>
#include <I2CMux.h>
#include <U8glib.h>
#include <Arduino.h>
 
#define I2CMux_ADDR 0x70
I2CMux mux(I2CMux_ADDR);
 
U8GLIB_SSD1306_128X64 First_Oled(U8G_I2C_OPT_FAST);
U8GLIB_SSD1306_128X64 Second_Oled(U8G_I2C_OPT_FAST);
 
const unsigned char bitmap[] PROGMEM = {
 Gekürzt da zu lang fürs Forum 
};
 
void draw(void) {
  // graphic commands to redraw the complete screen should be placed here  
  First_Oled.drawBitmapP(0, 0, 16, 64, bitmap);
  Second_Oled.drawBitmapP(0, 0, 16, 64, bitmap);
}
void displayStart(){
 
    Wire.beginTransmission(I2CMux_ADDR);
    Wire.write(1<<2);
    Wire.endTransmission();  
    delay(1);
    First_Oled.setContrast(100);
    First_Oled.firstPage();
      do {
          draw();
          First_Oled.undoScale();
      }
      while (First_Oled.nextPage());
 
    Wire.beginTransmission(I2CMux_ADDR);
    Wire.write(1<<3);
    Wire.endTransmission();  
    delay(1);
    Second_Oled.setContrast(100);
    Second_Oled.firstPage();
      do {
          draw();
      }
      while (Second_Oled.nextPage());
}
 
void setup(){
 
    Serial.begin(9600);
    Serial.println("Setup geht");
    Wire.begin();
    Wire.beginTransmission(I2CMux_ADDR);
    Wire.write(0);
    Wire.endTransmission();
   
 
 
    First_Oled.setFont(u8g_font_unifont);
    Second_Oled.setFont(u8g_font_unifont);
 
    displayStart();
   
}
 
void loop() {
  Serial.println("loop geht");
  First_Oled.firstPage();
      do {
          Wire.beginTransmission(I2CMux_ADDR);
          Wire.write(1<<2);
          Wire.endTransmission();  
          delay(1);
          First_Oled.setContrast(100);
          First_Oled.drawBox(0, 0, 128 , 18);
          First_Oled.setColorIndex(0);
          First_Oled.setFont(u8g_font_fub11);
          First_Oled.drawStr(0 , 15, "Camera ID");
          First_Oled.setColorIndex(1);
          First_Oled.setFont(u8g_font_fub25);
          First_Oled.drawStr(52, 60, "5");
      }
      while (First_Oled.nextPage());
 
   Second_Oled.firstPage();
      do {
          Wire.beginTransmission(I2CMux_ADDR);
          Wire.write(1<<2);
          Wire.endTransmission();  
          delay(1);
          Second_Oled.setContrast(100);
          Second_Oled.drawBox(0, 0, 128 , 18);
          Second_Oled.setColorIndex(0);
          Second_Oled.setFont(u8g_font_fub11);
          Second_Oled.drawStr(0 , 15, "CVideo Format");
          Second_Oled.setColorIndex(1);
          Second_Oled.setFont(u8g_font_fub25);
          Second_Oled.drawStr(52, 60, "1080i 60");
      }
      while (Second_Oled.nextPage());
}

Betreibst du alles an 3,3 Volt mit einem externen Netzteil ?

Wire.endTransmission(); liefert eine Erfolgsmeldung
Das könnte einen Hinweis liefern

Hi

Riecht doch so, daß der MUX nicht umschaltet - wenn Dem die Pegel nicht reichen, schaltet Der nicht (mehr?) um.
Sobald ein Display was anzeigt, geht vll. die Spannung in die Knie und der MUX hat keine Lust mehr.

MfG

Also ich ich betreibe das nur über den und Port.

Also Meldung kommt bei Wire.endTransmission() die 2.

Soll ich ausprobieren die Displays über externe 5v zu betreiben?

Also wenn ich mit extern 5v die Displays betreibe, und Ground verbinde tut sich leider trotzdem nichts

Du solltest dir mal das Datenblatt ansehen, für welche Spannung das Display spezifiziert ist.

Nicht einfach alles an 5Volt betreiben.
Die Pins vom Due sind nur 3,3V und du kannst dann Probleme haben, wenn der Rest dann 5 Volt liefert.
Bis zum zerstören des Due.

Ein Levelshifter könnte da helfen.

Der spannungsbereich, reicht laut Datenblatt.

Ich glaube das es irgendwie am Due liegt.. beim mega geht es ja, egal ob mit 3,3 oder mit 5 Volt

Hi

Der Mega kann ggf. einfach mehr Strom liefern?
Klar kann auch der Due einen Schuss haben - aber Das geht eher in die Richtung: Jammern auf hohem Niveau.

Viel wahrscheinlicher ist, daß der Due die Befehle von der Fehlerquelle bekommt :wink:
Noch nicht im Besitz eines Due.

MfG

Noch nicht im Besitz eines Due.

Aber ich und muss sagen, dass I2C ganz prächtig mit dem DUE funktioniert.

Ansonsten möchte ich dafür wetten, dass sich die Lösung beim Abgleich mit den Datenblättern finden lässt.

Dabei hilfreich: Oszi und LA
Auch den Links hier folgen

So, habe mir das mal genauer angeschaut....
Mit nur Wire funktioniert der Multiplexer perfekt.

Problem 1:
Die U8glib.h nutzt nicht Wire.
Kommt sich offenbar damit sogar ins Gehege.
So versagt die Multiplexer Kanalumschaltung. mit dem Fehler 2

Problem 2:
Auch den Multiplexer weg zu lassen, hat keinen Erfolg.
Bei der Verwendung von U8G_I2C_OPT_DEV_1 oder U8G_I2C_OPT_DEV_0 gewinnt der jeweils letzte Eintrag und damit landet alles auf einem Display

Offensichtlich ist die Lib nicht für DualDisplays geeignet.

Ich sehe keine einfache Lösung.

Aber das kann doch so nicht richtig sein. Wie ist es dann möglich das ich über den Mega bereit 8 Display einzeln am laufen hatte?

Aber das kann doch so nicht richtig sein.

Doch doch....

Hier mal ein I2C Scanner, der alle Känale des Multiplexers untersucht.
Der basiert auf Wire und funktioniert somit mit dem DUE und dem Mega oder UNO

Die gleiche Umschaltroutine versagt, sobald deine Displays nicht nur dranstecken , sondern auch benutzt werden.
Mit dem dir schon bekannten Fehler 2

Beweis 2:
Wirf alles was Wire heißt aus deinem Programm.
Und das Display tuts weiterhin

Versuchs mal mit der u8g2 Library, statt der U8glib. Das habe ich noch nicht getestet.
Soweit ich das erkennen kann basiert diese auf Wire, und könnte somit problemlos funktionieren.

#include <Wire.h>

#define TCAADDR 0x70
 
void tcaselect(uint8_t i) {
  if (i > 7) return;
 
  Wire.beginTransmission(TCAADDR);
  Wire.write(1 << i);
  Wire.endTransmission();  
}


void setup()
{
  Wire.begin();

  Serial.begin(9600);
  while (!Serial);             // Leonardo: wait for serial monitor
  Serial.println("\nI2C Scanner");
 
}
byte tcakanal = 0;

void loop()
{
  byte error, address;
  int nDevices;
  tcaselect(tcakanal);
  Serial.print("Scanning... TCA Kanal ");
  Serial.println(tcakanal);


  nDevices = 0;
  for(address = 1; address < 127; address++ ) 
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");

      nDevices++;
    }
    else if (error==4) 
    {
      Serial.print("Unknown error at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");

  delay(1000);           // wait  seconds for next scan
  tcakanal++;
  tcakanal &= 0b111;
}

Caombie vielen Dank für den Sketch. Es wird auf jeder Adresse ein Display gefunden. Ich werde es heute abend mal mit der anderen Lib versuchen und mich dann melden.

Soweit alles dann erstmal einen schönen Samstag - ich hoffe das Wetter ist bei euch auch so gut :slight_smile:

Leider auch mit der Library das selbe bild. Aud dem Due wechseln die Bilder abwechselnd auf dem selben Display und auf dem Mega laufen die beiden Displays.