Agregar un ADC a su Raspberry Pi: lo que necesita saber
Conclusiones clave
- Raspberry Pi carece de entrada analógica, pero puedes agregar ADC externos para convertir voltajes del mundo real en formato digital para grabación, manipulación y control.
- Las opciones populares de ADC incluyen MCP3004/MCP3008 para compensación de velocidad y precisión o ADS111x para lecturas de 16 bits a una frecuencia de muestreo más lenta.
- El ADS1115 de Adafruit es una opción sencilla con un amplificador de ganancia programable (PGA) que le permite detectar pequeñas diferencias de voltaje y ajustar la ganancia durante el programa. Conectarlo con Raspberry Pi usando I2C es sencillo.
Fuera de la caja, la Raspberry Pi carece de entrada analógica. Esto la sitúa en desventaja en comparación con las placas basadas en microcontroladores como la Arduino.
Pero no te desesperes: hay muchas opciones a considerar. Ponte en marcha con Raspberry Pi y un ADC externo.
¿Por qué agregar entradas?
El mundo real está lleno de fenómenos que, si se cuenta con los circuitos adecuados, se pueden describir fácilmente utilizando un voltaje. Consiga esos voltajes en forma digital y podrá registrarlos, manipularlos y utilizarlos para controlar otros parámetros y dispositivos.
Quizás quieras controlar la humedad de tu suelo, la temperatura de tu invernadero o el peso de tu hámster. Quizás estés buscando agregar un control de volumen a tu Pi, construir un banco completo de atenuadores o diseñar un joystick desde cero. Las posibilidades son, más o menos, ilimitadas.
Opciones para ADC
Entonces, ¿qué ADC es mejor para principiantes?
Entre las opciones más populares y sencillas se encuentran los chips MCP3004 (y MCP3008 ) de Microchip. Obtendrá cuatro (u ocho) canales de 10 bits cada uno, que pueden leer hasta 200 kSPS. Por otro lado, están los dispositivos ADS111x de Texas Instruments, que leen 16 bits a 860 SPS. Entonces, existe un equilibrio entre velocidad y precisión (y, naturalmente, precio).
Muchos microcontroladores vienen con ADC integrados. El ATMega que se encuentra en un Arduino promedio ofrecerá varios canales de 10 bits, además de todo lo demás. Esto es lo que permite a Arduino proporcionar entradas analógicas donde Raspberry Pi no puede. Si ya tiene un Arduino involucrado en su configuración y 10 bits son suficiente fidelidad, entonces esta podría ser la forma más fácil de hacerlo.
Aquí lo haremos simple, con un ADS1115 de Adafruit.
¿Qué es un amplificador de ganancia programable?
Este chip viene con algunas características interesantes, incluido un amplificador de ganancia programable (PGA). Esto le permitirá establecer digitalmente el rango deseado de valores, hasta una fracción de voltio. Con la cantidad de valores que pueden representar 16 bits, esto te permitirá detectar diferencias de apenas unos pocos microvoltios.
La ventaja aquí es que puedes cambiar la ganancia a mitad del programa. Otros chips, como el MCP3004, adoptan un enfoque diferente; Vienen con un pin adicional al que se le puede suministrar un voltaje de referencia.
¿Qué pasa con la multiplexación?
Un multiplexor (o mux) es un interruptor que le permite leer muchas entradas usando un solo ADC. Si su chip ADC viene con muchos pines de entrada, entonces se está produciendo una multiplexación interna. El mux del ADS1115 permite cuatro entradas, que puede seleccionar a través de los registros internos.
Tratar con registros
El ADS1115 ofrece estas opciones y algunas más. Puede manejar el multiplexor, ajustar la ganancia, activar el comparador incorporado, cambiar la frecuencia de muestreo y poner el dispositivo en modo de suspensión de bajo consumo, todo con solo accionar algunos interruptores.
¿Pero dónde están esos interruptores? Están dentro del paquete, en forma de fragmentos de memoria muy pequeños llamados registros . Para activar una función determinada, sólo necesita establecer el bit correspondiente en 1, en lugar de 0.
Al observar la hoja de datos del ADS111x , encontrará que estos modelos vienen con cuatro registros, incluidos los registros de configuración que gobiernan el comportamiento del dispositivo.
Por ejemplo, los bits 14 a 12 controlan el multiplexor. Usando estos tres bits, puede seleccionar entre ocho configuraciones. El que querrás aquí es «100», que dará la diferencia entre la entrada cero y tierra. Los bits 7 a 5, por otro lado, gobiernan la frecuencia de muestreo. Si desea un máximo de 860 muestras por segundo, puede configurarlas en “111”.
Una vez que sepa qué opciones configurar, tendrá dos bytes para enviar al ADC. Si más adelante desea establecer un solo bit aquí o allá, puede tratarlos individualmente utilizando operadores bit a bit.
Aquí es donde puede resultar confuso. En este caso, el binario no representa un valor, sino los valores de interruptores individuales. Podrías expresar estas variables como un número grande, en decimal o hexadecimal. Pero si quieres evitar dolores de cabeza, deberías quedarte con la versión binaria, que es más fácil de leer.
Cableándolo
Puede conectar este dispositivo directamente a la placa de pruebas. La entrada de voltaje positivo aceptará entre 2 y 5,5 V, lo que significa que el riel de 3,3 V de la Raspberry Pi funcionará bien.
Conecte las entradas SDA y SCL a sus contrapartes en el RPi y haga lo mismo con tierra y 3.3v. Obtenga un potenciómetro entre las líneas de tierra y de voltaje, y coloque el cable del medio en la primera entrada del ADC. ¡Eso es todo lo que necesitas para empezar!
Lidiando con I2C
Diferentes ADC funcionan a través de diferentes protocolos. En el caso de nuestro ADS1115, usaremos I2C .
El siguiente ejemplo interactuará con el ADC usando Python. Pero antes de hacer eso, deberás configurarlo. Las versiones recientes del sistema operativo Raspberry Pi han hecho que esto sea muy sencillo. Dirígete a Preferencias > Configuración de Raspberry Pi . Luego, desde la pestaña Interfaces , active I2C .
Para comprobar que todo funciona, abra una terminal y ejecute:
sudo i2cdetect -y 1
Este comando generará una cuadrícula. Suponiendo que todo esté funcionando y que lo haya conectado correctamente, verá aparecer un nuevo valor en la cuadrícula. Esta es la dirección de su ADC. Tenga en cuenta aquí que es un valor hexadecimal, por lo que debe anteponerle el prefijo «0x» cuando lo use en el código siguiente. Aquí es 0x48 :
Una vez que tenga la dirección, puede usar la biblioteca SMBus para enviar comandos I2C. Aquí tratará con dos métodos. El primero es write_word_data() , que acepta tres argumentos: la dirección del dispositivo, el registro en el que estás escribiendo y el valor que deseas escribir.
Puedes embellecer un poco el resultado y luego imprimirlo. Antes de volver al inicio del ciclo, introduzca un breve retraso. Esto asegurará que no se sienta abrumado por los datos.
from smbus import SMBusimport timeaddr = 0x48bus = SMBus(1)# set the registers for readingCONFIGREG = 1CONVERSIONREG = 0# set the address register to point to the config register# write to the config registersbus.write_word_data(addr, CONFIGREG, (0b00000100 << 8 | 0b10000010)) # define the top of the rangeTOP = 26300while 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)
Ya casi terminaste. Asigne el rango de valores que está obteniendo al que prefiera y luego trunca al número deseado de decimales. Puede personalizar la función de impresión para que solo imprima un nuevo valor cuando sea diferente del último valor.
Lidiar con el ruido
Ahora, a menos que su configuración sea súper, súper limpia y ordenada, notará algo de ruido. Ésta es la desventaja inherente de utilizar 16 bits en lugar de sólo diez: ese pequeño ruido será más perceptible.
Al conectar la entrada adyacente (entrada 1) a tierra y cambiar el modo para comparar las entradas uno y dos, puede obtener resultados mucho más estables. También puedes cambiar esos largos cables de puente que acumulan ruido por unos pequeños y agregar algunos condensadores mientras lo haces. El valor de su potenciómetro también puede marcar la diferencia.
También hay opciones de software. Puede crear un promedio móvil o simplemente ignorar los pequeños cambios. La desventaja es que el código adicional impondrá un costo computacional. Si escribe declaraciones condicionales en un lenguaje de alto nivel como Python y toma miles de muestras cada segundo, estos costos se agravarán rápidamente.
Vaya más allá con muchos posibles próximos pasos
Tomar lecturas a través de I2C es bastante sencillo y lo mismo ocurre con otros métodos, como SPI. Si bien puede parecer que existen grandes diferencias entre las opciones de ADC disponibles, la verdad es que una vez que tienes una de ellas funcionando, es fácil aplicar el conocimiento a las demás.
Entonces, ¿por qué no ir más allá? Conecte varios potenciómetros o intente leer la luz, el sonido o la temperatura. ¡Amplíe el controlador que acaba de crear y cree una configuración de Raspberry Pi que sea realmente práctica!
Deja una respuesta