본문 바로가기
Arduino(아두이노) 활용 강좌

Arduino Uno 로 APDS-9960 제스쳐 센서를 사용해서 제스쳐 감지시 0.96 I2C OLED에 방향별 이미지 출력해 보기

by 오마이엔지니어 2021. 12. 10.
반응형

Arduino Uno 로 APDS-9960 제스쳐 센서를 사용해서 방향별로 제스쳐 감지시

SSD1306 0.96 I2C OLED에 방향별 이미지를 출력해 보는 프로젝트 입니다

먼저 Arduino Uno 로 APDS-9960 제스쳐 센서를 사용해 제스쳐 감지시 시리얼 모니터로 출력값을 확인해 보는 프로젝트 입니다

<제스쳐 센서 이미지>

제스쳐센서 소개
APDS-9930  APDS-9930 Datasheet.pdf APDS-9960  APDS-9960 Datasheet.pdf 기반의
비접촉 제스쳐 센서 모듈
(Non Contact Gesture Sensor Module) 입니다

(다양한 제조사의 제스쳐 센서가 판매되고 있습니다 본 테스트에서는 위의 두가지 제품을 사용하였습니다)
I2C 인터페이스 구성의 ALS(ambient light sensor) 와 적외선 IR LED 가 포함된 센서로 제스쳐 감지가 가능하며
또한 근접센서로도 사용할수 있습니다 (APDS-9930 은 근접센서 100mm , APDS-9960 은 100mm~200mm 거리까지 플러그 앤 플레이 감지 기능을 제공합니다)
APDS-9930은 제스쳐 센서로 활용이 가능하나 제스쳐 센서 라기보다는 주변 광 센서 또는 근접센서라고 볼수 있습니다
APDS-9960은 제스쳐 센서, RGB 컬리인식 센서, 주변 광 센서, 근접센서 로 사용 가능합니다
아두이노와 호환 가능하며 마이크로 컨트롤러, 로봇 제어, 동작감지 등 다양하게 활용 가능합니다

아래 이미지에서 확인할수 있듯이 다양한 제조사의 제스쳐 센서가 제작되고 판매되고 있습니다

<제스쳐 센서 배선도 및 회로도>


사용된 부품
APDS-9960 제스쳐 센서
Arduino Uno R3
미니 브래드 보드

점퍼케이블
3mm LED (Blue) , (Red) , (Green) , (Yellow)
막대저항 220 Ohm - 4개

구성배선도 (APDS-9960 제스쳐 감지시 시리얼 모니터로 출력값 확인해 보기)

 

구성배선도 (APDS-9960 주변 광 차단시 배선된 LED 점등시켜 보기)

사용된 라이브러리

APDS9960.zip
APDS9960 라이브러리를 첨부하였습니다
라이브러리 추가 방법은 Arduino IDE 설치하기 포스팅을 참조해 주세요


사용된 예제코드

apds9960_gesture.zip


테스트 방법
첨부된 APDS9960 라이브러리를 추가해 준 후 위 사용된 예제코드에 첨부된 apds9960_gesture.ino 파일을 불러와서
스케치 컴파일 및 업로드를 해주고 시리얼 모니터를 실행시킵니다


시리얼 모니터를 실행 시키면 위와 같은 화면이 출력되는것을 확인할수 있습니다
주의해야 할것은 APDS-9960 initialization complete 메세지가 나와야 정상적으로 센서가 인식된 것입니다
에러 메세지가 나오면 센서에 문제가 있거나 예제나 라이브러리와 센서가 맞지 않는것 입니다

본 테스트에 사용한 제스쳐 센서는 첨부된 라이브러리(Sparkfun의 라이브러리 입니다)의 제스쳐 예제를 사용하면 컴파일 에러는 없으나 지속적으로 센서가 인식이 되질 않는 에러가 발생했습니다
때문에 꼭 사용된 예제코드에 첨부된 apds9960_gesture.ino 예제를 사용해서 테스트 하기를 바랍니다

센서위를 손으로 좌,우,위,아래로 움직여 보면 방향을 감지해서 시리얼 모니터로 출력해 주는것을 확인할 수 있습니다
드라이버나 철자 같은 금속성 또는 자성을 띄는 물체로 테스트 하면 더 정확하게 테스트 가능합니다

일부 생산 버전에 따라 제스쳐가 인식이 안 될수 있습니다
이경우 아래 첨부파일을 사용해서 테스트 가능합니다, LED BOOST 와 GGAIN 값을 수정한 파일입니다

GGAIN 수정 라이브러리.zip
0.03MB


위 첨부파일을 다운로드 해서 SparkFun_APDS-9960_Sensor_Arduino_Library-V_1.4.2 를 설치해 주고
apds-9960 제스쳐.txt 파일의 예제를 복사해서 붙여놓고 테스트 하면 됩니다



프로젝트 동영상 (APDS-9960 제스쳐 감지시 시리얼 모니터로 출력값 확인해 보기)



프로젝트 동영상 (APDS-9960 주변 광 차단시 배선된 LED 점등시켜 보기)


주변 광 차단시 배선된 LED가 점등되는 테스트는 위에 첨부된 APDS9960 라이브러리(
Sparkfun의 라이브러리 입니다)의 AmbientLightInterrupt 예제를 불러와서 컴파일 및 업로드를 해주면 됩니다
센서를 손이나 물체로 가려서 주변 광을 차단해 주면 LED가 점등되는것을 확인할수 있습니다

이어서 Arduino Uno 로 APDS-9960 제스쳐 센서를 사용해서 방향별로 제스쳐 감지시

방향에 따른 4색상의 LED를 제어해 보는 프로젝트를 진행해 보겠습니다

구성배선도 (APDS-9960 방향별 제스쳐 감지시 LED 제어해 보기)


테스트 방법

(테스트 방법은 위 첫번째 제스쳐 테스트 하고 동일합니다, 4~7번까지 핀에 LED만 추가로 배선해주면 됩니다)
포스팅 상단에 첨부된 APDS9960 라이브러리를 추가해 준 후 위 사용된 예제코드에 첨부된 apds9960_gesture.ino 파일을 불러와서 스케치 컴파일 및 업로드를 해주고 시리얼 모니터를 실행시킵니다


시리얼 모니터를 실행 시키면 위와 같은 화면이 출력되는것을 확인할수 있습니다
주의해야 할것은 APDS-9960 initialization complete 메세지가 나와야 정상적으로 센서가 인식된 것입니다
에러 메세지가 나오면 센서에 문제가 있거나 예제나 라이브러리와 센서가 맞지 않는것 입니다

본 테스트에 사용한 제스쳐 센서는 첨부된 라이브러리(Sparkfun의 라이브러리 입니다)의 제스쳐 예제를 사용하면 컴파일 에러는 없으나 지속적으로 센서가 인식이 되질 않는 에러가 발생했습니다
때문에 꼭 사용된 예제코드에 첨부된 apds9960_gesture.ino 예제를 사용해서 테스트 하기를 바랍니다


센서위를 손으로 좌,우,위,아래로 움직여 보면 방향을 감지해서 시리얼 모니터로 출력해 주는것을 확인할 수 있습니다
일부 생산 버전에 따라 제스쳐가 인식이 안 될수 있습니다
이경우 아래 첨부파일을 사용해서 테스트 가능합니다, LED BOOST 와 GGAIN 값을 수정한 파일입니다

GGAIN 수정 라이브러리.zip
0.03MB



위 첨부파일을 다운로드 해서 SparkFun_APDS-9960_Sensor_Arduino_Library-V_1.4.2 를 설치해 주고
apds-9960 제스쳐.txt 파일의 예제를 복사해서 붙여놓고 테스트 하면 됩니다



