Añadiendo un ADC a la Raspberry Pi
La raspberry no tiene entradas analógicas, para ello podemos utiliza el chip MCP3008. Y con un script en Python ya lo tenemos.
MCP3008
El chip MCP3008 es un convertidor analógico-digital con 8 canales de 10 bits de resolución e interfaz SPI,
Conexiones:
El ADC es 10bit por lo que puede informar un rango de números de 0 a 1023 (2 a la potencia de 10). Una lectura de 0 significa que la entrada es 0V y una lectura de 1023 significa que la entrada es 3.3V.
La conversión del valor se realiza de la siguiente forma:
Voltaje = (adc * Vref)/1023
Vref = Voltaje de referencia
Interfaz SPI en Raspberry Pi 2
Raspberry Pi no tiene habilitado el módulo de comunicación SPI, lo primero que hay que hacer es habilitar la interfaz para poder comunicarnos con nuestro MCP3008.
La forma de hacerlo es mediante:
sudo raspi-config
Script de Python
Script de Python, para leer el canal 1 (CH0) la tension obtenida mediante un potenciometro:
#!/usr/bin/python import spidev import time import os # SPI bus spi = spidev.SpiDev() spi.open(0,0) # Función para leer los datos SPI desde el chip MCP3008 # El canal debe ser un entero 0-7 def ReadChannel(channel): adc = spi.xfer2([1,(8+channel)<<4,0]) data = ((adc[1]&)<<8)+adc[2] return data # Función para convertir datos a nivel de voltaje, # Redondeado al número especificado de decimales. def ConvertVolts(data,places): volts = (data * 5.0) / float(1023) # si la tension de referencia es 3,3V, la linea volts = (data *3.3)/float(1023) volts = round(volts,places) return volts # Definir los canales del sensor pot = 0 # Definir el retardo entre lecturas delay = 3 while True: # Leer los datos del del potenciometro adc = ReadChannel(pot) pot_volts = ConvertVolts(adc,2) # Imprimir resultados print ("--------------------------------------------") print ("Lectura ADC: ", adc) print("Voltaje: {}V".format(pot_volts)) # Esperar antes de repetir el bucle time.sleep(delay)
#!/usr/bin/python import spidev import time import os # SPI bus spi = spidev.SpiDev() spi.open(0,0) # Función para leer los datos SPI desde el chip MCP3008 # El canal debe ser un entero 0-7 def ReadChannel(channel): adc = spi.xfer2([1,(8+channel)<<4,0]) data = ((adc[1]&) <<8) + adc[2] return data # Función para convertir datos a nivel de voltaje, # Redondeado al número especificado de decimales. def ConvertVolts(data,places): volts = (data * 5.0) / float(1023) # si la tension de referencia es 3,3V, la linea volts = (data *3.3)/float(1023) volts = round(volts,places) return volts # Definir los canales del sensor pot = 0 # Definir el retardo entre lecturas delay = 3 while True: # Leer los datos del del potenciometro adc = ReadChannel(pot) pot_volts = ConvertVolts(adc,2) # Imprimir resultados print ("--------------------------------------------") print ("Lectura ADC: ", adc) print("Voltaje: {}V".format(pot_volts)) # Esperar antes de repetir el bucle time.sleep(delay)