Home

Awesome

An isolated USB-RS485 adapter

I connected a lot of USB-RS485 adapters to my smart meter readout software and wasn't happy. Either the device is cheap and broken or works but is very expensive. The supercheap adaptors from China often provice no ground connection, one worked fine, another one was unstable. Both did not adhere to the USB spec (90mA initial current draw limit). On the other hand, industrial adaptors like the Meilhaus RedCOM USB-COMi-SI or the ADAM 4561 isolate the RS-485 bus from the USB line and work extremely reliable. But they are really expensive.

This project aims to create an adaptor that works well and is reasonably priced. We use the following components:

The first prototype looks like this:

First prototype

The PCB is too big, and I don't need all those test points any more. Therefore, I have build the second prototype. Please note that the board is slightly smaller, has a different WAGO connector and unpopulated footprints for protection diodes:

Second prototype

The second prototype works quite well. Unfortunately, the holes for the WAGO connector are too small -- I needed to drill them bigger. While doing so, I destroyed a connection to the "A" pin - the copper wire to the right of the WAGO connector replaces the PCB trace I destroyed. In addition, the footprint for the MOSFET is wrong.

Minor layout changes are needed, but the principle is solid.

TODO

FTDI configuration.

The FTDI chip needs to be configured in order to work in this application. Specifically, the following changes need to be written into its EEPROM:

You can use Mark Lord's ft232r_prog to change the EEPROM settings. In order to see the current EEPROM content, use

$ ft232r_prog --verbose --dump --old-vid 0x0403 --old-pid 0x6001

In order to set CBUS3 to PwrEN, CBUS4 to TxDEN, high-current-io off and the maximum power consumption to 300 mA, use

$ ft232r_prog --verbose --dump --old-vid 0x0403 --old-pid 0x6001 \
	--cbus3 PwrEn --cbus4 TxDEN --high-current-io off --max-bus-power 300

On Linux I could successfully compile the binary just by typing make and using it as described above. On Mac OS X, I needed to add /usr/local to the Makefile. The top two lines now read like this:

CFLAGS = -Wall -O2 -s -Werror -I/usr/local/include
LDFLAGS = -L/usr/local/lib -lusb -lftdi -s

In my case, a FTDI driver claimed the device, preventing the ft232r_prog command to communicate with the FTDI. You can list the FTDI-related kernel extensions using

$ kextstat | grep FTDI
	156    0 0xffffff7f83606000 0x8000     0x8000     com.FTDI.driver.FTDIUSBSerialDriver (2.2.16) 0AB01558-B114-9EF2-1CD9-A13CFA557737 <137 55 5 4 3 1>

Then, to unload the driver, use

$ sudo kextunload -b com.FTDI.driver.FTDIUSBSerialDriver

for all FTDI drivers you found.