top of page

Aquisição de sinais usando Arduino e Python

Foto do escritor: Amanda Lucatto MarraAmanda Lucatto Marra

Este post descreve como coletar sinais através da porta USB do computador utilizando apenas uma placa de Arduino UNO. Através de um script em Python, uma comunicação é estabelecida com o Arduino conectado na USB do computador e os sinais coletados são armazenados em um arquivo CSV.


Não irei entrar no detalhamento do sinal que está sendo coletado ou no condicionamento físico da entrada analógica do Arduino, uma vez que isso vai depender do tipo de sinal que se deseja coletar e, além de ser irrelevante para atingir o objetivo deste post, é possível encontrar esse tipo de informação na internet de maneira bastante fácil. Neste post irei focar apenas na programação necessária, tanto no Arduino, quanto no script em Python.


É importante destacar também que, pelo fato de estarmos acessando uma porta física de nosso computador, não podemos utilizar o Google Colab para fazer o script em Python, pois este roda em um servidor na nuvem, e não no seu computador. Por isso, é necessário utilizar um Jupyter Notebook local.


A primeira coisa a ser feita é criar um protocolo de comunicação, ou seja, um código (um número) para cada status da comunicação. Para esta aplicação, escolhi o código descrito na tabela a seguir:

Estado

Código

Descrição

Handshake

0

Estabelece e checa a comunicação entre o computador e o Arduino

Voltage Request

1

Computador requer uma leitura do Arduino

On Request

2

Modo de aquisição sob demanda do computador

Stream

3

Modo de aquisição onde o Arduino envia continuamente o sinal para o computador


Programação do Arduino

Para criar este protocolo no Arduino, na parte de configuração inicial (antes do código), criamos algumas constantes:

Em seguida, criamos e inicializamos as variáveis utilizadas no programa, assim como o pino do Arduino de onde iremos coletar o sinal. No caso escolhemos a entrada analógica AO.

Para facilitar, criamos também uma função para ler o pino, calcular o tempo entre os pontos coletados, ou seja, o período de amostragem, e imprimir o resultado na saída serial do Arduino:

Note que os valores já estão sendo separados por vírgulas, para criarmos o arquivo CSV depois.

Na rotina de setup do Arduino, colocamos a inicialização da porta serial, com uma velocidade de 115.200 bps (bits por segundo) e fazemos uma inicialização da variável do tempo atual:

E, finalmente, o código do loop:

Script em Python

No Jupyter Notebook, antes de mais nada, precisamos instalar o pacote pyserial, com o seguinte comando:

E, em seguida, importamos as seguintes bibliotecas:

Da mesma forma que criamos as constantes de comunicação para o nosso protocolo no Arduino, fazemos aqui:

E, para facilitar a configuração, definimos o número de pontos que desejamos coletar por arquivo. Aqui colocamos apenas 10 pontos apenas para facilitar a visualização e checagens, mas basta modificar este valor para a quantidade desejada.


Identificação da porta serial


Com essas configurações iniciais feitas, vamos identificar a porta serial. Para isso, com o Arduino conectado na USB do computador, rodamos o seguinte código:

No meu caso, apenas uma porta está conectada, a porta O. Mas caso não seja o seu caso, é possível identificar o equipamento conectado na porta através do seguinte código:

E para descobrir o string correto da porta associada (COM3, COM5, COM7, etc.), que é o que realmente precisamos, usamos o seguinte código:

OBSERVAÇÃO IMPORTANTE:

Ao abrir a conexão com o Python, o Monitor Serial da IDE do Arduino não pode estar aberta, pois isto manterá a porta ocupada para o Python, não permitindo uma nova conexão. Ou seja: O Monitor Serial da IDE do Arduino precisa estar fechado!


Abertura da porta serial e estabelecimento de comunicação (Handshake)


Para abrir a porta de comunicação, fazemos uma ação chamada Handshake, mas para isso é necessário criar uma função de Handshake antes:


Leitura da porta serial


Uma vez estabelecida a comunicação, vamos partir para a leitura. Para isso, criamos mais duas funções: uma para ler os valores da porta serial e outra para converter bytes em valores de tensão. Os valores das entradas analógicas do Arduino são inteiros de 10 bits, sem sinal (positivo ou negativo), com valores entre 0 e 1023. Por isso, quando uma tensão for escrita pelo Arduino (na serial, neste caso), ela será um valor inteiro, que precisa ser convertido de novo em tensão para que nós possamos entender este valor. Sabendo que o Arduino UNO vai de 0 a 5V, realizamos uma regra de 3 para encontrar a fórmula de conversão.

Com estas funções definidas, para ler um único valor do Arduino, basta chamar a função request_single_voltage uma única vez:

Mas para coletar uma lista com o número de pontos que definimos antes, fazemos:

Para visualizar o resultado:

Note que, no meu exemplo, os pontos estão sendo coletados a cada 4 ms. Isso resulta em uma frequência de amostragem de 250 kHz.


Uma vez finalizada a comunicação, é necessário fechar a porta serial:


Arquivo CSV


Para salvar os dados coletados em um arquivo CSV, o seguinte código foi implementado, onde um cabeçalho foi incorporado ao arquivo:


Referências

Este estudo foi baseado nas informações das seguintes páginas:


Leitura da porta serial:


Arquivo CSV:


Leitura analógica do Arduino:


E os arquivos dos scripts tanto em Python quanto do Arduino pode ser acessados no meu Github:


445 visualizações0 comentário

Posts recentes

Ver tudo

Comments


©2020 por Amanda Lucatto Marra.

bottom of page