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.
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
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
Como podría conseguir una salida 0-10v para controlar un driver de iluminación led?
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
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