Pregunta

I'm trying to get a SainSmart USB relay board based on the FT245RL chip working and having a terrible time. I was under the impression that I could control the relays from the command line with something like:

echo -e -n "\xFF\x1\x1" > /dev/ttyUSB1

While the device is mounted automatically and I think I've got the baud rate and permissions set up, nothing happens on my Debian squeeze or CentOS 5 machines. SainSmart's support is worthless.

I decided to try on windows, so I installed the drivers and wrote a small program in python:

import serial
ser = serial.Serial(2) #COM3
ser.write(chr(255) + chr(0) + chr(1))
ser.close

Still nothing. Perhaps it's a hardware problem so I install a provided windows program. It sees the device and works when I click on the relay buttons. Discouraged, I exit their program, look for bugs in mine (can't find any) but try it anyways, and it works! I write a much bigger program to do all sorts of cool things and cool things happen until I unplug the device. When I plug it back in, nothing works. I've got to run and exit the relay control program before my code will do anything.

I suspect that I've got to do something with d2xx drivers like FT_SetBitMode(). Is there any way to just use VCP mode? PyUSB won't install on my computer and isn't available for Linux.

All I want is a simple way to control a relay on Linux using python.

¿Fue útil?

Solución

I had the same problem, I think you were right about FT_SetBitMode(). Eventually I got it to work by using ftd2xx (which you can get by pip). You will also need to install the D2XX drivers.

import ftd2xx
if ftd2xx.listDevices() < 1:
    print "No relays found. Exiting..."
    exit()
else: print "Initializing relays..."
relays = ftd2xx.open(0)
relays.setBitMode(255,1) # I think this uses FT_SetBitMode()
relays.write(b'\01\01')  # relay one on
relays.write(b'\01\01')  # relay two on
relays.write(b'\00\00')  # all relays off
relays.close()

Otros consejos

I would first suggest you to try out hyperterminal first.

From your code snippet it seems that you are missing the baudrate (assuming the rest are going to be the default values). And I don't really know if it matters but I always explicitly set the port as Serial('COM3'), one less possible point of failure this way :)

Probably you don't have a problem with Python, but with controlling the device as such.

You should try to find out if the the device has special requirements about the state of the control lines (DST, DTR etc.).

And, not to forget, the communication speed which Alex already mentions.

Using virtual com ports on Windows I found I had to use 115k baud

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top