I2C Parallel

Hallo,
Ich arbeite zur Zeit an einem motorisierten Stativ, basierend auf einem Arduino Nano. Zur Steuerung der Schrittmotoren auf X sowie Y-Achse verwende ich einen Wii Nunchuk Joystick, dessen Kommunikation über I2C funktioniert. Außerdem benutze ich ein I2C OLED-Screen zum Anzeigen eines Menüs.
Getrennt von einander funktionieren die beiden Applikationen ohne Probleme aber sobald ich den Joystick parallel zum Display an den BUS anschließe kommt es zu Problemen, seitens des Displays.

Die 2 Hauptprobleme sind:

  • Bildfehler (Linien an zufälligen Stellen des Displays)
  • "aufhängen" des Sketches

Zu erwähnen wäre auch noch, dass der Nunchuk ein 3.3V Logic-Level hat und ich keinen Level-Shifter benutzt habe. Dies soll aber angeblich nicht als zu dramatisch sein, da es nur zu etwas geringerer Lebenszeit führt.(Infos von hier)
Da die Probleme nur in der parallel geschalteten Variante auftreten, gehe ich davon aus, dass die Benutzung zweier I2C Slaves mit unterschiedlichen Logic-Levels zwangsweise einen Level-Shifter oder Pull-Up Widerstände erfordert?!

Da die Software in diesem Fall wahrscheinlich eher weniger relevant sind, hier nur einige Einstellungen und Infos dazu:
Libraries: Nunchuk.h, U8Glib.h
U8glib I2C Settings: U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_NO_ACK|U8G_I2C_OPT_FAST);

Muss an den Wire Einstellungen auch etwas geändert werden? Oder reicht Wire.begin()?

Da ich mich mit I2C nur wenig auskenne würde ich mich in Bezug auf das Hardwareproblem sowie die richtigen Einstellungen dafür, sehr über Hilfe von Euch freuen.

Vielen Dank
LG Emil

2 Spannungslevel an einem I2C-Bus sollten mit Levelshiftern angepasst werden. PullUp-Widerstände braucht man immer, oft sind sie aber auf den Baugruppen schon drauf (im spannungslosen Zustand nachmessen).

Sind die I2C-Adressen unterschiedlich?

Gruß Tommy

I2C reagiert sehr kritisch, wenn Pegel nicht stimmen.
Wie Tommy schon schrieb, solltest du Level-Shifter verwenden und passende Pullup-Widerstände einsetzen.
Und diese auch an die richtige Spannung anschließen.

Ok, Vielen Dank!
Zunächst mal, ja die Adressen sind laut I2C-Scanner unterschiedlich.
Einen Widerstand konnte ich zwischen VCC und SDA bzw. SCL des Joysticks nicht messen.

lightbluecrab:
Ok, Vielen Dank!
Zunächst mal, ja die Adressen sind laut I2C-Scanner unterschiedlich.
Einen Widerstand konnte ich zwischen VCC und SDA bzw. SCL des Joysticks nicht messen.

Dann baue da mal 1 bis 4k7 Widerstände ein.
Der Wert ist erstmal nicht kritisch.

Dann 4,7 - 10 kOhm jeweils an VCC des Joystick, wenn der Pegelwandler keine drauf hat.

Gruß Tommy

Nochmal Danke für die weiteren Posts!
Wenn ich das richtig verstehe brauche ich einen bidirektionalen Level-Shifter, der mir die 5V Output des GPIO-Pins auf 3.3V (und umgekehrt) wandelt.
Außerdem brauche ich 2 Pull-Ups an A4 und A5 des Arduinos?! Oder habe ich das falsch verstanden?

lightbluecrab:
Nochmal Danke für die weiteren Posts!
Wenn ich das richtig verstehe brauche ich einen bidirektionalen Level-Shifter, der mir die 5V Output des GPIO-Pins auf 3.3V (und umgekehrt) wandelt.
Außerdem brauche ich 2 Pull-Ups an A4 und A5 des Arduinos?! Oder habe ich das falsch verstanden?

Das hast du schon richtig verstanden.
Allerdings haben die meisten Level-Shifter schon Pullup-Widerstände drauf, da brauchst du dann keine zusätzlichen einsetzen.

Du brauchst jeweils im 5V-Zweig (Nano - Display - HV vom Levelshifter) PullUp nach 5V und im 3,3V-Zweig (Joystick - NV vom Levelshifter) nach 3,3 V.

Die Levelshifter, die ich kenne, haben welche drauf, dann brauchst Du keine zusätzlichen, wenn die Kabel nicht zu lang sind. Das Display dürfte auch welche haben.

Gruß Tommy

Alles klar! Und nochmals Vielen Dank für die aufschlussreichen Antworten.
Dann werde ich wohl mal Level-Shifter bestellen. :slight_smile:

Hier ein wenig Lesestoff zu I2C

Bei I2C sind die Kabellänge und die Pullupwiderstände kritisch.
Über die Widerstände haben meine Vorredner bereits gesprochen und Ratschläge gegeben.

Wie lange sind die Kabel?

Grüße Uwe