mal wieder rs485

moin moin

ja es gibt wirklich viele HowTo's zu dem Thema aber ich versteh es einfach nicht...

Ich möchte mehrere Arduinos verbinden und diese mittels rs485 unterhalten lassen. Testaufbau sind 3 Uno's mit diesen rs485 modulen (https://arduino-info.wikispaces.com/RS485-Modules).
Der Masternode lauscht auf der Seriellen und schickt alles auf RS485 weiter. Die Slaves lauschen auf RS485 und machen was ihnen gesagt wird. Soweit so gut.
Das ganze ist also nur Senden->Empfangen. Was ich aber gerne möchte wäre ein "Senden <-> Empfangen" also nicht nur "Slave 1 mache das" und Slave1 macht das, sondern Slave1 sagt "ok, hab ich gemacht" oder ich möchte auch fragen können "Slave1 sag welchen wert hast du auf port XY" und bekomme eine Antwort.

marvin/transmitter.ino at master · obsd-guru/marvin · GitHub <- mein "Master"

marvin/reciver.ino at master · obsd-guru/marvin · GitHub <- mein "Slave"

Wie bekomme ich diese Bidirektionale Kommunikation hin, steh auf dem Schlauch.

Ich sag mal schon im voraus vielen Dank!

EDIT :

Vielleicht um meine Verständnisblockade zu beschreiben.. wie müsste ich den Master anpassen das er nicht nur auf dem "RS485 Port" rausschreibt sondern auch daran lauscht ob da was reinkommt.

Hallo,

der Master ist ja der Master, weil er der Chef im Ring ist. Also weiß er auch, was er wann selbst macht. Damit kann er einen Befehl an einen Slave schicken um Daten abzufragen. Ein Slave fühlt sich angesprochen und sendet die angeforderten Daten. Der Master empfängt diese und gibt sich zufrieden. Vielleicht hängt es auch daran, dass du noch nicht wußtest, das man die RS485 IC aktiv zwischen empfangen und senden umschalten muss. Oder nimmst 2 Schnittstellen und 2 IC und kannst jederzeit senden und empfangen gleichzeitig.

Näheres gibts hier inkl. seiner Library. https://www.gammon.com.au/forum/?id=11428

