【问题标题】:How to use a Sainsmart 8 Channel USB relay with python如何在 python 中使用 Sainsmart 8 通道 USB 继电器
【发布时间】:2019-03-12 16:39:10
【问题描述】:

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

【问题讨论】:

  • 请分享你到目前为止所做的事情。
  • 在我们等待的时候:我希望你没有用这个来切换任何潜在的危险。如果我读到“当板子连接到 PC 并重新启动 PC 时,继电器会切换几次。这是因为 FTDI 芯片的结构。” (sainsmart.com/products/8-channel-12v-usb-relay-module).. 如果您意外切换危险的东西,可能会造成灾难性后果。
  • 嘿,我在测试时没有连接到继电器。到目前为止,我的大部分测试都是对其进行串行写入,但尝试失败了。 ser.write({255, 1, 1}) 就是一个例子。我大部分时间都在摆弄那个。 python代码中没有错误,只是没有打开

标签: python relay


【解决方案1】:

在您安装 USB 驱动程序(来自http://wiki.sainsmart.com/index.php/101-70-116 的可执行文件)后,以下代码将用于打开前三个继电器。第三个数字中的每个位对应一个单独的继电器,需要打开或关闭。我的测试是在 Windows 10 机器上完成的,是反复试验的结果。文档没有帮助。

例如如果我通过 [255,1,2],它将打开第二个继电器,但关闭第一个,因为第二个位打开,但所有其他位都关闭。

import serial
import time

serialPort = serial.Serial(port="COM6", baudrate=9600, bytesize=8, timeout=2, stopbits=serial.STOPBITS_ONE)
elements=[255,1,1] 
result = serialPort.write(elements) 
time.sleep(2)
elements=[255,1,3] 
result = serialPort.write(elements) 
time.sleep(2)
elements=[255,1,7] 
result = serialPort.write(elements) 
serialPort.close()

【讨论】:

    【解决方案2】:

    由于该模块使用FT245RL USB FIFO集成电路,您可以使用这个repo https://github.com/vpatron/relay_ft245r 来自文斯赞助人。

    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)
    

    【讨论】:

      【解决方案3】:

      所以,这里有两种方法,这取决于你想去哪里。 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_ids,后缀看起来像 _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 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]
      

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

      ep.write(c6_on)
      

      无论哪种方式,只要您可以 A) 从命令行控制板或 B) 知道要发送的正确串行命令,那么您就可以弄清楚如何使用 python 来完成。唯一需要注意的另一件事是确保您具有适当的依赖关系和观看权限。

      【讨论】:

        猜你喜欢
        • 2016-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-15
        • 1970-01-01
        • 1970-01-01
        • 2016-03-19
        相关资源
        最近更新 更多