Test tool for MPR121 modules.
This commit is contained in:
parent
4decdf1d72
commit
6183f0faee
1 changed files with 153 additions and 0 deletions
153
TestMPR121/TestMPR121.ino
Normal file
153
TestMPR121/TestMPR121.ino
Normal file
|
@ -0,0 +1,153 @@
|
||||||
|
#include <Wire.h>
|
||||||
|
#include <Adafruit_MPR121.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
Tool to test an MPR121 unit. Wires each touch input to a teensy pin to simulate touch sensor signals.
|
||||||
|
Used to detect faulty MPR121 units before assembly.
|
||||||
|
*/
|
||||||
|
|
||||||
|
Adafruit_MPR121 touchSensor = Adafruit_MPR121(); // This is the 12-input touch sensor
|
||||||
|
|
||||||
|
//LED output pins. Red is the onboard one, other two are just wired via resistors to +3.3V
|
||||||
|
#define RED_LED 13
|
||||||
|
#define GREEN_LED 20
|
||||||
|
#define YELLOW_LED 21
|
||||||
|
|
||||||
|
void setup(void) {
|
||||||
|
Serial.begin(115200);
|
||||||
|
|
||||||
|
//Set all "test ports" to high-impedance for now
|
||||||
|
for(int i=0; i<=11; i++) {
|
||||||
|
pinMode(i, INPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
pinMode(RED_LED, OUTPUT); led(RED_LED, true);
|
||||||
|
pinMode(GREEN_LED, OUTPUT); led(GREEN_LED, true);
|
||||||
|
pinMode(YELLOW_LED, OUTPUT); led(YELLOW_LED, true);
|
||||||
|
|
||||||
|
delay(100);
|
||||||
|
int serialwait = 100; //Max time to wait for serial port initialization
|
||||||
|
while(!Serial && serialwait)
|
||||||
|
{
|
||||||
|
delay(1);
|
||||||
|
--serialwait;
|
||||||
|
}
|
||||||
|
|
||||||
|
led(RED_LED, false);
|
||||||
|
led(GREEN_LED, false);
|
||||||
|
led(YELLOW_LED, false);
|
||||||
|
|
||||||
|
Serial.println("Running MPR121 test");
|
||||||
|
|
||||||
|
if (!touchSensor.begin(0x5A)) {
|
||||||
|
//Bail out if MPR121 cannot be initialized (chip broken or not present).
|
||||||
|
Serial.println("MPR121 initialization failed!");
|
||||||
|
failure();
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
Serial.println("MPR121 init ok.");
|
||||||
|
}
|
||||||
|
|
||||||
|
//Attempt some kind of random seeding
|
||||||
|
srandom(analogRead(0) ^ millis());
|
||||||
|
delay(200);
|
||||||
|
|
||||||
|
run_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void led(uint8_t pin, bool state) {
|
||||||
|
//Onboard red LED is wired a bit differently
|
||||||
|
if(pin != RED_LED) {
|
||||||
|
digitalWrite(pin, state?LOW:HIGH);
|
||||||
|
} else {
|
||||||
|
digitalWrite(pin, state?HIGH:LOW);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_touch_pins(uint16_t value)
|
||||||
|
{
|
||||||
|
for(int pin=0; pin<12; ++pin)
|
||||||
|
{
|
||||||
|
uint16_t touched = (value >> pin) & 0x0001; //Mask out bit value of pin
|
||||||
|
int teensyPin = 11-pin; //Row of teensy pins is 0-11 but mirrored vs MPR121
|
||||||
|
|
||||||
|
if(touched) {
|
||||||
|
pinMode(teensyPin, INPUT_PULLDOWN);
|
||||||
|
} else {
|
||||||
|
pinMode(teensyPin, INPUT_PULLUP);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool run_test(const char* name, uint16_t value) {
|
||||||
|
Serial.print(name);
|
||||||
|
set_touch_pins(value);
|
||||||
|
led(YELLOW_LED, true);
|
||||||
|
delay(50);
|
||||||
|
led(YELLOW_LED, false);
|
||||||
|
delay(50);
|
||||||
|
uint16_t t = touchSensor.touched();
|
||||||
|
Serial.print(", expected: ");
|
||||||
|
Serial.print(value, HEX);
|
||||||
|
Serial.print(" got: ");
|
||||||
|
Serial.print(t, HEX);
|
||||||
|
|
||||||
|
if(value == t) {
|
||||||
|
Serial.println(" PASS");
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
Serial.println(" FAIL");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void failure() {
|
||||||
|
led(RED_LED, true);
|
||||||
|
led(GREEN_LED, false);
|
||||||
|
Serial.println("Test failed!");
|
||||||
|
}
|
||||||
|
|
||||||
|
void success() {
|
||||||
|
led(RED_LED, false);
|
||||||
|
led(GREEN_LED, true);
|
||||||
|
Serial.println("All tests succeeded!");
|
||||||
|
}
|
||||||
|
|
||||||
|
//Macro to bail out on any failure
|
||||||
|
#define TEST(x) if(!x) { failure(); return; }
|
||||||
|
|
||||||
|
void run_all(void) {
|
||||||
|
|
||||||
|
TEST(run_test("ALL_OFF", 0x000));
|
||||||
|
TEST(run_test("ALL_ON", 0xFFF));
|
||||||
|
|
||||||
|
//Pins one at a time
|
||||||
|
TEST(run_test("P0", 0x001 << 0));
|
||||||
|
TEST(run_test("P1", 0x001 << 1));
|
||||||
|
TEST(run_test("P2", 0x001 << 2));
|
||||||
|
TEST(run_test("P3", 0x001 << 3));
|
||||||
|
TEST(run_test("P4", 0x001 << 4));
|
||||||
|
TEST(run_test("P5", 0x001 << 5));
|
||||||
|
TEST(run_test("P6", 0x001 << 6));
|
||||||
|
TEST(run_test("P7", 0x001 << 7));
|
||||||
|
TEST(run_test("P8", 0x001 << 8));
|
||||||
|
TEST(run_test("P9", 0x001 << 9));
|
||||||
|
TEST(run_test("P10", 0x001 << 10));
|
||||||
|
TEST(run_test("P11", 0x001 << 11));
|
||||||
|
|
||||||
|
//Alternating pattern
|
||||||
|
TEST(run_test("ODD", 0x0555));
|
||||||
|
TEST(run_test("EVEN", 0x0AAA));
|
||||||
|
|
||||||
|
//A few random ones for good measure
|
||||||
|
for(int i=0; i<8; i++) {
|
||||||
|
TEST(run_test("RANDOM", random() % 0x1000));
|
||||||
|
}
|
||||||
|
|
||||||
|
success();
|
||||||
|
}
|
||||||
|
|
||||||
|
//Dummy loop does nothing
|
||||||
|
void loop() {
|
||||||
|
delay(100);
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue