Translate

domingo, 2 de marzo de 2014

Añadiendo un ADC a la Raspberry Pi

Se me encargó medir voltaje con la Raspberry Pi, así que como todo en san google uno encuentra mucha información así que dí con está página que muestra como usar un conversor analogo-digital SPI con la RPi de la tienda http://www.abelectronics.co.uk/

En el enlace anterior usan el integrado MCP3002 y en la web encontrarán miles de ejemplos para el MCP3008 como vivo en pueblo quieto lo único que pude conseguir en la ciudad fue un MCP3202 la única diferencia es que solo tiene 2 canales y que este sensor tiene una resolución de 12Bits, es decir, los valores obtenidos en decimal iràn de 0 a 4095.

Y bueno aquí les dejo los pasos para habilitar el soporte SPI en la Raspberry Pi, el programa(obtenido del enlace anterior) el circuito y unas capturas de prueba.

Background.

Este ADC para la Raspberry Pi esta basado en el chip MCP3202 de Microchip. Es un ADC de 12 bits
de resolución y se comunica vía SPI.

Como la Raspberry Pi usa 3.3v se usa un divisor de tensión para bajar 10V a 3.3V de modo que los
pasos del ADC van de 0 para 0V y 4095 para 3.3V.

REQUERIMIENTOS:

  1. Raspbian Wheezy
  2. Python
  3. Python-dev
  4. spidev
  5. Habilitar el soporte para SPI de la Raspberry Pi.

Instalación de Dependencias:

  • Para instalar python python-dev realizar:
 $ sudo apt-get install python-dev python
  • Para instalar spidev:
$ git clone git://github.com/doceme/py-spidev
$ cd py-spidev/
$ sudo python setup.py install
  • Habilitar el soporte de spi en la raspberry-pi:
$ sudo sed -i 's/blacklist spi\-bcm2708/\#blacklist spi-bcm2708/g' /etc/modprobe.d/raspi-blacklist.conf
$ sudo reboot


Diagrama:



El Programa
#!/usr/bin/python
import spidev
import time
DEBUG = 0

spi = spidev.SpiDev()
spi.open(0,0)

# read SPI data from MCP3202 chip
def get_adc(channel):
        # Only 2 channels 0 and 1 else return -1
        if ((channel > 1) or (channel < 0)):
                return -1
        r = spi.xfer2([1,(2+channel)<<6,0])

        ret = ((r[1]&0x0F) << 8) + (r[2])
        return ret

tempval = 0
#Take 5 reads on the adc
for x in range(0, 9):
 tempval += get_adc(0)

#Get the prom
promval = tempval/10

#Get the volts
V1 = (get_adc(0)*3.3)/4096
V2 = (V1*10)/3.3 


#Print results

print "Valor Decimal: ", promval
print ""
print "Divisor de Voltaje: %0.2f" % (V1)
print ""
print "Voltaje de Entrada: %0.2f" % (V2)
print ""


Y unas capturas del circuito y capturando el voltaje.


Primer captura de Voltaje:




Segunda Captura de Voltaje: