Adicionando saídas digitais a um PC para testar sistemas embarcados com Python

Este post faz parte da série Entradas e Saidas com conversor USB-SERIAL

Embora plataformas como Arduino, Raspberry Pi e similares vêm à mente quando se precisa desenvolver rapidamente projetos de controle, há situações em que simplesmente não é possível usá-las, seja por limitações da plataforma (capacidade de processamento, memória, etc.), seja por características do projeto a ser desenvolvido. Nesses casos, pode ser necessário usar um PC. O problema é que PCs modernos não têm entradas e saídas digitais diretamente usáveis e algum dispositivo externo precisa ser adicionado, via rede Ethernet ou USB.

A ideia apresentada neste artigo surgiu na necessidade de se testar um sistema embarcado usando um PC. O sistema de teste precisaria controlar alguns relés, comunicar-se com o sistema embarcado para controlá-lo e obter informações de status, gerar logs e executar outras tarefas relativamente complexos. O programa de teste teria de executar no Linux, portanto Python era uma escolha natural para desenvolvê-lo, já que uma linguagem de script permite que se implementem rotinas complexas com relativamente poucas linhas de código e menor esforço de programação, comparando-se com linguagens de programação como C ou C++.

A interface física de controle

O primeiro passo para desenvolver a ferramenta de teste foi encontrar um conversor USB-GPIO no mercado local. A pesquisa inicial retornou diversos links para um conversor similar ao mostrado na Figura 1, anunciado como interface serial/programador para o módulo WI-FI ESP8266 ESP-01.

Figura 1 – Conversor USB-Serial com identificação de alguns pinos relevantes

Esse conversor é baseado no CI CH340G. As saídas TxD, DTR e RTS podem ser usadas para controlar dispositivos com nível de tensão de 5V nas entradas. As saídas DTR e RTS (pinos 13 e 14) do CH340G foram ligadas aos pinos 2 e 3 do conector amarelo (Figura 2) e a funcionalidade foi testada em uma sessão interativa de Python.

Figura 2 – Conversor modificado com conexões das saídas DTR e RTS ao conector

Posteriormente se acharam outros conversores USB-Serial com saídas TTL/C-MOS (Figura 3) no mercado local. Esses conversores têm a vantagem de não necessitar retrabalho, bastando soldar barras de pinos aos furos metalizados para facilitar o acesso a alguns sinais, mas o conversor da Figura 2 foi usado para os testes de prova de conceito apresentados a seguir e, posteriormente, no setup de teste do Sistema Embarcado a ser testado.

Figura 3 – Conversores USB-Serial baseados no CI FTDI FT232 (esquerda) e Silabs CP2101N (direita)

A Figura 4 apresenta a conexão do conversor USB-Serial modificado com uma placa de relés de 4 canais. As bobinas dos relés dessa placa são energizadas quando as respectivas entradas (IN1 a IN4) têm nível de tensão de 0V. As saídas DTR, RTS e TxD da UART do conversor são de lógica negativa, portanto são ativas em nível lógico zero e as bobinas por elas controladas são energizadas. A placa de relés é alimentada por uma fonte de 5V.

Figura 4 – Conexão entre o conversor USB-Serial e a placa de relés

Controle manual dos relés com Python

As linhas abaixo apresentam uma sequência de comandos para controlar os relés no ambiente interativo do Python, que deve ser executado com o comando sudo, para permitir acesso à porta serial do conversor por usuários não root (ou o Linux deve ser configurado para permitir acesso à porta serial).

>>> from serial import Serial 
>>> s = Serial('/dev/ttyUSB0') # cria o objeto “s” de classe Serial 
>>> s.dtr = True # energiza a bobina do relé 1 (conecta o terminal N/O)
>>> s.dtr = False # desenergiza a bobina do relé 1 (conecta o terminal N/C)
>>> s.rts = True # energiza a bobina do relé 2
>>> s.rts = False # desenergiza a bobina do relé 2
>>> s.break_condition = True # energiza a bobina do relé 3
>>> s.break_condition = False # desenergiza a bobina do relé 3

Quando a segunda linha acima é executada, as bobinas dos relés controladas pelas saídas DTR e RTS são energizadas, porque essas saídas são ativadas quando a porta serial é iniciada pelo driver do Linux. Esse comportamento deve ser considerado ao se controlarem os relés manualmente.

A Figura 5 apresenta uma pequena classe para controlar os relés.

Figura 5 – Classe escrita em Python para controlar os relés

A classe Relays herda da classe Serial, que faz parte dos pacotes do Python instalados no Linux. Quando instanciada, a classe coloca as saídas DTR e RTS no estado inativo imediatamente, para evitar que as bobinas dos relés por elas controladas sejam energizadas.

As linhas abaixo apresentam uma sequência de comandos para exercitar a classe Relays dentro de uma sessão interativa de Python, com o código da Figura 5 previamente salvo como relays.py.

>>> from relays import Relays, ON, OFF, RELAY1, RELAY2, RELAY3
>>> r = Relays() # cria o objeto de classe Relays; /dev/ttyUSB0 é o default
>>> r.relay1(ON)
>>> r.relay1(OFF)
>>> r.relay2(ON)
>>> r.relay2(OFF)
>>> r.relay3(ON)
>>> r.relay3(OFF)

Uma observação importante para o caso de os dispositivos externos a serem controlados não serem eletromecânicos: entre o instante em que a classe Relays inicia a porta serial e os instantes em que as saídas DTR e RTS são inativadas, haverá um transiente nessas saídas. Esse transiente é suficientemente curto para não acionar os relés, mas deve ser levado em conta para outros dispositivos controlados por essas saídas: se eles forem afetados negativamente pelos transientes, medidas de mitigação serão necessárias.

Teste de prova de conceito: juntando todas as partes

A Figura 6 apresenta o setup feito para um simples teste de prova de conceito. Cada relé controla uma cor de uma fita de LEDs RGB. A Figura 7 apresenta o script usado para executar o teste de prova de conceito, usando a classe Relays. Os relés são controlados de forma a gerar alguns padrões simples de iluminação. Esse script deve estar no mesmo diretório de relays.py e ele deve ser tornado executável com o chmod.

Figura 6 – Setup de teste de prova de conceito

Figura 7 – Script para controlar uma fita de LEDs RGB

Um vídeo do teste de prova de conceito:

O código-fonte do teste pode ser baixado de https://github.com/cve2022/relay_party .

Conclusão

Este artigo apresentou uma forma de adicionar saídas digitais a um PC, para controlar dispositivos externos (relés, solenoides etc.), a fim de implementar ferramentas de desenvolvimento e/ou teste de sistemas embarcados para as quais plataformas como Arduino, Raspberry Pi e similares não conseguem atender os requisitos. O autor espera que ele seja útil para outros desenvolvedores de sistemas embarcados como foi para ele.

Entradas e Saidas com conversor USB-SERIAL

Adicionando entradas e saídas a um PC para monitorar e controlar dispositivos externos
Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
Comentários:
Notificações
Notificar
0 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Home » Hardware » Adicionando saídas digitais a um PC para testar sistemas embarcados com Python

EM DESTAQUE

WEBINARS

VEJA TAMBÉM

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Talvez você goste: