Introdução
Conversores analógico/digital são circuitos eletrônicos fundamentais para sistemas embarcados, necessários para transformar sinais contínuos de tensão em representações discretas para que possam ser processados em sistemas digitais.
A Beaglebone Black possui sete entradas para o seu conversor A/D de aproximação sucessiva, com resolução de 12 bits, capaz de realizar 200 mil amostras por segundo, e com uma tensão de entrada que pode variar de 0 a 1,8V. Com uma divisão simples então podemos concluir que a Beaglebone Black pode detectar variações de tensão de até 0,439mV, suficiente para a maioria das aplicações.
Neste post vou mostrar como usar o sistema de arquivos do Linux para ler os valores adquiridos pelo conversor A/D, e também como isso poderá ser feito pela sua aplicação (aqui vamos exemplificar utilizando Python).
Para demonstrar vou utilizar o sensor de distância ultrassônico LV-MaxSonar-EZ0 que, entre outras interfaces de comunicação, possui uma saída analógica que entrega uma tensão proporcional à distância do sensor até a superfície que ele estiver apontando.
Na prática
Importante:
- Não exponha a entrada analógica da Beaglebone Black a tensões superiores a 1.8V;
- Para que o nosso sensor ultrassônico forneça tensões compatíveis com a Beaglebone Black tivemos que alimentá-lo com 3,3V;
- No exemplo estou utilizando a última imagem oficial lançada para a Beaglebone Black com Debian, para saber mais acesse o artigo;
- Caso você queira clonar o projeto utilizado no exemplo, irá precisar de acesso à internet na Beaglebone Black. Isso pode ser feito pela porta USB e foi abordado em um artigo anterior.
Caso você execute o comando abaixo, você poderá ver que as entradas analógicas não estão habilitadas.
cat /sys/devices/bone_capemgr.*/slots
Como a Beaglebone Black já possui um device tree overlay (DTO) para o conversor A/D pronto para uso, podemos habilitar as entradas analógicas facilmente apenas com o comando abaixo:
echo BB-ADC > /sys/devices/bone_capemgr.*/slots
Agora se repetirmos o primeiro comando podemos notar que as entradas analógicas estão habilitadas.
Agora conectando o sensor na Beaglebone Black conforme:
- O VDD do sensor ultrassônico no +3,3V da Beaglebone Black (P9_03);
- O GND do sensor ultrassônico no GNDA_ADC da Beaglebone Black (P9_34);
- O sinal analógio do sensor ultrassônico na entrada AIN0 da Beaglebone Black (P9_39);
Já podemos fazer nossa primeira leitura utilizando o comando:
cat /sys/bus/iio/devices/iio:device0/in_voltage0_raw
O valor recebido varia linearmente de 0 a 4095 à medida que a tensão na entrada varia de 0 a +1,8V.
Utilizando Python
Agora vamos desenvolver um pequeno script em Python 2.7.3 para realizarmos a leitura do sensor ultrassônico, e exibir o resultado em centímetros na tela. O código está no GitHub e para clonar e rodar o projeto basta utilizar os três comandos seguintes:
git clone https://github.com/igorTavares/bbb_ultrasonic_python.git cd bbb_ultrasonic_python python ultrasonic.py
As explicações estão todas nos comentários do script, assim acho que fica mais fácil de visualizar o funcionamento do programa.
#!/usr/bin/env python
# Modulo para evocar novos processor
import subprocess
# Recebe a saída do comando "cat /sys/bus/iio/devices/iio:device0/in_voltage0_raw"
output = subprocess.check_output("cat /sys/bus/iio/devices/iio:device0/in_voltage0_raw", shell=True)
# Regra de tres para achar o valor em volts
voltage = (float(output)*1.8)/4096.0
# Converte voltage para string para escrever na tela
print "Voltage = " + str(voltage)
# Equacao do sensor. Vide datasheet.
inchs = (voltage*512.0)/3.3
# Converte inchs para string para escrever na tela
print "Inchs = " + str(inchs)
# Converte polegadas para centimetros
centimeters = inchs*2.54
# Converte centimeters para string para escrever na tela
print "Centimeters = " + str(centimeters)





