안녕하세요! 매드 입니다.
이번 시간에는 약 한달전쯤 요청이 들어왔었는데... (콜록콜록)
휴가에 이것저것 마무리 하다보니 이제서야 하게 되었네요.
그래도 나름 바쁜 와중에 노력중이라는 ... ㅡㅠ
먹고사는게 쉬운게 아니네요 ㅋㅋ
이번 다뤄볼 것은 터치센서와 부져 동작입니다!
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 댓글
안녕하세요? 몇가지 여쭤보고 싶은 내용이 있어서 이메일로 연락을 드리고 싶은데, 주소를 좀 알 수 있을까요?
답글삭제안녕하세요~
삭제개인적인 질문은 따로 답변 드리지 않습니다.
블로그에 질문 올려주시면 답변 드리겠습니다~
감사합니다.