Arduino远程上传器Redux

在2015年初,我开始考虑如何将Sketches上传到远程Arduino。 我不得不用电缆在笔记本上闲逛,以更新散落在房屋中的Arduino项目上的Sketches。 最终结果是惯性接管了我不经常更新的项目:改进停止了,错误没有得到修复。

在非嵌入式世界中,远程计算机上的更新软件非常明显。 但是Arduino不是一台计算机,嵌入式世界的情况有所不同。 在Arduino的情况下,它只能通过串行线接受程序,并且无法更新自身。 有点da脚吧? 但是它仅花费几美元,仅消耗约0.3W(与Raspberry Pi约3-5W相比),并且借助电源管理,它可以在一个很小的电池上运行数年。

我开始研究Arduino IDE如何通过USB编程Arduino,知道如果我可以在微控制器上模拟该过程,那么我将有一个解决方案。 因此工作开始了,大约在四月的某个时候,我认为我的项目已经完成。 我建立了一些原型,甚至与一个葡萄园所有者合作,后者想用它来实现葡萄酒生产的各个方面的自动化:泵,控制器和杂物。 然后,生活陷入困境,项目陷入僵局。

今年,我在假期前后花了一些时间,决定重新休息一下。 几年前,我已经构建了XBee车库控制器。 实际上,车库控制器是该项目的激励因素之一。 我认为这将是我的远程固件解决方案的最佳首选。

我高估了项目的一个方面,就是易于生产原型。 我以前从未在原型板上构建电路。 它能有多难? 好吧,我花了几个小时组装后,第一块板就没有功能。 故障排除花费了几个小时,而当您不能像面包板上那样简单地拔出电线或轻易改变电路时,这将变得更加困难。 但是无论如何,要学习很多东西,所以那很好。

我简要地研究了订购印刷电路板时涉及的内容,但是体积小则价格昂贵。 我还研究了DIY PCB方法,包括PCB研磨和碳粉转移。 如果我有Shapeoko,那我可以磨木板,生活会很棒,但这是很多钱。 碳粉转印方法看起来不愉快。 您必须手动为所有组件钻孔,这似乎比处理原型板还差。 加上杂乱的化学药品和其他麻烦。 最后,事实证明,我有空时实际上很喜欢制作原型,也许就像喜欢编织一样。

我从两年前开始为XBee原型板供电。 我什至不记得它是否有效。 在摆弄RXTX头痛之后,我跑了

  ./xbee-uploader.sh —草图../../..//resources/BlinkSlow-atmega-328–16Mhz.cpp.hex —串行端口/dev/tty.usbserial-A6005uRz —波特率9600 — remote-xbee-address“ 0013A200408B98FF” —无线电类型series2 

和天哪

  ……………………………………………………………… 
  …………。 
 成功在51秒内刷新远程Arduino,重试0次 

车库门电路非常简单:有一个用于控制继电器的晶体管和一个用于防止反电动势尖峰的1N4004二极管。 然后是远程Arduino组件:混入了Arduino,EEPROM和一些标头/跳线。我使用的是XBee无线网络,而Arduino XBee屏蔽网络用于电源,插座和串行接口。

接下来,我需要将车库门组件添加到板上。 我希望能够从Arduino重置XBee,因为随着时间的流逝,无线电有脱离网络的趋势,并且需要重启电源(也许通过固件升级解决了)。 正确的方法是使用晶体管或mosfet暂时将复位驱动为低电平,但由于没有足够的组件,因此只能将Arduino引脚直接连接到XBee上,希望它永远不要设置该引脚。高。

全新和改进的车库门控制器,具有完整的远程固件功能!

门控制1和2引脚连接到车库门头部单元(无极性)。 继电器立即关闭该电路以激活门。 敞开式磁传感器连接到D3和地面。 同样,闭门式磁传感器将D4接地。 当这些传感器关闭时,它们会将Arduino输入拉低; 打开时,输入读数为5V。

事后看来,我应该使用弹簧端子将门接线连接到电路板上,因为插头在接收电线时有点过时。 下次,我将使用其中之一:

