2 Arduino RS485

Hallo zusammen,

Ich möchte gerne 2 Arduinos miteinander Kommunizieren lassen, dies sollte über 2 Leiter Passieren. Das senden von daten sollte in beide Richtungen ermöglicht werden! Jedoch muss dies nicht gleichzeitig sein.

Somit bin ich auf einen RS485 gestossen den ich für mein Projekt verwenden könnte. Nun für eine Zuverlässige und relativ schnelle Verbindung über ca. 100m weis ich nicht welchen ich verwenden soll.

Ich habe herausgefunden dass es 250kbs - 5mbps gibt.

Was könnt ihr mir für mein Projekt empfehlen?

100m ist schon mal recht anspruchsvoll, dafür braucht man ein gutes Kabel (z.B. 2*twisted pair, ggf. plus Masse/Schirm).

Die tatsächlich erreichbare Übertragungsgeschwindigkeit hängt vom gesamten Aufbau ab, muß man ausprobieren.

Das ist relativ einfach zu handeln mit dieser RS485-Lib Die habe ich schon mal vor 3 Jahren gemacht.
Ich habe dies mit Atmegas und Attiny gemacht >Klick<.
Per Software Serial mit max 9600 baud zuverlässig. Wenn du den Bootloader entfernst und die Hardware Serial benutzt sollten sogar die 115kbaud funktionieren.
Bei meinen Test habe ich ein 50m Cat Kabel als Ring dazwischen gehabt.
Was heisst bei die Relativ schnell?
Prinzip ist hier das einer Master sein muss und die Daten vom Slave fordert der dieser dann sendet.
Gruß
DerDani

HardwareEmpfehlung

Hallo,

Ich sollte meine Ic's am Montag im Haus haben, dann werde ich es Testen :) vielen Dank

Relative schnell heisst bei mir unter 1 Sekunde :) .... Wenn ich 2-Weg Komunizieren möchte, ist dies viel Langsamer oder funktioniert es überhaupt nicht?

hi,

RS485 ist ja nur der physikalische layer. übertragen wird ein serielles signal, uns da gibt es keinen master oder slave. jeder kann reden, jeder hört zu. Du mußt nur irgendwie verhindern, daß etwas verlorengeht, weil 2 gleichzeitig reden.

weniger als 1 sekunde ist eine lustige angabe :) . was soll in weniger als einer sekunde passieren? wenn Du mit einer baudrate (ist in diesem fall gleich der bitrate) von 9600 arbeitest, kannst du 9600 bits = 1200 bytes pro sekunde übertragen.

weshalb bist Du auf 2 leiter beschränkt? ist ein CAT-kabel (normales netzwerkkabel) nicht möglich?

gruß stefan

Eisebaer: wenn Du mit einer baudrate (ist in diesem fall gleich der bitrate) von 9600 arbeitest, kannst du 9600 bits = 1200 bytes pro sekunde übertragen.

Die Nutzdaten sind weniger, da du ein Startbit und ein Stopbit hast. Also 10 Bit pro Nutz-Byte

Sollte aber immer noch schnell genug sein :)

stimmt, ich wollt’s nur nicht verkomplizieren. der TO scheint erst am anfang des wissens zu stehen…

Guten Morgen,

Ich hab keine Möglichkeit mehr Leiter zu verwenden. Ich habe 4 Leiter in einem Stahlseil, 2 davon benötige ich für die Speisung und andere Befehler und 2 davon für die Kommunikation.

Das habe ich nun alles verstanden und mich schlau gemacht, du hast auch recht mit dem rs 485 habe ich noch nicht viel Erfahrung.

Ich werde mal abwarten bis ich die Hardware erhalten habe und ein bisschen testen. ich denke es wird sicher die eine oder andere Frage noch auftauchen :)

Gruss roger

Ich habe nun diese Komponente erhalten: Link

Nun der Eine ist an einem Arduino Uno und der Andere an einem Arduino Nano angeschlossen.

Kann mir jemand helfen bez. ein Beispiel eines Codes (zb. senden von A001 schaltet beim Uno eine LED ein und mit A002 wieder aus?) Uploaden, ich krieg die verbindung nicht hin.

Ich würde mich über diese Hilfe sehr freuen!

In meinem Link zu meinem Projekt macht der doch genau das. Gruß DerDani

Du meinst dies mit dem Nokia display?

Gruss Schnibli

hi, schnibli,

ich würde erstmal die RS485-bausteine links liegen lassen. die sind dazu da, eine verbindung über längere strecken herzustellen.

bei den beispielen der IDE ist eines dabei, das bei einem MEGA (der hat mehr als eine serielle schnittstelle) einfach von serial auf serial1 (und umgekehrt) durchschleift (unter examples > communication > multiserialmega).

nachdem Du nur eine serielle hast, mußt Du serial1 auf softserial ändern.

