ジェスチャセンサー (APDS-9960) の利用

ここではジェスチャセンサー (APDS-9960) を Arduino から利用する方法について説明します。

Arduino は Arduino Uno を利用してます。センサーが 3.3V 動作で、Arduino Uno は 5V 動作なので、レベルシフタをはさんでます。

上下左右に赤色 LED を配置。そこにジェスチャーセンサーの前で、手を振り、上下左右に振った方向の LED を点灯させ、動作確認とします。

ここで作るのは次の通り。

動作している様子は次の通りです。

利用しているジェスチャ・センサーは APDS-9960。GY-9960LLC というモジュールで利用しています。

ピンアウトは写真の通り、電源 (VIN, GND)、I2C インターフェイス (SCL, SDA) 及び割込みピンです。

I2C インターフェイスは Arduino Uno では A4 (SDA) と A5 (SCL)。Arduino Mega であれば 20 (SDA) と 21 (SCL) になります。

I2C なので 10kΩ 位の抵抗でプルアップします。

APDS-9960 は 3V 動作です。最大入力電圧 3.8V です。今回は Arduino Uno (クローン) を利用しているので、双方向レベルシフター (Bi-directional Level Shifter) が必要でした。

レベルシフターは 3.3V 側、5V 側、それぞれに電源を接続し、レベルシフトする線同士を同じチャネルに接続するだけです。

割込みピンは Arduino Uno では D2 (割込み番号 0) です。詳しくは 「割込みと ISR」をみてください。

また、LED 点灯については電流制限抵抗として 220Ω としました。

以上をまとめると、次のようになります。

Arduino スケッチ: APDS-9960

ここでは Sparkfun の APDS-9960 ライブラリを利用します。ライブラリマネージャから 9960 で検索して、 インストールしてください。

プログラム (スケッチ) は次の通りです。

#include <Wire.h>
#include <SparkFun_APDS9960.h>

const int APDS9960_INT = 2;
const int PIN_LED_RIGHT = 8;
const int PIN_LED_LEFT = 9;
const int PIN_LED_UP = 10;
const int PIN_LED_DOWN = 11;

SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;

void setup() {

  Serial.begin(9600);
  
  pinMode(APDS9960_INT, INPUT);
  
  pinMode( PIN_LED_RIGHT, OUTPUT );
  pinMode( PIN_LED_LEFT, OUTPUT );
  pinMode( PIN_LED_UP, OUTPUT );
  pinMode( PIN_LED_DOWN, OUTPUT );

  digitalWrite( PIN_LED_RIGHT, LOW );
  digitalWrite( PIN_LED_LEFT, LOW );
  digitalWrite( PIN_LED_UP, LOW );
  digitalWrite( PIN_LED_DOWN, LOW );
  
  attachInterrupt(
    digitalPinToInterrupt(APDS9960_INT),
    interruptRoutine, 
    FALLING);

  if ( !apds.init() ) {
    Serial.println("Failed to initialize APDS-9960.");
  }
  
  if ( !apds.enableGestureSensor(true) ) {
    Serial.println("Could not start APDS-9960.");
  }
}

void loop() {
  if( isr_flag == 1 ) {
    detachInterrupt(0);
    handleGesture();
    isr_flag = 0;
    attachInterrupt(0, interruptRoutine, FALLING);
  }
}

void interruptRoutine() {
  isr_flag = 1;
}

void handleGesture() {
    if ( apds.isGestureAvailable() ) {
    switch ( apds.readGesture() ) {
      case DIR_UP:
        turnOnLED( PIN_LED_UP );
        break;
      case DIR_DOWN:
        turnOnLED( PIN_LED_DOWN );
        break;
      case DIR_LEFT:
        turnOnLED( PIN_LED_LEFT );
        break;
      case DIR_RIGHT:
        turnOnLED( PIN_LED_RIGHT );
        break;
    }
  }
}

void turnOnLED( int ledPin ){
  digitalWrite( ledPin, HIGH );
  delay( 1000 );
  digitalWrite( ledPin, LOW );
}

うまくいくと、上に示した動画の通り、手を振った方向の LED が点灯するはずです。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 基礎からの IoT 入門