我对XBeeUploader草图(简化固件更新的草图)进行了一些改进。 最初,它对另一个发送方XBee的地址进行了硬编码,但是由于该消息是请求/响应,因此它在接收到数据包并使用该地址进行答复时,可以获取另一个无线电的地址。 最好启用加密,因为有人可能会在您的设备上加载任意固件。 XBeeUploader草图不需要在这里进行更改,除了错误修复外,这很好,因为这是一件事,不能通过无线方式进行更新。

我正在使用Modern Device RBBB作为固件编程器。 我本来可以使用Arduino Pro,也可以使用任何Arduino,但该板非常紧凑,内置电源,我已经拥有了。 我忘记了它不会在草图上传时自动重置。 在IDE中单击“上传”按钮后,当您在Arduino IDE中看到“ Override baud rate…”时,必须点击开发板上的reset按钮。 该RBBB已安装了更新的Optiboot引导加载程序,对于Arduino IDE来说它看起来像Arduino UNO。 我有一个USB BUB(v1)TTL,可以轻松对其进行编程。

我焊接了所有组件并上传了我的测试眨眼测试,但是它到处都是丢包。 经过大量的故障排除后,我意识到在添加接头连接器时不小心翻转了屏蔽板上的USB / XBEE开关。 一个简单的修复程序,但是我花了几个小时以为我错误地连接了电路板。 当继电器激活时,我添加了一个LED来点亮,但是事实证明这是有问题的,因为LED吸取了太多的电流,并且没有足够的驱动力来驱动继电器,所以必须这样做。 最后,我上传了一个简单的草图来验证继电器和门传感器是否会着火并且看起来一切正常。

接下来,我用在车库门应用中一直使用的收音机替换了开发/测试收音机。 使用这些收音机,我可以上传草图,但该应用程序不会响应任何命令(例如,门状态)。 这些无线电与开发无线电之间的唯一区别是固件版本,因此我尝试将其更新。

Digi提供了一个Mac应用程序(XCTU)进行固件更新,但是我发现它仅能正常工作。 我无法更新固件-闪烁期间,它会以不同的百分比持续崩溃,并显示以下消息:“无法编程无线电模块-> getData:失败”。 所以不是超级有帮助。

我尝试了十几次。 我切换了USB电缆,xbee插座,USB端口,重新启动,启用了硬件流控制等,但是无论它是否始终会失败。 经过反复修改后,我发现我能够升级到后续版本,但不能升级到最新版本(大约升级10个版本),但前提是我选择了XBee Recovery工具(更新固件始终失败)。 在处理这种废话时,我意识到Sparkfun XBee Explorer颠倒了几个引脚:XBee上的重置引脚是引脚5,但出于某种可怕的原因,Sparkfun板交换了它们并使用了引脚6。它还交换了引脚1和2。现在我当XCTU告诉我时,实际上可以重置无线电,但这只是造成混乱的一个因素。 经过大量的中间升级和失败之后,我终于将它们全部升级到了最新的固件。 哦,现在可以了! 我不确定为什么会这样,因为它以前曾经工作过,但是只是接受它并继续前进。

大约一年前,我建立了一个套接字/串行服务器,以通过TCP中继数据包,然后再中继到USB串行XBee。 这对于跨进程/计算机共享对XBee的访问很有用,因为否则只有一个进程可以拥有串行端口,而应用程序必须与设备位于同一台计算机上。 通过套接字而不是直接发送到USB连接的XBee来发送客户端代码的唯一更改是一行,指示服务器的主机和端口:

  xbee.initProviderConnection((XBeeConnection)new SocketXBeeConnection(“ pi”,9000)); 

之后,无论xbee是通过串行端口还是通过网络连接,api的操作方式都相同。 它在github上发布到了Maven Central。

最后放入披萨面团盒中,准备安装

当前版本

  • Arduino IDE 1.0.5,尽管更高版本也可以使用
  • xbee-arduino提交eee466d56451ad651ba52ede7902b378b7a0c847
  • xbee-api提交8c4bdd6418001949ed7c2fc73ba9a3e16f556472
  • arduino-remote-uploader提交4740f98de801b43b8793817476476839f0b3abd1284