Comece a medir o mundo ao seu redor com este projeto prático e abrangente.

Principais conclusões

  • Raspberry Pi não possui entrada analógica, mas você pode adicionar ADCs externos para converter tensões do mundo real em formato digital para gravação, manipulação e controle.
  • As opções populares de ADC incluem MCP3004/MCP3008 para compensação de velocidade e precisão ou ADS111x para leituras de 16 bits em uma taxa de amostragem mais lenta.
  • O ADS1115 da Adafruit é uma opção simples com Amplificador de Ganho Programável (PGA) que permite detectar pequenas diferenças de tensão e ajustar o ganho durante o programa. Conectá-lo ao Raspberry Pi usando I2C é simples.

Fora da caixa, o Raspberry Pi não possui uma entrada analógica. Isso o coloca em desvantagem em comparação com placas baseadas em microcontroladores como o Arduino.

Mas não se desespere: há muitas opções a serem consideradas. Comece a usar o Raspberry Pi e um ADC externo.

Por que adicionar entradas?

O mundo real está cheio de fenômenos que, se você tiver os circuitos corretos, podem ser facilmente descritos usando uma voltagem. Coloque essas tensões em formato digital e você poderá registrá-las, manipulá-las e usá-las para controlar outros parâmetros e dispositivos.

instagram viewer

Você pode querer monitorar a umidade do solo, a temperatura da estufa ou o peso do seu hamster. Você pode querer adicionar um controle de volume ao seu Pi, construir um banco inteiro de faders ou projetar um joystick do zero. As possibilidades são, mais ou menos, ilimitadas.

Opções para ADCs

Então, qual ADC é melhor para iniciantes?

Entre as opções mais populares e simples estão o MCP3004 (e MCP3008) chips da Microchip. Você 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 leem 16 bits a 860 SPS. Portanto, há uma compensação entre velocidade e precisão (e, naturalmente, preço).

Muitos microcontroladores vêm com ADCs integrados. O ATMega que você encontra no Arduino médio oferecerá vários canais de 10 bits, além de todo o resto. Isso é o que permite ao Arduino fornecer entradas analógicas onde o Raspberry Pi não consegue. Se você já tem um Arduino envolvido em sua configuração e 10 bits são fidelidade suficiente, então esta pode ser a maneira mais fácil de fazer isso.

Aqui vamos manter as coisas simples, com um ADS1115 da Adafruit.

O que é um amplificador de ganho programável?

Este chip vem com alguns recursos interessantes, incluindo um Amplificador de Ganho Programável (PGA). Isso permitirá que você defina digitalmente a faixa de valores desejada, até uma fração de volt. Com o número de valores que 16 bits podem representar, isso permitirá detectar diferenças de apenas alguns microvolts.

A vantagem aqui é que você pode alterar o ganho no meio do programa. Outros chips, como o MCP3004, adotam uma abordagem diferente; eles vêm com um pino extra, ao qual você pode fornecer uma tensão de referência.

E quanto à multiplexação?

Um multiplexador (ou mux) é um switch que permite ler muitas entradas usando um único ADC. Se o seu chip ADC vier com muitos pinos de entrada, há alguma multiplexação interna acontecendo. O mux do ADS1115 permite quatro entradas, que você pode selecionar através dos registros internos.

Lidando com registros

O ADS1115 oferece essas opções e mais algumas. Você pode lidar com o multiplexador, ajustar o ganho, ativar o comparador integrado, alterar a taxa de amostragem e colocar o dispositivo no modo de suspensão de baixo consumo de energia, tudo isso pressionando alguns interruptores.

Mas onde estão esses interruptores? Eles estão dentro do pacote, na forma de pequenos pedaços de memória chamados registros. Para ativar um determinado recurso, você só precisa definir o bit relevante como 1, em vez de 0.

Olhando para a folha de dados ADS111x, você descobrirá que esses modelos vêm com quatro registros, incluindo os registros de configuração que controlam o comportamento do dispositivo.

Por exemplo, os bits 14 a 12 controlam o multiplexador. Usando esses três bits, você pode selecionar entre oito configurações. O que você vai querer aqui é “100”, que dará a diferença entre a entrada zero e o terra. Os bits 7 a 5, por outro lado, controlam a taxa de amostragem. Se você quiser o máximo de 860 amostras por segundo, poderá configurá-las para “111”.

Depois de saber quais opções definir, você terá dois bytes para enviar ao ADC. Se mais tarde você quiser definir um único bit aqui ou ali, poderá lidar com eles individualmente usando operadores bit a bit.

