pythonlinuxusbftdi

How to use FDTI chip in VCP mode?


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.


Solution

  • 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()