Nano 33 BLE Senseでジェスチャー認識

Nano 33 BLE Senseの内蔵ジェスチャーセンサーを用いて、内蔵RGB LEDを制御する方法を学びます。


AUTHOR: Nefeli Alushi、LAST REVISION: 2023/02/20 18:07


このチュートリアルでは、内蔵されているAPDS9960センサーにより実現されるジェスチャー認識を行うのに、Arduino Nano 33 BLE Senseを利用します。

単純なハンドジェスチャーの方向を表示し、ボードのRGB LEDを制御するために、センサーを使います。さらに、ジェスチャーにより、RGB LEDの色を変化させるようボードをプログラムします。コードは、単純な上下左右の手ぶりを読み取ります。

目的

このプロジェクトの目的は以下の通りです。

  • APDS9960センサーがどのようなものかを学びます。
  • APDS9960ライブラリを使用します。
  • Arduino Nano 33 BLE Senseから生のセンサーデータを出力する方法を学びます。
  • ジェスチャー認識モニターを作ります。
  • ハンドジェスチャーにより、RGB LEDを制御する方法を学びます。

必要なハードウェアとソフトウェア

  • このプロジェクトでは、外部のセンサーや機器を利用しません。
  • このチュートリアルでは、ボードのプログラムを記述するのに、Arduino Create Webエディタを利用します。

APDS9960センサー

APDS9960センサーは、高度なジェスチャー検出、ジェスチャー認識、デジタル周辺光検出(ALS: Ambient Light Sense)、色検出(RGBC)を提供する多目的デバイスです。

APDSS9960センサー

APDSS9960センサー

センサーのジェスチャー検出は、4方向のフォトダイオードを利用し、内蔵LEDを光源とする反射赤外線エネルギー検出し、物理的な動作情報(速度や方向、距離など)をデジタル信号に変換します。

以下の機能を持ちます。

  • 異なる方向に反応する4つの独立したダイオード
  • 周辺光除去
  • オフセット補償
  • 赤外線LED電流用プログラマブルドライバー
  • 32個のデータセットのFIFOストレージ
  • 割り込みベースのI2Cバス通信

APDS9960センサーモジュールの詳細を知りたければ、こちらを参照してください。

ライブラリ

APDS9960ライブラリは、ボード上のセンサーを利用し、ジェスチャーや色、明るさ、近接を読み取ります。ライブラリは以下のような関数を提供します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
begin()
end()
gestureAvailable()
readGesture()
colorAvailable()
readColor()
proximityAvailable()
readProximity()
setGestureSensitivity()
setInterruptPin()
setLEDBoost()

ライブラリの各関数をさらに深く理解したい場合は、Arduinoリファレンスを参照してください。

このチュートリアルの目的のため、4つのフォトダイオードの手の動きの検出を基本に、センサー内部でミリメートルに変換した、ジェスチャーを読み取ることに焦点をあてます。

プログラム作成

  1. 設定

Arduino Webエディタを開き、Librariesタブをクリックし、APDS9960ライブラリを探します。その後、> Examplesで、GestureSensorスケッチを開きます。開いた後は、Gesture&LEDsという名前に変更します。

Webエディタでライブラリを探す

Webエディタでライブラリを探す

  1. ボードを接続する

次に、Arduino Nano 33 BLE SenseをPCに接続し、Webエディタが認識することを確認します。すると、ポートとボードが以下の図で示すように現れます。現れない場合は、指示に従いエディタがボードを認識するためのプラグインをインストールしてください。

ボードを選択する

ボードを選択する

  1. ハンドジェスチャーによる点滅パータン

ハンドジェスチャーの方向により、RGB LEDと内蔵LEDの色を変更するために、スケッチ例のコードを修正します。

Arduino_APDS9960.hライブラリをインクルードした後、setup()の最初に、指定したピン(22、23、24、LED_BUILTIN)を、出力として動作するように設定する必要があります。

1
2
3
4
5
6
7
8
//in-built LED
pinMode(LED_BUILTIN, OUTPUT);
//Red 
pinMode(LEDR, OUTPUT);
//Green 
pinMode(LEDG, OUTPUT);
//Blue
pinMode(LEDB, OUTPUT);

そして、最後に以下の行を追加して、全てのLEDをOFFする必要があります。

次に、setup()の最後で、出力(OUTPUT)として振舞うために、LEDピンを設定する必要があります。そして、以下の命令を追加して全てのLEDをオフにします。

1
2
3
4
// Turining OFF the RGB LEDs
  digitalWrite(LEDR, HIGH);
  digitalWrite(LEDG, HIGH);
  digitalWrite(LEDB, HIGH);

loop()では、if()文では、ジェスチャーセンサーが利用可能かを確認し、利用可能であれば、ジェスチャー検出を読み取ります。

次に、switch()文で、状態により実行する異なるアクションを追加します。この場合、ハンドジェスチャーの方向がこの状態を定義します。

センサーが動き(上下左右)を検出した場合に、Serial.println()とbreak;の間に、以下のコードを追加します。それぞれのswitch caseにおいて、RGB LEDの赤・青・緑と内蔵LEDのオレンジ色を点灯します。

GESTURE_UPの場合、RGB LEDを1秒間赤にします。

1
2
3
digitalWrite(LEDR, LOW);  
delay(1000);
digitalWrite(LEDR, HIGH);

GESTURE_DOWNの場合、RGB LEDを1秒間緑にします。

1
2
3
digitalWrite(LEDG, LOW);  
delay(1000);
digitalWrite(LEDG, HIGH);

GESTURE_LEFTの場合、RGB LEDを1秒間青にします。

1
2
3
digitalWrite(LEDB, LOW);  
delay(1000);
digitalWrite(LEDB, HIGH);

GESTURE_RIGHTの場合、RGB LEDを1秒間オレンジ色にします。

1
2
3
digitalWrite(LED_BUILTIN, HIGH);  
delay(1000);
digitalWrite(LED_BUILTIN, LOW);

これでコードは完成です。

  1. 完全なコード
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/*
  APDS9960 - Gesture Sensor
  This example reads gesture data from the on-board APDS9960 sensor of the
  Nano 33 BLE Sense and prints any detected gestures to the Serial Monitor.
  Gesture directions are as follows:
  - UP:    from USB connector towards antenna
  - DOWN:  from antenna towards USB connector
  - LEFT:  from analog pins side towards digital pins side
  - RIGHT: from digital pins side towards analog pins side
  The circuit:
  - Arduino Nano 33 BLE Sense
  This example code is in the public domain.
*/

#include <Arduino_APDS9960.h>

void setup() {
  Serial.begin(9600);
  //in-built LED
  pinMode(LED_BUILTIN, OUTPUT);
  //Red
  pinMode(LEDR, OUTPUT);
  //Green
  pinMode(LEDG, OUTPUT);
  //Blue
  pinMode(LEDB, OUTPUT);
  
  while (!Serial);
  if (!APDS.begin()) {
    Serial.println("Error initializing APDS9960 sensor!");
  }
  // for setGestureSensitivity(..) a value between 1 and 100 is required.
  // Higher values makes the gesture recognition more sensible but less accurate
  // (a wrong gesture may be detected). Lower values makes the gesture recognition
  // more accurate but less sensible (some gestures may be missed).
  // Default is 80
  //APDS.setGestureSensitivity(80);
  Serial.println("Detecting gestures ...");
  // Turining OFF the RGB LEDs
  digitalWrite(LEDR, HIGH);
  digitalWrite(LEDG, HIGH);
  digitalWrite(LEDB, HIGH);
}
void loop() {
  if (APDS.gestureAvailable()) {
    // a gesture was detected, read and print to serial monitor
    int gesture = APDS.readGesture();
    switch (gesture) {
      case GESTURE_UP:
        Serial.println("Detected UP gesture");
        digitalWrite(LEDR, LOW);
        delay(1000);
        digitalWrite(LEDR, HIGH);
        break;
      case GESTURE_DOWN:
        Serial.println("Detected DOWN gesture");
        digitalWrite(LEDG, LOW);
        delay(1000);
        digitalWrite(LEDG, HIGH);
        break;
      case GESTURE_LEFT:
        Serial.println("Detected LEFT gesture");
        digitalWrite(LEDB, LOW);
        delay(1000);
        digitalWrite(LEDB, HIGH);
        break;
      case GESTURE_RIGHT:
        Serial.println("Detected RIGHT gesture");
        digitalWrite(LED_BUILTIN, HIGH);
        delay(1000);
        digitalWrite(LED_BUILTIN, LOW);
        break;
      default:
        break;
    }
  }
}

テスト

ジェスチャーセンサーを起動する。

ジェスチャーセンサーを起動する。

スケッチの検証とボードへのアップロードが成功したら、左側のメニューからシリアルモニタを開きます。

コードをテストするために、立った位置であなたの前(USBポートが下にある状態)で安定させ、ボードの近くで手を上下左右に動かします。センサーが認識できるよう、動きをできるだけ明確にし、かつ、できるだけ少しだけ動かします。

ハンドジェスチャーの方向

ハンドジェスチャーの方向

スケッチが値を返す例のスクリーンショットを示します。

シリアルモニターに表示されたジェスチャー検出

シリアルモニターに表示されたジェスチャー検出

トラブルシュート

エラーが起きることもあります。コードが動作しないときはいくつかの共通の問題があり、解決できます。

  • 括弧やセミコロンが抜けている。
  • Arduinoボードが、間違ったポートに接続されている。
  • ケーブル接続の予期しない切断。

おわりに

このチュートリアルで、APDS9960センサーとは何か、Arduino Nano 33 BLE Senseボード内蔵APDS9960センサーの使い方を学びました。RGB LEDと内蔵LEDを様々な色のパターンに制御するジェスチャー検出モニターの作り方も学びました。

オリジナルのページ

https://docs.arduino.cc/tutorials/nano-33-ble-sense/gesture-sensor

最終更新日

March 6, 2023

inserted by FC2 system