×

使用您的Raspberry Pi控制多达65280个继电器

消耗积分:2 | 格式:zip | 大小:2.77 MB | 2022-11-09

李建设

分享资料个

描述

使用IO 扩展器继电器扩展器可控制多达 65,280 个继电器。

需要在您的项目中添加大量继电器吗?然后您需要带有继电器扩展器的 IO 扩展器。每个 IO 扩展器最多可以控制 16 个菊花链继电器扩展器,总共 256 个继电器。然后将 255 个 IO 扩展器连接在一起,您可以选择性地控制多达 65,280 个继电器。

带有单个 IO 扩展器的控制继电器。

pYYBAGNofrSAZc_2AA7Ayl1mZyk451.jpg
控制 64 个继电器

功能列表

  • 使用价格低于 15 美元的 Arduino 16 继电器板。
  • 易于使用的继电器控制命令。
  • 一次控制一个单独的继电器或一个组。
  • 无需驱动程序。节省代码空间。
  • 没有数据空间来维持中继状态。
  • 不需要额外的电源。

构建中继库所需的零件

接线图

poYBAGNofrmAS21UAAfoIAQM4mQ152.jpg
64 个继电器的接线
 

注意:在上面的接线图中,IO 扩展器由第一个继电器板供电。所有继电器扩展器都由它们连接的继电器板供电。

#!/usr/bin/env python
import ioexpander
import time

ioexpander.ser.flushInput()
ioexpander.SerialCmdDone(b'eb4')

relay = 1

while 1:
  cmd = b'e' + bytes(str(relay),'raw_unicode_escape') + b'f'  
    ioexpander.SerialCmdDone(cmd)
    relay += 1
  if relay > 64:
        relay = 1
  cmd = b'e' + bytes(str(relay),'raw_unicode_escape') + b'o'
    ioexpander.SerialCmdDone(cmd)
 
  time.sleep(0.1)

多个 IO 扩展器控制继电器

另一种控制继电器的方法是使用多个 IO 扩展器。这使我们能够将传感器和继电器分配到中央网络或星形网络,但仍将所有 IO 扩展器互连到单个串行总线上。如果您必须将 IO 扩展器分离到 4000 英尺,则使用如下所示的IO 扩展器和标准蓝色 Cat5 网络线。

pYYBAGNofsGAClabABCEEAqTGOU082.jpg
使用 IO 扩展器的 64 个继电器

接线图

poYBAGNofsaAJ3FpAAizYDHMAJM599.jpg
使用多个 IO 扩展器为继电器接线
 

注意:在上面的接线图中,所有的 IO 扩展器都由第一个继电器板通过串行总线供电。所有继电器扩展器都由它们连接的继电器板供电。

#!/usr/bin/env python
import ioexpander9bit
import time

MAX_BOARDS = 4

ioexpander9bit.ser.flushInput()

# set IO Expander to 9-bit
ioexpander9bit.ser.write(b'\0')
# switch to simulated 9-bit mode using SPACE and MARK parity
ioexpander9bit.SerialSPACEParity()

for board in range(1, MAX_BOARDS+1):
    ioexpander9bit.SerialCmdDone(board, b'eb1')

board = 1
relay = 1

while 1:
  cmd = b'e' + bytes(str(relay),'raw_unicode_escape') + b'f'  
    ioexpander9bit.SerialCmdDone(board, cmd)
    relay += 1
  if relay > 16:
        relay = 1
        board += 1
  if board > MAX_BOARDS:
            board = 1
  cmd = b'e' + bytes(str(relay),'raw_unicode_escape') + b'o'
    ioexpander9bit.SerialCmdDone(board, cmd)
 
  time.sleep(0.1)

树莓派 9 位

Raspberry Pi 不支持 9 位,因此我们必须使用 8 位标记和空间奇偶校验。唯一的问题是 Raspbian 操作系统也不支持标记和空间奇偶校验,因此对于使用BCM2711 (pg.186)的 Pi4,我们将不得不使用一些未记录的代码并使用由位 7 选择的所谓的棒奇偶校验(SPS) 在 LCRH 寄存器中。

pYYBAGNofsqAY8x9AAAqEGSfo5U017.png
树莓派奇偶校验表
 

默认情况下,头针 14 和 15 上的主串行端口使用不支持任何奇偶校验位的 UART1 (MiniUART/ttyS0)。我们将不得不切换引脚以使用不同的 UART0 (ttyAMA0) 作为主串行端口。

为此,将以下行添加到 /boot/config.txt 文件中。

enable_uart=1
dtoverlay=disable-bt

同样在控制台上运行以下命令,以断开蓝牙与 UART0 的连接。

pi@raspberrypi:~ $ sudo systemctl disable hciuart

用于设置 MARK 或 SPACE 奇偶校验的 Python 代码。

import serial
import termios

ser = serial.Serial(
    port='/dev/serial0',
    baudrate=115200,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS,
    timeout=5
  )

# extra termios flags
CMSPAR = 0x40000000  # Use "stick" (mark/space) parity

# select SPACE parity to clear the address bit
def SerialSPACEParity():
    iflag,oflag,cflag,lflag,ispeed,ospeed,cc = termios.tcgetattr(ser)
    cflag |= termios.PARENB | CMSPAR
    cflag &= ~termios.PARODD
  termios.tcsetattr(ser, termios.TCSANOW, [iflag, oflag, cflag, lflag, ispeed, ospeed, cc])

# select MARK parity to set the address bit
def SerialMARKParity():
    iflag,oflag,cflag,lflag,ispeed,ospeed,cc = termios.tcgetattr(ser)
    cflag |= termios.PARENB | CMSPAR | termios.PARODD
  termios.tcsetattr(ser, termios.TCSANOW, [iflag,oflag,cflag,lflag,ispeed,ospeed,cc])  

# select the IO Expander board by setting the 9th or address bit
def SerialWriteBoard(board):
  if board is not None and board > 0:
        SerialMARKParity()  
        ser.write(bytes(chr(board),'raw_unicode_escape'))
        SerialSPACEParity()

那么为什么我需要控制这么多继电器呢?

一种这样的应用是在 Aquaponics 或 Hydroponics 中。许多传感器和设备需要自动化到每个种植床或单个植物。这需要极端的 IO,而 IO 扩展器可以提供。

因此,立即获取您的 IO 扩展器并构建您的系统!


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !