Como ler sinais analógicos no Raspberry Pi usando ADS1015/ADS1115

Raspberry Pi é o computador de placa única mais popular. Por ser um microcomputador embarcado, a aquisição de dados é quase essencial no Raspberry Pi. Embora Pi tenha vários pinos GPIO (entrada/saída de uso geral), ele não possui nenhum conversor analógico para digital integrado ou integrado. Portanto, Pi por si só não pode amostrar dados de sensores analógicos. Em aplicações embarcadas, sensores analógicos são frequentemente usados. Na verdade, muitos sensores, como resistores dependentes de luz (LDRs) e sensores IR, simplesmente não estão disponíveis em formato digital. Nesse caso, os sensores analógicos podem fazer interface com o Raspberry Pi de duas maneiras. Uma é usar um conversor analógico-digital externo; a segunda é amostrar dados de sensores analógicos usando um microcontrolador e transferir todos os dados capturados para Raspberry Pi por meio de uma interface serial.

A interface do Raspberry Pi com um microcontrolador apenas para buscar dados analógicos não é uma solução viável. Um ADC externo é a melhor solução quando o Raspberry Pi opera como um microcomputador incorporado independente e é necessária aquisição de dados analógicos.

A aquisição de dados analógicos no Raspberry Pi traz vários benefícios. É muito mais fácil aplicar algoritmos de aprendizado de máquina e modelos de aprendizado profundo em um microcomputador como Raspberry Pi do que em qualquer microcontrolador. Os microcontroladores têm muitos recursos limitados e têm ferramentas de software e APIs limitadas para aplicar algoritmos de aprendizado de máquina ou implementar redes de aprendizado profundo. As ferramentas de software disponíveis de aprendizado de máquina e aprendizado profundo para microcontroladores também são limitadas em suas capacidades. Por exemplo, aplicações de visão computacional geralmente requerem grande RAM e sensores de câmera eficientes para qualquer aplicação prática. As ferramentas de aprendizado de máquina para microcontroladores não têm muito desempenho para aplicativos embarcados com uso intensivo de recursos.

ADS1015 ADS1115

Este projeto irá explorar como realizar aquisição de dados analógicos em Raspberry Pi usando chips ADS1115 ou ADS1015 ADC. No mesmo contexto, também discutiremos como podemos ler dados analógicos de sensores IR no Raspberry Pi para detecção de obstáculos em um robô Raspberry Pi.

Componentes necessários

  1. Framboesa Pi 3B/4B x1
  2. ADS1115/ADS1015 ADC x1
  3. Sensores IR x1
  4. Tábua de ensaio x1
  5. Conectando fios/fios de jumper

ADS1115/ADS1015 Pi vs. microcontroladores
Conforme já discutido, temos duas maneiras de amostrar dados analógicos no Raspberry Pi. Antes de discutir o uso de ADCs externos como ADS1115/ADS1015, vale a pena notar a diferença entre as duas abordagens. Quando conectamos um microcontrolador como uma placa Arduino com Raspberry Pi, conectamos uma solução embarcada completamente separada com o microcomputador. Se a placa Arduino operar em um nível de tensão diferente, como a maioria das placas Arduino são circuitos de 5V, precisamos usar com cautela um conversor de nível lógico TTL entre o microcontrolador e o Raspberry Pi. Caso contrário, danificaremos todo o Pi, ou pelo menos os pinos da placa. No caso de ADC externo, podemos acionar o ADC a partir das saídas de tensão do Raspberry Pi.

