오늘날 대부분의 휴대폰 에는 모든 앱을 열거 나 닫고, 음악을 시작하고, 통화에 참석하는 등의 제스처 제어 기능 이 있습니다. 이것은 시간을 절약 할 수있는 매우 편리한 기능이며 제스처로 모든 장치를 제어하는 것도 멋지게 보입니다. 이전에는 가속도계를 사용하여 제스처 제어 로봇과 제스처 제어 에어 마우스를 구축했습니다. 그러나 오늘 우리 는 Arduino와 제스처 센서 APDS9960 을 인터페이스하는 방법을 배웁니다. 이 센서에는 또한 색상을 감지 하는 RGB 센서 가 있으며이 센서 는이 튜토리얼에서도 사용됩니다. 따라서 색상 감지 전용 센서를 사용할 수 있지만 제스처 및 색상 감지를 위해 별도의 센서를 사용할 필요가 없습니다. 색상 분류기 기계를 구축하기 위해 이미 Arduino와 함께 사용한 TCS3200 색상 센서 입니다.
필수 구성 요소
- Arduino UNO
- APDS9960 RGB 및 제스처 센서
- 16x2 LCD
- DPDT 스위치
- 100K pot 및 10K 저항
- 점퍼 케이블
APDS-9960 디지털 근접 RGB 및 제스처 센서 소개
APDS9960은 다기능 센서입니다. 빛에서 제스처, 주변 광 및 RGB 값을 감지 할 수 있습니다. 이 센서는 근접 센서로도 사용할 수 있으며 주로 스마트 폰에서 사용되어 통화 중에 터치 스크린을 비활성화합니다.
이 센서는 4 개의 포토 다이오드로 구성됩니다. 이 포토 다이오드는 온보드 LED에 의해 전송되는 반사 된 IR 에너지를 감지합니다. 따라서 제스처가 수행 될 때마다이 IR 에너지가 차단되어 센서로 다시 반사되며 이제 센서는 제스처에 대한 정보 (방향, 속도)를 감지하여이를 디지털 정보로 변환합니다. 이 센서는 반사 된 적외선을 감지하여 장애물의 거리를 측정하는 데 사용할 수 있습니다. RGB 색상을 감지하기위한 UV 및 IR 차단 필터가 있으며 각 색상에 대해 16 비트 데이터를 생성합니다.
APDS-9960 센서의 핀아웃은 아래와 같습니다. 이 센서는 I 2 C 통신 프로토콜 에서 작동 합니다. 1µA 전류를 소비하고 3.3V 전원을 사용하므로주의하고 5V 핀과 연결하지 마십시오. 여기서 INT 핀은 I 2 C 통신 을 구동하는 데 사용되는 인터럽트 핀 입니다. 그리고 VL 핀은 PS 점퍼가 연결되지 않은 경우 온보드 LED의 옵션 전원 핀입니다. PS 점퍼가 닫혀 있으면 VCC 핀에 전원 만 공급하면 모듈과 IR LED 모두에 전원이 공급됩니다.
회로도
Arduino와 APDS960의 연결 은 매우 간단합니다. DPDT 버튼을 사용하여 RGB 감지 및 제스처 감지 모드를 전환합니다. 먼저 APDS9960의 I2C 통신 핀 SDA 및 SCL은 각각 Arduino 핀 A4 및 A5에 연결됩니다. 앞서 언급했듯이 센서의 작동 전압은 3.3v이므로 APDS9960의 VCC 및 GND는 Arduino의 3.3V 및 GND에 연결됩니다. APDS9960의 인터럽트 핀 (INT)은 Arduino의 D2 핀에 연결됩니다.
들면 LCD, 데이터 핀 (D4-D7)는 디지털 핀의 Arduino의 D6-D3 및 RS 및 EN 핀에 접속되어 D6 및 D7의 Arduino의 접속된다. LCD의 V0은 포트에 연결되고 100K 포트는 LCD의 밝기를 제어하는 데 사용됩니다. DPDT 버튼의 경우 3 핀만 사용했습니다. 두 번째 핀은 입력을 위해 Arduino의 D7 핀에 연결되고 다른 두 핀은 GND 및 VCC에 연결되고 10K 저항이 이어집니다.
제스처 및 색상 감지를위한 Arduino 프로그래밍
프로그래밍 부분은 간단하고 쉬우 며 데모 비디오 가 포함 된 전체 프로그램 은이 튜토리얼의 끝에 제공됩니다.
먼저 Sparkfun에서 만든 라이브러리 를 설치 해야합니다. 이 라이브러리를 설치하려면 Sketch-> Include Library-> Manage Libraries로 이동하십시오.
이제 검색 창에 "Sparkfun APDS9960"을 입력하고 라이브러리가 표시되면 설치 버튼을 클릭합니다.
그리고 우리는 갈 준비가되었습니다. 시작하자.
따라서 먼저 필요한 모든 헤더 파일을 포함해야합니다. 첫 번째 헤더 파일 LiquidCrystal.h 는 LCD 기능에 사용됩니다. 두 번째 헤더 파일 Wire.h 는 I 2 C 통신에 사용되며 마지막 SparkFun_APDS996.h 는 APDS9960 센서에 사용됩니다.
#포함
이제 다음 줄에서 버튼과 LCD의 핀을 정의했습니다.
const int buttonPin = 7; const int rs = 12, en = 11, d4 = 6, d5 = 5, d6 = 4, d7 = 3; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
다음 부분에서는 디지털 핀 2에 연결된 인터럽트 핀에 대한 매크로와 버튼의 현재 상태에 대한 하나의 변수 buttonState 및 인터럽트 서비스 루틴에 대한 isr_flag 를 정의했습니다.
#define APDS9960_INT 2 int buttonState; int isr_flag = 0;
다음으로 SparkFun_APDS9960에 대한 개체가 생성되어 제스처 움직임에 액세스하고 RGB 값을 가져올 수 있습니다.
SparkFun_APDS9960 apds = SparkFun_APDS9960 (); uint16_t ambient_light = 0; uint16_t red_light = 0; uint16_t green_light = 0; uint16_t blue_light = 0;
에서는 설정 기능, 제 라인 입력으로서 버튼 (저 / 고)에서의 값과 두 번째 및 세 번째 줄에 정의 버튼 인터럽트 핀을 가져올 것이다. apds.init () 는 APDS9960 센서를 초기화하고 lcd.begin (16,2) 는 LCD를 초기화합니다.
void setup () { buttonState = digitalRead (buttonPin); pinMode (APDS9960_INT, INPUT); pinMode (buttonPin, INPUT); apds.init (); lcd.begin (16, 2); }
에서는 루프 기능 첫번째 라인의 버튼의 값과 저장을 얻는다 buttonState의 앞에서 정의한 변수. 이제 다음 줄에서 버튼의 값을 확인하고 값이 높으면 광 센서를 활성화하고 낮 으면 제스처 센서를 초기화합니다.
attachInterrupt ()는 ,이 경우에는 센서의 인터럽트 인 외부 인터럽트하는데 사용되는 함수이다. 이 함수의 첫 번째 인수는 인터럽트 번호입니다. Arduino UNO에는 INT.0 및 INT.1로 표시되는 2와 3의 두 개의 인터럽트 핀 디지털 핀이 있습니다. 그리고 우리는 그것을 핀 2에 연결했기 때문에 거기에 0을 썼습니다. 두 번째 인수는 나중에 정의되는 interruptRoutine () 함수를 호출합니다. 마지막 인수는 FALLING 이므로 핀이 하이에서 로우로 갈 때 인터럽트를 트리거합니다. 여기에서 Arduino 인터럽트에 대해 자세히 알아보십시오.
void loop () { buttonState = digitalRead (buttonPin); if (buttonState == HIGH) { apds.enableLightSensor (true); }
다음 부분에서는 버튼 핀을 확인합니다. 높으면 RGB 센서 프로세스를 시작 합니다. 그런 다음 광 센서가 값을 읽고 있는지 확인하십시오. 값을 읽을 수없는 경우이 경우 " Error reading light values"를 인쇄하십시오 . 그리고 값을 읽을 수 있으면 세 가지 색상의 값과 가장 높은 값을 비교하여 해당 색상을 LCD에 인쇄하십시오.
if (buttonState == HIGH) { if (! apds.readAmbientLight (ambient_light)- ! apds.readRedLight (red_light)- ! apds.readGreenLight (green_light)- ! apds.readBlueLight (blue_light)) { lcd.print ("조명 값 읽기 오류"); } else { if (red_light> green_light) { if (red_light> blue_light) { lcd.print ("Red"); 지연 (1000); lcd.clear (); } ……. ………..
다음 줄에서 다시 버튼 핀을 확인하고 핀이 낮 으면 제스처 센서를 처리합니다. 그런 다음 isr_flag 를 확인하고 1이면 detachInterrupt () 함수 가 호출됩니다. 이 기능은 인터럽트를 끄는 데 사용됩니다. 다음 줄은 나중에 정의 된 함수 인 handleGesture () 를 호출합니다. 다음 줄에서 isr_flag 를 0으로 정의 하고 인터럽트를 연결합니다.
else if (buttonState == LOW) { if (isr_flag == 1) { detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } }
다음은 interruptRoutine () 함수입니다. 이 함수는 인터럽트 서비스를 초기화 할 수 있도록 isr_flag 변수 1 을 돌리는 데 사용됩니다.
void interruptRoutine (). { isr_flag = 1; }
handleGesture () 함수는 다음의 부분으로 정의된다. 이 기능은 먼저 제스처 센서의 가용성을 확인합니다. 가능한 경우 제스처 값을 읽고 그것이 어떤 제스처인지 (UP, DOWN, RIGHT, LEFT, FAR, NEAR) 확인하고 해당 값을 LCD에 인쇄합니다.
void handleGesture () { if (apds.isGestureAvailable ()) { switch (apds.readGesture ()) { case DIR_UP: lcd.print ("UP"); 지연 (1000); lcd.clear (); 단절; case DIR_DOWN: lcd.print ("DOWN"); 지연 (1000); lcd.clear (); 단절; case DIR_LEFT: lcd.print ("LEFT"); 지연 (1000); lcd.clear (); 단절; case DIR_RIGHT: lcd.print ("RIGHT"); 지연 (1000); lcd.clear (); 단절; case DIR_NEAR: lcd.print ("NEAR"); 지연 (1000); lcd.clear (); 단절; 케이스 DIR_FAR: lcd.print ("FAR"); 지연 (1000); lcd.clear (); 단절; 기본값: lcd.print ("NONE"); 지연 (1000); lcd.clear (); } } }
마지막으로 Arduino에 코드를 업로드하고 센서가 초기화 될 때까지 기다립니다. 이제 버튼이 꺼져 있으면 제스처 모드 임을 의미 합니다. 따라서 손을 왼쪽, 오른쪽, 위, 아래 방향으로 움직여보십시오. 들어 지금까지 제스처 2 ~ 3 초 동안 센서 2-4인치의 거리에서 손을 유지하고 제거합니다. 그리고 가까운 제스처의 경우 손을 센서에서 멀리 유지 한 다음 가까이 가져가 제거하십시오.
이제 버튼을 켜서 색상 감지 모드로 전환 하고 센서 근처에서 빨간색, 파란색 및 녹색 물체를 하나씩 가져옵니다. 개체의 색상을 인쇄합니다.