×

具有集成LoRa和CAN总线的ATMEGA328P模块

消耗积分:2 | 格式:zip | 大小:0.01 MB | 2022-08-04

王鑫

分享资料个

PCB图如下:
poYBAGK0CQSALiqeAAC22QjfuyA805.jpg
pYYBAGK0CQqAWiK4AACw05e0pXw566.jpg

描述

具有集成 LoRa 和 CAN 总线的 ATMEGA328P 模块

具有集成 LoRa 和 CAN-BUS 的 ATMEGA328P 模块

poYBAGK0CR2ARpuDAACw3Bnz8fM351.jpg

介绍

为了完善我的 LoRa 遥测系统,我已经完成了很多原型。这篇文章将重点介绍下一个节点设计。由于我将部署系统的区域非常大,但边界围栏线大致呈方形,我决定尝试减少覆盖整个区域所需的 LoRa Radio 节点的数量。这为利用 CAN-BUS 将仅传感器节点连接到无线电节点并让它们报告异常状态以及来自无线电节点的请求提供了机会。

因此,该设备将用作 LoRa 到 CAN-BUS 网关,具有一些本地自动化来控制向主站传输数据。这个概念也可以适用于其他领域,例如家庭自动化或工业环境。

在该设备的核心,我坚持使用多功能 ATMEGA328P,排除当前的芯片短缺和当前的高价,它是一款非常便宜的芯片,具有许多经过良好测试的库,并且学习曲线相对较低,主要是由于它在 Arduino 生态系统中的广泛使用。

LoRa 组件由 AI-Tinker(非赞助)的 RA-02 甚至 RA-01H 模块处理。正如我们在之前的原型中看到的那样,该设备需要使用逻辑电平转换器,因为它只接受 3.3v 逻辑电平。虽然如果我从 3.3v 为 ATMEGA328P 供电,我可以摆脱这些问题,但它会产生两个问题,其中一个仍然会强制使用电平转换器......

我选择以 16Mhz 运行 ATMEGA328P,这基本上迫使我使用 5v 为芯片供电。除非您非常彻底地阅读了一些数据表,否则第二个原因并不那么明显......

CAN 总线组件由 MCP2515 独立 SPI 转 CAN 控制器以及 TJA1050 CAN 总线收发器处理。

这就是事情变得有趣的地方...... MCP2515 可以在 3.3v 上运行,但 TJA1050 是仅 5v 的设备。因此,理论上我可以只在 MCP2515 和 TJA1050 之间使用逻辑电平转换器,同时在 3.3v 上运行威廉希尔官方网站 的其余部分......

鉴于我宁愿在 16Mhz 上运行 ATMEGA328P,而且我的 LoRa 无线电模块威廉希尔官方网站 及其逻辑电平转换器威廉希尔官方网站 工作得非常好,我决定不改变这一点,并保持 CAN 总线在 5v 下运行一路走来,因为我仍然必须为此目的在 PCB 上使用 5v 稳压器。

poYBAGK0CR-AdHJmAABfu4A99q0741.jpg

LoRa 和 CAN BUS 模块的 IO 连接

