Pages Menu
TwitterFacebook



BANNER2_ALT

Posted by on May 21, 2014 in Raspberry Pi | 0 comments

Python: Sensor touch MPR121

Python: Sensor touch MPR121

Tarjeta con teclado touch por I2C con el MPR121 de Freescale

 

Favor de darle una revisada al tutorial de I2C si todavía no lo has leido: http://hetpro-store.com/TUTORIALES/?page_id=377

 

SONY DSC

MPR121

 

El sensor de proximidad capacitivo MPR121 de Freescale es un sensor de segunda generación proveniente de los sensores de la familia MPR03X. El sensor MPR121 incluye ciertas mejoras en el motor de detección capacitivo. Entre otras mejoras están la posibilidad de configurar por hardware la dirección del protocolo I2C, configuración independiente de electrodos.

Entre las características principales de la tarjeta que se pueden encontrar en la hoja de datos se encuentra el voltaje de alimentación, para este sensor es de 1.71V a 3.6V lo que presenta una ventaja debido a que estamos trabajando con lógica de la raspberry de 3.3V. Pero para este tutorial vamos a usar una tarjeta tipo shield para arduino con un convertidor de niveles para el I2C de 5V a 3.3v por lo que la tarjeta esta diseñada para el arduino y no para la raspberry Pi.

Tarjeta a utilizar: https://hetpro-store.com/sensores-es/otros-es-4/sensor-touch-pad-shield-9-12-canales-mpr121.html

SONY DSC

MPR121 Vista Superior

Debido a que tenemos la tarjeta PiDuino que convierte niveles de voltaje y adapta el GPIO a salidas con configuración Arduino, solamente la conectamos y listo. Cabe destacar que las señales de I2C cambiaran de nivel de 3.3V a 5V para después regresar a 3.3V.

SONY DSC

MPR121

SONY DSC

El siguiente código simplemente se encarga de inicializar el I2C, también sin olvidarnos de añadir la biblioteca time si vamos a usar la función sleep:

<pre>import smbus
import time
bus = smbus.SMBus(1)

Posteriormente procedemos a declarar el valore de la dirección del dispositivo, revisa el punto 6.2 en la hoja de datos en donde se configura la dirección, para esta tarjeta, esta configurada a 0x5A (o puedes hacer un barrido en la terminal)

DEVICE_ADDRESS = 0x5a

Posteriormente se configuran los electrodos de la tarjeta, se inicia una rutina en donde toma el valor leído y lo compara dentro de los “IFs” e imprime un valor.

OJO, tomar en cuenta que los registros son de 8 bits y que son hasta 12 electrodos por lo que el resultado se separa en mas de un registro. De cualquier manera se recomienda leer la hoja de datos apoyándose en el código que se describe a continuación y viendo que registros se están modificando.

El código del ejemplo se muestra a continuación:


#!/usr/bin/python
print "HeTPro";
print "MPR121 TEST pruebas para el sensor touch";
print "i2c test 01";
print "No tocar el touch pad...!!!";

import smbus
import time

time.sleep(0.5) # Dormir por 0.5 segundos

bus = smbus.SMBus(1)

DEVICE_ADDRESS = 0x5a
DEVICE_REG_MODE = 0x00

bus.write_byte_data(DEVICE_ADDRESS , 0x2b , 0x01)
bus.write_byte_data(DEVICE_ADDRESS , 0x2c , 0x01)
bus.write_byte_data(DEVICE_ADDRESS , 0x2d , 0x00)
bus.write_byte_data(DEVICE_ADDRESS , 0x2e , 0x00)
bus.write_byte_data(DEVICE_ADDRESS , 0x2f , 0x01)
bus.write_byte_data(DEVICE_ADDRESS , 0x30 , 0x01)
bus.write_byte_data(DEVICE_ADDRESS , 0x31 , 0xFF)
bus.write_byte_data(DEVICE_ADDRESS , 0x32 , 0x02)
bus.write_byte_data(DEVICE_ADDRESS , 0x41 , 0x0f)
bus.write_byte_data(DEVICE_ADDRESS , 0x42 , 0x0a)
bus.write_byte_data(DEVICE_ADDRESS , 0x43 , 0x0f)
bus.write_byte_data(DEVICE_ADDRESS , 0x44 , 0x0a)
bus.write_byte_data(DEVICE_ADDRESS , 0x45 , 0x0f)
bus.write_byte_data(DEVICE_ADDRESS , 0x46 , 0x0a)
bus.write_byte_data(DEVICE_ADDRESS , 0x47 , 0x0f)
bus.write_byte_data(DEVICE_ADDRESS , 0x48 , 0x0a)
bus.write_byte_data(DEVICE_ADDRESS , 0x49 , 0x0f)
bus.write_byte_data(DEVICE_ADDRESS , 0x4a , 0x0a)
bus.write_byte_data(DEVICE_ADDRESS , 0x4b , 0x0f)
bus.write_byte_data(DEVICE_ADDRESS , 0x4c , 0x0a)
bus.write_byte_data(DEVICE_ADDRESS , 0x4d , 0x0f)
bus.write_byte_data(DEVICE_ADDRESS , 0x4e , 0x0a)
bus.write_byte_data(DEVICE_ADDRESS , 0x4f , 0x0f)
bus.write_byte_data(DEVICE_ADDRESS , 0x50 , 0x0a)
bus.write_byte_data(DEVICE_ADDRESS , 0x51 , 0x0f)
bus.write_byte_data(DEVICE_ADDRESS , 0x52 , 0x0a)
bus.write_byte_data(DEVICE_ADDRESS , 0x53 , 0x0f)
bus.write_byte_data(DEVICE_ADDRESS , 0x54 , 0x0a)
bus.write_byte_data(DEVICE_ADDRESS , 0x55 , 0x0f)
bus.write_byte_data(DEVICE_ADDRESS , 0x56 , 0x0a)
bus.write_byte_data(DEVICE_ADDRESS , 0x57 , 0x0f)
bus.write_byte_data(DEVICE_ADDRESS , 0x58 , 0x0a)

bus.write_byte_data(DEVICE_ADDRESS , 0x5d , 0x04)
bus.write_byte_data(DEVICE_ADDRESS , 0x5e , 0x0C)

print "Listo!!! Tocuh pad configurado";
for i in range (1,10):
 time.sleep(0.5)
 B=bus.read_byte_data(DEVICE_ADDRESS ,0x5d)
 time.sleep(0.5)
 C=bus.read_byte_data(DEVICE_ADDRESS ,0x5f)
A= bus.read_byte_data(DEVICE_ADDRESS ,0x01)
 print "Valor del registro"
 print A

 if A == 32:
 print "Tecla 2"
 elif A == 256:
 print "Tecla 4"
 elif A == 16:
 print "Tecla 5"
 elif A == 2:
 print "Tecla 6"
 elif A == 64:
 print "Tecla 7"
 elif A == 8:
 print "Tecla 8"
 elif A == 1:
 print "Tecla 9"
 else:
 print "."

print "End"

mpr121

SONY DSC

Post a Reply

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