Adaptación de su antigua fuente de alimentación para ser controlable por smartphone

Ari Mahpour
|  Creado: February 12, 2024  |  Actualizado: April 23, 2024
Fuente de Alimentación Habilitada para Wifi

Recientemente encontré una vieja Fuente de Alimentación BK Precision 1787 en el garaje de mi padre y, siendo el ligero acaparador que soy, no pude dejar pasar la oportunidad de llevarla a casa y jugar con ella. Como un juguete abandonado, durante más de un año esta fuente de alimentación estuvo en mi armario, acumulando polvo, solo esperando ser utilizada. Recientemente la saqué solo para descubrir que tenía un puerto RS-232 en el panel trasero:

Figura 1

Figura 1: 

Me pregunté, “¿realmente podría controlar esto usando un cable RS-232?” Tras una investigación inicial en el sitio web de BK Precision, la documentación original (de hace más de 20 años) indicaba que necesitaba un kit especial para hacer uso de la interfaz de PC:

Figura 2

Figura 2: 

Me decepcionó bastante cuando me encontré con ese aviso y pensé en desechar toda la unidad, pero decidí realizar un pequeño experimento. En este artículo vamos a ver cómo desmonté la fuente de alimentación y la transformé en un dispositivo controlado por IoT donde se podría establecer o leer el voltaje y la corriente a través de tu teléfono o cualquier dispositivo conectado a internet. Veremos los comandos UART, el análisis del bus para validar la comunicación serial y la construcción de un servidor de API REST en un Raspberry Pi Pico W para proporcionar la capacidad de IoT de este equipo.

El Proyecto

En lugar de desechar la fuente de alimentación como residuo electrónico, decidí que quería experimentar un poco con ella. La mayoría de las fuentes de alimentación hoy en día se pueden controlar a través de Serial (por ejemplo, UART), USB (generalmente como un dispositivo COM o USBTMC) y/o Ethernet (generalmente controladas a través de VISA). Sin embargo, no he visto muchos equipos que admitan capacidades Wi-Fi. Imagino que esto se debe a que es un poco molesto configurarlo y a la mayoría de los diseñadores o ingenieros de pruebas no les molesta una conexión por cable. Mi fuente de alimentación venía con un puerto RS-232 pero nada más. Pensé que sería bastante interesante darle capacidad Wi-Fi con un frontend de API REST para poder controlarla desde cualquier lugar usando un dispositivo conectado a internet.

El principal problema que tuve fue mi incapacidad para comunicarme con la fuente de alimentación. Como viste arriba, el manual indicaba que necesitabas un kit y software propietario para utilizar la interfaz de PC. Mi primer intento de "hackear" la fuente de alimentación resultó en un fracaso total. Conecté un cable UART RS-232 al puerto del panel trasero y comencé a escribir caracteres al azar. Quité la tapa y rastreé las señales a través del puerto RS-232 hasta un chip transceptor MAX202C y examiné las señales TX y RX en ambos lados del chip. Todo lo que obtuve fue un montón de basura:

Figura 3

Figura 3:

Afortunadamente, la gente de BK Precision fue muy amable y me proporcionó el conjunto de comandos que necesitaba para controlar la fuente. Incluso pudieron proporcionarme capturas de pantalla con el software que estaban usando y todos los ajustes de UART para que pudiera confirmar que tenía todo configurado correctamente. Con su ayuda, pude probar mis comandos y ver cómo se procesaban correctamente en mi osciloscopio también:

Figura 4

Figura 4: 

Aunque esto parece un paso superfluo, esto me ayudó a establecer una base de comparación para cuando conectara mi Raspberry Pi Pico W directamente a las líneas UART. En este punto, pude establecer una comunicación adecuada y estaba listo para comenzar a adaptar mi fuente de alimentación para convertirla en un dispositivo habilitado para IoT.

Estableciendo comunicación

Ahora que tenía una configuración de trabajo usando un cable UART RS-232 USB, quería replicar la misma configuración usando un Raspberry Pi Pico W. La mayoría de mis proyectos para el Raspberry Pi Pico están escritos en MicroPython (una versión más pequeña y compacta de Python dirigida a microcontroladores) así que decidí utilizar la biblioteca machine.uart. Esto me obligó a conectar mis líneas UART/RS-232 a los pines específicos de hardware UART. En este caso usé GPIO 16 y 17. Después de enviar comandos seriales a través de UART dentro de mi código MicroPython descubrí que todos los datos enviados y recibidos eran basura. El código seguía informando que los códigos de bytes que regresaban ni siquiera eran caracteres ASCII. Claramente algo estaba mal. Por esta razón específica fue crítico obtener una captura de osciloscopio de una configuración funcionando. Inmediatamente pude determinar que las señales se habían invertido para cuando llegaron al dispositivo Raspberry Pi Pico. Después de configurar el TX y RX para invertir (al instanciar el objeto de la biblioteca UART) los datos seriales que regresaban estaban prístinos.

