M5Stackでジェスチャーセンサー(Grove - Gesture(PAJ7620U2))を使ってみた。

##やってみたこと
M5stackとGrove - Gesture(PAJ7620U2)を使って簡単なジェスチャー認識をやってみました。
使用したのはM5stack Basic。環境はArduinoIDEです。

![400px-Gesture_sensor_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309045/42b701dc-c50f-efec-6258-e94eef4459ce.png)

##コードを書くまでにやること
まず下記のGithubからライブラリーをZIPでダウンロードします。
https://github.com/Seeed-Studio/Gesture_PAJ7620

次にArduino IDEを立ち上げてダウンロードしたZIPファイルをインクルードします。
<img width="544" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309045/8edf7714-5948-6752-3680-dbc4b1de0478.png">


##プログラム
下記のコードをIDEにコピーしてアップロードします。
このコードはジェスチャーセンサーから受け取る、
上・下・右・左・時計回り・反時計回り・手を振るに合わせてM5Stackの画面の色を変更するプログラムになっています。

```ino:PAJ7620U2.ino

#include <M5Stack.h>
#include <Wire.h>
#include "paj7620.h"

#define GES_REACTION_TIME       500             // You can adjust the reaction time according to the actual circumstance.
#define GES_ENTRY_TIME          800             // When you want to recognize the Forward/Backward gestures, your gestures' reaction time must less than GES_ENTRY_TIME(0.8s). 
#define GES_QUIT_TIME           1000

void up()
{
    M5.Lcd.clear(BLACK);
    M5.Lcd.drawString("UP",0,0,4);  
}

void down()
{
    M5.Lcd.clear(BLACK);
    M5.Lcd.drawString("DOWN",0,0,4);  
}

void left()
{
    M5.Lcd.clear(RED);
    M5.Lcd.drawString("LEFT",0,0,4);  
}

void right()
{
    M5.Lcd.clear(RED);
    M5.Lcd.drawString("RIGHT",0,0,4);  
}

void forward()
{
    M5.Lcd.clear(GREEN);
    M5.Lcd.drawString("FORWARD",0,0,4);
}

void backward()
{
    M5.Lcd.clear(GREEN);
    M5.Lcd.drawString("BACKWARD",0,0,4);
}

void clockwise()
{
    M5.Lcd.clear(BLUE);
    M5.Lcd.drawString("CLOCKWISE",0,0,4);
}

void anti_clockwise()
{
    M5.Lcd.clear(BLUE);
    M5.Lcd.drawString("ANTI-CLOCKWISE",0,0,4);
}

void wave()
{
    M5.Lcd.clear(WHITE);
    M5.Lcd.drawString("WAVE",0,0,4);
}

void setup()
{
    M5.begin();
    uint8_t error = 0;

    error = paj7620Init();          // initialize Paj7620 registers
    if (error) 
    {
        M5.Lcd.print("INIT ERROR,CODE:");
        M5.Lcd.println(error);
    }
    else
    {
        M5.Lcd.drawString("INIT OK",0,0,4);
    };
}

void loop()
{
    uint8_t data = 0, data1 = 0, error;

    error = paj7620ReadReg(0x43, 1, &data);             // Read Bank_0_Reg_0x43/0x44 for gesture result.
    if (!error) 
    {
        switch (data)                                   // When different gestures be detected, the variable 'data' will be set to different values by paj7620ReadReg(0x43, 1, &data).
        {
            case GES_RIGHT_FLAG:
                delay(GES_ENTRY_TIME);
                paj7620ReadReg(0x43, 1, &data);
                if(data == GES_FORWARD_FLAG) 
                {
                    forward();
                    delay(GES_QUIT_TIME);
                }
                else if(data == GES_BACKWARD_FLAG) 
                {
                    backward();
                    delay(GES_QUIT_TIME);
                }
                else
                {
                    right();
                }          
                break;
            case GES_LEFT_FLAG: 
                delay(GES_ENTRY_TIME);
                paj7620ReadReg(0x43, 1, &data);
                if(data == GES_FORWARD_FLAG) 
                {
                    forward();
                    delay(GES_QUIT_TIME);
                }
                else if(data == GES_BACKWARD_FLAG) 
                {
                    backward();
                    delay(GES_QUIT_TIME);
                }
                else
                {
                    left();
                }          
                break;
            case GES_UP_FLAG:
                delay(GES_ENTRY_TIME);
                paj7620ReadReg(0x43, 1, &data);
                if(data == GES_FORWARD_FLAG) 
                {
                    forward();
                    delay(GES_QUIT_TIME);
                }
                else if(data == GES_BACKWARD_FLAG) 
                {
                    backward();
                    delay(GES_QUIT_TIME);
                }
                else
                {
                    up();
                }          
                break;
            case GES_DOWN_FLAG:
                delay(GES_ENTRY_TIME);
                paj7620ReadReg(0x43, 1, &data);
                if(data == GES_FORWARD_FLAG) 
                {
                    forward();
                    delay(GES_QUIT_TIME);
                }
                else if(data == GES_BACKWARD_FLAG) 
                {
                    backward();
                    delay(GES_QUIT_TIME);
                }
                else
                {
                    down();
                }          
                break;
            case GES_FORWARD_FLAG:
                forward();
                delay(GES_QUIT_TIME);
                break;
            case GES_BACKWARD_FLAG:       
                backward();
                delay(GES_QUIT_TIME);
                break;
            case GES_CLOCKWISE_FLAG:
                clockwise();
                break;
            case GES_COUNT_CLOCKWISE_FLAG:
                anti_clockwise();
                break;  
            default:
                paj7620ReadReg(0x44, 1, &data1);
                if (data1 == GES_WAVE_FLAG) 
                {
                    wave();
                }
                break;
        }
    }
    delay(100);
}
```

##接続

接続はGroveなので簡単です！
![P_20191222_205650.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309045/ac7b0b13-2c19-6668-7cc1-c9742f96cc65.jpeg)

##動作確認
だいぶ前に動かしたときの動画です。(記事にするまでが長かった・・・)
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">モーションセンサーを使って指の動きを簡単に取れた！色々使えそう！<a href="https://twitter.com/hashtag/M5Stack?src=hash&amp;ref_src=twsrc%5Etfw">#M5Stack</a> <a href="https://t.co/E5GJPDOPXy">pic.twitter.com/E5GJPDOPXy</a></p>&mdash; mono_shobel (@MonoShobel) <a href="https://twitter.com/MonoShobel/status/1162112246786342912?ref_src=twsrc%5Etfw">August 15, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

##終わりに
このセンサーを使えば色々面白そうなことができるなと思っています。
次はこのセンサーを使って何かを操作してみます。