Usando ADC en Raspberry Pi, MCP3201

Para conectar con el mundo real, que al menos en escala macroscópica es continuo, se ocupan puertas especiales para conversión Análoga Digital, o ADC por sus siglas en inglés.

Nuestro conocido Raspberry Pi no posee estas puertas por lo que debemos obtener esta funcionalidad a través de equipos externos.

ADC_RPI

 

En esta oportunidad probamos el MCP3201 un ADC de 12 bits

Tras el salto la información necesaria para implementar.

Materiales

  • RaspBerryPi con sistema operativo Occidentalis 0.2, disponible en nuestra tienda
  • Conector y adaptador para Raspberry Pi, ver tienda
  • Protoboard, ver tienda
  • MCP3201
  • Cables
  • Cable de red
  • Acceso vía SSH
  • Acceso a Inet

El MCP3201 es un conversor análogo digital de aproximación sucesiva (SAR) de 12 bit controlada por una interfaz SPI. permite voltajes desde 2.7 hasta 5.5V

 

Conectando el Hardware

La conexión del cable y adaptador para protoboard es directa, simplemente ten la precaución de poner la línea roja del cable hacia el lado de la SD

En la siguiente tabla se muestra la conexión de los pines vista desde el ADC

PIN en MCP3201 Pin en RPi Nombre o descripción
1 +3.3V VREF, requiere estabilidad
2 N/A IN+, entrada del sensor
3 GND IN-, entrada diferencial
4 GND Vss
5 GPIO18 CS
6 GPIO23 DOUT
7 GPIO24 CLK
8 +3.3V Vdd

Además, los PINES 1 y 8 van conectados a Tierra a traves de un condensador de 1.0μF

Se usa un potenciómetro para generar una salida variable entre 0 y +3.3V. En el mundo real la señal vendra de un sensor con salida analógica.

La puerta 1 o VREF se debe conectar a una fuente de mayor estabilidad , se conecta al Raspberry Pi en forma directa para simplificar el diagrama.

La conexión física se ve como en la siguiente foto

ADC_RPI_2
En la foto parte inferior. los conectores amarillo, rojo azul, rojo son los pines 5, 6, 7, y 8 respectivamente.
Parte superior, se aprecia un condensador de 1uF conectado a tierra y al pin 1 y 8. El potenciómetro representa la salida de un sensor.

 

Instalando Software

Usaremos Python para el control de las puertas, para eso debemos instalar la biblioteca de python GPIO, esta se encuentra en el siguiente link

Debes ejecutar los siguientes comandos

sudo wget https://pypi.python.org/packages/source/R/RPi.GPIO/                                                       RPi.GPIO-0.5.0a.tar.gz
tar zxf RPi.GPIO-0.5.0a.tar.gz
cd RPi.GPIO-0.5.0a
sudo python setup.py install
sudo reboot

Para verificar nuestra instalación usamos los siguientes comandos

sudo python
>>> import RPi.GPIO as GPIO
>>> GPIO.RPI_REVISION
2
>>> GPIO.VERSION
'0.5.0a'
>>>

Con esto ingresamos a Python y verificamos la importación de la biblioteca, la revisión de la Raspberry Pi y la versión de la misma librería.

Codificando en Python

El primer script que mencionamos es para probar el funcionamiento del ADC, el segundo script realiza una medida permanente. El código que Python que usamos para probar es el siguiente.


import RPi.GPIO as GPIO

CS = 18
DOUT = 23
CLK = 24

Vref = 3.28

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(CS, GPIO.OUT)
GPIO.setup(DOUT, GPIO.IN)
GPIO.setup(CLK, GPIO.OUT)

binData = 0;

GPIO.output(CS, True)
GPIO.output(CLK, True)
GPIO.output(CS, False)

i1 = 14

while (i1 >= 0):
    GPIO.output(CLK, False)
    bitDOUT = GPIO.input(DOUT)
    GPIO.output(CLK, True)
    bitDOUT = bitDOUT << i1
    binData |= bitDOUT
    i1 -= 1

GPIO.output(CS, True)
binData &= 0xFFF
res = Vref * binData/4096.0
print(res)

El ciclo de muestreo comienza cuando el valor CS cambia de Verdadero a Falso

Una modificación permite obtener un loop permanente y leer

from time import sleep
import RPi.GPIO as GPIO

CS = 18
DOUT = 23
CLK = 24

Vref = 3.29

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(CS, GPIO.OUT)
GPIO.setup(DOUT, GPIO.IN)
GPIO.setup(CLK, GPIO.OUT)

while (True):
        GPIO.output(CS, True)
        GPIO.output(CLK, True)
        GPIO.output(CS, False)
        binData = 0
        i1 = 14

        while (i1 >= 0):
                GPIO.output(CLK, False)
                bitDOUT = GPIO.input(DOUT)
                GPIO.output(CLK, True)
                bitDOUT = bitDOUT << i1
                binData |= bitDOUT
                i1 -= 1

        GPIO.output(CS, True)
        binData &= 0xFFF
        res = Vref * binData/4096.0
        print('Input Voltage = ' + str(res) + 'V')
        sleep(1)

Estos scripts se deben usar con

 sudo python script.py

De esta manera podemos ver en pantalla los valores obtenidos de la medición.

Bibliografía

Raspberry Pi y mediciones electrónicas, disponible en Amazon
Datasheet de MCP3201

Author: Manuel Carrasco

Ingeniero Eléctrico, Institutano, instructor certificado Cisco, en twitter @mcarrasco con comentarios y opiniones personales.

3 thoughts

    1. Juan, este ejemplo es para un sensor, es decir medir valores, en este caso analogos y procesarlos con algun software.
      Lo que necesitas es un controlador, creo que uno basado en el L298 (Controlador para motores) te puede servir, todo depende del que salida requieras, 0 a 10 V? el L298 soporta hasta 48V. Saludos. JZ

  1. Me fue muy útil el código, pero me queda la duda de la tabla que pusiste, el DOUT debe ser de un ADC en serie y no en paralelo? Porque el que tengo es en paralelo o al menos me lo explicó algo así un compañero, el que uso es el ADC0408lcn y tiene varias DB

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *