2年ちょっと前に買って、使えていなかったジェスチャーセンサーを使ってみました。

 ※この記事はこちらの記事を参考にしています。また、今回は秋月で売っているこちらのモジュールを使うことを前提にしています。


・配線
 このモジュールの動作電圧は3.0~3.6Vなので、絶対にArduinoの5V端子などから電源を供給せずに、3.3Vの電源を供給しましょう。

以下の端子同士をつなぎます。
LED -3.3V
VDD -3.3V
GND -GND
INT   -D2pin
SDA -A4pin
SCL -A5pin


・プログラム
"スケッチ"→"ライブラリをインクルード"→"ライブラリを管理"と進み、APDSと検索し下のライブラリをインクルードします。

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

// Global Variables
SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;
uint8_t proximity_data = 0;

void setup() {

  // Set interrupt pin as input
  pinMode(2, INPUT_PULLUP);

  // Initialize Serial port
  Serial.begin(19200);

  // Initialize interrupt service routine
  attachInterrupt(0, interruptRoutine, FALLING);

  // Initialize APDS-9960 (configure I2C and initial values)
  if ( apds.init() ) {
    Serial.println(F("APDS-9960 initialization complete"));
  } else {
    Serial.println(F("Something went wrong during APDS-9960 init!"));
  }

  // Start running the APDS-9960 gesture sensor engine
  if ( apds.enableGestureSensor(true) ) {
    Serial.println(F("Gesture sensor is now running"));
  } else {
    Serial.println(F("Something went wrong during gesture sensor init!"));
  }
}

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

void interruptRoutine() {
  isr_flag = 1;
}

void handleGesture() {
  if ( apds.isGestureAvailable() ) {
    Serial.print(apds.readGesture());
  }
}

・拡張
 参考元では、これをパソコンの画面上で表示するプログラムも公開されています。
 これはProcessingを使うもので、これはこのサイトからダウンロードし、zipファイルを解凍すると使えます。一応プログラムは以下の通りで動きます。
import processing.serial.*;

Serial port;
int val;
int x, y, dx, dy, c;

void setup() {
  size(800, 600);
  String arduinoPort = Serial.list()[1];
  port = new Serial(this, arduinoPort, 19200);
  background(0);
}

void draw() {
  val = 0;
  if ( port.available() > 0) {
    val = port.read();
    print(char(val));
    if (char(val) == '2') {
      x = -800; 
      y = 0;
      dx = 50; 
      dy = 0;
      c = 16;
      fill(255, 255, 0);
    } else if (char(val) == '1') {
      x = 800; 
      y = 0;
      dx = -50; 
      dy = 0;
      c = 16;
      fill(0, 0, 255);
    } else if (char(val) == '4') {
      x = 0; 
      y = -600;
      dx = 0; 
      dy = 40;
      c = 15;
      fill(255, 0, 0);
    } else if (char(val) == '3') {
      x = 0; 
      y = 600;
      dx = 0; 
      dy = -40;
      c = 15;
      fill(0, 255, 0);
    }
  }
  if (c-- > 0) {
    x = x + dx; 
    y = y + dy;
    rect(x, y, 800, 600);
  }
}


今回はこれまでです。それではまた今度。