资讯详情

继电器USB relay用python控制

概要

USB relay是在github参考链接如下: https://github.com/pavel-a/usb-relay-hid,可下载发布的二进制文件进一步封装。

在linux下使用 USB relay

可以用sudo apt-get install usbrelay,或下载发布bin直接执行文件。

在window下控制

想要usb relay实现开关控制的继电器现在分类成一个python调用库,r以下:需要发布dll文件保存在同级目录下到lib文件夹下,

# vim relay.py  #!/usr/bin/env python # -*- coding:utf-8 -*-  import os import sys import time from ctypes import Structure,WinDLL,c_char_p,POINTER,pointer,cdll from platform import system   cdll_names = {             'Darwin' : 'libc.dylib',             'Linux'  : 'libc.so.6',             'Windows': 'msvcrt.dll'         } clib = WinDLL(cdll_names[system()])  class Usb_relay_device_type(Structure):     USB_RELAY_DEVICE_ONE_CHANNEL = 1     USB_RELAY_DEVICE_TWO_CHANNEL = 2     USB_RELAY_DEVICE_FOUR_CHANNEL = 4     USB_RELAY_DEVICE_EIGHT_CHANNEL = 8  class Usb_relay_device_info(Structure):     pass Usb_relay_device_info._fields_ = [("serial_number",c_char_p),                                   ("device_path",c_char_p),                                   ("type",Usb_relay_device_type),                                   ("next",POINTER(Usb_relay_device_info))]  usb_relay_device_info_p = pointer(Usb_relay_device_info())  class Relay():      def __init__(self):                  self.filepath64 = os.path.dirname(os.path.abspath(__file__))   os.sep   "lib"   os.sep   "USB_RELAY_DEVICE_64n.dll"         self.filepath32 = os.path.dirname(os.path.abspath(__file__))   os.sep   "lib"   os.sep   "USB_RELAY_DEVICE_32n.dll"         # print(self.filepath64)         # print(self.filepath32)         self.usb_relay_device_info = pointer(Usb_relay_device_info())          self.load_usb_relay_device_dll()         self.usb_relay_device_enumerate = self.usb_relay_device_enumerate()         self.m_hCurDevice = self.usb_relay_device_open()         print(self.m_hCurDevice)         print("------------------")      def __del__(self):         print("close relay")         self.usb_relay_device_close()          def load_usb_relay_device_dll(self):                  if os.path.isfile(self.filepath32) and os.path.isfile(self.filepath64):             try:                 self.filepath = self.filepath32                 self.usb_relay_device_dll = cdll.LoadLibrary(self.filepath)             except:                  self.filepath = self.filepath64                 self.usb_relay_device_dll = cdll.LoadLibrary(self.filepath)         else:             assert False, "Can not find %s"%self.filepath         if self.usb_relay_device_dll is not None:             print ("Load %s successfully"%os.path.basename(self.filepath))              def usb_relay_init(self):         self.usb_relay_device_dll.usb_relay_init()          # 判断它是否存在USB relay,         def usb_relay_exit(self):         if self.m_hCurDevice > 0:             return True         else:             return False             def usb_relay_device_enumerate(self):         self.usb_relay_device_dll.usb_relay_device_enumerate.args = POINTER(Usb_relay_device_info)         self.usb_relay_device_dll.usb_relay_device_enumerate.restype  = POINTER(Usb_relay_device_info)                  return self.usb_relay_device_dll.usb_relay_device_enumerate()              def usb_relay_device_open(self):         return self.usb_relay_device_dll.usb_relay_device_open(self.usb_relay_device_enumerate)          def usb_relay_device_close(self):         self.usb_relay_device_dll.usb_relay_device_close(self.m_hCurDevice)        # 打开指定通道          def usb_relay_device_open_one_relay_channel(self,index):         self.usb_relay_device_dll.usb_relay_device_open_one_relay_channel(self.m_hCurDevice, index)            # 打开所有通道       def usb_relay_device_open_all_relay_channel(self):         self.usb_relay_device_dll.usb_relay_device_open_all_relay_channel(self.m_hCurDevice)     #关闭指定通道         def usb_relay_device_close_one_relay_channel(self, index):         self.usb_relay_device_dll.usb_relay_device_close_one_relay_channel(self.m_hCurDevice, index)          关闭所有通道         def usb_relay_device_close_all_relay_channel(self,):         self.usb_relay_device_dll.usb_relay_device_close_all_relay_channel(self.m_hCurDevice)                   def usb_relay_device_get_status(self, status):         self.usb_relay_device_dll.usb_relay_device_get_status(self.m_hCurDevice, status)      # 获取 usb relay回到各种通道状态,形式如{1:open”, 2:“close”,}     def UsbRelayDeviceStatus(self):         num = self.usb_relay_device_dll.usb_relay_device_get_status_bitmap(self.m_hCurDevice)         relay_num = self.usb_relay_device_dll.usb_elay_device_get_num_relays(self.m_hCurDevice)
        DeviceStatus = {}
        for i in range(1,relay_num+1):
            DeviceStatus[i] = "close"

        for i in range(1,relay_num+1):
              if num%2 == 1:
                    num=num/2
                    DeviceStatus[i]="open"
              else:
                    num=num/2
                    DeviceStatus[i]="close"
        return DeviceStatus

    def UsbRelayDeviceNum(self):
        return self.usb_relay_device_dll.usb_relay_device_get_num_relays(self.m_hCurDevice)

if __name__ == "__main__":
    r = Relay() #实例化Relay(),然后就可以调用里面到各个方法了。
    print(" ---------------------------")
    print(r.UsbRelayDeviceStatus())
    print(r.UsbRelayDeviceNum())
    r.usb_relay_device_open_one_relay_channel(2)
    time.sleep(1)
    r.usb_relay_device_close_all_relay_channel()
    print(r.usb_relay_device_get_status("1"))

标签: 64m继电器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台