MPR121 - kontroler sensorów dotykowych

Moderator: bbiernat

Post Reply
User avatar
pancio
Administrator
Posts: 63
Joined: 18 September 2013, 23:02 - Wed
Location: SILESIA

MPR121 - kontroler sensorów dotykowych

Post by pancio »

Dziś omówimy sobie moduł z układem MPR121, który realizuje obsługę 12 pojemnościowych przycisków dotykowych. Zastosowanie jest raczej oczywiste... klawiatura dotykowa ale w sieci można znaleźć przeróżne zastosowania np. instrument muzyczny zbudowany z owoców :-).
mpr121_module_01.jpg
mpr121_module_02.jpg
Tradycyjnie, nasz moduł z MPR121 posiada magistralę I2C i jest zasilany napięciem 3V3 bezpośrednio z naszego Cubietruck-a:

Code: Select all

root@ctdev:~/mpr121# i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- 5a -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         
root@ctdev:~/mpr121# 
Dokumentacja układu MPR121 jest dosyć pokaźna, nie mniej jednak musimy zdawać sobie sprawę, że możemy praktycznie dowolnie konfigurować np czułość każdej elektrody z osobna, prąd ładowania elektrod itp. Dodatkowo układ może wysterować 12 diod LED odpowiedzialnych za sygnalizację użytej elektrody. Masz moduł wyposażony jest tylko w zespół elektrod... diody będą musiały poczekać: -)

Krótki program pozwoli sprawdzić działanie naszego modułu:

Code: Select all

#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.
#  
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#  
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software
#  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
#  MA 02110-1301, USA.
#

from I2C import Device
import smbus
import os

import time

#Registers and Bits in the Control/Status register
MPR121_TOUCHSTATUS_L 	= 0x00
MPR121_TOUCHSTATUS_H 	= 0x01
MPR121_FILTDATA_0L  	= 0x04
MPR121_FILTDATA_0H		= 0x05
MPR121_BASELINE_0 		= 0x1E

MPR121_EPROXBV 			= 0x2A

MPR121_MHDR = 0x2B
MPR121_NHDR = 0x2C
MPR121_NCLR = 0x2D
MPR121_FDLR = 0x2E
MPR121_MHDF = 0x2F
MPR121_NHDF = 0x30
MPR121_NCLF = 0x31
MPR121_FDLF = 0x32
MPR121_NHDT = 0x33
MPR121_NCLT = 0x34
MPR121_FDLT = 0x35

MPR121_TOUCHTH_0 	= 0x41
MPR121_RELEASETH_0 	= 0x42
MPR121_DEBOUNCE 	= 0x5B
MPR121_CONFIG1 		= 0x5C
MPR121_CONFIG2 		= 0x5D
MPR121_CHARGECURR_0 = 0x5F
MPR121_CHARGETIME_1 = 0x6C
MPR121_ECR 			= 0x5E
MPR121_AUTOCONFIG0 	= 0x7B
MPR121_AUTOCONFIG1 	= 0x7C
MPR121_UPLIMIT   	= 0x7D
MPR121_LOWLIMIT  	= 0x7E
MPR121_TARGETLIMIT  = 0x7F

MPR121_GPIODIR  	= 0x76
MPR121_GPIOEN  		= 0x77
MPR121_GPIOSET  	= 0x78
MPR121_GPIOCLR  	= 0x79
MPR121_GPIOTOGGLE  	= 0x7A



MPR121_SOFTRESET 	= 0x80

#The default I2C address
MPR121_I2CADDR_DEFAULT 	= 0x5A

# DS3231 Address:
ADDRESSmpr = MPR121_I2CADDR_DEFAULT

# I2C BUS:
BUS = 1

# initialize I2C BUS	
mpr=Device(ADDRESSmpr, BUS)


# functions:
def mprSHOWFILTEREDFATA (sensor):
	""" Function doc """
	if sensor > 12:
		return 0x00
	else:
		data = mpr.readU16(MPR121_FILTDATA_0L + sensor*2)
	return data
	
def mprSHOWBASELINEDATA (sensor):
	""" Function doc """
	if sensor > 12:
		return 0x00
	else:
		data = mpr.readU16(	MPR121_BASELINE_0 + sensor)
	return data
		
def mprTOUCHED ():
	""" Function doc """
	data = mpr.readU16(MPR121_TOUCHSTATUS_L)
	return data
	

def mprSETTRESHOLDS (touch,release):
	""" Function doc """
	for i in range(0,12):
		mpr.write8(MPR121_TOUCHTH_0 + 2*i, touch)
		mpr.write8(MPR121_RELEASETH_0 + 2*i, release)

def mprINITIALIZATION ():
	""" Function doc """
	mpr.write8(MPR121_SOFTRESET,0x63)
	time.sleep(1)
	mpr.write8(MPR121_ECR, 0x0)

	data = mpr.readU8(MPR121_CONFIG2)
	if data <> 0x24:
		exit()
	
	mprSETTRESHOLDS(12, 6)
	
	mpr.write8(MPR121_MHDR, 0x01)
	mpr.write8(MPR121_NHDR, 0x01)
	mpr.write8(MPR121_NCLR, 0x0E)
	mpr.write8(MPR121_FDLR, 0x00)

	mpr.write8(MPR121_MHDF, 0x01)
	mpr.write8(MPR121_NHDF, 0x05)
	mpr.write8(MPR121_NCLF, 0x01)
	mpr.write8(MPR121_FDLF, 0x00)

	mpr.write8(MPR121_NHDT, 0x00)
	mpr.write8(MPR121_NCLT, 0x00)
	mpr.write8(MPR121_FDLT, 0x00)

	mpr.write8(MPR121_DEBOUNCE, 0)
	
	mpr.write8(MPR121_CONFIG1, 0b00010000) 	#16uA charge current for each electrode
	mpr.write8(MPR121_CONFIG2, 0x20) 		#0.5uS encoding, 1ms period
	
	mpr.write8(MPR121_ECR, 0x8F)  			#start with first 5 bits of baseline tracking, alle electrodes are enabled
			
def readREGISTERSforTEST ():
	""" Function doc """
	for reg in range(0x00,0x80):
		data = mpr.readU8(reg)
		print hex(reg),' = ',hex(data)
	

# Main game:
mprINITIALIZATION()
#readREGISTERSforTEST() # only for test

print ""

while 1:
	print 'Touched:', mprTOUCHED()
	print ""
	print "Raw data:"
	for i in range(0,12):
		print 'Sensor:', i ,hex(mprSHOWFILTEREDFATA(i)), hex(mprSHOWBASELINEDATA(i))
		
	time.sleep(0.1)
	os.system('clear')
Program na początku dokonuje inicjalizacji układu MPR121, następnie w pętli przeprowadza odczyt rejestrów odpowiedzialnych za sygnalizację dotkniętego pola (lub pól), a następnie podaje wartości źródłowe, które pozwolą zorientować nam się jak czuła jest dana elektroda... czy wymagana jest kalibracja parametrów inicjalizujących etc...
mpr121_module_03.jpg
Przykładowo na załączonym powyżej zdjęciu widać 'wduszony' sensor nr 8... Moduł można nabyć w cenie ok. 3,5 $.
Attachments
mpr121.zip
(2.77 KiB) Downloaded 1633 times
MPR121_NXP.pdf
(379.91 KiB) Downloaded 1641 times

Post Reply