ジェスチャセンサー (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 が点灯するはずです。