Um microcontrolador funcionará de forma independente com seu ciclo de amostragem de dados. Nesse caso, um script Python no Raspberry Pi precisará acompanhar a velocidade de amostragem do microcontrolador. Isso também significa que o controle de aquisição de dados permanece com o microcontrolador e não com o Raspberry Pi. Às vezes, isso é útil ao implementar aplicações de tempo crítico, onde os dados do sensor devem ser processados ​​imediatamente para uma resposta rápida. No caso de um ADC, a aquisição de dados e a taxa de amostragem são controladas pelo Raspberry Pi. Alguns desenvolvedores acham que o Raspberry Pi executando um sistema operacional normal pode atrasar a aquisição e o processamento de dados analógicos com ADCs externos, pois outros processos podem substituir os scripts Python em execução no momento. No entanto, este problema pode ser facilmente resolvido delegando a detecção de dados analógicos em um thread paralelo, empregando multi-threading.

Um microcontrolador só deve ser usado com Raspberry Pi quando várias tarefas incorporadas de tempo crítico precisam ser executadas em paralelo. O Raspberry Pi, neste caso, pode ser implantado no backend para realizar análises extensas de dados, implementar modelos de aprendizado de máquina ou aprendizado profundo em dados de sensores, gerenciar a comunicação com uma plataforma em nuvem e gerenciar operações de IoT (Internet das Coisas).

ADS115/ADS1015 ADC
ADS1015 e ADS1115 são conversores analógico-digitais de baixa potência e alta precisão. Eles são amplamente utilizados com Raspberry Pi, pois esses chips também operam a uma tensão de 3V3. ADS1015 é um ADC de 12 bits com quatro canais de entrada analógica. ADS1115 é um ADC de 16 bits com quatro canais de entrada analógica.

Neste projeto, usaremos ADS1115. O ADS1115 suporta dois tipos de aquisição de dados – single-ended e diferencial. Na conversão single-ended, os dados analógicos de cada um dos quatro pinos de entrada analógica são amostrados independentemente. A diferença entre as tensões em dois pinos de entrada analógica é amostrada em um modo diferencial de operação. O ADS1115 possui resolução de 16 bits, dos quais um bit permanece reservado para o sinal de mais/menos da diferença de tensão no modo diferencial, e os 15 bits restantes são usados ​​para armazenar valores de tensão convertidos. O chip possui uma interface I2C para comunicação serial de dados com um microcomputador/microcontrolador.

A taxa de amostragem no ADS1115 pode ser definida entre 8 e 860 amostras por segundo. Maior é a taxa de amostragem; menor é o tempo que o ADC leva para capturar e converter o sinal analógico. O chip também possui um amplificador de ganho integrado, amplificando sinais de tensão fraca de 2 a 3x a 16x vezes. A conversão (single-ended ou diferencial) pode ser feita de duas maneiras. A conversão é iniciada pelo Raspberry Pi (ou microcomputador/microcontrolador de controle) em um método. O valor convertido é armazenado em um registro no ADS1115. O Raspberry Pi então lê o registro. No segundo método, a conversão é feita continuamente pelo ADS1115. O sinal é amostrado a uma taxa pré-programada (8~860 sps) e o valor convertido é atualizado repetidamente em um registro no ADS1115. O Raspberry Pi deve ler repetidamente o registro ADS1115 de acordo com a taxa de amostragem programada. Se o Raspberry Pi ler o registro em uma taxa mais baixa, ele perderá várias amostras capturadas. Por outro lado, se o Raspberry Pi ler o registrador a uma taxa mais alta, ele registrará vários valores redundantes para as mesmas amostras.

ADS1115 possui o seguinte diagrama de pinos.

Configuração de pinos do ADS1015 ADS1115

Fiação ADS115/ADS1015 com Raspberry Pi
ADS1115 e ADS1015 amostram dados analógicos de sensores e transferem os valores convertidos para Raspberry Pi através da interface I2C. Ambos os chips usam o mesmo protocolo I2C e possuem a mesma configuração de pinos. Para conectar o ADS1015/ADS1115, siga as conexões do circuito resumidas na tabela abaixo.

Habilitando I2C no Raspberry PiA saída analógica de um sensor deve ser conectada em A0, A1, A2 ou A3 do ADS1015/ADS1115. No máximo quatro sensores podem ser conectados ao ADS1015/ADS1115. O sensor pode receber tensão do próprio Raspberry Pi. Se uma fonte externa alimentar o sensor, ela não deve ultrapassar 3,3V.