wenn Du das bei beiden arduinos richtig machst, kannst Du RX mit TX und umgekehrt verbinden (die softserials), und mit 2 instanzen von zb. HTerm daten hin-und herschicken.

einfacher wäre es mit FTDI-adaptern um 2,3 euro von ebay, da könntest Du die dinger einzeln testen, das erleichtert anfangs die fehlersuche…

gruß stefan

Es tut mir leid.
Ich bin von anderen Voraussetzungen deinerseits ausgegangen.
Wenn du auf “der grünen Wiese” anfängst ist der Weg von Eisbär auf jeden Fall der bessere und mit mehr Lernerfolg.
Wenn du die “Normale” Konfiguration ohne RS485 auf dem Tisch probierst und erfolg hast dann kann man es auf RS485 portieren bzw umbauen.
Bei RS485 ist es so das nur einer zu gleichen Zeit etwas senden kann, deswegen mein Vorschlag mit Master und Slave. Einer der beiden Arduinos muss den Bus steuern also er Sendet was an den “Slave” der Anwortet mit “verstanden” (und setzt den Ausgang) oder z.B. mit den senden angeforderten Werten eines Analog Eingangs.

Gruß
DerDani

So ich habe nun eine Standart Verbindung über A4 und A5 aufgebaut:
Sender:

// Wire Master Writer
// by Nicholas Zambetti <http://www.zambetti.com>

// Demonstrates use of the Wire library
// Writes data to an I2C/TWI slave device
// Refer to the "Wire Slave Receiver" example for use with this

// Created 29 March 2006

// This example code is in the public domain.


#include <Wire.h>

void setup() {
  Wire.begin(); // join i2c bus (address optional for master)
}

byte x = 15;

void loop() {
  Wire.beginTransmission(8); // transmit to device #8
  Wire.write(x);              // sends one byte
  Wire.endTransmission();    // stop transmitting
  delay(500);
}

Empfänger:

// Wire Slave Receiver
// by Nicholas Zambetti <http://www.zambetti.com>

// Demonstrates use of the Wire library
// Receives data as an I2C/TWI slave device
// Refer to the "Wire Master Writer" example for use with this

// Created 29 March 2006

// This example code is in the public domain.


#include <Wire.h>

void setup() {
  Wire.begin(8);                // join i2c bus with address #8
  Wire.onReceive(receiveEvent); // register event
  Serial.begin(9600);           // start serial for output
}

void loop() {
  delay(100);
}

// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany) {
  while (1 < Wire.available()) { // loop through all but the last
    char c = Wire.read(); // receive byte as a character
    Serial.print(c);         // print the character
  }
  int x = Wire.read();    // receive byte as an integer
  Serial.println(x);         // print the integer
}

Gibt es hier noch verbesserungen? oder kann mir nun jemand helfen dies zu “transferieren auf den rs485”?

I2C und RS-485 verträgt sich leider nicht. Wenn Du nicht die angebotene RS485 Bibliothek verwenden möchtest, und auch keine serielle Verbindung, dann mußt Du Dir eigene Prozeduren oder eine Stream-Klasse schreiben.

hi,

oje, Du machst da ja eine verbindung über I²C. wenn Du mit RS485 arbeiten willst, mußt Du eine serielle verbindung aufbauen. I²C ist für kurze distanzen. es gibt zwar expander, aber bleibe bei der entfernung auf jeden fall bei seriell und RS485.

gruß stefan

Auch ein Blinder Vogel fängt mal ein Wurm xD…

Vielen dank hab es nun geschnallt :slight_smile: Ein bisschen mehr einlesen und dann Funktioniert es mit und auch ohne rs485 Baustein :slight_smile:

Sender:

// Sender

// DI 2 = RX
// DI 3 = TX
// DI 4 = Einschalten

#include <RS485.h>
#include <SoftwareSerial.h>


char Message[maxMsgLen+1] ;


void setup()
{
  Serial.begin(9600);
  Serial.println("System Startup - Sender");

  RS485_Begin(28800);
}

void loop()
{
  strcpy(Message,"001");

  if(RS485_SendMessage(Message,fWrite,ENABLE_PIN))
  {
    Serial.print("Sending:");
    Serial.println(Message);
  }  

  delay(1000);  
}

Empfänger:

// Receive
#include <RS485.h>
#include <SoftwareSerial.h>

char message[maxMsgLen+3+1];

void setup()
{
  Serial.begin(9600);
  Serial.println("System Startup - Receiver");

  RS485_Begin(28800);
}

void loop()
{
  //if(RS485_ReadPlainMessage(fAvailable,fRead,message))
  if(RS485_ReadMessage(fAvailable,fRead, message))
  {
    Serial.print("Receiving:");
    Serial.println(message);
  }


}

Was kann man an diesem Code verändern sodass es sicherer wird? :slight_smile: