Recentemente, encontrei uma antiga Fonte de Alimentação BK Precision 1787 na garagem do meu pai e, sendo o leve acumulador que sou, não pude perder a oportunidade de levá-la para casa e brincar com ela. Como um brinquedo abandonado, por mais de um ano esta fonte de alimentação ficou no meu armário, acumulando poeira, apenas esperando para ser usada. Recentemente, eu a retirei apenas para descobrir que tinha uma porta RS-232 no painel traseiro:
Figura 1:
Eu me perguntei, "será que eu poderia realmente controlar isso usando um cabo RS-232?" Após uma investigação inicial no site da BK Precision, a documentação original (de mais de 20 anos atrás) afirmava que eu precisava de um kit especial para fazer uso da interface de PC:
Figura 2:
Fiquei bastante decepcionado quando me deparei com esse aviso e pensei em descartar a unidade inteira, mas decidi realizar um pequeno experimento. Neste artigo, vamos ver como eu desmontei a fonte de alimentação e a transformei em um dispositivo controlado por IoT, onde a tensão e a corrente poderiam ser ajustadas ou lidas através do seu telefone ou qualquer dispositivo conectado à internet. Vamos olhar para os comandos UART, farejar o barramento para validar a comunicação serial e construir um servidor de API REST em um Raspberry Pi Pico W para fornecer a capacidade de IoT deste equipamento.
Em vez de descartar a fonte de alimentação como lixo eletrônico, decidi que queria mexer um pouco com ela. A maioria das fontes de alimentação hoje pode ser controlada por Serial (por exemplo, UART), USB (geralmente como um dispositivo COM ou USBTMC) e/ou Ethernet (geralmente controlada via VISA). No entanto, não vi muitos equipamentos que suportem capacidades Wi-Fi. Imagino que isso seja porque é um pouco incômodo configurar e a maioria dos designers ou engenheiros de teste não se incomoda muito com uma conexão com fio. Minha fonte de alimentação veio com uma porta RS-232, mas nada mais. Pensei que seria interessante dar a ela capacidade Wi-Fi com uma interface de API REST para que eu pudesse controlá-la de qualquer lugar usando um dispositivo conectado à internet.
O principal problema que tive foi minha incapacidade de comunicar com a fonte de alimentação. Como você viu acima, o manual afirmava que você precisava de um kit proprietário e software para utilizar a interface de PC. Minha primeira tentativa de "hackear" a fonte de alimentação resultou em um fracasso total. Conectei um cabo UART RS-232 à porta do painel traseiro e comecei a digitar caracteres aleatórios. Removi a tampa e rastreei os sinais através da porta RS-232 até um chip transceptor MAX202C e observei os sinais TX e RX em ambos os lados do chip. Tudo o que consegui foi um monte de lixo:
Figura 3:
Felizmente, o pessoal da BK Precision foi super prestativo e me forneceu o conjunto de comandos necessário para controlar a fonte. Eles até conseguiram me fornecer capturas de tela com o software que estavam usando e todas as configurações de UART para que eu pudesse confirmar que estava tudo configurado corretamente. Com a ajuda deles, consegui testar meus comandos e observá-los sendo processados corretamente no meu osciloscópio também:
Figura 4:
Embora isso pareça um passo supérfluo, isso me ajudou a estabelecer uma base de comparação para quando eu conectasse diretamente meu Raspberry Pi Pico W às linhas UART. Neste ponto, consegui estabelecer uma comunicação adequada e estava pronto para começar a adaptar minha fonte de alimentação para se tornar um dispositivo habilitado para IoT.
Agora que eu tinha uma configuração funcional usando um cabo UART RS-232 USB, eu queria replicar a mesma configuração usando um Raspberry Pi Pico W. A maioria dos meus projetos para o Raspberry Pi Pico são escritos em MicroPython (uma versão menor e mais compacta do Python direcionada para microcontroladores), então decidi utilizar a biblioteca machine.uart. Isso exigiu que eu conectasse minhas linhas UART/RS-232 aos pinos específicos de hardware UART. Neste caso, usei o GPIO 16 e 17. Após enviar comandos seriais via UART dentro do meu código MicroPython, descobri que todos os dados enviados e recebidos eram lixo. O código continuava relatando que os bytecodes recebidos nem sequer eram caracteres ASCII. Claramente, algo estava errado. Por essa razão específica, foi crítico obter uma captura de escopo de uma configuração funcionando. Imediatamente, consegui determinar que os sinais haviam se invertido até chegarem ao dispositivo Raspberry Pi Pico. Após configurar o TX e o RX para inverter (ao instanciar o objeto da biblioteca UART), os dados seriais que voltaram estavam impecáveis.
É importante notar que o dispositivo Raspberry Pi Pico opera em níveis de tensão de 3.3V e a BK Precision 1787 (especificamente o chip MAX202C que utiliza) opera em 5V. Enviar sinais de 5V para os pinos GPIO do dispositivo Raspberry Pi Pico por períodos prolongados pode danificar os buffers de entrada do chip. Para uso a longo prazo, é altamente aconselhável usar um conversor de nível para converter adequadamente os níveis de tensão de 3.3V para 5V entre os dispositivos.
Neste ponto, eu havia estabelecido comunicação e escrito uma biblioteca de driver que fornecia controle total da minha fonte de alimentação via comunicação serial. O próximo passo foi configurar um servidor web básico e validar que eu seria capaz de controlar meu dispositivo pela web. Graças ao microdot, consegui simplificar minha API REST e criar um protótipo muito rápido de "Hello World" para validar que o dispositivo Raspberry Pi Pico H poderia hospedar um servidor web para mim. Além de um simples retorno de "Hello World", também confirmei que poderia alternar LEDs usando funções POST. Neste ponto, eu estava pronto para integrar tudo.
Para tornar o código final mais legível e escalável, utilizei classes no meu código. Código orientado a objetos não é algo novo no mundo do software, mas muitas vezes é negligenciado em sistemas embarcados. Ao escrever serviços web, especialmente aqueles que estão controlando diferentes peças de hardware, é importante abstrair seu código de forma adequada para que o código de hardware detalhado fique fora da aplicação principal. No meu caso, você notará em main.py que há muito pouco código referenciando a fonte de alimentação, exceto por chamar funções específicas, como definir ou ler corrente/tensão (em vez de lidar com o comando UART real dentro de main.py). Isso permite uma visão mais limpa do que está acontecendo no nível da aplicação web e abstrai os detalhes do que está acontecendo no nível de comunicação do dispositivo.
Em main.py, crio dois tipos diferentes de endpoints para controlar minha fonte de alimentação. Um tipo é usado um método POST que é tipicamente usado dentro da API REST para atualizar campos em um backend para o servidor (por exemplo, inserir uma linha de um banco de dados). Eu poderia facilmente ter usado um método PUT, já que é apenas um único valor que eu estava editando, mas, sem nenhum bom motivo, fiquei com o POST. Na verdade, cabe a você qual tipo de método você gostaria de implementar neste cenário específico.
Também criei uma rota chamada "controller" que exibe um formulário de envio muito simples onde um usuário pode definir a tensão/corrente e clicar em "enviar", o que, por sua vez, realizaria uma ação POST e acionaria o webservice para atualizar as configurações de tensão/corrente na fonte de alimentação. É aqui que entra o aspecto de IoT habilitado para smartphones. Realizar um método POST não é muito simples de fazer do seu smartphone ou navegador comum. Você poderia emitir um método GET, mas acabaria com uma longa string de URL também. Uma maneira muito simples de alcançar o aspecto de "smartphoness" do seu projeto é incluir um formulário web básico que qualquer pessoa pode acessar de qualquer dispositivo. Uma vez que você suporta um formulário web básico dentro da sua aplicação web (e direciona adequadamente o tráfego de entrada através do firewall do seu roteador), você demonstrou, praticamente, que seu código é "habilitado para IoT".
Figura 5:
Algumas outras funcionalidades de monitoramento de saúde/debug que incluí neste projeto são:
Figura 6:
Ter esses pequenos extras realmente ajuda a transformar um projeto de hobby em algo um pouco mais maduro que pode ser diagnosticado quando surgem problemas.
Neste ponto, eu havia conseguido juntar todas as peças e agora possuía uma fonte de alimentação antiga com tecnologia de ponta. “Para que propósito serviria esta super fonte de alimentação retrô?” eu me perguntei. Bem, essa parte eu ainda estou tentando descobrir.
Para visualizar o repositório completo do código, visite https://gitlab.com/embedded-designs/rest-api-controlled-power-supply-using-micropython.