Contents

Adicionando um ADC ao seu Raspberry Pi: O que precisa de saber

Conclusões principais

O Raspberry Pi não consegue processar sinais analógicos diretamente; no entanto, pode ser equipado com conversores analógico-digitais (ADC) externos para transformar valores de tensão física num formato digital adequado para armazenamento, manipulação e gestão de dados.

As opções populares de conversor analógico-digital (ADC) incluem o MCP3004/MCP3008, que oferece um equilíbrio entre velocidade e precisão, bem como o ADS111x, que fornece uma resolução de 16 bits numa frequência de amostragem mais baixa.

O ADS1115, disponível através da Adafruit, é uma solução elegante que inclui um amplificador de ganho programável (PGA), permitindo a deteção de disparidades de tensão mínimas e facilitando o ajuste dinâmico do ganho durante o funcionamento. A integração com o Raspberry Pi via I2C não apresenta quaisquer desafios.

A deficiência inicial do Raspberry Pi em fornecer entradas analógicas distingue-o das plataformas orientadas para microcontroladores, como o Arduino, o que pode limitar as suas capacidades quando comparado com essas alternativas.

Embora possa parecer assustador, há várias alternativas a explorar. Pode começar por utilizar um Raspberry Pi juntamente com um conversor analógico-digital (ADC) externo para um funcionamento sem problemas.

Porquê adicionar entradas?

No mundo natural, existem inúmeras ocorrências que podem ser convenientemente encapsuladas através da utilização de potenciais eléctricos. Ao converter estes potenciais nos seus equivalentes binários, podem ser arquivados, manipulados e utilizados como meios para regular factores adicionais e ativar outros mecanismos.

Uma pessoa pode querer supervisionar a humidade da sua terra, o calor da sua estufa ou o peso do seu roedor. Pode querer incorporar um regulador de nível no seu Raspberry Pi, construir uma série de controlos deslizantes ou criar um joystick de novo. As aplicações potenciais são muito vastas e variadas.

Opções para ADCs

Então, qual é o melhor ADC para principiantes?

Entre as opções mais populares e directas estão os chips MCP3004 (e MCP3008 ) da Microchip. Obterá quatro (ou oito) canais de 10 bits cada, que podem ler até 200 kSPS. Por outro lado, existem os dispositivos ADS111x da Texas Instruments, que lêem 16 bits a 860 SPS. Assim, existe uma relação de compromisso entre velocidade e precisão (e, naturalmente, preço).

Vários microcontroladores estão equipados com conversores analógico-digitais (ADCs) integrados. Por exemplo, o amplamente utilizado ATMega presente na maioria dos Arduinos fornece vários canais de resolução de 10 bits, juntamente com outras funcionalidades.Esta capacidade permite que a plataforma Arduino suporte sinais de entrada analógicos que ultrapassam as limitações das capacidades do Raspberry Pi. Nos casos em que um Arduino existente é incorporado num projeto e 10 bits de resolução são suficientes para a precisão necessária, utilizar a solução Arduino prontamente disponível pode revelar-se o curso de ação mais simples.

De facto, por uma questão de simplicidade, vamos utilizar o ADS1115, cortesia da Adafruit neste caso.

/pt/images/ads1115_photo.png

O que é um amplificador de ganho programável?

O circuito integrado possui várias capacidades intrigantes, nomeadamente um amplificador de ganho programável (PGA) incorporado, que permite a definição digital do espetro de amplitude preferido. O PGA permite a especificação da gama de tensões até às fracções de um volt, possibilitando a deteção de variações mínimas tão pequenas como alguns microvolts, devido à vasta gama de valores representada pela resolução de 16 bits.

Uma das vantagens deste chip específico é o facto de permitir o ajuste do ganho durante o funcionamento. Em contrapartida, alguns outros dispositivos, como o MCP3004, utilizam uma estratégia alternativa, incorporando um pino adicional ao qual pode ser aplicada uma tensão de referência.

E quanto à multiplexagem?

Um multiplexador, também conhecido como mux, serve como um dispositivo de comutação que permite a utilização de um único conversor analógico-digital (ADC) para amostrar dados de várias fontes. Nos casos em que um circuito integrado ADC possui uma multiplicidade de terminais de entrada, torna-se evidente que ocorre internamente um processo intrínseco de multiplexagem. Por exemplo, o ADS1115 incorpora um componente mux com capacidade para acomodar até quatro sinais de entrada distintos, que podem ser seletivamente escolhidos através da manipulação da sua configuração de registo inerente.

