M5Stack Core2 のバイブレーションモーターを動かしてみる


M5Stack Core2にはバイブレーションモーターが搭載されていますが、Arduino IDEでどのようにコーディングすればバイブレーションできるようになるのか知りたかったため、公式リポジトリのソースコードを見てちょっとだけ調べたことをメモします。

とりあえずバイブレーションを試すには

AXP192クラスのSetLDOEnable関数をコールすることで、バイブレーションの開始 or 終了を指定できます。

サンプルコード

下記のvibration関数のようにバイブレーション開始から終了までをワンセットにした関数を定義しておくと、ボタン押下のタイミングに合わせて振動フィードバックしたいときなどにその関数1つ呼び出すだけで済むようになるので便利です。

#include <M5Core2.h>
#include <AXP192.h>

AXP192 power;

// バイブレーション実行関数
void vibration() {
  power.SetLDOEnable(3, true);  // 3番をtrueにしてバイブレーション開始
  delay(100);                   // バイブレーションの長さ(ms)はお好みで調整
  power.SetLDOEnable(3, false); // 3番をfalseにしてバイブレーション修了
}

void loop() {
  // vibration(); // バイブレーションしたいときに呼び出すだけ
  delay(1000);
}

参照しました

M5Core2公式リポジトリ(GitHub)

公式リポジトリのReadme(PinMap)を見ると、バイブレーションモーターの電源とAXPのLDO 3番pinとがマッピングされていることが示されています。

AXP192クラスのSetLDOEnable関数の中身を見ると、第一引数にAXPのLDO番号(2または3)を、第二引数に希望する状態(true/false)を指定することで制御できる作りになっていました。
前述のサンプルコードは、必要なパラメータを指定してこの関数を呼び出しただけに過ぎません。

公式リポジトリ(M5Core2ライブラリ)のコード

M5Core2/src/AXP192.cpp
void AXP192::SetLDOEnable(uint8_t number, bool state)
{
    uint8_t mark = 0x01;
    if ((number < 2) || (number > 3))
        return;

    mark <<= number;
    if (state)
    {
        Write1Byte(0x12, (Read8bit(0x12) | mark));
    }
    else
    {
        Write1Byte(0x12, (Read8bit(0x12) & (~mark)));
    }
}