MCP3008

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)