Also ich habe es bei meiner Kommunikation so gemacht. Das "Protokoll" hat ne Adresse (für den Ziel Adressaten). Einen Funktionscode für die Aktion die der Master will. Und "Nutzdaten".
Sagt der Master dem Slave 12 will Daten von dir haben mit der Funktionen Nummer 23 so weiß der Slave das als nächstes ein Byte kommt mit dem Alias was der Master vom Slave haben will. Dann geht der Master auf hören und der Slave sendet.
Das ist meinene grob vereinfachte Form von der Kommunikation die ich nutzte alles auf Basis von Nick Gammon RS485 nonblocking Version (ganz wichtig diese zu nehmen da es sonst zu Timing Problemen kommen kann.
Gruß
DerDani
Suche mal nach RS485 und volvodani da findest du einiges von mir

Doc_Arduino:
Oder nimmst 2 Schnittstellen und 2 IC und kannst jederzeit senden und empfangen gleichzeitig.

Dann brauchst Du aber auch 2x2 Leitungen und es funktioniert nur eine Punkt zu Punkt-Verbindung wie bei RS232, nur mit besseren Störeigenschaften aber kein Bussystem.

Grüße Uwe

Hallo,

das wollte ich damit zum Ausdruck bringen. 2x2 Leitungen, also 2 Schnittstellen für jeden Teilnehmer. Dafür kann dann jeder senden wann er möchte ohne zu warten ob jemand anfragt.

Nur eines muss ich korrigieren oder Dani hätte das getan. Er hat sowas schon. RS485 ist ein Bussystem. Mit den ICs von Maxim kann man entweder bis 32 oder bis 128 Teilnehmer betreiben. Das baue ich gerade auf mit meinem Mega und den ATtinys. Hast bestimmt nur irgendwas verwechselt, nehme ich an. :wink:

http://forum.arduino.cc/index.php?topic=419612
http://forum.arduino.cc/index.php?topic=407298

32, 64 und 128 Teilnehmer.

Skorpi08 RS485 gibts auch paar Beiträge.

moin moin

Danke für die ganzen Antworten. Ich glaube ich hab es wohl falsch ausgedrückt.
Klar muss ich dem slave eine "id" geben, ich ich dachte das war klar mit "SLAVE01 mache das" wo SLAVE01 die ID wäre etc..
In meinem Beispiel hört ja der slave auf commandons wie "slave02 05=1" also 2.slave pin 5 auf high. das tut ja auch wunderprächtig hier mit 8 verschiedensten arduinos.
aber wie gehe ich "programmtechnisch" von senden-> emfangen zu "senden<->empfangen"
also z.b. zeile 22 im transmitter.ino
pinMode(SSerialTxControl, OUTPUT);
da setze ich das zu OUTPUT, ich will aber doch INPUT UND OUTPUT ich will ja senden und empfangen...
oder im reciver.ino würde ich an zeile 65 einfach ein "RS485Serial.write("OK");" hinzufügen und er würde einfach ein ok als bestätigung senden.
den link https://www.gammon.com.au/forum/?id=11428 kannte ich schon, hab ihn mehrmals gelesen, die wörter verstanden aber was man mir sagen wollte leider nicht. bin wohl zu blöd dafür :wink:

grüße

hi,

mal im voraus: es gibt bei RS485 keinen master oder slave, außer DU legst das so FÜR DICH fest.

jeder kann senden und empfangen, und zwar jederzeit, ohne jede aufforderung eines "masters".

natürlich kann es dann dazu kommen, daß gleichzeitig zwei senden und die telegramme dadurch unlesbar werden. das zu verhindern, ist Deine aufgabe. eine möglichkeit ist, daß Du eben master und slave benennst. aber das ist nur EINE möglichkeit.

eine andere methode ist, es so zu machen, wie Du es ja schon angesprochen hast, mittels einer antwort. kommt keine antwort, muß der sender wiederholen.

es gibt etliche mechanismen, das bleibt Dir überlassen.

wenn einer senden will, setzt er SSerialTxControl auf RS485Transmit, also auf HIGH, ansonsten setzt er es auf
RS485Recive, also auf LOW, dann lauscht er.

gruß stefan

ungetestet:

//
// Marvin Master for RS485 Communication
//
#include <SoftwareSerial.h>

// arduino connect to rs485 pins
#define SSerialRX 2
#define SSerialTX 3
#define SSerialTxControl 4

#define RS485Transmit HIGH
#define RS485Recive   LOW

SoftwareSerial RS485Serial (SSerialRX, SSerialTX);
unsigned char byteReceived;

void setup() {
  Serial.begin(9600);
  Serial.println("Marvin Rs485 commiunication system");
  Serial.println("..................................");

  pinMode(SSerialTxControl, OUTPUT);
  digitalWrite(SSerialTxControl, RS485Recive);

  RS485Serial.begin(4800);
}

void loop() {
  
  while (Serial.available())
    {      
      byteReceived = Serial.read();
      digitalWrite (SSerialTxControl, RS485Transmit);
      RS485Serial.write(byteReceived);
     }
     delay(20);
     digitalWrite(SSerialTxControl, RS485Recive);
}

Eisebaer:
hi,

mal im voraus: es gibt bei RS485 keinen master oder slave, außer DU legst das so FÜR DICH fest.

jeder kann senden und empfangen, und zwar jederzeit, ohne jede aufforderung eines "masters".

natürlich kann es dann dazu kommen, daß gleichzeitig zwei senden und die telegramme dadurch unlesbar werden. das zu verhindern, ist Deine aufgabe. eine möglichkeit ist, daß Du eben master und slave benennst. aber das ist nur EINE möglichkeit.

eine andere methode ist, es so zu machen, wie Du es ja schon angesprochen hast, mittels einer antwort. kommt keine antwort, muß der sender wiederholen.

es gibt etliche mechanismen, das bleibt Dir überlassen.

wenn einer senden will, setzt er SSerialTxControl auf RS485Transmit, also auf HIGH, ansonsten setzt er es auf
RS485Recive, also auf LOW, dann lauscht er.

gruß stefan

ungetestet:

//

// Marvin Master for RS485 Communication
//
#include <SoftwareSerial.h>

// arduino connect to rs485 pins
#define SSerialRX 2
#define SSerialTX 3
#define SSerialTxControl 4

#define RS485Transmit HIGH
#define RS485Recive  LOW

SoftwareSerial RS485Serial (SSerialRX, SSerialTX);
unsigned char byteReceived;

void setup() {
  Serial.begin(9600);
  Serial.println("Marvin Rs485 commiunication system");
  Serial.println("..................................");

pinMode(SSerialTxControl, OUTPUT);
  digitalWrite(SSerialTxControl, RS485Recive);

RS485Serial.begin(4800);
}

void loop() {
 
  while (Serial.available())
    {     
      byteReceived = Serial.read();
      digitalWrite (SSerialTxControl, RS485Transmit);
      RS485Serial.write(byteReceived);
    }
    delay(20);
    digitalWrite(SSerialTxControl, RS485Recive);
}

Eisebaer:
hi,

mal im voraus: es gibt bei RS485 keinen master oder slave, außer DU legst das so FÜR DICH fest.

jeder kann senden und empfangen, und zwar jederzeit, ohne jede aufforderung eines "masters".

natürlich kann es dann dazu kommen, daß gleichzeitig zwei senden und die telegramme dadurch unlesbar werden. das zu verhindern, ist Deine aufgabe. eine möglichkeit ist, daß Du eben master und slave benennst. aber das ist nur EINE möglichkeit.

eine andere methode ist, es so zu machen, wie Du es ja schon angesprochen hast, mittels einer antwort. kommt keine antwort, muß der sender wiederholen.

es gibt etliche mechanismen, das bleibt Dir überlassen.

wenn einer senden will, setzt er SSerialTxControl auf RS485Transmit, also auf HIGH, ansonsten setzt er es auf
RS485Recive, also auf LOW, dann lauscht er.

gruß stefan

ungetestet:

//

// Marvin Master for RS485 Communication
//
#include <SoftwareSerial.h>

// arduino connect to rs485 pins
#define SSerialRX 2
#define SSerialTX 3
#define SSerialTxControl 4

#define RS485Transmit HIGH
#define RS485Recive  LOW

SoftwareSerial RS485Serial (SSerialRX, SSerialTX);
unsigned char byteReceived;

void setup() {
  Serial.begin(9600);
  Serial.println("Marvin Rs485 commiunication system");
  Serial.println("..................................");

pinMode(SSerialTxControl, OUTPUT);
  digitalWrite(SSerialTxControl, RS485Recive);

RS485Serial.begin(4800);
}

void loop() {
 
  while (Serial.available())
    {     
      byteReceived = Serial.read();
      digitalWrite (SSerialTxControl, RS485Transmit);
      RS485Serial.write(byteReceived);
    }
    delay(20);
    digitalWrite(SSerialTxControl, RS485Recive);
}

Eisebaer:
hi,

mal im voraus: es gibt bei RS485 keinen master oder slave, außer DU legst das so FÜR DICH fest.

jeder kann senden und empfangen, und zwar jederzeit, ohne jede aufforderung eines "masters".

natürlich kann es dann dazu kommen, daß gleichzeitig zwei senden und die telegramme dadurch unlesbar werden. das zu verhindern, ist Deine aufgabe. eine möglichkeit ist, daß Du eben master und slave benennst. aber das ist nur EINE möglichkeit.

eine andere methode ist, es so zu machen, wie Du es ja schon angesprochen hast, mittels einer antwort. kommt keine antwort, muß der sender wiederholen.

es gibt etliche mechanismen, das bleibt Dir überlassen.

wenn einer senden will, setzt er SSerialTxControl auf RS485Transmit, also auf HIGH, ansonsten setzt er es auf
RS485Recive, also auf LOW, dann lauscht er.

gruß stefan

ungetestet:

//

// Marvin Master for RS485 Communication
//
#include <SoftwareSerial.h>

// arduino connect to rs485 pins
#define SSerialRX 2
#define SSerialTX 3
#define SSerialTxControl 4

#define RS485Transmit HIGH
#define RS485Recive  LOW

SoftwareSerial RS485Serial (SSerialRX, SSerialTX);
unsigned char byteReceived;

void setup() {
  Serial.begin(9600);
  Serial.println("Marvin Rs485 commiunication system");
  Serial.println("..................................");

pinMode(SSerialTxControl, OUTPUT);
  digitalWrite(SSerialTxControl, RS485Recive);

RS485Serial.begin(4800);
}

void loop() {
 
  while (Serial.available())
    {     
      byteReceived = Serial.read();
      digitalWrite (SSerialTxControl, RS485Transmit);
      RS485Serial.write(byteReceived);
    }
    delay(20);
    digitalWrite(SSerialTxControl, RS485Recive);
}

Hallo, ich bin gerade hier rüber gestolpert.
Stehe quasi auch am Anfang. Ich möchte einen Nano mit einem Nano 33 BLE via RS485 Treiber verbinden. Die Hardware habe ich schon da.
Finde leider kein Beispiel wie ich Senden und Empfangen kann. Ich möchte auf dem Nano verschiedene ESC Module, Servos über RS485 auf dem 33BLE Steuern. Der 33BLE Quasi der "Slave" soll Sensordaten an den Nano Master übermitteln. Batteriespannung z.B.
Ich möchte einen Tauchroboter (ROV)über RS485 realisieren.
Ich weiß gar nicht ob das überhaupt geht. DE und RE auf dem Treiber muss ich ja Brücken oder?
Ich finde leider keinen Sketch oder ein Beispiel im Internet. Bisher habe ich nur Master und Slave als Einseitige Kommunikation gefunden. Hat mir jemand einen Tipp?
Danke

Warum kaperst Du einen fremden uralten Thread? Du hast doch schon einen eigenen Thread.

Gruß Tommy

Tommy56:
Warum kaperst Du einen fremden uralten Thread? Du hast doch schon einen eigenen Thread.

Gruß Tommy

Stimmt aber es geht im Moment mehr um das RS485 Problem. Aber kein Problem, dann gehe ich zurück in meinen!