3

How does RS-485 communication between Raspberry Pi and various sensors work?

Note: I would like to use it with Pyhton 2.7.

Can I connect ADM485 to the UART (Tx, Rx) of Raspberry Pi? I want to use minimalmodbus to communicate with Arduinos receiving information from multiple temperature sensors.

Any there any references to this? I read the documentation of minimalmodbus and it sounds great. Can I go forward or is there any other better Python mdoules for a beginner like me?

SlySven
  • 3,631
  • 1
  • 20
  • 46
Ruthvik Vaila
  • 793
  • 2
  • 12
  • 21

2 Answers2

9

1- Managing the send / recieve modes by soft will most likely result in failure for the communication

[Ref.Link to be inserted here]

I am trying to hook up a Tristar TS-MPPT-60 to a Raspberry Pi using an RS-485 chip connected to the Raspberry Pi UART, and eventually add my Arduinos to the network. I have some MAX485 chips and a SparkFun RS-485 BOB to do my tests.

References:

2- To let the Raspberry Pi control the RTS / CTS you need access to pins 30 and 31

Here is what I got hooked up, but not tested yet: Original image: http://www.homegenie.it/forum/index.php?topic=208.0

Enter image description here

3- To use the UART you need to have it released by the Raspberry Pi internal use (undesired traffic):

The MakeFile is broken. Do not forget to fix this code for the gpio_setfunc function to compile:

In the Makefile change the line:

cp $(BINARIES) $(SCRIPTS) $(BINDIR)

to

cp $(BINARIES) $(BINDIR)

To make this restart safe, we put the command into /etc/rc.local:

# Enable CTS + RTS on P5 header for onboard serial
/usr/local/bin/gpio_setfunc 31 ALT3
/usr/local/bin/gpio_setfunc 30 ALT3

3-Here is a sample of code that should allow to communicate with slaves.

pymodbus rtu RS-485 communication

Pay attention to the corrections below, the code block in the previous link.

temps  = client.read_input_registers(30001, 4, unit=0x0a) # Address, count, slave address
print temps.registers
coil  = client.read_coils(10001, 8, unit=0x0a) # Address, count, slave address
print coil.bits

In the sample code, replace the undesired USB port with the TTL one:

port="/dev/ttyUSB0"
to
port="/dev/ttyAMA0"

All of this is untested, but that is a resume of all my findings up to now.

Now my latest issue is that the slave has a big 12 V mark on the Modbus port. Will my Raspberry Pi get fried? I'll keep you posted.

WARNING:

As Chris pointed out in the comments below, that amateur setup is untested and might fry your pi.

You've got MAX485 connected to 5V and its D/R/DE/RE pins connected to Pi's GPIO >directly. This isn't safe as GPIO pins are designed to operate at 3.3V whereas >the R pin will send 5V signals (not sure if the other pins ever send 5V signals >from MAX485). This mistake seems so common and yet I haven't read someone >saying they actually burnt their pi doing that, so maybe it's usually fine, but >technically you should use a 5V to 3.3V level converter. Or replace MAX485 with >MAX3485 and power via 3.3Vcc pin.

7

I do not think you will be able to directly connect the RS-485 to the RPi with software bitbanging.

It think the easiest way would be to use a USB <-> RS-485 device. Then you can use the USB as a serial port and let the rest happen as it should.

enter image description here

I did find something like that at Farnell and it says it supports Linux 2.4+ - But the driver might need to get tweaked to work on ARM version of Linux. Then just use Python or whatever using built in Serial Port tools and code!

enter image description here

Thanks to Phil Vallone for providing a solution to use the FTDI chip on the Pi

Piotr Kula
  • 17,336
  • 6
  • 66
  • 105