rs485 on nano
-
Implemented fixed node ID without success, I think maybe the rs485 adapter on gateway is broken, will test more tomorrow
@skatun Will join this discussion as well. I have exately the same issue. My set up is a nano as sensor and an uno as gateway.
I verified correct wiring of RS485 network is correctly doen I used this sketch (swith ReceiveOrSend to RS485Transmit or RS485Receive on both nodes;
:#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); } } }``` -
@skatun Will join this discussion as well. I have exately the same issue. My set up is a nano as sensor and an uno as gateway.
I verified correct wiring of RS485 network is correctly doen I used this sketch (swith ReceiveOrSend to RS485Transmit or RS485Receive on both nodes;
:#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); } } }``` -
@wimd As my reply stated in the other thread, it would be helpful to see all sketches being used so we can determine better where the problem may lie.
@dbemowsk It are the standard examples.
For the gateway (Uno) :
* The MySensors Arduino library handles the wireless radio link and protocol * between your home built sensors/actuators and HA controller of choice. * The sensors forms a self healing radio network with optional repeaters. Each * repeater and gateway builds a routing tables in EEPROM which keeps track of the * network topology allowing messages to be routed to nodes. * * Created by Henrik Ekblad <henrik.ekblad@mysensors.org> * Copyright (C) 2013-2015 Sensnology AB * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors * * Documentation: http://www.mysensors.org * Support Forum: http://forum.mysensors.org * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * ******************************* * * DESCRIPTION * The RS485 Gateway prints data received from sensors on the serial link. * The gateway accepts input on seral which will be sent out on * the RS485 link. * * Wire connections (OPTIONAL): * - Inclusion button should be connected between digital pin 3 and GND * - RX/TX/ERR leds need to be connected between +5V (anode) and digital pin 6/5/4 with resistor 270-330R in a series * * LEDs (OPTIONAL): * - To use the feature, uncomment MY_LEDS_BLINKING_FEATURE in MyConfig.h * - RX (green) - blink fast on radio message recieved. In inclusion mode will blink fast only on presentation recieved * - TX (yellow) - blink fast on radio message transmitted. In inclusion mode will blink slowly * - ERR (red) - fast blink on error during transmission error or recieve crc error * * The gateway uses AltSoftSerial to handle two serial links * on one Arduino. Use the following pins for RS485 link * * Board Transmit Receive PWM Unusable * ----- -------- ------- ------------ * Teensy 3.0 & 3.1 21 20 22 * Teensy 2.0 9 10 (none) * Teensy++ 2.0 25 4 26, 27 * Arduino Uno 9 8 10 * Arduino Leonardo 5 13 (none) * Arduino Mega 46 48 44, 45 * Wiring-S 5 6 4 * Sanguino 13 14 12 * */ // Enable debug prints to serial monitor #define MY_DEBUG // Enable RS485 transport layer #define MY_RS485 // Define this to enables DE-pin management on defined pin #define MY_RS485_DE_PIN 2 // Set RS485 baud rate to use #define MY_RS485_BAUD_RATE 9600 // Enable serial gateway #define MY_GATEWAY_SERIAL // Flash leds on rx/tx/err #define MY_LEDS_BLINKING_FEATURE // Set blinking period #define MY_DEFAULT_LED_BLINK_PERIOD 300 // Enable inclusion mode #define MY_INCLUSION_MODE_FEATURE // Enable Inclusion mode button on gateway #define MY_INCLUSION_BUTTON_FEATURE // Set inclusion mode duration (in seconds) #define MY_INCLUSION_MODE_DURATION 60 // Digital pin used for inclusion mode button #define MY_INCLUSION_MODE_BUTTON_PIN 3 #define MY_DEFAULT_ERR_LED_PIN 4 // Error led pin #define MY_DEFAULT_RX_LED_PIN 5 // Receive led pin #define MY_DEFAULT_TX_LED_PIN 6 // the PCB, on board LED #include <SPI.h> #include <MySensors.h> void setup() { // Setup locally attached sensors } void presentation() { // Present locally attached sensors } void loop() { // Send locally attached sensor data here }For the sensor (Nano):
/** * The MySensors Arduino library handles the wireless radio link and protocol * between your home built sensors/actuators and HA controller of choice. * The sensors forms a self healing radio network with optional repeaters. Each * repeater and gateway builds a routing tables in EEPROM which keeps track of the * network topology allowing messages to be routed to nodes. * * Created by Henrik Ekblad <henrik.ekblad@mysensors.org> * Copyright (C) 2013-2015 Sensnology AB * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors * * Documentation: http://www.mysensors.org * Support Forum: http://forum.mysensors.org * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * ******************************* * * REVISION HISTORY * Version 1.0 - Henrik Ekblad * * DESCRIPTION * This is an example of sensors using RS485 as transport layer * * Motion Sensor example using HC-SR501 * http://www.mysensors.org/build/motion * * The transport uses AltSoftSerial to handle two serial links * on one Arduino. Use the following pins for RS485 link * * Board Transmit Receive PWM Unusable * ----- -------- ------- ------------ * Teensy 3.0 & 3.1 21 20 22 * Teensy 2.0 9 10 (none) * Teensy++ 2.0 25 4 26, 27 * Arduino Uno 9 8 10 * Arduino Leonardo 5 13 (none) * Arduino Mega 46 48 44, 45 * Wiring-S 5 6 4 * Sanguino 13 14 12 * * */ // Enable RS485 transport layer #define MY_RS485 // Define this to enables DE-pin management on defined pin #define MY_RS485_DE_PIN 2 // Set RS485 baud rate to use #define MY_RS485_BAUD_RATE 9600 #include <SPI.h> #include <MySensors.h> unsigned long SLEEP_TIME = 120000; // Sleep time between reports (in milliseconds) #define DIGITAL_INPUT_SENSOR 3 // The digital input you attached your motion sensor. (Only 2 and 3 generates interrupt!) #define CHILD_ID 1 // Id of the sensor child // Initialize motion message MyMessage msg(CHILD_ID, V_TRIPPED); void setup() { pinMode(DIGITAL_INPUT_SENSOR, INPUT); // sets the motion sensor digital pin as input } void presentation() { // Send the sketch version information to the gateway and Controller sendSketchInfo("Motion Sensor", "1.0"); // Register all sensors to gw (they will be created as child devices) present(CHILD_ID, S_MOTION); } void loop() { // Read digital motion value boolean tripped = digitalRead(DIGITAL_INPUT_SENSOR) == HIGH; Serial.println(tripped); send(msg.set(tripped?"1":"0")); // Send tripped value to gw // Sleep until interrupt comes in on motion sensor. Send update every two minute. sleep(digitalPinToInterrupt(DIGITAL_INPUT_SENSOR), CHANGE, SLEEP_TIME); } -
@dbemowsk It are the standard examples.
For the gateway (Uno) :
* The MySensors Arduino library handles the wireless radio link and protocol * between your home built sensors/actuators and HA controller of choice. * The sensors forms a self healing radio network with optional repeaters. Each * repeater and gateway builds a routing tables in EEPROM which keeps track of the * network topology allowing messages to be routed to nodes. * * Created by Henrik Ekblad <henrik.ekblad@mysensors.org> * Copyright (C) 2013-2015 Sensnology AB * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors * * Documentation: http://www.mysensors.org * Support Forum: http://forum.mysensors.org * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * ******************************* * * DESCRIPTION * The RS485 Gateway prints data received from sensors on the serial link. * The gateway accepts input on seral which will be sent out on * the RS485 link. * * Wire connections (OPTIONAL): * - Inclusion button should be connected between digital pin 3 and GND * - RX/TX/ERR leds need to be connected between +5V (anode) and digital pin 6/5/4 with resistor 270-330R in a series * * LEDs (OPTIONAL): * - To use the feature, uncomment MY_LEDS_BLINKING_FEATURE in MyConfig.h * - RX (green) - blink fast on radio message recieved. In inclusion mode will blink fast only on presentation recieved * - TX (yellow) - blink fast on radio message transmitted. In inclusion mode will blink slowly * - ERR (red) - fast blink on error during transmission error or recieve crc error * * The gateway uses AltSoftSerial to handle two serial links * on one Arduino. Use the following pins for RS485 link * * Board Transmit Receive PWM Unusable * ----- -------- ------- ------------ * Teensy 3.0 & 3.1 21 20 22 * Teensy 2.0 9 10 (none) * Teensy++ 2.0 25 4 26, 27 * Arduino Uno 9 8 10 * Arduino Leonardo 5 13 (none) * Arduino Mega 46 48 44, 45 * Wiring-S 5 6 4 * Sanguino 13 14 12 * */ // Enable debug prints to serial monitor #define MY_DEBUG // Enable RS485 transport layer #define MY_RS485 // Define this to enables DE-pin management on defined pin #define MY_RS485_DE_PIN 2 // Set RS485 baud rate to use #define MY_RS485_BAUD_RATE 9600 // Enable serial gateway #define MY_GATEWAY_SERIAL // Flash leds on rx/tx/err #define MY_LEDS_BLINKING_FEATURE // Set blinking period #define MY_DEFAULT_LED_BLINK_PERIOD 300 // Enable inclusion mode #define MY_INCLUSION_MODE_FEATURE // Enable Inclusion mode button on gateway #define MY_INCLUSION_BUTTON_FEATURE // Set inclusion mode duration (in seconds) #define MY_INCLUSION_MODE_DURATION 60 // Digital pin used for inclusion mode button #define MY_INCLUSION_MODE_BUTTON_PIN 3 #define MY_DEFAULT_ERR_LED_PIN 4 // Error led pin #define MY_DEFAULT_RX_LED_PIN 5 // Receive led pin #define MY_DEFAULT_TX_LED_PIN 6 // the PCB, on board LED #include <SPI.h> #include <MySensors.h> void setup() { // Setup locally attached sensors } void presentation() { // Present locally attached sensors } void loop() { // Send locally attached sensor data here }For the sensor (Nano):
/** * The MySensors Arduino library handles the wireless radio link and protocol * between your home built sensors/actuators and HA controller of choice. * The sensors forms a self healing radio network with optional repeaters. Each * repeater and gateway builds a routing tables in EEPROM which keeps track of the * network topology allowing messages to be routed to nodes. * * Created by Henrik Ekblad <henrik.ekblad@mysensors.org> * Copyright (C) 2013-2015 Sensnology AB * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors * * Documentation: http://www.mysensors.org * Support Forum: http://forum.mysensors.org * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * ******************************* * * REVISION HISTORY * Version 1.0 - Henrik Ekblad * * DESCRIPTION * This is an example of sensors using RS485 as transport layer * * Motion Sensor example using HC-SR501 * http://www.mysensors.org/build/motion * * The transport uses AltSoftSerial to handle two serial links * on one Arduino. Use the following pins for RS485 link * * Board Transmit Receive PWM Unusable * ----- -------- ------- ------------ * Teensy 3.0 & 3.1 21 20 22 * Teensy 2.0 9 10 (none) * Teensy++ 2.0 25 4 26, 27 * Arduino Uno 9 8 10 * Arduino Leonardo 5 13 (none) * Arduino Mega 46 48 44, 45 * Wiring-S 5 6 4 * Sanguino 13 14 12 * * */ // Enable RS485 transport layer #define MY_RS485 // Define this to enables DE-pin management on defined pin #define MY_RS485_DE_PIN 2 // Set RS485 baud rate to use #define MY_RS485_BAUD_RATE 9600 #include <SPI.h> #include <MySensors.h> unsigned long SLEEP_TIME = 120000; // Sleep time between reports (in milliseconds) #define DIGITAL_INPUT_SENSOR 3 // The digital input you attached your motion sensor. (Only 2 and 3 generates interrupt!) #define CHILD_ID 1 // Id of the sensor child // Initialize motion message MyMessage msg(CHILD_ID, V_TRIPPED); void setup() { pinMode(DIGITAL_INPUT_SENSOR, INPUT); // sets the motion sensor digital pin as input } void presentation() { // Send the sketch version information to the gateway and Controller sendSketchInfo("Motion Sensor", "1.0"); // Register all sensors to gw (they will be created as child devices) present(CHILD_ID, S_MOTION); } void loop() { // Read digital motion value boolean tripped = digitalRead(DIGITAL_INPUT_SENSOR) == HIGH; Serial.println(tripped); send(msg.set(tripped?"1":"0")); // Send tripped value to gw // Sleep until interrupt comes in on motion sensor. Send update every two minute. sleep(digitalPinToInterrupt(DIGITAL_INPUT_SENSOR), CHANGE, SLEEP_TIME); } -
-
@wimd include debug and remove inclusion from the sketches and it should be ok. I have ordered new rs485 shield, i expect that to be the issue..
-
@wimd include debug and remove inclusion from the sketches and it should be ok. I have ordered new rs485 shield, i expect that to be the issue..
-
@skatun my problem is solve . you test this and feedback me. use 3.3v and gnd pins in arduino use for rs485 module.
-
@Reza Though your two pictures are both bus topologies, your first one is a star bus topology and your second is a linear bus topology. As to your second question "so in end of A and B , what am i do ?" Depending on a few factors such as equipment connected, cable type, cable length and data speed (baud rate) used, you may or may not need a termination resistor at the end of the line. For short runs you typically won't need them, but if you have hundreds of feet you are working with, you may want them, especially if you want to run at a higher baud like 115200 or higher. As to the resistor value, just do a google search for "RS485 termination resistor."
-
This is how you build your network.

I assume that you use these :

Node 1 is the MAX485 RS-485 Module connected to your gateway.
Node N is the MAX485 RS-485 Module connected to your last sensor of your network.Between node 1 and N you can add addtional nodes but you need to keep the bus structure.
Important are the terminating resistors (1) and (2). They are R7 on the RS-485 module.
If you add modules between node 1 and node N and you have a failure in transmitting, check then with removal of R7 on that added node. -
This is how you build your network.

I assume that you use these :

Node 1 is the MAX485 RS-485 Module connected to your gateway.
Node N is the MAX485 RS-485 Module connected to your last sensor of your network.Between node 1 and N you can add addtional nodes but you need to keep the bus structure.
Important are the terminating resistors (1) and (2). They are R7 on the RS-485 module.
If you add modules between node 1 and node N and you have a failure in transmitting, check then with removal of R7 on that added node.@wimd
i use this module (rs485) . for max 30 or 40 meter. is need resistors ? ( if need 100 ohm is good ?)
i think the problem that @skatun told was solve with 3.3v pin on arduino but no. i use static ID for nodes and remove INCLUSION MODE in gateway but when connect i have error:2035 !TSM:FPAR:NO REPLY 2037 TSM:FPAR 2055 TSF:MSG:SEND,1-1-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK: 4063 !TSM:FPAR:NO REPLY 4065 TSM:FPAR 4082 TSF:MSG:SEND,1-1-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK: 6090 !TSM:FPAR:NO REPLY 6092 TSM:FPAR 6110 TSF:MSG:SEND,1-1-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK: 8118 !TSM:FPAR:FAIL 8119 TSM:FAIL:CNT=1 8121 TSM:FAIL:PDTafter some reset and change pins of vcc and gnd , when use 3.3v in gateway for vcc rs485 module i see (in serial monitor) node is connect to gateway. so i think this is ok always. but today i try for new node and i see same problem again
do you think this is related to power ? -
i found a thing about this . i think all of problem is related to power ! when power of node is with a adaptor 1A and power of gateway is with usb of raspberry so i have this error "!TSM:FPAR:NO REPLY" but when connect both ( node and gateway to laptop with usb) after several test i see all of connect is ok ( several reset and connect/disconnect usb cable) . i am beginner sorry , so for this what am i do ? can i use another power for vcc and gnd rs485 module ? how ? or you have better solution ?
-
i tested again . connected gateway to my laptop (use domoticz for laptop) and use a 30 meter wire between gateway and first node. and again use a 5 meter wire for second node ( without any resistor). when start domoticz , nodes detect easy and start working well. i test again and again (with reset and power off/on)but this is ok and dont any problem(relay give command and send ack and all of thing is true) . then i connect gateway to raspberry (2 nodes is connect to laptop yet) so for a short time relay worked ( 2 - 3 command send and relay on without ack ) then all command can not send....
again i connect gateway to laptop and all command send and ok .
so i think this is related to power of usb port (raspberry)
can i use rx-tx gpio on raspberry and arduino and use other power for arduino ?how configure on raspberry ? thank you -
Many hours I solved why MySe485 example does not work :angry: ... I tried Mega, Uno, Mini, Nano, reinstallation of IDE, libraries, ClearEepromConfig, HWserial / AltSoftSerial / direct (Tx <> Rx) + (Rx <> TX) without MAX485 ...
The other day I came across this forum and the solution is:
#define MY_NODE_ID xx
I saw a bug that RS485 communication is bad, because it is illegible. My mistake, the communication between GW and the node is not readable ASCII ...
RS485 communication: Node waiting to GW respone:


