PlatformIOでM5Atomを動かす-ライブラリインストールから加速度取得まで

##ウチにもM5Atomが届きました！

[M5AtomMatrix](https://www.switch-science.com/catalog/6260/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/c112be6c-8c10-562f-5ab5-3b3c92ba23cf.png)

**横のボタンはリセットボタン**で、いわゆる**ボタンは画面押し**なんですね。ほー。
ちなみに**ボタンは背面側を押しても機能する**ようです。

早速PlatformIOで試してみたところ、M5StickCを指定してビルドが通りました。

```platformio.ini
[env:m5stick-c]
platform = espressif32
board = m5stick-c
framework = arduino
monitor_speed = 115200
```

##ライブラリのインストール

さらに[こちら](https://platformio.org/lib/show/3113/M5Atom/installation)に公式ライブラリの初期バージョンが上がっていたので、こちらも試してみました。

![スクリーンショット 2020-04-14 17.09.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/01e518bf-5104-1942-f2d5-88906c0c3026.png)
PlatformIOのコマンドライン（一番右の[>]）を開いて

```
platformio lib install 3113
```

と入力するとM5Atomのライブラリがインストールされます。
**現時点でのライブラリバージョンは0.0.1です**

##FastLEDライブラリのインストール
そのままビルドするとエラーになりました。どうやらFaltLEDライブラリが必要のようです。
~~しかも自分の環境だと**最新版(3.3.3)でビルドするとエラーになりました**。~~
PlatformIO>Librariesでライブラリ画面に移動し、FastLEDを選択した後、~~3.2.10を選択して~~インストールしたところビルドが通るようになりました。
>*[訂正]ビルドエラーはAdafruit_NeopixelライブラリとFastLEDライブラリを#ifで切り替えようとしていたのが原因のようでした。#ifの問題については[こちら](https://community.platformio.org/t/preprocessor-ifdef-guard-and-include-not-working-as-expected/2657/2)のページにあるように*

>```platformio.ini(part)
lib_ignore = RF24_STM32
```
>*の追加で回避することができました(Macだけ？)*

![2020-04-15_132240.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/2418414b-996d-d639-b084-a28bba783ac3.png)



##加速度を取得してみる

サンプルの動作も確認できたので、ついでにサンプルに手を加えて加速度を取ってみます。

```main.cpp
#include "M5Atom.h"
#define SIG_MAX (4096)

extern const unsigned char AtomImageData[375 + 2];

uint8_t DisBuff[2 + 5 * 5 * 3];
int16_t adX,adY,adZ;

void setBuffP(uint8_t posData, uint8_t Rdata, uint8_t Gdata, uint8_t Bdata)
{
    DisBuff[2 + posData * 3 + 0] = Rdata;
    DisBuff[2 + posData * 3 + 1] = Gdata;
    DisBuff[2 + posData * 3 + 2] = Bdata;
}
void setBuff(uint8_t Rdata, uint8_t Gdata, uint8_t Bdata)
{
    for (uint8_t i = 0; i < 25; i++)
        setBuffP(i, Rdata, Gdata, Bdata);
}
void shftBuff()
{
    for (uint8_t i = 24; i > 0; i--)
    {
        for (uint8_t j = 0; j < 3; j++)
            DisBuff[2 + i * 3 + j] = DisBuff[2 + (i-1) * 3 + j];
    }
}

void setup()
{
    DisBuff[0] = 0x05;
    DisBuff[1] = 0x05;
    M5.begin(false, true, true);
    delay(10);
    M5.IMU.Init();
    setBuff(0x20, 0x20, 0x20);
    M5.dis.displaybuff(DisBuff);
}

void loop()
{
    M5.update();
    if (M5.Btn.read()==0)
    {
        M5.IMU.getAccelAdc(&adX, &adY, &adZ);
        int r = min(max((int)map(adX,-SIG_MAX,SIG_MAX,0,255),0),255);
        int g = min(max((int)map(adY,-SIG_MAX,SIG_MAX,0,255),0),255);
        int b = min(max((int)map(adZ,-SIG_MAX,SIG_MAX,0,255),0),255);
        shftBuff();
        setBuffP(0,r,g,b);
        M5.dis.displaybuff(DisBuff);
    }
    delay(20);
}
```

これで傾きに合わせてLEDが光るようになると思います。
[動画](https://youtu.be/yToRAsS_gs8)
![スクリーンショット 2020-04-14 17.36.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/7f9440c3-9a00-da99-7de4-be073e1742c4.png)


一応簡単に補足をしておきます。

```
    M5.begin(false, true, true);
```
の引数は左からSerial,I2C,Display(LED Matrix)の有効/無効フラグです。
Serial を true にすると ```Serial.println()``` 等が使えるようになります。
また、I2Cを有効にしても加速度センサーは初期化されないので(Wire.begin()が呼ばれるだけ)、

```
    M5.IMU.Init();
```
を追加で呼びます。
IMUにはこんな感じで関数が用意されています

```MPU6886.h(part)
       :
    public:
      MPU6886();
      int Init(void);
      void getAccelAdc(int16_t* ax, int16_t* ay, int16_t* az);
      void getGyroAdc(int16_t* gx, int16_t* gy, int16_t* gz);
      void getTempAdc(int16_t *t);

      void getAccelData(float* ax, float* ay, float* az);
      void getGyroData(float* gx, float* gy, float* gz);
      void getTempData(float *t);

      void SetGyroFsr(Gscale scale);
      void SetAccelFsr(Ascale scale);

      void getAhrsData(float *pitch,float *roll,float *yaw);
       :
```

ボタンは

```Button.h(part)
       :
  public:
    uint8_t read();
    uint8_t isPressed();
    uint8_t isReleased();
    uint8_t wasPressed();
    uint8_t wasReleased();
    uint8_t pressedFor(uint32_t ms);
    uint8_t releasedFor(uint32_t ms);
    uint8_t wasReleasefor(uint32_t ms);
    uint32_t lastChange();
       :
```
等が用意されています。

```
    if (M5.Btn.read()==0)
```

は```押下時が1,離している時が0です。

[Wi-Fi等の機能も試してみました](https://youtu.be/lOzZmfyr2Mg)がM5StickCそのままビルドで動作しました。
他にもいろいろ遊べそうです！