Lidar com registos

O ADS1115 oferece uma série de funcionalidades que podem ser facilmente acedidas através da manipulação de várias configurações de controlo. Estas incluem a capacidade de gerir o multi

O mecanismo de ativação para cada funcionalidade individual está escondido dentro dos limites da embalagem do produto, manifestando-se como minúsculos repositórios de dados conhecidos como “registos”. Para ativar uma função específica, basta alterar o registo apropriado do seu estado predefinido de zero para um valor de um.

Se olharmos para a folha de dados do ADS111x , veremos que estes modelos vêm com quatro registos, incluindo os registos de configuração que regem o comportamento do dispositivo.

/pt/images/as1115_config_register.jpg

Neste contexto, os bits 14 a 12 são utilizados para controlar o funcionamento de um multiplexador. Utilizando estes três dígitos binários, é possível escolher entre oito configurações distintas. Neste caso, a configuração desejável é “100”, pois determina o sinal diferencial entre o canal de entrada 0 e a terra. Por outro lado, os bits 7 a 5 são responsáveis pela regulação da frequência de amostragem. Para obter a maior taxa de amostragem possível de 860 amostras por segundo, o ideal seria configurar estes bits em “111”.

Uma vez identificadas as definições apropriadas a aplicar, terá acesso a um total de dois bits que podem ser transmitidos ao Conversor Analógico-Digital. No caso de posteriormente desejar modificar bits individuais, pode fazê-lo utilizando operações bit a bit isoladamente.

A representação de estados de comutação individuais num sistema binário pode dar origem a alguma confusão. Embora o código binário em si não represente diretamente um valor numérico específico, pode ser utilizado para indicar o estado de cada interrutor individual. Esta informação pode ser expressa em vários formatos, como a notação decimal ou hexadecimal; no entanto, para facilitar a compreensão e evitar potenciais complicações, é muitas vezes preferível manter a utilização do formato binário.

Ligação eléctrica

Este dispositivo pode ser convenientemente ligado a uma placa de ensaio. A sua gama de entrada de tensão positiva vai de 2 a 5,5 volts, garantindo a compatibilidade com a fonte de alimentação de 3,3 volts de um Raspberry Pi.

Para começar a funcionar, ligue os pinos SDA e SCL do MCP3008 às portas correspondentes no Raspberry Pi, ligando simultaneamente as ligações à terra e de 3,3V. Além disso, insira um potenciómetro em série entre as linhas de terra e de tensão e, em seguida, ligue uma extremidade do condutor central do potenciómetro à primeira entrada do conversor analógico-digital (ADC). Com estes passos concluídos, a sua configuração está pronta a ser utilizada.

Lidar com I2C

Diversos conversores analógico-digitais (ADCs) utilizam vários protocolos de comunicação para o seu funcionamento. Por exemplo, no contexto do nosso ADS1115, utilizaremos uma interface específica conhecida como I2C (Inter-Integrated Circuit) para fins de comunicação e transferência de dados.

Para utilizar o Python na interface com um conversor analógico-digital (ADC) num Raspberry Pi, devem ser cumpridos determinados pré-requisitos. Felizmente, as iterações recentes do sistema operativo (SO) Raspberry Pi simplificaram consideravelmente este processo.Para iniciar o procedimento de configuração, navegue até “Preferências” no menu do sistema e seleccione “Configuração do Raspberry Pi”. A partir daí, vá para o separador “Interfaces” e active a opção “I2C”.

/pt/images/i2c_enable.jpg

Para garantir que todos os componentes estão a funcionar corretamente, inicie uma interface de linha de comandos abrindo uma janela de terminal e executando o seguinte comando:

 sudo i2cdetect -y 1 

O texto fornecido descreve um cenário em que a execução de um determinado comando irá gerar uma saída numa grelha, que contém informações relativas ao endereço de um conversor analógico-digital (ADC). O autor salienta que este valor hexadecimal deve ser precedido de “0x” antes de ser utilizado no código subsequente. Neste caso, o valor é representado como 0x48.

/pt/images/20231108_18h24m38s_grim.jpg

