MPR121 – kontroler czujników pojemnościowych

MPR121 jest drugiej generacji kontrolerem czujników pojemnościowych. Obsługuje 12 kanałów (czujników), obsługa poprzez I2C

Przykładowy schemat podłączenia:

MPR121

Biblioteka (należy rozpakować i umieścić ją w katalogu arduino/libraries/)

mpr121

Kod:

/*
MPR121 UNO
IRQ D2 (digital 2)
3.3V 3.3V
GND GND
SCL A5 (analog 5)
SDA A4 (analog 4)
*/

#include "mpr121.h"
#include <Wire.h>

int irqpin = 2; // Digital 2
boolean touchStates[12]; //to keep track of the previous touch states

void setup(){
 pinMode(irqpin, INPUT);
 digitalWrite(irqpin, HIGH); //enable pullup resistor
 
 Serial.begin(9600);
 Wire.begin();

mpr121_setup();
}

void loop(){
 readTouchInputs();
}

void readTouchInputs(){
 if(!checkInterrupt()){
 
 //read the touch state from the MPR121
 Wire.requestFrom(0x5A,2); 
 
 byte LSB = Wire.read();
 byte MSB = Wire.read();
 
 uint16_t touched = ((MSB << 8) | LSB); //16bits that make up the touch states

 for (int i=0; i < 12; i++){ // Check what electrodes were pressed
 if(touched & (1<<i)){
 
 if(touchStates[i] == 0){
 //pin i was just touched
 Serial.print("pin ");
 Serial.print(i);
 Serial.println(" was just touched");
 
 }else if(touchStates[i] == 1){
 //pin i is still being touched
 } 
 
 touchStates[i] = 1; 
 }else{
 if(touchStates[i] == 1){
 Serial.print("pin ");
 Serial.print(i);
 Serial.println(" is no longer being touched");
 
 //pin i is no longer being touched
 }
 
 touchStates[i] = 0;
 }
 
 }
 
 }
}

void mpr121_setup(void){

set_register(0x5A, ELE_CFG, 0x00); 
 
 // Section A - Controls filtering when data is > baseline.
 set_register(0x5A, MHD_R, 0x01);
 set_register(0x5A, NHD_R, 0x01);
 set_register(0x5A, NCL_R, 0x00);
 set_register(0x5A, FDL_R, 0x00);

// Section B - Controls filtering when data is < baseline.
 set_register(0x5A, MHD_F, 0x01);
 set_register(0x5A, NHD_F, 0x01);
 set_register(0x5A, NCL_F, 0xFF);
 set_register(0x5A, FDL_F, 0x02);
 
 // Section C - Sets touch and release thresholds for each electrode
 set_register(0x5A, ELE0_T, TOU_THRESH);
 set_register(0x5A, ELE0_R, REL_THRESH);
 
 set_register(0x5A, ELE1_T, TOU_THRESH);
 set_register(0x5A, ELE1_R, REL_THRESH);
 
 set_register(0x5A, ELE2_T, TOU_THRESH);
 set_register(0x5A, ELE2_R, REL_THRESH);
 
 set_register(0x5A, ELE3_T, TOU_THRESH);
 set_register(0x5A, ELE3_R, REL_THRESH);
 
 set_register(0x5A, ELE4_T, TOU_THRESH);
 set_register(0x5A, ELE4_R, REL_THRESH);
 
 set_register(0x5A, ELE5_T, TOU_THRESH);
 set_register(0x5A, ELE5_R, REL_THRESH);
 
 set_register(0x5A, ELE6_T, TOU_THRESH);
 set_register(0x5A, ELE6_R, REL_THRESH);
 
 set_register(0x5A, ELE7_T, TOU_THRESH);
 set_register(0x5A, ELE7_R, REL_THRESH);
 
 set_register(0x5A, ELE8_T, TOU_THRESH);
 set_register(0x5A, ELE8_R, REL_THRESH);
 
 set_register(0x5A, ELE9_T, TOU_THRESH);
 set_register(0x5A, ELE9_R, REL_THRESH);
 
 set_register(0x5A, ELE10_T, TOU_THRESH);
 set_register(0x5A, ELE10_R, REL_THRESH);
 
 set_register(0x5A, ELE11_T, TOU_THRESH);
 set_register(0x5A, ELE11_R, REL_THRESH);
 
 // Section D
 // Set the Filter Configuration
 // Set ESI2
 set_register(0x5A, FIL_CFG, 0x04);
 
 // Section E
 // Electrode Configuration
 // Set ELE_CFG to 0x00 to return to standby mode
 set_register(0x5A, ELE_CFG, 0x0C); // Enables all 12 Electrodes
 
 
 // Section F
 // Enable Auto Config and auto Reconfig
 /*set_register(0x5A, ATO_CFG0, 0x0B);
 set_register(0x5A, ATO_CFGU, 0xC9); // USL = (Vdd-0.7)/vdd*256 = 0xC9 @3.3V set_register(0x5A, ATO_CFGL, 0x82); // LSL = 0.65*USL = 0x82 @3.3V
 set_register(0x5A, ATO_CFGT, 0xB5);*/ // Target = 0.9*USL = 0xB5 @3.3V
 
 set_register(0x5A, ELE_CFG, 0x0C);
 
}

boolean checkInterrupt(void){
 return digitalRead(irqpin);
}

void set_register(int address, unsigned char r, unsigned char v){
 Wire.beginTransmission(address);
 Wire.write(r);
 Wire.write(v);
 Wire.endTransmission();
}

Jedna myśl nt. „MPR121 – kontroler czujników pojemnościowych

  1. Rolkar

    Bardzo ciekawy artykuł.
    Właśnie czekam na dostawę modułu.
    Rozumiem że jest to lepsze rozwiązanie niż układy typu TTP229.
    Chciałbym zapytać także czy i jak możliwe jest zwiększenie czułości (interesuje mnie odległość ok 3-5mm). Moje pytanie czy w tej drugiej części od (void mpr121_setup(void)) ustawia się w jakiś sposób parametry tego układu? Na razie początki i nie bardzo to rozumiem.

    Odpowiedz

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *