使用IO 扩展器和继电器扩展器可控制多达 65,280 个继电器。
需要在您的项目中添加大量继电器吗?然后您需要带有继电器扩展器的 IO 扩展器。每个 IO 扩展器最多可以控制 16 个菊花链继电器扩展器,总共 256 个继电器。然后将 255 个 IO 扩展器连接在一起,您可以选择性地控制多达 65,280 个继电器。
注意:在上面的接线图中,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 扩展器分离到 4000 英尺,则使用如下所示的IO 扩展器和标准蓝色 Cat5 网络线。
注意:在上面的接线图中,所有的 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)
Raspberry Pi 不支持 9 位,因此我们必须使用 8 位标记和空间奇偶校验。唯一的问题是 Raspbian 操作系统也不支持标记和空间奇偶校验,因此对于使用BCM2711 (pg.186)的 Pi4,我们将不得不使用一些未记录的代码并使用由位 7 选择的所谓的棒奇偶校验(SPS) 在 LCRH 寄存器中。
默认情况下,头针 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条评论
快来发表一下你的评论吧 !