Es importante notar que el dispositivo Raspberry Pi Pico opera a niveles de voltaje de 3.3V y el BK Precision 1787 (específicamente el chip MAX202C que utiliza) opera a 5V. Enviar señales de 5V a los pines GPIO del dispositivo Raspberry Pi Pico durante períodos prolongados puede dañar los buffers de entrada del chip. Para un uso a largo plazo es muy aconsejable usar un convertidor de nivel para convertir adecuadamente los niveles de voltaje de 3.3V a 5V entre los dispositivos.

Construyendo el servidor de la API REST

En este punto había establecido comunicación y escrito una biblioteca de controladores que proporcionaba control total de mi fuente de alimentación a través de comunicación serial. El siguiente paso fue configurar un servidor web básico y validar que podría controlar mi dispositivo a través de la web. Gracias a microdot, pude tomar un atajo en mi API REST y crear un prototipo muy rápido de “Hola Mundo” para validar que el dispositivo Raspberry Pi Pico H podría alojar un servidor web para mí. Aparte de una simple instrucción de retorno de “Hola Mundo”, también confirmé que podía alternar los LEDs utilizando funciones POST. En este punto, estaba listo para integrar todo.

Integrándolo todo

Para hacer el código final más legible y escalable, utilicé clases en mi código. El código orientado a objetos no es algo nuevo en el mundo del software, pero a menudo se pasa por alto en los sistemas embebidos. Al escribir servicios web, especialmente aquellos que están controlando diferentes piezas de hardware, es importante abstraer bien tu código para que el código detallado del hardware quede fuera de la aplicación principal. En mi caso, notarás en main.py que hay muy poco código que hace referencia a la fuente de alimentación, excepto por llamar a funciones específicas como establecer o leer la corriente/voltaje (en lugar de manejar el comando UART real dentro de main.py). Esto permite una vista más clara de lo que está sucediendo a nivel de la aplicación web y abstrae los detalles de lo que está ocurriendo a nivel de comunicación con el dispositivo.

En main.py, creo dos tipos diferentes de puntos finales para controlar mi fuente de alimentación. Un tipo se usa un método POST que se utiliza típicamente dentro de la API REST para actualizar campos en un backend al servidor (por ejemplo, insertar una fila de una base de datos). Fácilmente podría haber utilizado un método PUT ya que es solo un valor único que estaba editando pero, sin ninguna buena razón, me quedé con POST. Realmente depende de ti, sinceramente, qué tipo de método te gustaría implementar en este escenario específico.

También creé una ruta llamada “controlador” que muestra un formulario de envío muy simple donde un usuario puede establecer el voltaje/corriente y pulsar “enviar”, lo que a su vez, realizaría una acción POST y activaría el servicio web para actualizar los ajustes de voltaje/corriente en la fuente de alimentación. Aquí es donde entra el aspecto habilitado para IoT, compatible con smartphones. Realizar un método POST no es muy simple de hacer desde tu smartphone o navegador común. Podrías emitir un método GET pero terminarías con una larga cadena de URL también. Una forma muy simple de lograr el aspecto de “smartphoness” de tu proyecto es colocar un formulario web básico al que cualquiera puede acceder desde cualquier dispositivo. Una vez que admites un formulario web básico dentro de tu aplicación web (y diriges correctamente el tráfico entrante a través del firewall de tu router), has demostrado, prácticamente, que tu código está “habilitado para IoT”.

Figura 5

Figura 5:

Algunas otras características de monitoreo de salud/debug que incorporé en este proyecto incluyen:

  1. Configurar el LED integrado para que se encienda una vez que todo ha sido inicializado
  2. Una página de “estado” que demuestra que el servidor web está funcionando y en marcha
  3. Declaraciones de retorno vía HTTP del suministro de energía después de emitir comandos a este
Figura 6

Figura 6:

Tener estos pequeños extras realmente ayuda a convertir un proyecto de hobby en algo un poco más maduro que puede ser diagnosticado cuando surgen problemas.

En este punto había logrado juntar todas las piezas y ahora poseía un suministro de energía de la vieja escuela con tecnología de punta. “¿Para qué propósito serviría este suministro de energía súper retro?” me pregunté. Bueno, esa parte todavía estoy tratando de averiguarlo.


Para ver el repositorio completo de código visita https://gitlab.com/embedded-designs/rest-api-controlled-power-supply-using-micropython.

Sobre el autor / Sobre la autora

Sobre el autor / Sobre la autora

Ari es un ingeniero con una amplia experiencia en diseño, fabricación, pruebas e integración de sistemas eléctricos, mecánicos y de software. Le apasiona integrar a los ingenieros de diseño, de verificación y de pruebas para que trabajen juntos como una unidad cohesiva.

Recursos Relacionados

Documentación técnica relacionada

Volver a la Pàgina de Inicio
Thank you, you are now subscribed to updates.