Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
MPR121/MPR121.cc@0:9a49249d42b3, 2017-12-13 (annotated)
- Committer:
- Charith Dassanayake
- Date:
- Wed Dec 13 00:06:47 2017 -0500
- Revision:
- 0:9a49249d42b3
Initial commit
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| Charith Dassanayake |
0:9a49249d42b3 | 1 | #ifndef CPP_TO_PIGPIO_I2C_HEADER |
| Charith Dassanayake |
0:9a49249d42b3 | 2 | #include <CPPToPigpio.h> |
| Charith Dassanayake |
0:9a49249d42b3 | 3 | #endif |
| Charith Dassanayake |
0:9a49249d42b3 | 4 | #include <sstream> |
| Charith Dassanayake |
0:9a49249d42b3 | 5 | #include <string> |
| Charith Dassanayake |
0:9a49249d42b3 | 6 | #include <list> |
| Charith Dassanayake |
0:9a49249d42b3 | 7 | |
| Charith Dassanayake |
0:9a49249d42b3 | 8 | #include "MPR121.h" |
| Charith Dassanayake |
0:9a49249d42b3 | 9 | Mpr121::Mpr121(CPPToPigpio::I2C *i2c, Address i2cAddress) |
| Charith Dassanayake |
0:9a49249d42b3 | 10 | { |
| Charith Dassanayake |
0:9a49249d42b3 | 11 | this->i2c = i2c; |
| Charith Dassanayake |
0:9a49249d42b3 | 12 | |
| Charith Dassanayake |
0:9a49249d42b3 | 13 | address = i2cAddress; |
| Charith Dassanayake |
0:9a49249d42b3 | 14 | |
| Charith Dassanayake |
0:9a49249d42b3 | 15 | // Configure the MPR121 settings to default |
| Charith Dassanayake |
0:9a49249d42b3 | 16 | this->configureSettings(); |
| Charith Dassanayake |
0:9a49249d42b3 | 17 | } |
| Charith Dassanayake |
0:9a49249d42b3 | 18 | |
| Charith Dassanayake |
0:9a49249d42b3 | 19 | |
| Charith Dassanayake |
0:9a49249d42b3 | 20 | void Mpr121::configureSettings() |
| Charith Dassanayake |
0:9a49249d42b3 | 21 | { |
| Charith Dassanayake |
0:9a49249d42b3 | 22 | // Put the MPR into setup mode |
| Charith Dassanayake |
0:9a49249d42b3 | 23 | this->write(ELE_CFG,0x00); |
| Charith Dassanayake |
0:9a49249d42b3 | 24 | |
| Charith Dassanayake |
0:9a49249d42b3 | 25 | // Electrode filters for when data is > baseline |
| Charith Dassanayake |
0:9a49249d42b3 | 26 | unsigned char gtBaseline[] = { |
| Charith Dassanayake |
0:9a49249d42b3 | 27 | 0x01, //MHD_R |
| Charith Dassanayake |
0:9a49249d42b3 | 28 | 0x01, //NHD_R |
| Charith Dassanayake |
0:9a49249d42b3 | 29 | 0x00, //NCL_R |
| Charith Dassanayake |
0:9a49249d42b3 | 30 | 0x00 //FDL_R |
| Charith Dassanayake |
0:9a49249d42b3 | 31 | }; |
| Charith Dassanayake |
0:9a49249d42b3 | 32 | |
| Charith Dassanayake |
0:9a49249d42b3 | 33 | writeMany(MHD_R,gtBaseline,4); |
| Charith Dassanayake |
0:9a49249d42b3 | 34 | |
| Charith Dassanayake |
0:9a49249d42b3 | 35 | // Electrode filters for when data is < baseline |
| Charith Dassanayake |
0:9a49249d42b3 | 36 | unsigned char ltBaseline[] = { |
| Charith Dassanayake |
0:9a49249d42b3 | 37 | 0x01, //MHD_F |
| Charith Dassanayake |
0:9a49249d42b3 | 38 | 0x01, //NHD_F |
| Charith Dassanayake |
0:9a49249d42b3 | 39 | 0xFF, //NCL_F |
| Charith Dassanayake |
0:9a49249d42b3 | 40 | 0x02 //FDL_F |
| Charith Dassanayake |
0:9a49249d42b3 | 41 | }; |
| Charith Dassanayake |
0:9a49249d42b3 | 42 | |
| Charith Dassanayake |
0:9a49249d42b3 | 43 | writeMany(MHD_F,ltBaseline,4); |
| Charith Dassanayake |
0:9a49249d42b3 | 44 | |
| Charith Dassanayake |
0:9a49249d42b3 | 45 | // Electrode touch and release thresholds |
| Charith Dassanayake |
0:9a49249d42b3 | 46 | unsigned char electrodeThresholds[] = { |
| Charith Dassanayake |
0:9a49249d42b3 | 47 | E_THR_T, // Touch Threshhold |
| Charith Dassanayake |
0:9a49249d42b3 | 48 | E_THR_R // Release Threshold |
| Charith Dassanayake |
0:9a49249d42b3 | 49 | }; |
| Charith Dassanayake |
0:9a49249d42b3 | 50 | |
| Charith Dassanayake |
0:9a49249d42b3 | 51 | for(int i=0; i<12; i++){ |
| Charith Dassanayake |
0:9a49249d42b3 | 52 | int result = writeMany((ELE0_T+(i*2)),electrodeThresholds,2); |
| Charith Dassanayake |
0:9a49249d42b3 | 53 | } |
| Charith Dassanayake |
0:9a49249d42b3 | 54 | |
| Charith Dassanayake |
0:9a49249d42b3 | 55 | // Proximity Settings |
| Charith Dassanayake |
0:9a49249d42b3 | 56 | unsigned char proximitySettings[] = { |
| Charith Dassanayake |
0:9a49249d42b3 | 57 | 0xff, //MHD_Prox_R |
| Charith Dassanayake |
0:9a49249d42b3 | 58 | 0xff, //NHD_Prox_R |
| Charith Dassanayake |
0:9a49249d42b3 | 59 | 0x00, //NCL_Prox_R |
| Charith Dassanayake |
0:9a49249d42b3 | 60 | 0x00, //FDL_Prox_R |
| Charith Dassanayake |
0:9a49249d42b3 | 61 | 0x01, //MHD_Prox_F |
| Charith Dassanayake |
0:9a49249d42b3 | 62 | 0x01, //NHD_Prox_F |
| Charith Dassanayake |
0:9a49249d42b3 | 63 | 0xFF, //NCL_Prox_F |
| Charith Dassanayake |
0:9a49249d42b3 | 64 | 0xff, //FDL_Prox_F |
| Charith Dassanayake |
0:9a49249d42b3 | 65 | 0x00, //NHD_Prox_T |
| Charith Dassanayake |
0:9a49249d42b3 | 66 | 0x00, //NCL_Prox_T |
| Charith Dassanayake |
0:9a49249d42b3 | 67 | 0x00 //NFD_Prox_T |
| Charith Dassanayake |
0:9a49249d42b3 | 68 | }; |
| Charith Dassanayake |
0:9a49249d42b3 | 69 | writeMany(MHDPROXR,proximitySettings,11); |
| Charith Dassanayake |
0:9a49249d42b3 | 70 | |
| Charith Dassanayake |
0:9a49249d42b3 | 71 | unsigned char proxThresh[] = { |
| Charith Dassanayake |
0:9a49249d42b3 | 72 | PROX_THR_T, // Touch Threshold |
| Charith Dassanayake |
0:9a49249d42b3 | 73 | PROX_THR_R // Release Threshold |
| Charith Dassanayake |
0:9a49249d42b3 | 74 | }; |
| Charith Dassanayake |
0:9a49249d42b3 | 75 | writeMany(EPROXTTH,proxThresh,2); |
| Charith Dassanayake |
0:9a49249d42b3 | 76 | |
| Charith Dassanayake |
0:9a49249d42b3 | 77 | this->write(FIL_CFG,0x04); |
| Charith Dassanayake |
0:9a49249d42b3 | 78 | |
| Charith Dassanayake |
0:9a49249d42b3 | 79 | // Set the electrode config to transition to active mode |
| Charith Dassanayake |
0:9a49249d42b3 | 80 | this->write(ELE_CFG,0x0c); |
| Charith Dassanayake |
0:9a49249d42b3 | 81 | } |
| Charith Dassanayake |
0:9a49249d42b3 | 82 | |
| Charith Dassanayake |
0:9a49249d42b3 | 83 | void Mpr121::setElectrodeThreshold(int electrode, unsigned char touch, unsigned char release){ |
| Charith Dassanayake |
0:9a49249d42b3 | 84 | |
| Charith Dassanayake |
0:9a49249d42b3 | 85 | if(electrode > 11) return; |
| Charith Dassanayake |
0:9a49249d42b3 | 86 | |
| Charith Dassanayake |
0:9a49249d42b3 | 87 | // Get the current mode |
| Charith Dassanayake |
0:9a49249d42b3 | 88 | unsigned char mode = this->read(ELE_CFG); |
| Charith Dassanayake |
0:9a49249d42b3 | 89 | |
| Charith Dassanayake |
0:9a49249d42b3 | 90 | // Put the MPR into setup mode |
| Charith Dassanayake |
0:9a49249d42b3 | 91 | this->write(ELE_CFG,0x00); |
| Charith Dassanayake |
0:9a49249d42b3 | 92 | |
| Charith Dassanayake |
0:9a49249d42b3 | 93 | // Write the new threshold |
| Charith Dassanayake |
0:9a49249d42b3 | 94 | this->write((ELE0_T+(electrode*2)), touch); |
| Charith Dassanayake |
0:9a49249d42b3 | 95 | this->write((ELE0_T+(electrode*2)+1), release); |
| Charith Dassanayake |
0:9a49249d42b3 | 96 | |
| Charith Dassanayake |
0:9a49249d42b3 | 97 | //Restore the operating mode |
| Charith Dassanayake |
0:9a49249d42b3 | 98 | this->write(ELE_CFG, mode); |
| Charith Dassanayake |
0:9a49249d42b3 | 99 | } |
| Charith Dassanayake |
0:9a49249d42b3 | 100 | |
| Charith Dassanayake |
0:9a49249d42b3 | 101 | |
| Charith Dassanayake |
0:9a49249d42b3 | 102 | unsigned char Mpr121::read(int key){ |
| Charith Dassanayake |
0:9a49249d42b3 | 103 | |
| Charith Dassanayake |
0:9a49249d42b3 | 104 | unsigned int data[2]; |
| Charith Dassanayake |
0:9a49249d42b3 | 105 | char out[2]={0}; |
| Charith Dassanayake |
0:9a49249d42b3 | 106 | char cmd[] = {CPPToPigpio::I2C::Start, CPPToPigpio::I2C::Addr, address, CPPToPigpio::I2C::Write, |
| Charith Dassanayake |
0:9a49249d42b3 | 107 | 0x01, key, CPPToPigpio::I2C::Start, CPPToPigpio::I2C::Read,0x02, CPPToPigpio::I2C::Stop, |
| Charith Dassanayake |
0:9a49249d42b3 | 108 | CPPToPigpio::I2C::End}; |
| Charith Dassanayake |
0:9a49249d42b3 | 109 | int ack = i2c->bang(cmd, 11, out, 2, false); |
| Charith Dassanayake |
0:9a49249d42b3 | 110 | //printf("ack_read: %d", ack); |
| Charith Dassanayake |
0:9a49249d42b3 | 111 | //Start the command |
| Charith Dassanayake |
0:9a49249d42b3 | 112 | /*i2c->start(); |
| Charith Dassanayake |
0:9a49249d42b3 | 113 | |
| Charith Dassanayake |
0:9a49249d42b3 | 114 | // Address the target (Write mode) |
| Charith Dassanayake |
0:9a49249d42b3 | 115 | int ack1= i2c->write(address); |
| Charith Dassanayake |
0:9a49249d42b3 | 116 | |
| Charith Dassanayake |
0:9a49249d42b3 | 117 | // Set the register key to read |
| Charith Dassanayake |
0:9a49249d42b3 | 118 | int ack2 = i2c->write(key); |
| Charith Dassanayake |
0:9a49249d42b3 | 119 | |
| Charith Dassanayake |
0:9a49249d42b3 | 120 | // Re-start for read of data |
| Charith Dassanayake |
0:9a49249d42b3 | 121 | i2c->start(); |
| Charith Dassanayake |
0:9a49249d42b3 | 122 | |
| Charith Dassanayake |
0:9a49249d42b3 | 123 | // Re-send the target address in read mode |
| Charith Dassanayake |
0:9a49249d42b3 | 124 | int ack3 = i2c->write(address+1); |
| Charith Dassanayake |
0:9a49249d42b3 | 125 | |
| Charith Dassanayake |
0:9a49249d42b3 | 126 | // Read in the result |
| Charith Dassanayake |
0:9a49249d42b3 | 127 | data[0] = i2c->read(0); |
| Charith Dassanayake |
0:9a49249d42b3 | 128 | |
| Charith Dassanayake |
0:9a49249d42b3 | 129 | // Reset the bus |
| Charith Dassanayake |
0:9a49249d42b3 | 130 | i2c->stop();*/ |
| Charith Dassanayake |
0:9a49249d42b3 | 131 | data[0] = out[0]; |
| Charith Dassanayake |
0:9a49249d42b3 | 132 | return (unsigned char)data[0]; |
| Charith Dassanayake |
0:9a49249d42b3 | 133 | } |
| Charith Dassanayake |
0:9a49249d42b3 | 134 | |
| Charith Dassanayake |
0:9a49249d42b3 | 135 | |
| Charith Dassanayake |
0:9a49249d42b3 | 136 | int Mpr121::write(int key, unsigned char value){ |
| Charith Dassanayake |
0:9a49249d42b3 | 137 | |
| Charith Dassanayake |
0:9a49249d42b3 | 138 | char out[1]={0}; |
| Charith Dassanayake |
0:9a49249d42b3 | 139 | char keyc = static_cast<char>(key); |
| Charith Dassanayake |
0:9a49249d42b3 | 140 | char valc = static_cast<char>(value); |
| Charith Dassanayake |
0:9a49249d42b3 | 141 | char cmd[] = {CPPToPigpio::I2C::Start, CPPToPigpio::I2C::Addr, address, CPPToPigpio::I2C::Write, |
| Charith Dassanayake |
0:9a49249d42b3 | 142 | 0x02, keyc, valc, CPPToPigpio::I2C::Stop, CPPToPigpio::I2C::End}; |
| Charith Dassanayake |
0:9a49249d42b3 | 143 | int ack = i2c->bang(cmd, 9, out, 1, false); |
| Charith Dassanayake |
0:9a49249d42b3 | 144 | //printf("ack_write: %d", ack); |
| Charith Dassanayake |
0:9a49249d42b3 | 145 | //Start the command |
| Charith Dassanayake |
0:9a49249d42b3 | 146 | /*i2c->start(); |
| Charith Dassanayake |
0:9a49249d42b3 | 147 | |
| Charith Dassanayake |
0:9a49249d42b3 | 148 | // Address the target (Write mode) |
| Charith Dassanayake |
0:9a49249d42b3 | 149 | int ack1= i2c->write(address); |
| Charith Dassanayake |
0:9a49249d42b3 | 150 | |
| Charith Dassanayake |
0:9a49249d42b3 | 151 | // Set the register key to write |
| Charith Dassanayake |
0:9a49249d42b3 | 152 | int ack2 = i2c->write(key); |
| Charith Dassanayake |
0:9a49249d42b3 | 153 | |
| Charith Dassanayake |
0:9a49249d42b3 | 154 | // Read in the result |
| Charith Dassanayake |
0:9a49249d42b3 | 155 | int ack3 = i2c->write(value); |
| Charith Dassanayake |
0:9a49249d42b3 | 156 | |
| Charith Dassanayake |
0:9a49249d42b3 | 157 | // Reset the bus |
| Charith Dassanayake |
0:9a49249d42b3 | 158 | i2c->stop();*/ |
| Charith Dassanayake |
0:9a49249d42b3 | 159 | |
| Charith Dassanayake |
0:9a49249d42b3 | 160 | return ack-1; |
| Charith Dassanayake |
0:9a49249d42b3 | 161 | } |
| Charith Dassanayake |
0:9a49249d42b3 | 162 | |
| Charith Dassanayake |
0:9a49249d42b3 | 163 | |
| Charith Dassanayake |
0:9a49249d42b3 | 164 | int Mpr121::writeMany(int start, unsigned char* dataSet, int length){ |
| Charith Dassanayake |
0:9a49249d42b3 | 165 | //Start the command |
| Charith Dassanayake |
0:9a49249d42b3 | 166 | /*i2c->start(); |
| Charith Dassanayake |
0:9a49249d42b3 | 167 | |
| Charith Dassanayake |
0:9a49249d42b3 | 168 | // Address the target (Write mode) |
| Charith Dassanayake |
0:9a49249d42b3 | 169 | int ack= i2c->write(address); |
| Charith Dassanayake |
0:9a49249d42b3 | 170 | if(ack!=1){ |
| Charith Dassanayake |
0:9a49249d42b3 | 171 | return -1; |
| Charith Dassanayake |
0:9a49249d42b3 | 172 | } |
| Charith Dassanayake |
0:9a49249d42b3 | 173 | |
| Charith Dassanayake |
0:9a49249d42b3 | 174 | // Set the register key to write |
| Charith Dassanayake |
0:9a49249d42b3 | 175 | ack = i2c->write(start); |
| Charith Dassanayake |
0:9a49249d42b3 | 176 | if(ack!=1){ |
| Charith Dassanayake |
0:9a49249d42b3 | 177 | return -1; |
| Charith Dassanayake |
0:9a49249d42b3 | 178 | } |
| Charith Dassanayake |
0:9a49249d42b3 | 179 | |
| Charith Dassanayake |
0:9a49249d42b3 | 180 | // Write the date set |
| Charith Dassanayake |
0:9a49249d42b3 | 181 | int count = 0; |
| Charith Dassanayake |
0:9a49249d42b3 | 182 | while(ack==1 && (count < length)){ |
| Charith Dassanayake |
0:9a49249d42b3 | 183 | ack = i2c->write(dataSet[count]); |
| Charith Dassanayake |
0:9a49249d42b3 | 184 | count++; |
| Charith Dassanayake |
0:9a49249d42b3 | 185 | } |
| Charith Dassanayake |
0:9a49249d42b3 | 186 | // Stop the cmd |
| Charith Dassanayake |
0:9a49249d42b3 | 187 | i2c->stop();*/ |
| Charith Dassanayake |
0:9a49249d42b3 | 188 | |
| Charith Dassanayake |
0:9a49249d42b3 | 189 | char datasetb[length+1] = {0}; |
| Charith Dassanayake |
0:9a49249d42b3 | 190 | datasetb[0] = start; |
| Charith Dassanayake |
0:9a49249d42b3 | 191 | for (int i=0; i<length; i++){ |
| Charith Dassanayake |
0:9a49249d42b3 | 192 | datasetb[i+1]=static_cast<char>(dataSet[i]); |
| Charith Dassanayake |
0:9a49249d42b3 | 193 | //printf("a: %x, b :%x\n", dataSet[i], datasetb[i+1]); |
| Charith Dassanayake |
0:9a49249d42b3 | 194 | } |
| Charith Dassanayake |
0:9a49249d42b3 | 195 | //printf("here\n"); |
| Charith Dassanayake |
0:9a49249d42b3 | 196 | int count = i2c->write(address, datasetb, length+1, false); |
| Charith Dassanayake |
0:9a49249d42b3 | 197 | |
| Charith Dassanayake |
0:9a49249d42b3 | 198 | |
| Charith Dassanayake |
0:9a49249d42b3 | 199 | |
| Charith Dassanayake |
0:9a49249d42b3 | 200 | return count; |
| Charith Dassanayake |
0:9a49249d42b3 | 201 | } |
| Charith Dassanayake |
0:9a49249d42b3 | 202 | |
| Charith Dassanayake |
0:9a49249d42b3 | 203 | |
| Charith Dassanayake |
0:9a49249d42b3 | 204 | bool Mpr121::getProximityMode(){ |
| Charith Dassanayake |
0:9a49249d42b3 | 205 | if(this->read(ELE_CFG) > 0x0c) |
| Charith Dassanayake |
0:9a49249d42b3 | 206 | return true; |
| Charith Dassanayake |
0:9a49249d42b3 | 207 | else |
| Charith Dassanayake |
0:9a49249d42b3 | 208 | return false; |
| Charith Dassanayake |
0:9a49249d42b3 | 209 | } |
| Charith Dassanayake |
0:9a49249d42b3 | 210 | |
| Charith Dassanayake |
0:9a49249d42b3 | 211 | void Mpr121::setProximityMode(bool mode){ |
| Charith Dassanayake |
0:9a49249d42b3 | 212 | this->write(ELE_CFG,0x00); |
| Charith Dassanayake |
0:9a49249d42b3 | 213 | if(mode){ |
| Charith Dassanayake |
0:9a49249d42b3 | 214 | this->write(ELE_CFG,0x30); //Sense proximity from ALL pads |
| Charith Dassanayake |
0:9a49249d42b3 | 215 | } else { |
| Charith Dassanayake |
0:9a49249d42b3 | 216 | this->write(ELE_CFG,0x0c); //Sense touch, all 12 pads active. |
| Charith Dassanayake |
0:9a49249d42b3 | 217 | } |
| Charith Dassanayake |
0:9a49249d42b3 | 218 | } |
| Charith Dassanayake |
0:9a49249d42b3 | 219 | |
| Charith Dassanayake |
0:9a49249d42b3 | 220 | |
| Charith Dassanayake |
0:9a49249d42b3 | 221 | int Mpr121::readTouchData(){ |
| Charith Dassanayake |
0:9a49249d42b3 | 222 | return this->read(0x00); |
| Charith Dassanayake |
0:9a49249d42b3 | 223 | } |