两个集成组件(Lora 和 CAN)都是 SPI 设备。这意味着它们共享公共 SCK、MISO 和 MOSI 线(在 ATMEGA328P 上分别由引脚 D13、D12 和 D11 提供。然后通过使用 CE 引脚进一步选择单独的 SPI 设备进行操作,每个设备一个唯一的引脚, MCU将其拉低以向设备指示它应该注意在SPI总线上传输的数据......

LoRa 和 CAN 都使用其他引脚,LoRa 需要一个连接到 D9 的复位引脚,一个连接到 D10 的 CS/CE 引脚以及一个连接到 D2 的硬件中断引脚。(请注意,这是与 Sandeep Mistry 的 LoRa 库一起使用的。Radiolib 库需要一个额外的引脚,通常连接到 LoRa 模块上的 DIO1。该设备在其当前布局中不提供对这些引脚的访问,因此您只能使用它与 Sandeep Mistry 图书馆,至少现在......)

CAN 模块在 D4 使用 CE/CS 引脚,在 D6 使用 IRQ 引脚,虽然不是硬件中断引脚,但确实具有 PCINT 功能。

引脚 D10、D9 和 D2 未断开以供用户访问。虽然我决定允许访问 D4 和 D6 以及 SPI 总线 D11、D12、D13,以允许与逻辑分析仪连接,或将其他 SPI 设备添加到总线......

这给我们带来了一个非常有趣的观点……这两个 SPI 设备真的可以一起玩吗?我所说的“一起玩得很好”是什么意思?

pYYBAGK0CSKANxlUAADG8iwpF58988.jpg

为了回答这个问题,我们不得不先看一些理论,以及了解 SPI 和 I2C 之间的根本区别......

SPI和I2C的区别

我们大多数人都会非常熟悉 I2C,因为它是一种非常常见的协议,用于将传感器连接到微控制器。它仅由两条 IO 线组成,SDA 用于数据,SCL 用于时钟。总线上的每个设备都有自己的内置地址,就像 PCF8574 IO 扩展器一样,该地址可以在 0x20h 和 0x27h 之间选择。所有设备共享这些公共数据线,并且只有在主控制器专门寻址时才会响应......除非您不小心将具有相同地址的两个设备放在同一总线上,(如果这甚至可以工作),没有错误的设备会响应任何数据请求的方式......

另一方面,SPI 以完全不同的原理运行,使其比 I2c 快很多倍,有源设备同时发送和接收数据...... SPI 也称为四线协议。每个设备至少有 4 条数据线,分别是 SCK(时钟)、MOSI(用于从主设备传输到从设备的数据)、MISO(用于从从设备传输到主设备的数据)和一个 CE 或 CS(芯片选择 ) 引脚。

SCK、MISO 和 MOSI 对所有设备都是通用的,这意味着它在所有设备之间共享。CE/CS 是每个设备的唯一引脚,这意味着如果总线上有四个 SPI 设备,则必须有四个单独的 CE/CS 引脚!

如果主机将其各自的 CE/CS 引脚拉低,则设备将或者更确切地说应该只响应 SPI-BUS 上的数据。现在你应该很快就会明白,这会很快变成一个非常非常复杂的混乱。

让我们举一个很好的例子。ST7789 SPI显示模块,有便宜的版本,在速卖通和其他网上商店都有卖。我假设这个特定模块是为了使其更易于使用,默认情况下,CE/CS 引脚在内部被拉低到地……那你可能会问呢?这有什么问题,因为它为您节省了一个 IO 引脚?

事实上这是非常错误的,如果您曾经尝试在 SPI 总线上使用其中一个显示器与其他 SPI 设备一起使用,您将很快发现这一事实......什么都不起作用,或者只有显示器可以工作(如果你是幸运的)

但为什么?

将 CE/CS 拉低,向芯片发出信号,表明它应该响应公共 SCK、MISO 和 MOSI 线上的指令。将引脚内部拉低,从而迫使该芯片始终响应,即使它不应该响应。因此用垃圾污染了整个 SPI-BUS...

问题的答案

在这个非常冗长的解释之后,这仍然是非常基本的,是时候回到我们最初的问题了:

Sx127x ( RA-02 ) 模块和 MCP2515 控制器能否在同一总线上运行良好?答案并不简单,因为它归结为您使用哪些库......

请记住,库必须拉低它要与之通信的设备的 CE/CS 引脚。一些库错误地认为它们是唯一在使用的库,并忽略了一个简单的事实,即它们应该在每次事务后释放 CE/CS 引脚,以释放总线以供其他设备使用它......

然而,经过广泛的测试,我可以说Sandeep Mistry 的 LoRa 库以及mcp_can库确实可以很好地结合使用。这两个库不会将单独的 CE/CS 引脚拉低,并允许共享 spi 总线。

上面讨论的 ST7789 模块并非如此,硬件实际上一直在拉动引脚……

pYYBAGK0CSSAd6CkAADiW2kjVN4146.jpg

仔细看看PCB

让我们仔细看看PCB。Ra-02 模块 ( LoRa ) 占据了 PCB 左侧的大部分区域,ATMEGA328P 在其右侧。RA-02 被电平转换器包围,使用 BSS138 N 沟道 Mosfet 和 10k 电阻器(Q1 至 Q6、R1、R2、R3、R4、R5、R6、R8、R9、R10、R11、R12、R13 )

C1 和 C2 是 Ra-02 模块的旁路电容

在左下角,我们有一个硬件重置按钮,用于重置 ATMEGA328P,旁边有一个黄色跳线(H1)。该跳线控制 CAN 总线的 120 欧姆镇流电阻 (R17)。移除跳线将移除镇流器。正下方是 CAN 连接器,标记为 U5,CH 为 CAN-H,CL 为 CAN-L 端口。

U3 和 U4 与 R18、R19、X2、C16、C17 一起构成 PCB 上的 CAN 组件。去耦由 C6、C7、C8 以及 C9 和 C12 提供(包括 ATMEGA328P 的去耦)

在 U1 (ATMEGA328P) 上方提供了一个 ICSP 编程头,用于与 USPASP、AVRASP 或 Arduino 作为 ISP 和类似设备一起使用。

板上没有提供 USB 到串行转换器,可以通过 Arduino 引导加载程序为 Arduino NANO 加载串行上传(以利用所有模拟输入)。RxD、TxD 和 DTR 引脚在 PCB 的两侧分出,以及接入 3.3v、5v 和 GND 引脚。

提供一个直流电源插座。它可以接受高达 12v 的直流电压,尽管我建议不要超过 7.2 伏,以免对 PCB(LDO1 和 LDO2)背面的 LDO 稳压器施加太大压力。

poYBAGK0CSeAEbEKAAC24z2pUNs745.jpg

在上图中,我已将 USB 转串口转换器以及 CAN-BUS 连接到设备。

原理图,示意图

详细示意图如下:

pYYBAGK0CSqAMxadAAB57UwwkhA164.png

表 1(上图)负责 ATMEGA328p 及其支持威廉希尔官方网站 ,以及通过 LDO 稳压器提供的电源。

表 2(下)负责逻辑电平转换器、RA-02 (Sx1278) LoRa 模块以及 CAN-BUS 控制器和收发器威廉希尔官方网站 。

pYYBAGK0CS2AMMAuAAB3xx4D-W4323.png

软件和固件

为了测试这个模块,我使用了Cory J Fowler 的 mcp_can 库,用于 CAN-Bus 部分,

以及Sandeep Mistry 的 Arduino-LoRa

同时使用 LoRa 和 CAN 的组合示例将与项目的下一部分一起发布,即 CAN 继电器模块

代码

https://github.com/sandeepmistry/arduino-LoRa

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

评论(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.obk20.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:'具有集成LoRa和CAN总线的ATMEGA328P模块',//标题 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.obk20.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);