Go Down

Topic: Welche Kommunikationsart (RS232 / I2C/ ?) für mein Projekt? (Read 381 times) previous topic - next topic

BullSimons

Hallo zusammen,

gerade neu angemeldet, weil irgendwann die Fragen/Probleme zu spezifisch für Tante Googel werden ;)


Projekt ->

Verschiedene analoge Messwerte  (Strom und Spannung) sollen erfasst werden ~7 (Stand jetzt)
Temperatur und Luftfeuchte eingelesen werden  3 x DHT22
Zwei reine Temperaturwerte (Sensor noch unklar)

Als Ausgänge sind geplant
3 PWM Signale für Motoren
1 Servo
PWM über I2C für RGBW LED-Streifen (3 bis 4 Streifen als ein PCA9685  mit 16 Ausgängen)

Touch Display


Problem ->
Diese Anzahl an In/Out benötigt logisch viele Kabel. Dort wo das Display sitzt ist aber keine Möglichkeit ein dickes oder viele dünne Kabel zu verlegen.

Lösung bis jetzt ->
min 2 Arduino Mega. Einer kümmert sich um das Display und einer um die Ein und Ausgänge

Aber wie am besten Kommunizieren? Als Elektroniker hätte ich natürlich gerne eine schnelle Anzeige der Messwerte (inkl. kleinster Spitzen bei den Analogwerten). Auf der anderen Seite ist das natürlich auch eine größere Datenmenge. Ich könnte damit Leben, die Temperaturwerte nur jede Minute zu aktualisieren. Die gemessenen Strom und Spannungswerte hätte ich gerne aber schon deutlich öfters gemessen. Zur Not könnte ich auch mit Mittelwerten leben.

Die Entfernung zwischen beiden Arduinos sind maximal 10m (eher 5m - ich weiß aber noch nicht wie ich die Kabel genau verlegen kann). Sollte also für I2C und RS232 machbar sein.


Ich hoffe ich habe alle Infos geliefert - oft sind für mich Sachen logisch (ich hab es mir ja überlegt) aber für den Rest fehlt das natürlich - ich werde fehlende Infos aber gerne nachliefern.

Danke schon mal für Antworten!

Oliver


Serenifly

I2C ist bei 5-10m eher grenzwertig. Eine normale serielle Verbindung mit 5V Pegel könnte es auch tun. RS232 ist je nach Umgebung nicht unbedingt nötig. Schadet aber nichts

uwefed

I2C scheidet aus.
RS232 brauchst Du 2 TTL zu RS232 Wandler; kann die Distanz locker.
Serielle Schnittstelle TTL (direkt von Arduino Pins) weiß nicht wie lange da das Kabel sein kann. Mußt Du ausprobieren; notfalls mußt Du 2 RS232 Wandler dazwischenschalten. Das Protokoll bleibt gleich, ändern sich nur die Logikpegel.
Grüße Uwe

pylon

Quote
Die Entfernung zwischen beiden Arduinos sind maximal 10m (eher 5m - ich weiß aber noch nicht wie ich die Kabel genau verlegen kann). Sollte also für I2C und RS232 machbar sein.
Schon 5m ist viel zu viel für einen I2C. Das Maximum sollte (ohne Extender) bei höchsten 0.5m liegen, in einer Umgebung mit Motoren und dergleichen eher weniger. 10m könnten in einer solchen Umgebung bereits für RS232 knapp werden, ich würde eher zu RS485 tendieren. Dort ist die Signalübertragung differentiell, sollte also einigermassen störresistent sein und ohne aufwendige Schirmung auskommen.

Brauchst Du wirklich für beiden Seiten einen Mega? Wieso sollte die Display-Seite so viele Anschlüsse benötigen?

BullSimons

Laut Pinout sollte es wohl ein Mega sein - würde ich sagen.


Extender für I2C wäre auch kein Problem. Wobei es ja viele erfolgreiche  Versuche über mehrere Meter ohne Extender gibt , aber an die PWM hab ich ehrlich gesagt nicht gedacht in dem Moment (wobei da nicht sooo viel Leistung drüber geht).

Wandler gibt es ja für alles mögliche, wäre nur die Frage welcher den geringsten Aufwand benötigt. Ich hab mich noch nicht mit diesen Wandlern beschäftigt - ich nehme mal nicht an, dass man die einfach anschließt und sonst nichts mehr konfigurieren muss? Ansonsten würde ich mal zum testen alles aufbauen und danach dann schauen ob TTL ausreicht oder ob ich einen Wandler benötige - wäre aber blöd, wenn man danach alles wieder umschreiben müsste. Ich les mich mal nebenher etwas ein...

agmue

Zum Abschätzen des Aufwands: I2C-Extender oder RS-485 module for Arduino

Die Mega haben mehrere serielle Schnittstellen, da würde ich bei einer Punkt-zu-Punkt-Verbindung auch zu RS485 raten. Du kannst die Übertragungsrate variieren, was bei I2C nicht so einfach geht.

MicroBahner

Laut Pinout sollte es wohl ein Mega sein - würde ich sagen.
Was hat diese Pinout mit einem Mega zu tun?
Gruß, Franz-Peter

agmue

