Leitura de sinal analógico com Raspberry Pi e ADS1115

Em projetos de sistemas embarcados, às vezes, faz-se necessário ler sinais analógicos em computadores embarcados que não possuem ADC (Analog to Digital Converter) como é o caso da Raspberry Pi. Diferente de um Arduino, onde podemos conectar um potenciômetro ou LDR diretamente em um pino ADC, uma Raspberry Pi não possui portas analógicas e precisa de um componente externo para realizar a função de leitura desses sinais. Neste artigo iremos mostrar na prática como fazer uma leitura de sinal analógico com Raspberry Pi e ADS1115 que é um conversor de sinais analógicos I2C. Faremos uma pequena biblioteca em linguagem C para interface com este componente.

 

 

Montagem do circuito para leitura de sinal analógico com Raspberry Pi

 

Para exemplificar o uso do ADS1115, iremos montar o circuito abaixo utilizando 3 potenciômetros.

 

1x Raspberry Pi
1x módulo ADS1115
3x potenciômetros 10 K ohm
Jumpers macho-macho
Jumpers macho-fêmea
1x Protoboard

 

Circuito do projeto sinal analógico com Raspberry Pi
Figura 1 - Circuito do projeto

 

 

Funcionamento básico do ADS1115

 

Extraímos algumas informações do datasheet do ADS1115 sobre seu funcionamento básico. Não iremos implementar integralmente todas as funções do componente, mas se você quiser, pode tomar este artigo como base e se aprofundar no datasheet para complementar a integração.



O ADS1115 utiliza o protocolo I2C para comunicação. Através deste protocolo podemos configurar o dispositivo e fazer a leitura de seus dados de conversão AD.



Assim como todo dispositivo I2C tem um endereço, o ADS1115 pode ter seu endereço configurado através do pino ADDR. Conectando esse pino de acordo com a tabela abaixo obtém-se o endereço. Por exemplo, conectado o pino ADDR em GND temos o endereço 0x48 em hexadecimal. [Datasheet pág 23]

 

Tabela de endereçamento
Figura 2 - Tabela de endereçamento

 

O ADS1115 possui 4 registradores de memória que podem ser acessados através do Address Pointer Register. Iremos trabalhar com apenas 2 destes registradores. O Conversion Register, que possui os valores de conversão, e o Config Register, que é usado para configuração dos parâmetros do ADS1115. Veja mais detalhes na seção 9.6 Register Map do datasheet. [Datasheet pág 27]

 

Antes de fazer a leitura dos dados de sinal analógico do ADS1115, seus parâmetros precisam ser configurados de acordo com cada necessidade de projeto. Essa configuração é feita através do Config Register. Este registrador é formado por 2 Bytes sendo dividido em alguns grupos de bits para cada tipo de parâmetro. Basicamente precisaremos configurar os parâmetros MUX, PGA e MODE.

 

Parâmetro MUX

 

O MUX é formado pelos bits 14, 13 e 12. Manipulando esses 3 bits configuramos o multiplexador do ADS1115 para ler os canais A0, A1, A2 ou A3 individualmente ou em modo diferencial entre canais. Por exemplo para ler o canal A1 apenas, os bits seriam 101.

 

Parâmetro PGA

 

Este parâmetro é formado pelos bits 11, 10 e 9 e usado para configurar o Programmable Gain Amplifier. Como estamos trabalhando com 3,3 V da Raspberry Pi, configuramos este registrador em 4,096 V. Assim nossa faixa de medição fica dentro dos 4,096 V. Para esta faixa de medição os bits devem ficar na forma  001. É possível até mesmo ler valores de tensão muito baixos com o ADS1115, como 0,256 V, e mesmo assim ter uma ótima resolução.

 

Parâmetro MODE

 

Esse parâmetro é formado pelo bit 8 apenas, e configura a forma de operação do ADS1115. Podem ser usadas duas formas. Forma contínua, onde o ADS1115 faz conversões continuamente, e forma single-shot, onde o ADS1115 faz apenas uma conversão e espera pela leitura. Iremos usar como exemplo a forma single-shot, por isso o bit 8 deve estar configurado em 1.

 

Existem ainda outros parâmetros mas, para este artigo, não serão necessários. Se seu projeto necessitar da configuração desses parâmetros, basta configurar os registros e bits de acordo.

 

Por fim, temos o registrador de leitura, Conversion Register, que possui os valores de conversão em um formato de 16-bits.

 

 

Biblioteca em C para interface com ADS1115

 

Foi desenvolvida uma biblioteca em C, que pode ser usada com Raspberry Pi e outras placas baseadas em Linux Embarcado. Ela pode ser baixada do meu GitHub. Com ela podemos fazer a leitura de sinal analógico com Raspberry Pi.

 

São dois arquivos. O ads1115_rpi.c e ads1115_rpi.h. No arquivo header temos as declarações das funções e diversos #define com o endereço de diversos registradores, o que facilita bastante a configuração do ADS1115.

 

No arquivo source temos a definição das 3 funções básicas da biblioteca. São elas: openI2CBus(), setI2CSlave() e readVoltage(). Veja abaixo o funcionamento de cada função.

 

int openI2CBus(char *bus)

 

Inicia a interface I2C no Linux com um dado endereço do barramento I2C

 

Você pode encontrar esse endereço com o comando “ls /dev” que irá mostrar algo como “i2c-1”.

 

Exemplo:

 

 

int setI2CSlave(unsigned char deviceAddr)

 

Essa função configura o endereço do nosso ADS1115, recebendo como parâmetro o endereço escolhido.

 

Exemplo:

 

 

float readVoltage(int channel)

 

Essa é a função de leitura e retorna o valor em volts do canal especificado.

 

Exemplo:

 

 

 

Executando um programa exemplo para leitura de sinal analógico com Raspberry Pi

 

Como exemplo de uso da biblioteca faremos um programa em C que lê os valores de 3 potenciômetros e exibe esses valores no terminal.

 

 

O programa acima é bem simples. Primeiro abrimos o barramento I2C, configuramos o endereço do ADS1115 e entramos num loop while fazendo a leitura da tensão através da função readVoltage(). Para exibir os valores no terminal, utilizamos a função printf().

 

Para executar o exemplo acima, primeiro habilite a interface I2C no raspi-config -> Interfacing Options -> I2C.

 

Menu de configuração I2C
Figura 3 - Menu de configuração I2C

 

Baixe o repositório do Github na Raspberry Pi com o seguinte comando:

 

 

Entre na pasta e faça compilação do programa:

 

 

Finalmente execute o exemplo:

 

 

Se tudo ocorrer bem você deverá ver o seguinte resultado:

 

 

Veja no vídeo abaixo o funcionamento do projeto, lendo sinal analógico com Raspberry Pi:

 

 

 

Conclusão

 

Neste artigo vimos como fazer a leitura de sinal analógico com Raspberry Pi e o funcionamento básico do conversor analógico digital ADS1115.

 

Desenvolvemos uma biblioteca em linguagem C para trabalhar com o ADS1115 através do protocolo I2C no Linux. A biblioteca ainda carece de muitas outras funções como, por exemplo, fazer uma leitura diferencial entre canais. Melhorias para a biblioteca ads1115_rpi são muito bem vindas através do GitHub. Esperamos que, através deste artigo, os leitores possam aplicar a técnica de leitura de sinal analógico com Raspberry Pi em seus projetos.

 

Saiba Mais

 

Sinal Analógico X Sinal Digital

Trazendo o mundo real para dentro do processador - Condicionamento de sinais analógicos - Parte 4

NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Giovanni Bauermeister
É formado em Técnico em Mecatrônica pelo SENAI Roberto Mange de Campinas, onde teve seus primeiros contatos com microcontroladores, eletrônica e programação. Em 2016 obteve a graduação em Engenharia de Controle e Automação pela UNISAL, também em Campinas. Durante a graduação, teve a oportunidade de ingressar como estagiário na empresa Toradex, onde atuou e desenvolveu habilidades em sistemas Linux embarcado. Participou do movimento maker, contribuindo com tutoriais e suporte ao cliente na Filipeflop. Atualmente atua na área de desenvolvimento de projetos.

Deixe um comentário

avatar
 
  Notificações  
Notificar