Freescale에서 제작한 MPR121 칩은 정전식 터치 패드를 구현하는데 사용하는 컨트롤러입니다. MPR121 breakout 보드는 12개의 터치 패드를 감지해서 마이크로 컨트롤러에게 I2C 통신으로 알려주도록 제작된 모듈입니다. 메탈 테이프, 전선, 금속 조각 등을 이용해서 터치에 반응하는 입력 장치를 만드는데 유용하게 사용할 수 있습니다.

1:N 연결이 가능한 I2C 통신을 사용하기 때문에 아두이노에 여러개의 MPR121 모듈을 연결해서 감지 가능한 터치패드의 갯수를 늘릴 수 있습니다. 최대 4개의 모듈을 연결해서 48개의 터치 패드를 감지할 수 있습니다. 물론 이 경우 각각의 모듈의 I2C address 값을 다르게 지정해 줘야 합니다.

그리고 실제 손이 닿지 않고 근접하더라도 감지가 가능하도록 만들 수 있습니다. MPR121 모듈의 감도를 조절함으로써 감지가 가능한 거리를 바꿀 수 있습니다. 12개의 감지용 핀을 합쳐 더욱 민감하게 터치를 감지하게 만들 수도 있습니다. 이 경우는 보다 복잡한 과정을 거쳐야 하므로 아래 데이터시트를 참고하세요.

MPR121 data sheet

그리고 점퍼 셋팅을 통해 8개의 핀을 LED 출력용으로도 쓸 수 있습니다.

MPR121 모듈은 2.5 ~ 3.6V DC 전원을 넣어줘야 합니다. 아두이노의 3.3V 핀을 이용해서 전원을 넣어주면 됩니다. 하지만 판매되는 모듈에 따라 5V 전원을 넣어줘도 동작하도록 나온 경우도 있으므로(3.3V 레귤레이터 탑재) 판매처의 스펙을 잘 확인하세요.

현재 아래 사이트에서 쉽게 구매할 수 있습니다. 입력 전원쪽을 빼곤 대동소이합니다.

연결 방법

SKU207358-3

모듈의 한 쪽 면은 12개의 터치패드용 핀이 달려있고, 반대쪽에는 6개의 통신/제어용 핀이 달려 있습니다. 6개의 핀은 아래와 같은 역할을 합니다.

  • 3.3V : 전원 + 입력
  • GND : 전원 – 입력
  • IRQ : Interrupt Request – 12개의 터치핀에 변화가 발생하면 이 핀이 3.3V를 출력해서 알려줍니다. 따라서 여기에 LED를 붙여 터치가 감지되었음을 확인하는 용도로도 쓸 수 있고, 아두이노의 인터럽트 핀에 연결해서 터치 입력시 바로 특정 루틴이 처리되도록 만들 수도 있습니다.
  • SCL : I2C 통신용 핀
  • SDA : I2C 통신용 핀
  • ADD : 모듈의 I2C address 를 변경하는데 사용합니다. 이 핀은 100K 저항을 통해 GND에 연결되어 있으므로 연결하지 않고 놔둘 경우 I2C address 는 0x5A 가 됩니다. 이 핀을 3V에 연결하면 0x5B, SDA에 연결하면 0x5C, SCL에 연결하면 0x5D로 바뀌게 됩니다. 주소를 변경해서 최대 4개의 모듈을 한꺼번에 사용할 수 있습니다.
  • (ADD 핀을 default[0x5A] 상태로 사용하지 않고 다른 주소로 변경하는 경우 모듈에 따라 위 방법대로 되지 않을 수도 있습니다.  이때는 모듈 뒷면의 점퍼 셋팅을 변경해줘야 합니다. 뒷면에 ADDR 점퍼가 연결된 상태일 텐데 이걸 칼로 끊어버리고 다시 시도해보세요.)

아두이노에 연결할 때는 아래와 같이 합니다.

  • MPR121 모듈 –> 아두이노
  • 3.3V(VIN) –> 3.3V
  • GND –> GND
  • SCL –> A5
  • SDA –> A4
  • IRQ –> D2 (이건 옵션 사항. 인터럽트 사용을 하고 싶을 때 사용.  인터럽트가 필요 없는 경우 다른 디지털 핀에 연결해서 Digital Input 체크용으로 사용해도 됩니다.)

제어 방법

MPR121 모듈은 이미 전용 라이브러리가 개발되어 있습니다. 해당 라이브러리를 통해 쉽게 터치 패드의 상태를 알 수 있습니다.

2 종의 라이브러리가 있는데 Adafruit 라이브러리와 Sparkfun 라이브러리 입니다. 거의 유사하므로 원하시는 라이브러리를 받아 테스트 해보시면 됩니다.

예제는 각 라이브러리에 포함된 에제 파일을 참고하시면 됩니다. (Adafruit 예제가 좀 더 편해보인다는 개인적인 생각…)

Adafruit 라이브러리 예제의 경우 아래 코드가 터치 패드를 인식하는 코드입니다.

먼저 라이브러리 include 및 초기화 코드. 만약 4개의 모듈을 모두 연결해서 쓰고 싶다면 cap1, cap2, cap3, cap4 와 같이 4개의 인스턴스를 생성해주면 됩니다.

#include <Wire.h>
#include "Adafruit_MPR121.h"

// You can have up to 4 on one i2c bus but one is enough for testing!
Adafruit_MPR121 cap = Adafruit_MPR121();

아래 코드가 모듈과의 연결, 통신을 초기화 하는 코드입니다. 이 때 I2C address 를 적어줘야 합니다.

  // Default address is 0x5A, if tied to 3.3V its 0x5B
  // If tied to SDA its 0x5C and if SCL then 0x5D
  if (!cap.begin(0x5A)) {
    Serial.println("MPR121 not found, check wiring?");
    while (1);
  }

아래 코드를 통해 0번 부터 11번 까지 12개의 터치가 눌러졌는지, 떼졌는지 확인합니다.

  for (uint8_t i=0; i<12; i++) {
    // it if *is* touched and *wasnt* touched before, alert!
    if ((currtouched & _BV(i)) && !(lasttouched & _BV(i)) ) {
      Serial.print(i); Serial.println(" touched");
    }
    // if it *was* touched and now *isnt*, alert!
    if (!(currtouched & _BV(i)) && (lasttouched & _BV(i)) ) {
      Serial.print(i); Serial.println(" released");
    }
  }

cap.touched() 함수를 호출하면, 현재 터치 결과가 2byte 데이터로 currtouched 변수에 들어옵니다. 즉, 0~11번 bit 에 각 터치의 상태가 0 또는 1로 기록됩니다. 이걸 확인하는 코드가 아래 코드죠.

currtouched & _BV(i)

터치의 감도를 바꾸고 싶다면 초기화 이후, 아래 함수를 호출해주면 됩니다.

setThreshholds(uint8_t touch, uint8_t release)

touch는 터치 인식 감도로 기본값이 12 count 입니다. release는 터치 종료 감도로 기본값은 6 count 입니다. 이 값을 원래대로 돌리고 싶으면 cap.begin() 초기화 함수를 다시 호출해주면 됩니다.

참고자료