ADS1015 e ADS1115 comunicam-se com Raspberry Pi através do protocolo I2C. Antes de fazermos a interface do ADS1015/ADS1115 com Raspberry Pi, a porta I2C deve estar habilitada no microcomputador. Para isso, navegue até Preferências -> Configuração do Raspberry Pi.

Janela de configuração do Raspberry PiUma janela de configuração será aberta, conforme mostrado abaixo.

Interfaces na configuração do Raspberry Pi

Selecione a guia Interfaces. Habilite I2C e clique em ok.

Porta I2C no Raspberry PiÉ isso. Agora o Raspberry Pi pode se comunicar por meio de uma porta I2C. A porta I2C no Raspberry Pi é mostrada na imagem abaixo.

Para saber mais sobre a comunicação I2C no Raspberry Pi. Você também pode estar interessado em saber como funciona o protocolo I2C.

Biblioteca python Adafruit ADS1x15 Raspberry Pi
Felizmente, temos a biblioteca Python Adafruit ADS1x15 disponível para trabalhar com ADS1015 e ADS1115. Não precisamos escrever nenhum script Python do zero para fazer a interface ADS1015/ADS1115 com Raspberry Pi.

Instalando a biblioteca python ADS1x15 no Raspberry Pi
A biblioteca Python Adafruit ADS1x15 pode ser instalada no Raspberry Pi manualmente ou através do gerenciador de pacotes PiP. Para instalar a biblioteca a partir do código-fonte, abra o Terminal Bash navegando em Acessórios->Terminal ou simplesmente clicando no ícone Terminal; em seguida, execute os seguintes comandos.

sudo apt-get atualização
sudo apt-get install build-essential python-dev python-smbus git
CD ~
clone
CD Adafruit_Python_ADS1x15
sudo python setup.py instalar

Para instalar a biblioteca usando o gerenciador de pacotes PiP, abra o Terminal Bash navegando em Acessórios->Terminal ou simplesmente clicando no ícone Terminal; em seguida, execute os seguintes comandos.

sudo apt-get atualização
sudo apt-get install build-essential python-dev python-smbus python-pip
sudo pip instalar adafruit_ads1x15

Se estiver usando Python3, você precisará instalar a biblioteca usando pip3 da seguinte maneira.
sudo pip3 instalar adafruit_ads1x15

Depois que a biblioteca for instalada com sucesso na instalação do Python, você poderá usá-la simplesmente importando a biblioteca em um script.

Código Python para aquisição de dados analógicos usando ADS1115/ADS1015
Para usar a biblioteca Adafruit ADS1x15 em um script python, importe a biblioteca usando a seguinte instrução.

importar Adafruit_ADS1x15

Então, você precisa instanciar um objeto da classe Adafruit_ADS1x15 usando a seguinte instrução. A instância é denominada 'adc' aqui; pode ser qualquer identificador.

adc = Adafruit_ADS1x15.ADS1115

Em seguida, você precisa definir o ganho do amplificador integrado. O ganho precisa ser definido de acordo com a tabela de Ganho do Amplificador Programável fornecida na folha de dados ADS1015/ADS1115. Uma referência rápida do ganho do amplificador e da faixa de tensão de detecção desejada está resumida na tabela abaixo.


O ganho pode ser definido usando a seguinte instrução.

GANHO = 1

A leitura da tensão convertida varia de -32768 a +32767 para ADS1115 e -2048 a +2047 para ADS1015. Um valor de 0 faz referência ao nível do solo. A tensão real detectada é determinada pela proporcionalidade da faixa de tensão definida pelo ganho do amplificador. Por exemplo, se o ganho for definido como 1, o valor de 32767 refere-se a uma tensão de 4,096V no ADS1115. Qualquer valor na faixa de -32768~32767 refere-se a uma tensão analógica (4.096/32767)*a. A leitura analógica da entrada analógica A0 do ADS1115/ADS1015 pode ser lida usando a seguinte instrução.
valor = adc.read_adc(0, ganho=GANHO)

