Arduinos vernetzen mit je einem Display

Guten Abend allerseits!

Ich möchte, wie oben bereits angedeutet, mehrere Arduinos (Nano Atmega328P V3.1) miteinander vernetzen, soweit so gut, gibts ja diverse Tutorials dazu. Wo ich aber aktuell etwas ratlos bin, ist die Tatsache, dass jedes Device auch ein eigenes Display (SSD1306) ansteuern soll.
Nach meiner aktuell laienhaften Vorstellung sind ja auch die Displays nur Geräte auf dem Bus. Wenn diese nun die gleiche ID besitzen: Kann man die so verschalten, dass jeder Nano nur sein für ihn bestimmtes Display sieht oder kommen die sich auf dem Bus ins Gehege, wenn hier Signale von verschiedenen Nanos zu allen Displays gelangen, die alle die gleiche ID besitzen?

Ich hoffe, ich konnte mich einigermaßen verständlich ausdrücken, was ich machen möchte. :wink:

Danke!

ein wenig mehr Kontext bitte.

Du sprichst von I2C Displays? Setze einen Link auf das Produkt das dir aktuell vorschwebt.
Wie weit sind die Nanos voneinander entfernt?
Du willst die Nanos mit I2C "vernetzen"? Nein? Was dann?

Was wird das ganze?

Ja, die kommen sich ins Gehege, wenn sie am gleichen Bus hängen.
Evtl. Verbindung der Nano über I2C und die Displays an SPI oder andere Busse nutzen.

Beschreibe doch mal, was es werden soll, dann kann man besere Ratschläge geben.

Gruß Tommy

atarifreak:
Ich möchte, wie oben bereits angedeutet, mehrere Arduinos (Nano Atmega328P V3.1) miteinander vernetzen [...] jedes Device auch ein eigenes Display (SSD1306) ansteuern soll.
Nach meiner aktuell laienhaften Vorstellung sind ja auch die Displays nur Geräte auf dem Bus.

Ich hoffe, ich konnte mich einigermaßen verständlich ausdrücken, was ich machen möchte. :wink:

Fange ich mit dem Ende an:
Nein.

Ich hab noch nicht verstanden, was Du willst.
Variante1:
Ein NANO ist Master, alle anderen Slave.
Kommuniziert wird über I2C.
Die Dsplays sind ebenfalls I2C, sollen aber nur auf den jeweils gültigen NANO reagieren.

Dann: Beschreibung lesen zum I2C-Display-Treiber.
Adresse auswählen, einrichten, im jeweils zuständigen NANO verankern.
Fettig.

Ich glaube zu verstehen:
Du willst alle Platinen (Display und Nano) per I2C "vernetzen".
So geht das nicht.
Schon bedingt durch di kabellänge geht es nicht.

Man könnte es evtl. mit Multimaster aufbauen, allerings ist das nicht trivial.

my_xy_projekt:
Ich hab noch nicht verstanden, was Du willst.
Variante1:
Ein NANO ist Master, alle anderen Slave.
Kommuniziert wird über I2C.
Die Dsplays sind ebenfalls I2C, sollen aber nur auf den jeweils gültigen NANO reagieren.

Dann: Beschreibung lesen zum I2C-Display-Treiber.
Adresse auswählen, einrichten, im jeweils zuständigen NANO verankern.
Fettig.

Vielen Dank für die schnellen Reaktionen!

Genauso dachte ich mir das. Die Abbildung über Master-Slave über I2C ist auch das, was ich in den Tutorials bisher gesehen habe. Ich hatte dazu auch etwas gelesen, z.B. mit Lötbrücken, in denen die ID auf dem Bus festgelegt werden können. Das geht vermutlich bei den billigen Teilen nicht, die mir vorschweben.

noiasca:
ein wenig mehr Kontext bitte.

Du sprichst von I2C Displays? Setze einen Link auf das Produkt das dir aktuell vorschwebt.
Wie weit sind die Nanos voneinander entfernt?

Es geht aktuell um folgendes Produkt, es könnte aber auch ein anderes sein, bin für Empfehlungen offen:
https://www.ebay.de/itm/OLED-Display-0-96-Zoll-12C-IIC-SSD1306-128x64-4-Pin-weiss/293906234077?ssPageName=STRK%3AMEBIDX%3AIT&_trksid=p2057872.m2749.l2649
Die Nanos wären quasi nebeneinander, also kein Entfernungsproblem.

