LoginSignup
10
7

More than 1 year has passed since last update.

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

Last updated at Posted at 2020-04-14

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

M5AtomMatrix
image.png

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

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

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

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

さらにこちらに公式ライブラリの初期バージョンが上がっていたので、こちらも試してみました。

スクリーンショット 2020-04-14 17.09.59.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の問題についてはこちらのページにあるように

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が光るようになると思います。
動画
スクリーンショット 2020-04-14 17.36.23.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等の機能も試してみましたがM5StickCそのままビルドで動作しました。
他にもいろいろ遊べそうです!

10
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
7