Da mesma forma, as leituras analógicas das entradas analógicas A1~A3 do ADS1015/ADS1115 podem ser lidas usando as seguintes instruções.
valor = adc.read_adc(1, ganho=GANHO)
valor = adc.read_adc(2, ganho=GANHO)
valor = adc.read_adc(3, ganho=GANHO)

Aqui, 'valor' é uma variável no script Python. As leituras ADC podem ser obtidas em um loop se vários sensores analógicos estiverem conectados ao Raspberry Pi via ADS1015/ADS1115. As tensões reais podem ser calculadas usando a equação indicada acima. A seguir está um exemplo de derivação da leitura de tensão real.
GANHO = 1
valor = adc.read_adc(0, ganho=GANHO)
tensão_analógica = valor*(4.096/32767)

Interface de sensores IR com Raspberry Pi via ADS1115/ADS1015
Sensores IR são sensores comumente usados ​​que estão disponíveis apenas na forma analógica. Os sensores IR são amplamente utilizados em robôs Raspberry Pi para seguimento de linha ou detecção de obstáculos. Os sensores IR podem ser facilmente conectados ao Raspberry Pi via ADS1015/ADS1115. O sensor IR possui três pinos – VDD, GND e Out. Conecte o pino Out do sensor IR com qualquer pino de entrada analógica do ADS1015/ADS1115 e forneça a alimentação positiva e negativa ao sensor a partir do próprio Raspberry Pi. Em seguida, faça a interface do ADS1015/ADS1115 com Raspberry Pi conforme mencionado acima. Dessa forma, um sensor IR, um sensor analógico agora está conectado ao Raspberry Pi.

Script Python para ler a saída do sensor IR no Raspberry Pi
Execute o script a seguir para buscar leituras analógicas do sensor IR no console Python.
hora de importação
importar Adafruit_ADS1x15
adc = Adafruit_ADS1x15.ADS1115
# Escolha um ganho de 1 para leitura de tensões de 0 a 4,09V.
# Ou escolha um ganho diferente para alterar a faixa de tensões lidas:
# – 2/3 = +/-6,144V
# – 1 = +/-4,096V
# – 2 = +/-2,048V
# – 4 = +/-1,024V
# – 8 = +/-0,512V
# – 16 = +/-0,256V
# Consulte a tabela 3 na ficha técnica ADS1015/ADS1115 para obter mais informações sobre ganho.

GANHO = 1
enquanto Verdadeiro:
valor = adc.read_adc(0, ganho=GANHO)
imprimir(valor)

tempo.sono(0,5)

Resultados
O sensor IR emite uma tensão mais alta quando não há obstáculo em seu caminho. Quando o sensor enfrenta um obstáculo, sua saída é reduzida. A leitura do ADC quando não há obstáculo no caminho do sensor IR é 24550 ~ 24729. Com um ganho do amplificador de 1, essas leituras correspondem a uma tensão de 3,06~3,09V. A leitura do ADC quando um obstáculo bloqueia o sensor IR é 660~670. Com um ganho do amplificador de 1, essas leituras correspondem a uma tensão de 0,081~0,083V. Deve-se observar que a saída do sensor IR depende de sua calibração pelo potenciômetro integrado.

Conclusão
ADS1015 e ADS1115 são conversores analógicos para digitais de baixa potência e alta resolução. Eles podem ser facilmente interligados com Raspberry Pi e comunicados através do protocolo I2C. Esses ICs podem detectar no máximo quatro tensões analógicas simultaneamente em uma configuração de terminação única. Portanto, tornando ADS1015 e ADS1115 os melhores ADCs para robôs Raspberry Pi.

Conteúdo Relacionado

Voltar para o blog

Deixe um comentário

Os comentários precisam ser aprovados antes da publicação.