Utilizando o endereço obtido, pode-se empregar a biblioteca SMBus para transmitir comandos I2C utilizando dois procedimentos distintos. Um destes métodos envolve a utilização da função write\_word\_data(), que requer três entradas, nomeadamente, o endereço do dispositivo, o registo específico a ser escrito e o valor de dados desejado que será inscrito nessa localização.

A função read_word_data() recebe como entrada um endereço de dispositivo e um registo, e faz com que o conversor analógico-digital (ADC) recolha continuamente amostras e armazene valores de tensão no registo especificado. Isto permite a recuperação subsequente dos dados armazenados a partir do registo.

Pode optar-se por melhorar a apresentação visual da saída e, posteriormente, exibi-la. Antes de voltar a entrar no ciclo iterativo, pode ser implementada uma breve pausa ou atraso. Esta abordagem ajuda a evitar a sobrecarga de informação.

 from smbus import SMBus
import time
addr = 0x48
bus = SMBus(1)

# set the registers for reading
CONFIGREG = 1
CONVERSIONREG = 0

# set the address register to point to the config register
# write to the config registers
bus.write_word_data(addr, CONFIGREG, (0b100 << 8 | 0b10000010))

 # define the top of the range
TOP = 26300

while True:
    # read the register
    b = bus.read_word_data(addr, CONVERSIONREG)

    # swap the two bytes
    b = ((b & 0xFF) << 8) | ((b >> 8) & 0xFF)
    
    # subtract half the range to set ground to zero
    b -= 0x8000

    # divide the result by the range to give us a value between zero and one
    b /= TOP

    # cap at one
    b = min(b, 1)

    # bottom is zero
    b = max(b, 0)

    # two decimal places
    b = round(b, 2)
    print(b)
    time.sleep(.01)

Depois de ter convertido o tipo de dados da sua variável para corresponder ao formato preferido, é essencial mapear os valores resultantes para os seus correspondentes na escala original. Isso permite comparações significativas entre os dois conjuntos de valores. Posteriormente, pode optar por eliminar quaisquer dígitos em excesso, definindo o número apropriado de casas decimais. Para apresentar apenas resultados actualizados, modifique a função de impressão para mostrar os novos valores apenas se forem diferentes dos anteriormente apresentados. Para mais informações sobre max, min e round, consulte a nossa compilação das 20 funções Python mais importantes.

Lidar com o ruído

Nos casos em que o ambiente carece de um elevado grau de organização e ordenação, pode tornar-se evidente que certos elementos indesejados estão presentes nos dados que estão a ser recolhidos.Este fenómeno pode ser atribuído ao facto de que a utilização de uma gama mais pequena de valores, como a resolução de 16 bits em vez de 10 bits, leva a uma maior probabilidade de encontrar estas perturbações ou “ruído”.

Ao ligar a entrada um à terra e definir o dispositivo para comparar as entradas um e dois, obtém-se uma maior estabilidade nas leituras. Além disso, podem ser utilizados cabos de ligação em ponte mais curtos com melhorias de capacitância em vez de versões mais longas e ruidosas. Além disso, os ajustes no nível de resistência do potenciómetro também podem ter impacto no desempenho.

Em alternativa, podem ser utilizadas soluções de software para gerir as flutuações de dados. Uma abordagem possível envolve o cálculo de uma média móvel ou a eliminação de pequenas alterações. No entanto, este curso de ação tem um peso computacional acrescido. Quando se trabalha com linguagens de programação de alto nível, como Python, e se processam numerosas amostras por segundo, estas despesas podem acumular-se a um ritmo acelerado.

Ir mais longe com muitos passos possíveis

A utilização de I2C para fins de leitura é um processo relativamente simples, tal como acontece com abordagens alternativas como a SPI. Apesar das aparentes disparidades entre as várias alternativas de ADC, a realidade é que, uma vez implementada com sucesso qualquer uma destas opções, a experiência adquirida pode ser prontamente aplicada às restantes.

Porque não alargar ainda mais os limites do seu controlador de potenciómetros recém-construído? Ao ligar vários potenciómetros em série ou ao tentar medir variáveis como a luz, o som ou a temperatura, é possível explorar novas possibilidades de interação com o seu sistema Raspberry Pi. Embarque numa viagem emocionante, alargando as capacidades do seu projeto atual e criando uma experiência totalmente interactiva através da experimentação prática.