MPR121 정전용량 센서로 모든 표면에 터치 버튼 만들기
부품 및 소모품
| 부품명 |
수량 |
| Arduino UNO | 1 |
| Adafruit MPR121 정전용량 터치 센서 브레이크아웃 | 1 |
| LED (범용) | 1 |
앱 및 온라인 서비스
프로젝트 소개
MPR121은 IC의 정전용량 기능을 이용한 12핀 터치 센서입니다.
이 IC용 라이브러리는 2가지가 있는데, 개인적으로 Bare Conductive 라이브러리를 선호합니다. https://github.com/BareConductive/mpr121
이 칩에는 트리거 핀이 있어 12개 핀 중 하나가 터치되거나 해제되면 알림을 받을 수 있어 훌륭한 응답 속도를 제공하며, 루프에서 상태를 폴링하는 대신 인터럽트 방식으로 사용할 수 있습니다(예제 참고). 단점은 12개 IO 핀 모두에 단 하나의 트리거 핀만 있다는 점입니다.
I2C 주소는 ADDR 핀으로 설정합니다. 기본적으로 100k 저항으로 GND에 풀다운되어 0x5A 주소를 가집니다. 3.3V 연결 시 0x5B, SDA 연결 시 0x5C, SCL 연결 시 0x5D가 됩니다. 이 설정은 Adafruit 보드 기준이며, 일부 호환 보드는 다른 주소 설정을 가질 수 있습니다. 모를 경우 I2C 스캐너로 확인하세요.
회로 연결은 매우 간단합니다 (회로도 참조).
주의사항: 대부분의 브레이크아웃 보드 전원은 3.3V 정격이므로 5V로 공급하지 마세요. 데이터 레벨 전압은 I2C 하드웨어 특성상 Arduino의 5V가 MPR121을 손상시키진 않지만, 읽기 문제나 버스에서 발견되지 않는 경우 로직 레벨 컨버터 사용을 권장합니다.
수년간 이 훌륭한 IC로 여러 프로젝트를 만들었습니다. 처음 만든 것 중 하나는 아이용 게임으로, 상단의 글자들이 2개의 MPR121에 연결되어 각 글자 터치 시 제가 녹음한 글자 이름 MP3가 재생되도록 했습니다. 같은 시기에 Bare Conductive 페인트도 실험했는데, 매우 재미있고 MPR121과 잘 작동합니다.
소스 코드
핀 0/1로 LED 온/오프 제어 (Arduino)
MPR121의 0번 핀 터치로 LED 켜기, 1번 핀 해제로 LED 끄기 예제입니다. LED는 3번 핀에 연결.
#include <MPR121.h>
#include <Wire.h>
#define numElectrodes 2
#define LEDPIN 3
void setup() {
Serial.begin(115200);
Serial.println("System started");
pinMode(LEDPIN, OUTPUT);
Wire.begin();
// Bare Touch Board에서 MPR121 I2C 주소는 0x5C, Adafruit는 0x5A
if (!MPR121.begin(0x5A)) {
Serial.println("error setting up MPR121");
switch (MPR121.getError()) {
case NO_ERROR: Serial.println("no error"); break;
case ADDRESS_UNKNOWN: Serial.println("incorrect address"); break;
case READBACK_FAIL: Serial.println("readback failure"); break;
case OVERCURRENT_FLAG: Serial.println("overcurrent on REXT pin"); break;
case OUT_OF_RANGE: Serial.println("electrode out of range"); break;
case NOT_INITED: Serial.println("not initialised"); break;
default: Serial.println("unknown error"); break;
}
while (1);
}
MPR121.setInterruptPin(4);
MPR121.setTouchThreshold(40);
MPR121.setReleaseThreshold(20);
MPR121.updateTouchData();
}
void loop() {
if (MPR121.touchStatusChanged()) {
MPR121.updateTouchData();
for (int i = 0; i < numElectrodes; i++) {
if (MPR121.isNewTouch(i)) {
if (i == 0) {
digitalWrite(LEDPIN, HIGH);
}
} else if (MPR121.isNewRelease(i)) {
if (i == 1) {
digitalWrite(LEDPIN, LOW);
}
}
}
}
}
회로도
Arduino UNO와 MPR121 브레이크아웃 보드 간 I2C 연결(SDA, SCL), 인터럽트 핀(4번), 전원(3.3V, GND) 연결도 포함. 터치 전극은 도전성 페인트, 구리 테이프, 알루미늄 호일 등 다양한 재료로 확장 가능.