如何通过Python使用Sainsmart 8通道USB中继

时间:2018-10-08 03:21:52

标签: python relay

我一直在找几个小时,我想让我的Sainsmart 8通道USB中继使用python工作。如果有人可以帮助我解决这个问题,那就太好了。谢谢。

2 个答案:

答案 0 :(得分:1)

因此,这里有两种方法,这取决于您要去的地方。 A)您可以获得类似usbrelay的命令行版本,然后从python发出命令,并且B)您可以从python内部打开串行连接,然后使用usb.core或usb.util将串行命令发送到开发板。

A)Darrylb在github上的工作很不错,这里概述了可用于HID兼容继电器的命令行工具。 https://github.com/darrylb123/usbrelay

如果您使用的是Debian:

sudo apt-get install usbrelay

然后,您更新了rules.d文件,因此您不必一直使用'sudo',并且可以在python中调用命令行。当然,这对安全性有一定的影响,如果您打算长期使用,则应该在谷歌上搜索。

无论如何,一旦安装了它,就可以从命令行调用它,它将以某种格式列出您的relay_id,其后缀看起来像_1到_8。

$ ./usbrelay

输出将显示您所连接的板上的信息,并提供中继ID和状态。 “ 1”打开,“ 0”关闭。

然后在python内部:

import os    
os.system("usbrelay 5291D_1=1 5291D_3=1")

要关闭这些继电器,只需将分配中的那些设置为零即可,并且您可以同时执行所有八个继电器编号。因此,您可以从那里继续编写各种函数,以独特的组合,延迟等触发继电器。您还可以在python中使用子过程:

import subprocess
subprocess.run(['usbrelay', '5291D_1=1', '5291D_3=1'], stdout=subprocess.PIPE).stdout.decode('utf-8')

B)要采用串行连接方法,您必须首先了解对您的主板正确的串行命令是什么。例如,我有一个sainsmart 16通道继电器,因为它与HID不兼容,所以要求我发送串行命令。

在Sainsmart Wiki上找到您的型号: http://wiki.sainsmart.com/index.php/SKU

然后下载zip文件并查看中继说明。对我来说,我使用了RJ的修改版本来发送串行命令。
https://gist.github.com/RJ/7acba5b06a03c9b521601e08d0327d56

这是有关我的SKU编号的说明(可能比您的差!) CH-6开3A 46 45 30 35 30 30 35 46 46 30 30 46 39 0D 0A

您需要在串行消息中添加一个0x前缀:

c6_on=[0x3A, 0x46, 0x45, 0x30, 0x35, 0x30, 0x30, 0x30, 0x35, 0x46, 0x46, 0x30, 0x30, 0x46, 0x39, 0x0D, 0x0A]

然后,您可以使用上面的git gist链接中RJ如何处理这些命令的方法将这些命令发送到usb.core.Endpoint,此处的“ ep”为usb.core.Endpoint:

ep.write(c6_on)

无论哪种方式,只要您可以A)从命令行控制开发板,或B)知道要发送的正确串行命令,那么您就可以弄清楚如何使用python进行操作。要注意的唯一另一件事是确保您具有适当的依存关系并监视权限。

答案 1 :(得分:0)

由于此模块使用FT245RL USB FIFO集成电路,因此可以使用此存储库 https://github.com/vpatron/relay_ft245r,来自文斯·帕特隆(Vince Patron)。

test.py源代码非常容易理解:

import relay_ft245r
import sys
import time

rb = relay_ft245r.FT245R()
dev_list = rb.list_dev()

# list of FT245R devices are returned
if len(dev_list) == 0:
    print('No FT245R devices found')
    sys.exit()

# Show their serial numbers
for dev in dev_list:
    print(dev.serial_number)

# Pick the first one for simplicity
dev = dev_list[0]
print('Using device with serial number ' + str(dev.serial_number))

# Connect and turn on relay 2 and 4, and turn off
rb.connect(dev)
rb.switchon(2)    
rb.switchon(4)
time.sleep(1.0)
rb.switchoff(2)    
time.sleep(1.0)
rb.switchoff(4)