Hi all,
I'm looking for a little guidance communicating with the mpr121 capacitive sensor (i.e. SparkFun Capacitive Touch Sensor Breakout - MPR121 - SEN-09695 - SparkFun Electronics).
I'm trying to read the 10bit filtered data from the sensors vs. the touch data, but seems no matter what I do, I can't get anything but the touch data. I'm hoping it's a matter of having a register set wrong, but I've gone through the docs several times and am just not seeing it.
Here's my sketch:
#include "mpr121.h"
#include <Wire.h>
int ele0_msb = 0;
int ele0_lsb = 0;
unsigned long currenttime = 0;
unsigned long nextsample = 0;
int sampleinterval = 20;
boolean sampleflag = 0;
void setup(){
Serial.begin(9600);
Wire.begin();
mpr121_setup();
}
void loop(){
currenttime = millis();
if (currenttime >= nextsample) {
nextsample = currenttime + sampleinterval;
readData();
}
}
void readData() {
Wire.beginTransmission(0x5A); // begin communication with the MPR121 on I2C address 0x5A
Wire.send(0x04); // read ELE0 filtered data LSB
Wire.send(0x05); // read ELE0 filtered data MSB
Wire.requestFrom(0x5A, 2); // request for the MPR121 to send 2 bytes
// check to see if we've received the byte over I2C
if(Wire.available() >= 2)
{
ele0_lsb = Wire.receive();
ele0_msb = Wire.receive();
}
Wire.endTransmission(); // ends communication
sendData();
}
void sendData() {
Serial.print(ele0_msb, BYTE);
Serial.print(ele0_lsb, BYTE);
Serial.print(10, BYTE);
}
void mpr121_setup(void){
// 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 (register 0x5E)
// Set ELE_CFG to 0x00 to return to standby mode
// Set ELE_CFG to 0x0C to turn on just touch
// Set ELE_CFG to 0x30 to turn on proximty for all electrodes
// Set ELE_CFG to 0x3C to turn on BOTH proximity and touch
set_register(0x5A, ELE_CFG, 0x30);
/*
// 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
*/
}
void set_register(int address, unsigned char r, unsigned char v){
Wire.beginTransmission(address);
Wire.send(r);
Wire.send(v);
Wire.endTransmission();
}
In a nutshell, I'm trying to read from registers 0x04 and 0x05 (LSB and MSB for electrode 0 data), but I seem to only get 0x00 and 0x01.
For those that have worked a bit with this sensor, any ideas?
Thanks in advance for any pointers.
David