É aqui que pode ficar confuso. Nesse caso, o binário não representa um valor, mas os valores de switches individuais. Você poderia expressar essas variáveis ​​como um grande número, em decimal ou em hexadecimal. Mas se quiser evitar dores de cabeça, você deve se ater à versão binária, que é mais fácil de ler.

Conectando

Você pode conectar este dispositivo diretamente na placa de ensaio. A entrada de tensão positiva aceitará algo entre 2 e 5,5 V, o que significa que o trilho de 3,3 V no Raspberry Pi funcionará bem.

Conecte as entradas SDA e SCL às contrapartes no RPi e faça o mesmo com o terra e 3,3 V. Obtenha um potenciômetro entre as linhas de terra e de tensão e coloque o fio do meio na primeira entrada do ADC. Isso é tudo que você precisa para seguir em frente!

Lidando com I2C

Diferentes ADCs funcionam através de protocolos diferentes. No caso do nosso ADS1115, vamos usar I2C.

O exemplo a seguir irá interagir com o ADC usando Python. Mas antes de fazer isso, você precisará configurá-lo. Versões recentes do Raspberry Pi OS tornaram isso muito simples. Dirigir a Preferências > Configuração do Raspberry Pi. Então, a partir do Interfaces aba, mudar I2C sobre.

Para verificar se tudo está funcionando, abra um terminal e execute:

sudo i2cdetect -y 1

Este comando produzirá uma grade. Supondo que tudo esteja funcionando e que você tenha conectado corretamente, você verá um novo valor aparecer na grade. Este é o endereço do seu ADC. Tenha em mente aqui que é um valor hexadecimal, então você precisa prefixá-lo com “0x” quando você o usa no código abaixo. Aqui está 0x48:

Depois de obter o endereço, você pode usar a biblioteca SMBus para enviar comandos I2C. Você estará lidando com dois métodos aqui. O primeiro é write_word_data(), que aceita três argumentos: o endereço do dispositivo, o registro no qual você está escrevendo e o valor que deseja escrever.

O segundo é leitura_palavra_dados(), que aceita apenas o endereço do dispositivo e o registro. O ADC lerá continuamente as tensões e armazenará o resultado no registro de conversão. Com este método, você pode recuperar o conteúdo desse registro.

Você pode embelezar um pouco o resultado e depois imprimi-lo. Antes de voltar ao início do loop, introduza um pequeno atraso. Isso garantirá que você não fique sobrecarregado com dados.

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, (0b00000100 << 8 | 0b10000010))

# define the top of the range
TOP = 26300

whileTrue:
# 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)

Você está quase terminando. Mapeie o intervalo de valores que você está obtendo para aquele de sua preferência e, em seguida, trunque para o número desejado de casas decimais. Você pode personalizar a função de impressão para imprimir um novo valor apenas quando for diferente do último valor. Se você não tiver certeza sobre máx., min, e redondo, você pode confira nossa lista das 20 funções Python mais importantes!

Lidando com o ruído

Agora, a menos que sua configuração seja super, super organizada e organizada, você notará algum ruído. Esta é a desvantagem inerente ao uso de 16 bits em vez de apenas dez: esse pequeno ruído será mais perceptível.

Ao vincular a entrada adjacente (entrada 1) ao terra e mudar o modo para comparar as entradas um e dois, você pode obter resultados muito mais estáveis. Você também pode trocar aqueles cabos de jumper longos e coletores de ruído por outros pequenos e adicionar alguns capacitores enquanto faz isso. O valor do seu potenciômetro também pode fazer a diferença.

Existem também opções de software. Você pode criar uma média móvel ou simplesmente desconsiderar pequenas alterações. A desvantagem é que o código extra imporá um custo computacional. Se você estiver escrevendo instruções condicionais em uma linguagem de alto nível como Python, e coletando milhares de amostras a cada segundo, esses custos aumentarão rapidamente.

Vá mais longe com muitas próximas etapas possíveis

Fazer leituras via I2C é bastante simples e o mesmo se aplica a outros métodos, como o SPI. Embora possa parecer que existem grandes diferenças entre as opções de ADC disponíveis, a verdade é que, uma vez que uma delas funcione, é fácil aplicar o conhecimento às outras.

Então, por que não levar as coisas adiante? Amarre vários potenciômetros ou tente ler luz, som ou temperatura. Expanda o controlador que você acabou de criar e crie uma configuração do Raspberry Pi que seja realmente prática!