이 글에서는 PIR 센서와 아두이노 나노 같은 간단한 부품으로 제스처 감지기를 만드는 방법을 보여줍니다. 이 글을 읽고 나면 다음을 할 수 있습니다:
PIR 센서의 응용 분야와 작동 원리 설명
8픽셀 PIR 센서 TPA81 실행
아두이노로 PIR 센서를 이용해 모션 및 제스처 감지
스피커 볼륨을 제어하는 멋진 감지기 제작
수동 적외선 센서(PIR): 작동 원리
수동 적외선 센서(PIR 센서)는 시야 내 물체에서 방사되는 적외선(IR) 빛을 측정하는 전자 센서입니다. 주로 PIR 기반 모션 감지기에 사용됩니다. 절대 영도 이상의 온도를 가진 모든 물체는 복사 형태로 열 에너지를 방출합니다. 보통 이 복사는 적외선 파장에서 일어나므로 육안으로는 보이지 않지만, 그런 목적으로 설계된 전자 장치로는 감지할 수 있습니다.
여기서 '수동(Passive)'이란 PIR 장치가 감지 목적으로 에너지를 생성하거나 방사하지 않는다는 뜻입니다. 전적으로 물체에서 방출되거나 반사된 적외선 복사를 감지함으로써 작동합니다. 열을 감지하거나 측정하는 것이 아닙니다. (출처: Wikipedia)
TPA81은 2µm~22µm 범위의 적외선을 감지하는 열전퇴 배열 센서입니다. 이는 복사열의 파장 대역입니다. 도난 경보기나 실외 조명 제어에 흔히 쓰이는 파이로전기 센서도 같은 파장 대역의 적외선을 감지합니다. 하지만 이 센서들은 열 레벨의 변화만 감지할 수 있어 모션 감지기로만 쓰입니다. 로봇공학에 유용하지만 정적 열원의 온도를 감지하고 측정할 수 없어 응용이 제한적입니다.
또 다른 유형은 열전퇴 배열(thermopile array)입니다. 비접촉 적외선 온도계에 사용되며, 매우 넓은 감지 각도(FOV, 약 100°)를 가져 보통 12° 정도의 더 유용한 FOV를 얻기 위해 차폐나 렌즈가 필요합니다. 일부는 내장 렌즈를 가지기도 합니다. 최근에는 열전퇴 배열, 내장 전자회로, 실리콘 렌즈를 통합한 센서가 나왔는데 TPA81이 이 유형입니다. 8개의 열전퇴가 한 줄로 배열되어 있어 8개 인접 지점의 온도를 동시에 측정할 수 있습니다. TPA81은 서보를 제어해 모듈을 팬(Pan)하며 열화상 이미지를 구성할 수도 있습니다. 2미터(6피트) 거리에서 촛불 불꽃을 감지하며 주변 광에 영향을 받지 않습니다!
PIR 센서는 따뜻한 것만 볼 수 있는 카메라와 비슷합니다. TPA81은 8픽셀 해상도의 열화상 카메라이고, 인체는 항상 열을 방출합니다. 컨트롤러로 PIR 센서를 제어하고 제스처를 정의하면 간단한 제스처 감지기를 만들 수 있습니다.
이 프로젝트에서는 PIR과 아두이노로 제스처 감지 시스템을 만듭니다. TPA81을 사용했지만 다소 비싸므로, 비용을 아끼려면 흰색 헤드(초점 부분) 없는 단순 PIR 센서 8개를 사용해도 됩니다. TPA81은 I2C 프로토콜을 지원하며 아두이노 나노와 호환됩니다. 이 프로젝트는 이미지 처리와 제스처 감지의 기초를 이해하는 데 도움이 됩니다. 시작해봅시다!
회로도
TPA81 대신 8개 PIR 센서를 사용하려면 각 센서를 아두이노 보드에 연결하고 순차적으로 읽으면 됩니다. 이렇게 하면 비용을 절약할 수 있습니다!
코드
첫 번째 회로(TPA81 사용)용 코드입니다. 아두이노 IDE에 복사하기 전 라이브러리를 추가해야 합니다. 처음 아두이노를 실행한다면 다음 단계를 따르세요:
스케치 > 라이브러리 포함 > ZIP 라이브러리 추가로 라이브러리 추가 (아래 링크에서 다운로드)
툴 > 보드 > 아두이노 나노 선택
아두이노를 PC에 연결하고 툴 > 포트에서 COM 포트 설정
업로드(화살표) 버튼 클릭
완료!
1단계: 기본 온도 읽기
#include "Wire.h"
#include "TPA81.h"
// TPA81 인스턴스 생성
TPA81 tpa;
void setup() {
Serial.begin(9600);
// TPA81 라이브러리 사용을 위해 Wire 라이브러리 시작 필요
Wire.begin();
}
void loop() {
// 주변 온도 출력
Serial.print(tpa.getAmbient());
Serial.print(" ");
// 8개 포인트 온도 모두 출력
for (int i = 1; i <= 8; i++) {
Serial.print(tpa.getPoint(i));
Serial.print(" ");
}
Serial.println(" ");
delay(100);
}
코드 실행 후 아두이노 IDE 시리얼 터미널을 열고 TPA81이 감지한 8개 배열 온도를 확인하세요. 각 줄의 첫 번째 숫자는 전체 주변 온도입니다. 센서 앞에 손을 대고 체온 변화를 관찰하세요. 손으로 제스처를 정의하려면 손 온도를 오프셋으로 설정해야 합니다. 우리는 29도로 설정했습니다. 다음 코드를 업로드해 TPA81 앞 손 움직임을 확인하세요.