[매드] 아두이노 강좌 - 34. 터치 센서와 부져 동작


안녕하세요! 매드 입니다.

이번 시간에는 약 한달전쯤 요청이 들어왔었는데... (콜록콜록)
휴가에 이것저것 마무리 하다보니 이제서야 하게 되었네요.

그래도 나름 바쁜 와중에 노력중이라는 ... ㅡㅠ
먹고사는게 쉬운게 아니네요 ㅋㅋ

이번 다뤄볼 것은 터치센서와 부져 동작입니다!


34-1. 터치 센서

<MPR121(출처:구글사진)>

터치 IC는 여러가지가 있지만 아두이노에서 많이 사용하는 터치 센서 중에 하나인 MPR121에 대해서 다뤄보도록 하겠습니다.
이 MPR121 IC를 사용한 보드가 몇가지가 있는데 저는 위 사진과 같이 생긴 보드를 사용한다고 보시면 될 것 같네요! ㅎㅎ

이전에 다뤘던 여러 센서들과 마찬가지로 i2c 인터페이스를 사용하구요. 터치 입력을 받을 수 있는 포트가 무려 12채널이나 됩니다! ㅎㅎ 많죠.

연결전에 중요한건 바로 동작 전압! 아두이노는 5V이지만 많은 센서들이 5V 보다는 3.3V 입력이 많죠 ㅠㅋ 이 MPR121도 마찬가지 입니다. 잘못된 전원을 연결하면 비싼돈주고 산 센서가 망가진다는 점! 잊지 마시기를 바랍니다. ㅎㅎ

일단 IC는 여기까지만 보고 연결을 보도록 하죠.


34-2. 하드웨어 연결

<MPR121 아두이노 연결(출처:구글사진)>

연결은 간단하죠! 그림과 같이 연결해주시면 됩니다.

3.3V → 3.3V
SCL → A5
SDA → A4
GND → GND
IRQ → D2(옵션)

여기서 IRQ는 옵션으로 터치가 되었을 때를 트리거로 알려주는 핀인데 여러가지 센서를 사용한다면 필요하겠지만 터치IC만 다루기 때문에 딱히 필요는 없을 것 같네요.

여타 다른 I2C 센서들과 동일한 연결이지 어렵지 않다고 봅니다! ㅎㅎ
중요한건 터치 되는 부분은 전도성 물체를 연결하게 되면 손으로 터치했을 때 동작이 된다는 것입니다. 전도성 물체라고 한다면 수분이 많은 것들도 포함이죠. 예를들면 과일 같은 것들이요 ㅎㅎ

그럼 바로 동작시켜 볼까요!


34-3. 펌웨어

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

Adafruit_MPR121 cap = Adafruit_MPR121();

int melody[] = {
  NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4
};

uint16_t lasttouched = 0;
uint16_t currtouched = 0;

void setup() {
  Serial.begin(9600);
  Serial.println("Adafruit MPR121 Capacitive Touch sensor test");

  tone(6, NOTE_C4, 1000 / 4);
  delay(500);
  noTone(6);

  tone(6, NOTE_G3, 1000 / 4);
  delay(500);
  noTone(6);

  tone(6, NOTE_A3, 1000 / 4);
  delay(500);
  noTone(6);

  // 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);
  }
  Serial.println("MPR121 found!");
}

void loop() {
  // Get the currently touched pads
  currtouched = cap.touched();

  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 (i == 0) {
        tone(6, NOTE_C4, 1000 / 4);
        delay(500);
        noTone(6);
      }
      else if (i == 1) {
        tone(6, NOTE_G3, 1000 / 4);
        delay(500);
        noTone(6);
      }
       else if (i == 2) {
        tone(6, NOTE_A3, 1000 / 4);
        delay(500);
        noTone(6);
      }
    }
    // if it *was* touched and now *isnt*, alert!
    if (!(currtouched & _BV(i)) && (lasttouched & _BV(i)) ) {
      Serial.print(i); Serial.println(" released");
    }
  }

  // reset our state
  lasttouched = currtouched;

  // comment out this line for detailed data from the sensor!
  return;
}


ㅎㅎ 간단하게 금방 끝났네요!!
응용하는건 여러분들의 몫입니다. ㅠㅠ
저도 한번 머리 굴려볼께요! 하하하....
더워서 제정신 아니네요. 어쨋든!!

다음엔 머를 만들어볼지... ㅡㅜ 만든다기 보다는 이제 지루한 강좌가 될 수도 있겠네요.
다짜고짜 만들기보다는 이론을 좀 위주로 다뤄보도록 하겠습니다.
아무래도 응용을 할려니 기초이론을 모르는 상태로는 많이 부족한것 같아서요!

그럼 다음 시간에 뵐께요! >.<

댓글 쓰기

2 댓글

  1. 안녕하세요? 몇가지 여쭤보고 싶은 내용이 있어서 이메일로 연락을 드리고 싶은데, 주소를 좀 알 수 있을까요?

    답글삭제
    답글
    1. 안녕하세요~
      개인적인 질문은 따로 답변 드리지 않습니다.
      블로그에 질문 올려주시면 답변 드리겠습니다~
      감사합니다.

      삭제