Was hat diese Pinout mit einem Mega zu tun?
Das könnten die Anschlüsse des Displays sein, die so zahlreich sind, daß es eines Megas bedarf.

Ein Touchdisplay kann auch gut den Speicher eines Megas vertragen, das habe ich auch so gelöst.

MicroBahner

Das könnten die Anschlüsse des Displays sein, die so zahlreich sind, daß es eines Megas bedarf.

Ein Touchdisplay kann auch gut den Speicher eines Megas vertragen, das habe ich auch so gelöst.
Ich vermute auch, dass es die Anschlüsse des Displays sind, das hat aber offensichtlich auch eine SPI-Schnittstelle. Der Speicherbedarf ist aber sicher ein gutes Argument für den Mega.
Gruß, Franz-Peter

Doc_Arduino

Hallo,

aus eigener aktueller Erfahrung kann ich dir bei der Entfernung zu einer seriellen Verbindung raten die mit dem Differenzverfahren arbeitet was RS485 wäre. Die ist trotzdem seriell nur die Übertragung ist sicherer. Verdrillte Drähte völlig ausreichend. Viele Leute nehmen auch Netzwerkkabel. Ich nutze die MAX487, damit sind bis zu 250kBaud drin (mit slew rate). Software seitig bleibt alles beim alten. Deine serielle Programmierung bleibt allso ganz normal wie gewohnt. Nur eine Pinumschaltung fürs senden / empfangen kommt noch dazu. Außer du nimmst zwei serielle Ports und damit zwei RS485 Verbindungen was dann Fullduplex wäre. Eine empfängt und die andere sendet. Mit dem Mega wäre das kein Problem. Ob das notwendig ist kannst nur du wissen. Zu dem Thema findet man mehr mit dem Suchbegriff RS485 und/oder MAX485.

Edit:
eine wichtige Ergänzung noch. Bei allen Speedjunkies muss natürlich auch sichergestellt sein das der Empfänger die Daten auch schnell genug verarbeiten kann. Ansonsten ist irgendwann auch der größte Buffer vollgeschrieben und ab dann gehen Daten verloren.

Edit2:
Korrektur wegen Fullduplex von Uwe in #11, Danke.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

volvodani

Wenn es RS485 werden sollte dann gibt es von Nick Gammon  eine fertige sehr einfach zu nutzende Library  die auch ein bisschen "sicherheit" mitbringt. Ich nutze sie sehr zuverlässig.
In seinem Thread sind viele Infos drin. Nutze die non-blocking Version und dann braucht man sich um Timming des Restprogramms nicht mehr so sehr versteifen. Man kann auch die Eingangs und Ausgangspuffer vergrößern sollte es nicht reichen. Alles auf die Arduino Megas wegen der mehreren UART Ports, somit kann man ein bisschen serielles Debugging machen ohne große Klimmzüge.
Gruß
DerDani
0x2B | ~ 0x2B = 0xFF  
(Shakespeare)

uwefed



RS485 ist halbduplex. Senden und Empfangen wechseln sich ab. Dafür braucht es nur 1 Leitungspaar aber eine Flußkontrolle.
Nimmt man aber 2 Leitungspaare so hat man einen Punkt zu Punktverbindung, braucht keine Flußkontrolle und auch nur 1 serielle Schnittstelle analog zu RS232

Grüße Uwe

BullSimons

Danke für die weiteren Antworten. Ursprünglich war geplant das Display und alle I/O mit einem Mega zu machen. Darum ist der schon da und im Prinzip auch schon alles programmiert. Zusätzlich das Thema Speicher und dann hat sich der Umstieg auf einen kleineren Arduino auch erledigt ;)

Ich habe jetzt mal ein paar RS485 Umsetzer bestellt. Ich würde sagen Halbduplex reicht mir. Vollduplex hätte nur den Vorteil, dass ich Schaltbefehle schneller an den Messenden Arduino schicken könnte und die sind nicht Zeitkritisch - ob ein Relais jetzt 2 Sekunden früher oder später schält ist relativ egal.

Ich splitte nachher mal Messen und Anzeigen auf und messe mal mit der Stoppuhr ;) wie lange die Loop überhaupt läuft.


Grüße
Oliver

agmue

... und messe mal mit der Stoppuhr ;) wie lange die Loop überhaupt läuft.
Die eingebaute Stoppuhr ist millis() :)

Eisebaer

hi,

ich denke, Du wirst mit der "stoppuhr" draufkommen, daß die dinger schneller und öfter senden, als Du es Deinem ersten post zufolge brauchst. da ist es auch wichtig, kurze telegramme zu schicken. also um gottes willen nicht ASCII-code. nicht "Temperatursensor01:22,3" sondern zwei binärwerte,
7 223
bei 7 weiß der empfänger, welcher sensor das ist, 223 ist der wert.

eine alternative wären vielleicht zwei nodeMCU, die garkeine kabelverbindung brauchen. die reden über WLan entweder direkt miteinander oder über Dein heimnetz. z.b. mit UDP.
sind sauschnell, haben riesig speicher, bei zu wenigen pins halt mit expandern über zb I2C erweitern.

gruß stefan

gruß stefan

Go Up