×

使用您的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条评论

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

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.lene-v.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'使用您的Raspberry Pi控制多达65280个继电器',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.lene-v.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);