💬 Building a wired RS485 sensor network
-
Hi, I build up the set up with serial gateway and the motion sensor but nothing happens (only nonsence is is seen in the serial monitor)
However if I run this small program using the AltSoftSerial library I can communicatie without any issue in both directions.
Have others the same issue, or what do I overlook?#include <AltSoftSerial.h>
AltSoftSerial altSerial;
#define SSerialTxControl 2 //RS485 Direction control#define RS485Transmit HIGH
#define RS485Receive LOW
bool ReceiveOrSend = RS485Transmit;void setup() {
Serial.begin(9600);
Serial.println("AltSoftSerial Test Begin");
pinMode(SSerialTxControl, OUTPUT);
digitalWrite(SSerialTxControl, RS485Transmit); // Enable RS485 Transmit
altSerial.begin(9600);
if (ReceiveOrSend ){
Serial.println("send mode");
digitalWrite(SSerialTxControl, RS485Transmit); // Enable RS485 Transmit
} else
{
digitalWrite(SSerialTxControl, RS485Receive); // Enable RS485 Transmit
Serial.println("receive mode");
}
}void loop() {
char receivedOnRS485;if (ReceiveOrSend ){
altSerial.println(" Hello world");
delay(2000);
} else
{if (altSerial.available()) {
receivedOnRS485 = altSerial.read();
Serial.print("ontvagen=");
Serial.println(receivedOnRS485);
}
}
} -
@MICK HI, please check this topic : https://forum.mysensors.org/topic/5495/rs485-on-nano
-
Yes. It is very bad for beginners, that examples in MySensors library are wrong.
Example "MotionSensorRS485" will never work and I think, that author not tested it.
MY_NODE_ID must be always defined for node in RS485 network, because is used for RS485 network addressing.
Obtaining NODE_ID from controller with currentRS485 network implementation is impossible and I think it should be clearly mentioned in the examples and documentation. -
Would be better if someone with a RS485 setup could analyse and fix the root cause of why automatic id assignment doesn't work than just change the example to use static ids.
Did the id request reach your controller or gateway? Did the id response get to your gateway?
-
Would be better if someone with a RS485 setup could analyse and fix the root cause of why automatic id assignment doesn't work than just change the example to use static ids.
Did the id request reach your controller or gateway? Did the id response get to your gateway?
@hek
I think it is simply. In radio network, each node has its unique "radio ID" , witch is used for delivering messages between nodes in radio network. So node can send message " Give me NODE_ID" and gateway or controller knows to witch radio ID send message with assigned NODE_ID in it.
But in RS485 network we had not unique network ID by default - we use directly NODE_ID for addressing messages between nodes. -
No, it follow exactly the same flow as in a radio network. The gateway (and nodes) should listen to "channel" 255 which is used for broadcast messages (picked up by anyone interested; I.e. repeaters and nodes waiting for new id).
When a id request is sent out from a node, the gateway will forward it to the controller.. the controller sends out the new id on 255 (which is forwarded by the gateway) and (hopefully) picked up by the new node.
So somewhere in stil flow the message is not sent along for some reason. Which controller do you use @kimot?
-
No, it follow exactly the same flow as in a radio network. The gateway (and nodes) should listen to "channel" 255 which is used for broadcast messages (picked up by anyone interested; I.e. repeaters and nodes waiting for new id).
When a id request is sent out from a node, the gateway will forward it to the controller.. the controller sends out the new id on 255 (which is forwarded by the gateway) and (hopefully) picked up by the new node.
So somewhere in stil flow the message is not sent along for some reason. Which controller do you use @kimot?
@hek
I am using Domoticz, but not using RS485, instead I am working on CAN protocol layer for MySensors or using only MySensors serial gateway protocol in my CAN-to-Domoticz gateway. For that reason I am studying source code of MYSensors a lot of. Its only useful documentation source, unfortunately.
Imagine, if you "switch on" entire your network with 10 nodes. Each node send request for NODE_ID to the gateway and gateway send broadcast with assigned NODE_ID. How RS485 nodes recognizes, that this NODE_ID is exactly for specific node?
Why in radio network is something like MY_RF24_NODE_ADDRESS?
( five bytes long, 4 are constant, fifth is radio ID )
I seems, that entire this "MySensors network DHCP" stuff is made in different level then MyTransportXXXXX.cpp level. Maybe radio drivers ?
If you know, how it works, pleas write here or send link, please.
I can imagine only mechanism, when only one new node is connected at time, or some random generated number in each node or unique serial number etc. Then gateway can send NODE_ID with this "mark" end receiving node knows, that this is for it. -
@kimot said:
Imagine, if you "switch on" entire your network with 10 nodes. Each node send request for NODE_ID to the gateway and gateway send broadcast with assigned NODE_ID. How RS485 nodes recognizes, that this NODE_ID is exactly for specific node?
This will not work (and the same applies for a radio network). All nodes will then pick the broadcasted id.
This is known limitation and has its technical background in how the radios work and that the new have problem generating a good unique random number when it starts blank.
I know we had some ideas of adding a payload (random number) on the id-request payload identifying the requesting node. The node then also check that this number is the same in the id-response. But would break backward compatibility with the serial protocol so it would only happen in a bigger (3.0?) release.
Edit: Added issue so we won't forget it.
https://github.com/mysensors/MySensors/issues/732 -
@kimot said:
Imagine, if you "switch on" entire your network with 10 nodes. Each node send request for NODE_ID to the gateway and gateway send broadcast with assigned NODE_ID. How RS485 nodes recognizes, that this NODE_ID is exactly for specific node?
This will not work (and the same applies for a radio network). All nodes will then pick the broadcasted id.
This is known limitation and has its technical background in how the radios work and that the new have problem generating a good unique random number when it starts blank.
I know we had some ideas of adding a payload (random number) on the id-request payload identifying the requesting node. The node then also check that this number is the same in the id-response. But would break backward compatibility with the serial protocol so it would only happen in a bigger (3.0?) release.
Edit: Added issue so we won't forget it.
https://github.com/mysensors/MySensors/issues/732@hek
Thanks for your explanation.
Last question for you. I cannot find information about internal message strukture.
Only this discussion:
https://forum.mysensors.org/topic/305/mysensors-protocol-format
or
"hacking" librariesWitch version is actual?
I need myself write translation between my network message format and MySensors message format to use
something like MyTransportRS485.cpp. But I have limited number of bytes for payload, so I need modify and test "data" array too.
Thanks. -
@wimd
i have problem with usb port in raspberry. everytime after power off/on , usb port lost for me. so now i use a raspberry gateway . rs485 can run on gpio ? with a virtual usb port
