zoukankan      html  css  js  c++  java
  • 继电器Relay:ZZR08

    继电器常识:

          继电器有三个接线柱:常开(NO),常闭(NC),接地(C)

          如果连接的时间长,偶尔需要断电, 那么接NC 和 C, 这样继电器set on 时为断电。除此之外,继电器还可以控制按键,以及长按。

          继电器接通时,该继电器的灯会亮。ZZR08有8个继电器,以一个字节表示其整体状态,以每位的位高(bit high)代表对应继电器的状态。例如:第一个继电器set on 时为00000001,set off 时该位为0;第二个set on 时为00000010(2), set off 时该位为0。以此类推.

    怎样使用继电器:

    1. Command “ls /dev/tty*”, you can find like this
    /dev/ttyRelayCard

        在接入继电器之前运行“ls /dev/tty*”, 接入之后再运行一次,多出来的就是继电器的标识。

    2. Check the file /etc/udev/rules.d/ACS.rules. In this file, there have a code like

    this:

    SUBSYSTEMS=="usb", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60",
    SYMLINK+="ttyRelayCard", MODE="0666", OWNER="buildbot"

    If there don’t have this code, please add it by manual. And then re-plugin the

    relay card’s USB cable.

        查看是否存在/etc/udev/rules.d/ACS.rules,如果不存在,则建立文件:touch ACS.rules,文件内容如上。

    3. 查看权限:ls -l /dev/ttyRelayCard 结果crw-rw---- 1 root dialout.

        可以更改继电器权限:chmod a+rw /dev/ttyRelayCard. 这样坏处是,每次插拔继电器都要更改。

        继电器的user是root, group是dialout。可以使当前用户从属于dialout用户组。查看user的用户组:groups user。更改user的附属用户组list: sudo usermod -G dialout,adm,...

    4. python script

    import serial
    import sys, time
    '''
    ser = serial.Serial(
    port=None,              # number of device, numbering starts at
    # zero. if everything fails, the user
    # can specify a device string, note
    # that this isn't portable anymore
    # if no port is specified an unconfigured
    # an closed serial port object is created
    baudrate=9600,          # baud rate
    bytesize=EIGHTBITS,     # number of databits
    parity=PARITY_NONE,     # enable parity checking
    stopbits=STOPBITS_ONE,  # number of stopbits
    timeout=None,           # set a timeout value, None for waiting forever
    xonxoff=0,              # enable software flow control
    rtscts=0,               # enable RTS/CTS flow control
    interCharTimeout=None   # Inter-character timeout, None to disable
    )
    '''
    
    device = sys.argv[1] # /dev/ttyRelayCard
    ser = serial.Serial(device, 19200, serial.EIGHTBITS, serial.PARITY_NONE, serial.STOPBITS_TWO, None)
    W = 0.05
    
    def get_version():
        cmd = 90
        print "get the relay software version"
        ser.write(chr(cmd))
        time.sleep(W)
        a = ser.read(1)
        print ord(a)
        b = ser.read(1)
        print ord(b)
        time.sleep(1)
    
    def set_relay_on(i):
        ''' relay No is from 1 to 8'''
        cmd = 100 + i
        print "set relay %d on "%(i)
        ser.write(chr(cmd))
        time.sleep(W)
        ser.write(chr(91)) # get relay states
        a = ser.read(1)
        print ord(a)
        time.sleep(W)
    
    def set_relay_off(i):
        ''' relay No is from 1 to 8'''
        cmd = 110 + i
        print "set relay %d off"%(i)
        ser.write(chr(cmd))
        time.sleep(W)
        ser.write(chr(91))
        a = ser.read(1)
        print ord(a)
        time.sleep(W)
        
    set_relay_off(1)
    # set_relay_on(1)
    

     newer edition:

    import serial
    import sys, time
    '''
    base API of controlling Relay.
    '''
    class RelayControl(object):
        def __init__(self, relay_id='/dev/ttyACM0', interval=0.05):
            self.relay_id = relay_id
            self.interval = interval
            self.handler = serial.Serial(relay_id, 19200, serial.EIGHTBITS, serial.PARITY_NONE, serial.STOPBITS_TWO, None)
    
        def get_version(self, cmd=90):
            print "get the relay software version"
            self.handler.write(chr(cmd))
            time.sleep(self.interval)
            a = self.handler.read(1)
            print ord(a)
            b = self.handler.read(1)
            print ord(b)
            time.sleep(1)
    
        def get_relay_status(self, cmd=91):
            self.handler.write(chr(cmd))
            a = self.handler.read(1)
            print ord(a)
            time.sleep(self.interval)
            return ord(a)
    
        def set_relay_on(self, relay_no):
            ''' relay No is from 1 to 8'''
            cmd = 100 + relay_no
            print "set relay %d on "%(relay_no)
            self.handler.write(chr(cmd))
            time.sleep(self.interval)
            self.get_relay_status()
    
        def set_relay_off(self, relay_no):
            ''' relay No is from 1 to 8'''
            cmd = 110 + relay_no
            print "set relay %d off"%(relay_no)
            self.handler.write(chr(cmd))
            time.sleep(self.interval)
            self.get_relay_status()
    
        def set_all_relay_on(self, cmd=100):
            print "set all relays on "
            self.handler.write(chr(cmd))
            time.sleep(self.interval)
            self.get_relay_status()
    
        def set_all_relay_on(self, cmd=110):
            print "set all relays off "
            self.handler.write(chr(cmd))
            time.sleep(self.interval)
            self.get_relay_status()

    附录

    ZZR08 command Table

    Command Action
    Character DEC HEX  
      90 5A Get software version - returns 2 bytes, the first being the module
    ID which is 8, followed by the software version
      91 5B Get relay states - sends a single byte back to the controller, bit high
    meaning the corresponding relay is powered
      92 5C Set relay states - the next single byte will set all relays states, All on
    = 255 (11111111) ,All off = 0
    d 100 64 All relays on
    e 101 65 Turn relay 1 on
    f 102 66 Turn relay 2 on
    g 103 67 Turn relay 3 on
    h 104 68 Turn relay 4 on
    i 105 69 Turn relay 5 on
    j 106 6A Turn relay 6 on
    k 107 6B Turn relay 7 on
    l 108 6C Turn relay 8 on
    n 110 6E All relays off
    o 111 6F Turn relay 1 off
    p 112 70 Turn relay 2 off
    q 113 71 Turn relay 3 off
    r 114 72 Turn relay 4 off
    s 115 73 Turn relay 5 off
    t 116 74 Turn relay 6 off
    u 117 75 Turn relay 7 off
    v 118 76 Turn relay 8 off

  • 相关阅读:
    LintCode "Maximum Gap"
    LintCode "Wood Cut"
    LintCode "Expression Evaluation"
    LintCode "Find Peak Element II"
    LintCode "Remove Node in Binary Search Tree"
    LintCode "Delete Digits"
    LintCode "Binary Representation"
    LeetCode "Game of Life"
    LintCode "Coins in a Line"
    LintCode "Word Break"
  • 原文地址:https://www.cnblogs.com/snow-backup/p/5013563.html
Copyright © 2011-2022 走看看