我最近在我爸爸的车库里发现了一台旧的BK Precision 1787电源供应器,作为一个轻微的囤积者,我没法放过带它回家玩的机会。就像一个被遗弃的玩具,这台电源供应器在我的柜子里放了一年多,只是积满了灰尘,等待着被玩耍。我最近拿出它,才发现它的后面板上有一个RS-232端口:
图1:
我自问,“我真的可以使用RS-232线缆来控制它吗?”在初步调查BK Precision的网站后,原始文档(20多年前的)指出我需要一个特殊的套件才能使用PC接口:
图2:
当我看到这个通知时,我相当失望,甚至考虑把整个设备扔掉,但我决定进行一次小实验。在这篇文章中,我们将看看我是如何拆解电源供应器,并将其转变为一个IoT控制设备,通过手机或任何联网设备可以设置或读取电压和电流。我们将研究UART命令,嗅探总线以验证串行通信,并在Raspberry Pi Pico W上构建REST API服务器,以提供这台设备的IoT功能。
我决定不将电源供应器视为电子垃圾,而是想稍微研究一下它。如今,大多数电源供应器可以通过串行(例如UART)、USB(通常作为COM或USBTMC设备)和/或以太网(通常通过VISA控制)进行控制。然而,我还没有看到许多支持Wi-Fi功能的设备。我想这是因为设置起来有点麻烦,大多数设计师或测试工程师并不真的介意有线连接。我的电源供应器带有一个RS-232端口,但没有其他的。我认为,给它加上Wi-Fi功能,并配备REST API前端,这样我就可以使用任何联网设备从任何地方控制它,会是一件相当酷的事情。
我遇到的一个主要问题是我无法与电源供应器通信。如你所见,手册指出你需要一个专有的套件和软件才能使用PC接口。我第一次尝试“黑”电源供应器完全失败了。我将一个RS-232 UART线缆连接到后面板的端口,并开始随机输入字符。我拆开盖子,通过RS-232端口追踪信号到一个MAX202C收发器芯片,并在芯片的TX和RX信号两侧进行了示波器测量。我得到的全是一堆乱码:
图3:
幸运的是,BK Precision的工作人员非常乐于助人,为我提供了控制电源所需的命令集。他们甚至能够提供他们使用的软件截图以及所有UART设置,以便我确认一切设置正确无误。在他们的帮助下,我能够测试我的命令,并在示波器上正确地看到它们被处理:
图4:
虽然这看起来像是一个多余的步骤,但这帮助我建立了一个基线,以便当我直接将我的Raspberry Pi Pico W连接到UART线时进行比较。在这一点上,我能够建立正确的通信,并准备开始改造我的电源,使其成为一个物联网(IoT)启用的设备。
既然我已经使用USB RS-232 UART电缆建立了一个工作设置,我想使用Raspberry Pi Pico W复制相同的设置。我为Raspberry Pi Pico的大多数项目都是用MicroPython编写的(一个针对微控制器的更小、更紧凑的Python版本),所以我决定使用machine.uart库。这要求我将我的UART/RS-232线连接到特定的UART硬件引脚。在这种情况下,我使用了GPIO 16和17。通过在我的MicroPython代码中发送串行命令通过UART后,我发现所有发送和返回的数据都是乱码。代码不断报告返回的字节码甚至不是ASCII字符。显然有些地方出了问题。出于这个特定的原因,获取一个工作设置的范围捕获至关重要。我立即能够确定信号在到达Raspberry Pi Pico设备时已经被反转。在实例化UART库对象时设置TX和RX为反转后,返回的串行数据变得非常清晰。
需要注意的是,Raspberry Pi Pico设备的电压水平为3.3V,而BK Precision 1787(特别是它使用的MAX202C芯片)的电压水平为5V。长时间向Raspberry Pi Pico设备的GPIO引脚发送5V信号可能会损坏芯片的输入缓冲器。长期使用时,强烈建议使用电平转换器,以正确地将设备间的电压水平从3.3V转换为5V。
在这一点上,我已经建立了通信并编写了一个驱动库,该库通过串行通信完全控制我的电源。下一步是配置一个基本的网络服务器,并验证我能否通过网络控制我的设备。多亏了microdot,我能够简化我的REST API,并创建了一个非常快速的“Hello World”原型来验证Raspberry Pi Pico H设备是否能为我托管一个网络服务器。除了一个简单的“Hello World”返回语句外,我还确认了我可以通过使用POST函数来切换LED灯。在这一点上,我已经准备好整合一切了。
为了使最终代码更易读和可扩展,我在代码中使用了类。面向对象的代码在软件世界中并不是什么新鲜事,但在嵌入式系统中经常被忽视。编写网络服务时,特别是那些控制不同硬件的服务,重要的是要优雅地抽象你的代码,以便详细的硬件代码位于主应用程序之外。在我的案例中,你会注意到在main.py中几乎没有引用电源的代码,除了调用特定的函数,如设置或读取电流/电压(与在main.py中处理实际的UART命令相反)。这允许在网络应用程序级别更清晰地查看正在发生的事情,并抽象出在设备通信级别正在进行的细节。
在main.py中,我创建了两种不同类型的端点来控制我的电源。一种是使用POST方法,这通常在REST API中用于更新后端服务器上的字段(例如,插入数据库的一行)。我本可以轻松使用PUT方法,因为我编辑的只是一个单一的值,但出于没有真正好的理由,我坚持使用POST。实际上,你可以自由选择在这个特定场景中想要实现的方法类型。
我还创建了一个名为“controller”的路由,它输出一个非常简单的提交表单,用户可以在其中设置电压/电流并点击“提交”,这将反过来执行POST操作并触发网络服务更新电源上的电压/电流设置。这就是物联网、智能手机启用方面的内容。从你的智能手机或普通浏览器执行POST方法并不是很简单。你可以发出GET方法,但你也会得到一个很长的URL字符串。实现项目的“智能手机性”方面的一个非常简单的方法是放置一个基本的网络表单,任何人都可以从任何设备访问。一旦你在你的网络应用程序中支持了一个基本的网络表单(并通过你的路由器的防火墙正确路由传入流量),你就几乎展示了你的代码是“物联网启用”的。
图5:
我在这个项目中加入的一些其他健康监控/调试功能包括:
图6:
拥有这些小额外功能确实有助于将一个爱好项目转变为一个更成熟的东西,当出现问题时可以进行诊断。
到这一点,我已经成功地把所有部分组合在一起,现在我拥有了一个配备了尖端技术的老式电源。“这个超级复古的电源将用于什么目的?”我问自己。嗯,那部分我还在琢磨中。
要查看完整的代码仓库,请访问 https://gitlab.com/embedded-designs/rest-api-controlled-power-supply-using-micropython。