Tommy56:
Beschreibe doch mal, was es werden soll, dann kann man besere Ratschläge geben.

Im Grunde möchte ich nur eine Uhr bauen, nicht mehr. Allerdings möchte ich jede Ziffer auf einem eigenen Display abbilden. Es sollten auf jeden Fall OLEDs sein (schon aus Gründen der Energireffizienz aber auch des Kontrasts), was ein einzelnes TFT ausschließt, das die richtige Breite hätte, aber viel zu hoch wäre.
Ich möchte damit auch nicht einfach nur über den ASCII-Satz Ziffern nutzen sondern selbst erstellte Bilder im Format 64x128 für die Zahlen 0-9, die stellvertretend für die einzelnen Ziffern gezeigt werden und so der Anzeige einen eigenen Look verpassen.
Aus Stromversorgungsgründen aber eben auch aus Bus-Konflikt-Gründen dachte ich mir, dass jedes Display durch einen eigenen Arduino angesteuert wird. Ein Master ermittelt die Uhrzeit, zeigt eine Ziffer davon an und sendet die Zeit anschließend über den Bus an die anderen Teilnehmer, die über Stringoperationen sich jeweils ihre Ziffern extrahieren und auf ihren Displays anzeigen.

Ich hoffe, mein Projekt ist etwas klarer geworden. Wenn die Umsetzung wie beschrieben ne Schnapsidee war, bin ich für alternative Ideen offen. :slight_smile:

Danke!!

Die Aufgabe sollte mit einem Nano und einem I2C-Multiplexer zu erledigen sein.

Edit #1: Die Stromversogung der Displays sollte nicht direkt vom Nano, sondern von einer gemeinsamen Spannungsquelle erfolgen.

Edit #2: Die 81920 Bit = 10240 Byte, die Du für zehn Ziffern-Bilder brauchst, kannst Du im Programmspeicher ablegen.

wno158:
Die Aufgabe sollte mit einem Nano und einem I2C-Multiplexer zu erledigen sein.

Das klingt spannend. D.h. der teilt den angeschlossenen Displays Zeitscheiben zu, ähnlich wie ein Scheduler?
Ich müsste dann auf der Masterseite das Timing kennen, um die richtigen Informationen zur richtigen Zeit zu senden oder bin ich auf dem Holzweg?

Quote from: wno158 Tue Dec 29 2020 23:05:22 GMT+0100 (Central European Standard Time)

Edit #2: Die 81920 Bit = 10240 Byte, die Du für zehn Ziffern-Bilder brauchst, kannst Du im Programmspeicher ablegen.

Das habe ich schon getestet, geht völlig problemlos. Es bleibt sogar noch richtig Speicher für die Programmierung übrig. Das war ja meine erste Sorge. :o

Holzweg :wink:

Macht aber nix, hier findest Du die Beschreibung.
Vereinfacht: Der Multiplexer hat eine eigene I2C-Adresse. Auf die schreibst Du ein Byte, um einen der I2C-Ausgänge zu selektieren und dahinter dann das, was Du sonst an das Display schicken würdest - wenn es alleine am Bus hinge.

wno158:
Holzweg :wink:

Macht aber nix, hier findest Du die Beschreibung.
Vereinfacht: Der Multiplexer hat eine eigene I2C-Adresse. Auf die schreibst Du ein Byte, um einen der I2C-Ausgänge zu selektieren und dahinter dann das, was Du sonst an das Display schicken würdest - wenn es alleine am Bus hinge.

Das klingt ja richtig cool!! Ein steuerbarer Multiplexer? Luxus! :slight_smile:

Das klingt dann gleich etwas anders. Das geht auch so mit dem beschriebenen Multiplexer.

Allerdings vermute ich hier ein Speicherplatzproblem beim Nano, wenn du mit mehreren Displays arbeitest.

Könnte sein, dass du auf einen Wemos D1 oder NodeMCU umsteigen musst. Die haben deutlich mehr Speicher. Wenn du dann Wlan nimmst, sparst du auch die RTC.

HotSystems:
Könnte sein, dass du auf einen Wemos D1 oder NodeMCU umsteigen musst. Die haben deutlich mehr Speicher.

