Capacitive touch sensor (8 probes) by Microchip
"The CAP1298 is a turnkey capacitive touch controller providing a wide variety of button and proximity functionality, and making it easy for designers to add aesthetically pleasing, low-cost and robust touch interfaces. It also offers improved proximity detection with its Signal Guard option." (from Microchip website)
http://www.microchip.com/wwwproducts/en/CAP1298
Diff: CAP12xx.cpp
- Revision:
- 0:3480c5e1f395
- Child:
- 1:8b152c72eded
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CAP12xx.cpp Tue Jan 31 15:38:25 2017 +0000 @@ -0,0 +1,179 @@ +/* + ___ ___ ___ + /\ \ /\ \ /\ \ + /::\ \ /::\ \ /::\ \ + /:/\:\__\ /::\:\__\ /::\:\__\ + \:\ \/__/ \/\::/ / \/\::/ / + \:\__\ /:/ / \/__/ + \/__/ \/__/ + + Copyright (c) 2016 Flow design labs, Project LEAF + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + #define CAP12xx_MAIN 0x00 //Controls power states and indicates an interrupt + #define CAP12xx_MINT 0x1 //Clears interrupts on touch + #define CAP12xx_SEN 0x1F //Controls the sensitivity of the threshold and delta counts and datascaling of the base counts + #define CAP12xx_MTC 0x2A //Determines the number of simultaneous touches to flag a multiple touch condition + #define CAP12xx_SIS 0x03 //Returns the state of the sampled capacitive touch sensor inputs + #define CAP12xx_PID 0xFD //Stores a fixed value that identifies the CAP12xx + #define CAP12xx_MID 0xFE //Stores a fixed value that identifies Microchip + #define CAP12xx_REV 0xFF //Stores a fixed value that represents the revision number + #define CAP12xx_ACT 0x24 //Controls averaging and sampling window for Active + #define CAP12xx_CAL 0x26 //Forces calibration for capacitive touch sensor inputs and indicates calibration failure + #define CAP12xx_ENA 0x27 //Determines which capacitive sensor inputs can generate interrupts + #define CAP12xx_IRP 0x28 //Turn off interrupt repeat on button hold + #define CAP12xx_GRD 0x29 //Enables the signal guard for specific sensor inputs + #define CAP12xx_STB 0x41 //Controls averaging and sensing cycle time for Standby + #define CAP12xx_IRR 0x44 //Set interrupt on press but not release - default 0x41 + + ////////////////////////////////////////////////////// + // CAP12xx_SEN - Sensitivity values - 1x minimum // + // 0x0F //128x sensitivity // + // 0x1F //64x sensitivity // + // 0x2F //32x sensitivity // + // 0x3F //16x sensitivity // + // 0x4F //8x sensitivity // + // 0x5F //4x sensitivity // + // 0x6F //2x sensitivity // + // 0x7F //1x sensitivity // + ////////////////////////////////////////////////////// +*/ + +#include "CAP12xx.h" + +CAP12xx::CAP12xx(PinName SDA, PinName SCL, PinName interrupt_pin) : communication(SDA, SCL), interrupt(interrupt_pin) +{ + core_address = 0x28<<1; + return; +} + +bool CAP12xx::init() +{ + communication.frequency(400000); + interrupt.mode(PullUp); + + readRegister(CAP12xx_PID); + + //printf("Product ID: 0x%02X\n\r", readRegister(CAP12xx_PID)); + //printf("Manufacturer ID: 0x%02X\n\r", readRegister(CAP12xx_MID)); + //printf("Revision ID: 0x%02X\n\r", readRegister(CAP12xx_REV)); + + if ((readRegister(CAP12xx_PID) != 0x71) || (readRegister(CAP12xx_MID) != 0x5D) || (readRegister(CAP12xx_REV) != 0x01)) { + return false; + } + + writeRegister(CAP12xx_SEN, 0x4F); //Sensitivity settings + writeRegister(CAP12xx_MTC, 0x80); //Determines the number of simultaneous touches to flag a multiple touch condition 0x80 for OFF and 0x00 for ON + writeRegister(CAP12xx_ENA, 0xFF); //Determines which capacitive sensor inputs can generate interrupts + writeRegister(CAP12xx_STB, 0x39); //Controls averaging and sensing cycle time for Standby 0x41 + writeRegister(CAP12xx_ACT, 0x39); //Controls averaging and sampling window for Active 0x39 + writeRegister(CAP12xx_IRP, 0x00); //Turn off interrupt repeat on button hold + + return true; +} + +void CAP12xx::setSensitivity(char level) +{ + writeRegister(CAP12xx_SEN, level); //Sensitivity settings + return; +} + +void CAP12xx::enable(void) +{ + probe = 0; + probe_touched = 0; + interrupt.fall(this, &CAP12xx::handler); + + uint8_t clear_interrupt = readRegister(CAP12xx_MAIN); //read main register + clear_interrupt &= ~CAP12xx_MINT; //clear interrupt bit + writeRegister(CAP12xx_MAIN, clear_interrupt); //write main register with no interrupt bit + return; +} + +void CAP12xx::disable(void) +{ + interrupt.fall(NULL); + probe = 0; + probe_touched = 0; + return; +} + +uint8_t CAP12xx::touched(void) +{ + return probe_touched; +} + +uint8_t CAP12xx::identifyProbeTouched(void) +{ + uint8_t clear_interrupt = readRegister(CAP12xx_MAIN); //read main register + clear_interrupt &= ~CAP12xx_MINT; //clear interrupt bit + writeRegister(CAP12xx_MAIN, clear_interrupt); //write main register with no interrupt bit + + uint8_t probe = readRegister(CAP12xx_SIS); + probe_touched = 0; + + return probe; +} + +uint8_t CAP12xx::inspect(void) +{ + char touch_data = readRegister(CAP12xx_SIS); + + uint8_t clear_interrupt = readRegister(CAP12xx_MAIN); //read main register + clear_interrupt &= ~CAP12xx_MINT; //clear interrupt bit + writeRegister(CAP12xx_MAIN, clear_interrupt); //write main register with no interrupt bit + + return touch_data; +} + +void CAP12xx::handler(void) +{ + probe_touched = 1; + return; +} + +void CAP12xx::writeRegister(char address, char data) +{ + int write_status; + char command[2] = {address, data}; + write_status = communication.write(core_address, command, 2, false); + + if(write_status != 0){ + //printf("ERROR - writing to CAP12xx failed.."); + } + return; +} + +uint8_t CAP12xx::readRegister(char address) +{ + int write_status, read_status; + char data; + + write_status = communication.write(core_address, &address, 1, false); + read_status = communication.read(core_address, &data, 1); + + if(write_status != 0){ + //printf("ERROR - writing to CAP12xx failed.."); + } + if(read_status != 0){ + //printf("ERROR - reading from CAP12xx failed.."); + } + return data; +} \ No newline at end of file