예제코드를 살펴보면
// Global Variables
APDS9960 apds = APDS9960();
int isr_flag = 0;
int led1;
int led2;
int led3;
int led4;
void setup() {

  // Set interrupt pin as input
  pinMode(APDS9960_INT, INPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
위 처럼 4~7번 핀까지 LED가 배선되었기 때문에 좌,우,상,하 방향에 따라서 4번~7번까지 LED를 제어할 수 있습니다

#define DEFAULT_GGAIN           GGAIN_1X
GGAIN 값이 원래 4X 인데 1X 로 수정한 것을 확인 할 수 있습니다

SparkFun_APDS9960.cpp 파일과 SparkFun_APDS9960.h 파일도 수정하였는데
자세한 수정 방법은 https://rockjjy.tistory.com/2569 포스팅을 참조해 주세요


프로젝트 동영상 (APDS-9960 방향별 제스쳐 감지시 LED 제어해 보기)



이어서 Arduino Uno 로 APDS-9960 제스쳐 센서를 사용해서 방향별로 제스쳐 감지시

SSD1306 0.96 I2C OLED에 방향별 이미지를 출력해 보는 프로젝트 입니다

사용된 부품
APDS-9960 제스쳐 센서
0.96인치 I2C OLED SSD1306
Arduino Uno R3
미니 브래드 보드

점퍼케이블

구성배선도 (APDS-9960 제스쳐 감지시 0.96 OLED로 방향별 이미지 출력해 보기)

사용된 라이브러리

Adafruit_BusIO-master.zip
0.02MB
Adafruit_SSD1306-master.zip
0.04MB
Adafruit-GFX-Library-master.zip
0.33MB
SparkFun_APDS-9960_Sensor_Arduino_Library-V_1.4.2.zip
0.02MB


사용된 예제코드

APDS-9960_OLED.txt
0.02MB


테스트 방법
먼저 위 4가지 라이브러리가 필수적으로 설치가 필요합니다
라이브러리 추가 방법은Arduino IDE 설치하기포스팅을 참조해 주세요
자신의 PC에 Adafruit_SSD1306 라이브러리가 이미 설치되어 있어 위 파일을 다운로드하지 않는경우
꼭 라이브러리가 128X64 로 세팅되어 있는지 확인해야 합니다
128X32로 세팅되어 있는 경우는 라이브러리 폴더내 Adafruit_SSD1306.h 파일을 연 다음
//#define SSD1306_128_64 ///< DEPRECTAED: old way to specify 128x64 screen
#define SSD1306_128_32 ///< DEPRECATED: old way to specify 128x32 screen
이 부분을 이렇게 128_32 는 주석처리하고 128_64는 주석해제를 해서 아래와 같이 수정해 주면 됩니다
#define SSD1306_128_64 ///< DEPRECTAED: old way to specify 128x64 screen
//#define SSD1306_128_32 ///< DEPRECATED: old way to specify 128x32 screen

Sparkfun APDS-9960 라이브러리 역시 GGAIN 수정이 필요한데

수정 방법은 포스팅 위쪽을 참조하면 됩니다 (첨부파일은 GGAIN 수정이 되어 있습니다)
자세한 수정 방법은 https://rockjjy.tistory.com/2569 포스팅을 참조해 주세요

라이브러리 설치가 끝났으면 첨부파일 APDS-9960_OLED 을 업로드 하고 배선후 테스트 하면 됩니다

예제코드를 살펴보면
#include <Wire.h>
#include <SparkFun_APDS9960.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
위와 같은 라이브러리를 사용합니다

#define APDS9960_INT    2
인터럽트 핀 세팅은 2번입니다 

#define SCREEN_WIDTH 128    // OLED display width, in pixels
#define SCREEN_HEIGHT 64    // OLED display height, in pixels
#define OLED_RESET 4        // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
0.96 인치 OLED는 128X64로 테스트 합니다

static const unsigned char PROGMEM myleft[]  
static const unsigned char PROGMEM myright[] 
static const unsigned char PROGMEM myup[]
static const unsigned char PROGMEM mydown[]
static const unsigned char PROGMEM mynear[]
static const unsigned char PROGMEM myfar[]
left, right, up, down, near, far 에 해당하는 이미지를 세팅하는데 0.96 OLED에 left, right, up, down, near, far 의 이미지가
제스쳐센서 감지방향과 반대로 출력해서 나온다면 my...[] 부분을 수정해서 테스트 하면 됩니다
(좌우상하가 반대로 나와서 아래 동영상은 left와 right, up과 down을 수정해서 테스트한 동영상입니다)

display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //initialize with the I2C addr 0x3C (128x64)
0.96 I2C OLED 기본 I2C 주소는 0x3C 입니다

void handleGesture() {
    if ( apds.isGestureAvailable() ) {
    switch ( apds.readGesture() ) {
      case DIR_UP:
        Serial.println("UP");
        display.clearDisplay();
        display.drawBitmap(31, 0, myup, LOGO_WIDTH, LOGO_HEIGHT, 1);
        display.display();
        break;
      case DIR_DOWN:
        Serial.println("DOWN");
        display.clearDisplay();
        display.drawBitmap(31, 0, mydown, LOGO_WIDTH, LOGO_HEIGHT, 1);
        display.display();
        break;
      case DIR_LEFT:
        Serial.println("LEFT");
        display.clearDisplay();
        display.drawBitmap(31, 0, myleft, LOGO_WIDTH, LOGO_HEIGHT, 1);
        display.display();
        break;
      case DIR_RIGHT:
        Serial.println("RIGHT");
        display.clearDisplay();
        display.drawBitmap(31, 0, myright, LOGO_WIDTH, LOGO_HEIGHT, 1);
        display.display();
        break;
      case DIR_NEAR:
        Serial.println("NEAR");
        display.clearDisplay();
        display.drawBitmap(31, 0, mynear, LOGO_WIDTH, LOGO_HEIGHT, 1);
        display.display();
        break;
      case DIR_FAR:
        Serial.println("FAR");
        display.clearDisplay();
        display.drawBitmap(31, 0, myfar, LOGO_WIDTH, LOGO_HEIGHT, 1);
        display.display();
        break;
      default:
        Serial.println("NONE");
    }
시리얼 모니터 출력 부분입니다
이 부분 역시 UP, DOWN, LEFT, RIGHT, NEAR, FAR 가 시리얼 모니터에 제스쳐센서 감지 방향과
반대로 나온다면 수정해서 테스트하면 됩니다

프로젝트 동영상 (APDS-9960 제스쳐 감지시 0.96 OLED로 방향별 이미지 출력해 보기)


저가형 센서이고 주변밝기나 주변광에 따라서 영향이 있어서 깔끔하게 동작되지는 않는것 같습니다
이렇게 제스쳐 센서를 이용해서 간단하게 OLED에 제스쳐 감지 방향을 표시해 볼수 있습니다

반응형

댓글