Speicherprobleme in Bezug auf was? Nutzen die Displays als Puffer/Display-RAM beispielsweise den Speicher des Nanos? Die Bilder selbst bekomme ich problemlos unter und hätte sogar noch ca. 50% Flash zur Verfügung. Das habe ich schon getestet: Ich habe auf einem Gerät alle Hex-Kolonnen der Bilder untergebracht und damit ein Display angesteuert und alle Zahlen durchgetestet.
Aber sicher meinst Du etwas, an das ich gerade nicht denke. :wink:

wno158:
Die Aufgabe sollte mit einem Nano und einem I2C-Multiplexer zu erledigen sein.

Die Stromversogung der Displays sollte nicht direkt vom Nano, sondern von einer gemeinsamen Spannungsquelle erfolgen.

Ja..

Speicherproblem:
Das käme auf einen Versuch an - wieviel Speicher die nötigen sechs Instanzen der Display-Klasse am Ende benötigen. Die könnte man aber massiv abspecken; z.B. die ganze Font- und Schriftgeschichte ist ja nicht erforderlich. Eigentlich braucht es ja nur so was wie BitBlit zum Display.

Spannendes Projekt!

atarifreak:
Aber sicher meinst Du etwas, an das ich gerade nicht denke. :wink:

Ja, wno158 hat es schon beantwortet.
Die Displays müssen auch angesteuert werden. Pro Display eine Instanz.
Einfach mal testen.

wno158:
Eigentlich braucht es ja nur so was wie BitBlit zum Display.

Spannendes Projekt!

Lese ich da Assembler-Wissen? :wink: Die Erfindung des Blitter war schon ein Segen. :slight_smile:
Genau, den ganzen Font- und ASCII-Kram brauche ich nicht.
Auch wenn ich jetzt eine bessere Orientierung habe, werde ich sicherlich noch Fragen haben und Euch noch etwas mit quälenden Anfängerfragen nerven :wink:

atarifreak:
Lese ich da Assembler-Wissen? :wink:

Yep. Ist 25 Jahre her dass ich mal eine Sammlung Grafikprimitive auf einem 32 Bit RISC-Controller implementieren durfte.

Auch wenn ich jetzt eine bessere Orientierung habe, werde ich sicherlich noch Fragen haben und Euch noch etwas mit quälenden Anfängerfragen nerven :wink:

Nur zu, wenn ich genügend Displays hier hätte würde ich das selber ausprobieren. Und damit bin ich wohl nicht alleine :wink:

Ich habe mir jedenfalls erstmal den Multiplexer bestellt. Da ich von Hause aus ein eher ungeduldiger Mensch bin, bin ich Fan von Tutorials, die zeigen, wie es geht. Daher empfinde ich es als ein Segen, dass es die Examples in der Arduino-IDE gibt.
Wenn ich eine Art Blitting brauche, reden wir aber dennoch von einer Vernetzung, also einer seriellen Übertragung der Bilddaten, richtig? Also durch simples Verbiegen von Zeigern auf ein Video-RAM wird das daher vermutlich nicht zu bewerkstelligen sein. Ich gehe deshab davon aus, dass folgende Dinge weiterhin zwingend benötigt werden:

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

Oder kann da was weg?

Mein erster Schritt wird daher erstmal sein, dass das, was ich bisher erreicht habe (die Darstellung der Ziffern als Grafik nacheinander auf einem Display), über den Multiplexer erreichen möchte. Dann gehe ich den nächsten Schritt an.

atarifreak:
Da ich von Hause aus ein eher ungeduldiger Mensch bin, ...

... kannst Du auf der Rückseite eines OLEDs den Widerstand von "0x78" nach "0x7A" umlöten, damit Du zwei OLEDs mit unterschiedlicher Adresse ansprechen kannst. Mit zwei Nanos und SoftwareSerial kannst Du die Uhrzeit austauschen. Bis der Multiplexer kommt ::slight_smile:

atarifreak:
Im Grunde möchte ich nur eine Uhr bauen, nicht mehr.

Woher kommt die Uhrzeit? Takte zählen ist zu ungenau!

agmue:
Woher kommt die Uhrzeit? Takte zählen ist zu ungenau!

Moin, ich dachte an sowas wie das hier:

Während der Synchronisation würde ich dann auf den Displays eine Animation ausgeben.