Skip to content

xdiversity/xMod-lib

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

48 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

xModLib

xModを操作するためのライブラリです。M5Stack,Toioと共に利用することを想定しています。 xModに関する情報はWikiをご参照ください。

関数一覧

Index

クラス名:xMod.BtnX

Xはボタンごとに異なります。

  • BtnL(xMod上側面左の物理ボタン)
  • BtnR(xMod上側面右の物理ボタン)

index

今ボタンが押されているかどうかをboolで返します。

プロトタイプ宣言

bool isPressed();

新たにボタンが押されたかどうかをboolで返します。

プロトタイプ宣言

bool wasPressed();

ボタンが押されていない状態になったかどうかをboolで返します。

プロトタイプ宣言

bool wasReleased();

ボタンが押し続けられているかどうかをboolで返します。

プロトタイプ宣言

bool isHeld();

クラス名:xMod.Mic

index

録音を開始します。事前にSDカードのマウントが必要です。指定したファイル名で保存されます。ファイル形式はwavです。

プロトタイプ宣言

void recordStart(String filename);

引数

No. 変数名 必須 説明
1 filename String 録音結果を保存する先のファイル名です。.wavの形で指定してください。デフォルトは”audio.wav"となります。

録音を終了します。recordStard()で開始された録音はこの関数によって停止されるまで続きます。

プロトタイプ宣言

void recordStop();

クラス名:xMod.WaveOut

index

スピーカー周辺機能を利用するための初期処理を行います。 このクラスを利用する際は最初に実行してください。

プロトタイプ宣言

void begin();

スピーカー周辺機能の利用を終了します。

プロトタイプ宣言

void end();

スピーカーが再生中かどうかをboolで返します。

プロトタイプ宣言

bool isPlaying();

スピーカーの音量を指定した値に調整します。

プロトタイプ宣言

void setVolume(uint8_t volume);

引数

No. 変数名 必須 説明
1 volume uint8_t ✔︎ スピーカーの音の大きさ(0-255)

スピーカーの音量の大きさを取得します。

プロトタイプ宣言

uint8_t getVolume();

スピーカーの動作を中断します。

プロトタイプ宣言

void stop();

引数

No. 変数名 必須 説明
1 channel uint8_t 動作を止めるチャンネルを指定することもできます。指定しなければ全部のチャンネルの動作を止めます。

振動数で指定した高さの音を鳴らします。鳴らせたかどうかをboolで返します。

プロトタイプ宣言

bool tone(float frequency, uint32_t duration = UINT32_MAX, int channel = -1, bool stop_current_sound = true);

引数

No. 変数名 必須 説明
1 frequency float ✔︎ 振動数
2 duration uint32_t 音を鳴らす長さ
3 channel int チャンネル
4 stop_current_sound bool すでに音が鳴っている場合に、その音を止めつつこの音を再生するかどうか

指定したwavファイルを再生します。

プロトタイプ宣言

void playWavFile(const char* filename);

引数

No. 変数名 必須 説明
1 filename const char* ✔︎ ファイル名。wavファイルを指定してください。

音の出力を行う機器をスピーカーに指定します。事前に他の指定を行なっている場合はその指定を解除してから指定を行ってください。

プロトタイプ宣言

void enable_Speaker();

スピーカーに対する音の出力を行う機器の指定を解除します。

プロトタイプ宣言

void disable_Speaker();

音の出力を行う機器を振動アクチュエータに指定します。事前に他の指定を行なっている場合はその指定を解除してから指定を行ってください。

プロトタイプ宣言

void enable_LRA();

振動アクチュエータに対する音の出力を行う機器の指定を解除します。

プロトタイプ宣言

void disable_LRA();

音の出力を行う機器をラインアウト(イヤホンジャック)に指定します。事前に他の指定を行なっている場合はその指定を解除してから指定を行ってください。

プロトタイプ宣言

void enable_LineOut();

ラインアウト(イヤホンジャック)に対する音の出力を行う機器の指定を解除します。

プロトタイプ宣言

void disable_LineOut();

クラス名:xMod.SDM

index

SDカードのマウントを行います。これを行わないとxModがSDカードを認識しません。

プロトタイプ宣言

void begin();

SDカードがマウントされているかどうかをboolで返します。

プロトタイプ宣言

bool checkSD();

クラス名:xMod.OpenAI

index

OpenAIのAPIキーを登録します。OpanAI APIに関連した機能を利用するには必須です。

プロトタイプ宣言

void SetAPIKey(String key);

引数

No. 変数名 必須 説明
1 key String ✔︎ APIキー

OpenAIのAPIキーにて利用するモデルを指定します。 デフォルトは"gpt-4o"になっています。 モデルの名前参考:https://platform.openai.com/docs/models

プロトタイプ宣言

void SetModel(String modelName);

引数

No. 変数名 必須 説明
1 modelName String ✔︎ モデルの名前。実在するモデルを指定してください。

与えられたテキストをapiを通じてモデルに送信し、返答を得ます。 利用するにはwifiの接続が必要です。

プロトタイプ宣言

String GPT(String text);

引数

No. 変数名 必須 説明
1 text String ✔︎ gptに送るメッセージ

クラス名 : xMod.Toio

index

指定されたIDのToioを探します。 IDが指定されていなければIDに関わらずToioを1つ探します。 もし見つかれば、見つかったToioの名前を返します。

プロトタイプ宣言

String searchToio();
String searchToio(String ID);

引数

No. 変数名 必須 説明
1 ID uint8_t* ToioのID

searchToio()で見つけたToioに接続します。接続結果をboolで返します。

プロトタイプ宣言

bool connect();

引数

なし

接続したToioとの通信を切断します。

プロトタイプ宣言

void disconnect();

引数

なし

Toioとの接続状況をboolで返します。

プロトタイプ宣言

bool isConnected();

引数

なし

Toioの MAC アドレスを返します。

プロトタイプ宣言

String getAddress();

引数

なし

接続しているToioの名前を取得します。

プロトタイプ宣言

String getName();

引数

なし

接続に利用しているBluetoothプロトコルのバージョンを得ます。

プロトタイプ宣言

String getBleProtocolVersion();

引数

なし

soundIDに対応した効果音を鳴らします。

プロトタイプ宣言

void playSoundEffect(uint8_t sound_id, uint8_t volume = 0xff);

引数

No. 変数名 必須 説明
1 sound_id uint8_t 効果音の ID (0 ~ 10)
2 volume uint8_t   音量 (0 ~ 255)。指定が無ければ 255。

効果音の ID の意味は以下の通りです。

効果音 ID 効果音名称
0 Enter
1 Selected
2 Cancel
3 Cursor
4 Mat in
5 Mat out
6 Get 1
7 Get 2
8 Get 3
9 Effect 1
10 Effect 2

Toioにて主に MIDI データを再生するために使います。

プロトタイプ宣言

void playSoundRaw(uint8_t* data, size_t length);

引数

No. 変数名 必須 説明
1 data uint8_t* 書き込むデータのバイト列
2 length size_t 書き込むバイト数

コードサンプル

以下のサンプルコードは、チャルメラを最大音量で再生します。

uint8_t charumera_data[39] = {
  3,             // 制御の種類 (MIDI なら `3`)
  1,             // 繰り返し回数
  12,            // Operation の数
  14,  69, 255,  // 140ms, A5
  14,  71, 255,  // 140ms, B5
  56,  73, 255,  // 560ms, C#6
  14,  71, 255,  // 140ms, B5
  14,  69, 255,  // 140ms, A5
  114, 128, 255, // 無音
  14,  69, 255,  // 140ms, A5
  14,  71, 255,  // 140ms, B5
  14,  73, 255,  // 560ms, C#6
  14,  71, 255,  // 140ms, B5
  14,  69, 255,  // 140ms, A5
  56,  71, 255   // 560ms, B5
};
xMod.Toio.playSoundRaw(charumera_data, 39);

再生中の音の再生を止めます。

プロトタイプ宣言

void stopSound();

引数

なし

Toioの背面にあるLEDを指定した色で点灯させます。

プロトタイプ宣言

void turnOnLed(uint8_t r, uint8_t g, uint8_t b);

引数

No. 変数名 必須 説明
1 r uint8_t 赤コンポーネント (0255)
2 g uint8_t 緑コンポーネント (0255)
2 b uint8_t 青コンポーネント (0255)

Toioの背面にあるLEDを消灯させます。

プロトタイプ宣言

void turnOffLed();

引数

なし

バッテリーの残量を取得します。

プロトタイプ宣言

uint8_t getBatteryLevel();

引数

なし

背面のLEDは押しボタンにもなっており、それが押されているかどうかを取得します。

プロトタイプ宣言

bool getButtonState();

引数

なし

Toioのモーションセンサーの状態を取得します。

プロトタイプ宣言

struct ToioCoreMotionData {
  bool flat;
  bool clash;
  bool dtap;
  uint8_t attitude;
  uint8_t shake;
};

ToioCoreMotionData getMotion();

引数

なし

戻値

ToioCoreMotionData 型の構造体が返されます。各メンバーの意味は以下の通りです。

名前 説明
flat bool 水平検出 (true: 水平, false: 水平でない)
clash bool 衝突検出 (true: あり, false: なし)
dtap bool ダブルタップ検出 (true: あり, false: なし)
attitude uint8_t 姿勢検出 (後述)
shake uint8_t シェイク検出 (0x00 検出なし, 0x01 ~ 0x0a 振った強さ)

姿勢検出 attitude が取る値とその意味は以下の通りです。

toio コア キューブの姿勢
1 天面が上
2 底面が上
3 背面が上
4 正面が上
5 右側面が上
6 左側面が上

姿勢検出の詳細は toio コア キューブ技術仕様をご覧ください。

コードサンプル

ToioCoreMotionData motion = xMod.Toio.getMotion();
M5.Display.printf("- 水平検出: %s\n", motion.flat ? "水平" : "水平でない");
M5.Display.printf("- 衝突検出: %s\n", motion.clash ? "あり" : "なし");
M5.Display.printf("- ダブルタップ検出: %s\n", motion.dtap ? "あり" : "なし");
M5.Display.printf("- 姿勢検出: %d\n",  motion.attitude);
M5.Display.printf("- シェイク検出: %d\n",  motion.shake);

Toioのモーターを制御します。

プロトタイプ宣言

void controlMotor(bool ldir, uint8_t lspeed, bool rdir, uint8_t rspeed, uint16_t duration = 0);

引数

No. 変数名 必須 説明
1 ldir bool 左モーターの回転方向 (true: 前進, false: 後進)
2 lspeed uint8_t 左モーターの速度 (0115)
3 rdir bool 右モーターの回転方向 (true: 前進, false: 後進)
4 rspeed uint8_t 右モーターの速度 (0115)
5 duration uint16_t   モーターの制御時間 (ミリ秒)

lspeed および rspeed の値と実際の速度の対応は、toio コア キューブ通信仕様をご覧ください。

duration0 (デフォルト値) を指定すると、停止 (lspeed, rspeed0 をセット) 命令を受けるまで動き続けます。

コードサンプル

// 右に曲がりながら進む
xMod.Toio.controlMotor(true, 50, true, 40);
delay(5000);

// 停止
xMod.Toio.controlMotor(true, 0, true, 0);
delay(5000);

// 2 秒間だけ左に曲がりながら進む
xMod.Toio.controlMotor(true, 40, true, 50, 2000);
delay(5000);

モーター制御をスロットルとステアリング操作に置き換えて行います。

プロトタイプ宣言

void drive(int8_t throttle, int8_t steering);

引数

No. 変数名 必須 説明
1 throttle int8_t スロットル (-100100)
2 steering int8_t ステアリング (-100100)

throttle に正の値を指定すると前進、負の値を指定すると後進、0 を指定すると停止します。steering に正の値を指定すると右に曲がり、負の値を指定すると左に曲がります。

コードサンプル

// ゆっくりと左に曲がる
xMod.Toio.drive(20, -10);
delay(5000);

// 停止
xMod.Toio.drive(0, 0);

目標地点を一つ指定してモーターを制御し、キューブを自律的に移動させます。

プロトタイプ宣言

void controlMotorWithTarget(uint8_t distinction, uint8_t timeout, uint8_t movement_type, 
  uint8_t maximum_speed, uint8_t speed_change_type,
  uint16_t target_x, uint16_t target_y, 
  uint16_t target_angle_degree, uint8_t target_angle_and_rotation_bits = 0);

引数

No. 変数名 必須 説明
1 distinction uint8_t 制御識別値
2 timeout uint8_t タイムアウト時間(秒)
3 movement_type uint8_t 移動タイプ (02)
4 maximum_speed uint8_t モーターの最大速度指示値 (102550)
5 speed_change_type uint8_t モーターの速度変化タイプ (03)
6 target_x uint16_t 目標地点の X 座標値(065535)
7 target_y uint16_t 目標地点の Y 座標値 (-065535)
8 target_angle_degree uint16_t 目標地点でのキューブの角度 (00x1fff)
9 target_angle_and_rotation_bits uint8_t   角度の意味と動き方の指定 (06)

コードサンプル

// 座標(150, 200)の位置、角度0の方向で止まるように速度80で移動
xMod.Toio.controlMotorWithTarget(1, 5, 0, 80, 0, 150, 200, 0);
delay(5000);

目標地点を複数指定してモーターを制御し、キューブを自律的に移動させます。

プロトタイプ宣言

struct ToioCoreTargetPos {
  uint16_t posX; // 目標地点の X 座標値
  uint16_t posY; // 目標地点の Y 座標値 
  uint16_t angleDegree:13; // 目標地点でのキューブの角度(0~0x1fff)
  uint8_t angleAndRotation:3; //角度の意味と動き方(0~6)
};

void controlMotorWithMultipleTargets(uint8_t distinction, uint8_t timeout, uint8_t movement_type, 
      uint8_t maximum_speed, uint8_t speed_change_type,  uint8_t addition_setting,
      uint8_t target_num, ToioCoreTargetPos *target_positions);

引数

No. 変数名 必須 説明
1 distinction uint8_t 制御識別値
2 timeout uint8_t タイムアウト時間(秒)
3 movement_type uint8_t 移動タイプ (02)
4 maximum_speed uint8_t モーターの最大速度指示値 (102550)
5 speed_change_type uint8_t モーターの速度変化タイプ (03)
6 addition_setting uint8_t 書き込み操作の追加設定(01)
7 target_num uint16_t ターゲット座標の数(129)
8 target_positions ToioCoreTargetPos * ターゲット座標の配列へのポインタ

コードサンプル

// 5つの目標地点を指定して移動
  ToioTargetPos pos[5];
  pos[0].x = 250;
  pos[0].y = 250;
  pos[0].angle = 0;
  pos[1].x = 250;
  pos[1].y = 300;
  pos[1].angle = 90;
  pos[2].x = 300;
  pos[2].y = 300;
  pos[2].angle = 180;
  pos[3].x = 300;
  pos[3].y = 250;
  pos[3].angle = 270;
  pos[4].x = 250;
  pos[4].y = 250;
  pos[4].angle = 0;
  xMod.Toio.controlMotorWithMultipleTargets(0, 0, 0, 50, 0, 0, 5, pos);
  delay(5000);

キューブの加速度を指定してモーターを制御します。

プロトタイプ宣言

void controlMotorWithAcceleration(uint8_t translational_speed, uint8_t acceleration,
  uint16_t rotational_velocity, uint8_t rotational_direction, uint8_t travel_direction,
  uint8_t priority, uint8_t duration);

引数

No. 変数名 必須 説明
1 translational_speed uint8_t キューブの並進速度(0255)
2 acceleration uint8_t キューブの加速度(100 ミリ秒ごとの速度の増加分 0255)
3 rotational_velocity uint16_t キューブの向きの回転速度 (度/秒 065535)
4 rotational_direction uint8_t キューブの向きの回転方向 (0 正 ~ 1 負)
5 travel_direction uint8_t キューブの進行方向 (0 前進 ~ 1 後退)
6 priority uint8_t 速度調整優先指定(0 並進優先回転調整 ~ 1 回転優先速度調整)
7 duration uint8_t 制御時間 x10 ミリ秒 0は制限なし(0255)

コードサンプル

// ゆっくり弧を描きながら 2 秒間移動します。
xMod.Toio.controlMotorWithAcceleration(50, 15, 30, 0, 0, 0, 200);
delay(5000);

Toioのプレイマット読み取りセンサーの状態を取得します。キューブがマット上にあるとき、マットからセンサーで読み取った値(ID)が取得できます。マットから読み取ることができるIDには、マット上の座標値を表すポジションIDと、キューブが乗っている領域を表すスタンダードIDがあり、どちらかの情報が返されます。

プロトタイプ宣言

struct ToioCoreIDData {
  ToioCoreIDType type; // 	情報の種類
  union {
    ToioCorePositionIDData position; // キューブの座標と角度
    ToioCoreStandardIDData standard; // キューブの下のStandard IDとキューブの角度
  };
};

struct ToioCorePositionIDData {
  uint16_t cubePosX; // 	キューブの中心の X 座標値
  uint16_t cubePosY; //   キューブの中心の Y 座標値
  uint16_t cubeAngleDegree; // キューブの角度
  uint16_t sensorPosX;  // 読み取りセンサーの X 座標値
  uint16_t sensorPosY;  // 読み取りセンサーの Y 座標値
  uint16_t sensorAngleDegree;  // 読み取りセンサーの角度
};

struct ToioCoreStandardIDData {
  uint32_t standardID;  // Standard ID の値
  uint16_t cubeAngleDegree; // キューブの角度
};

ToioCoreIDData getIDReaderData();

引数

なし

戻値

ToioCoreIDData 型の構造体が返されます。各メンバーの意味は以下の通りです。

名前 説明
type ToioCoreIDType IDタイプ (ToioCoreIDTypeNone: 読み取れなかった場合, ToioCoreIDTypePosition: ポジションIDの場合, ToioCoreIDTypeStandard: スタンダードIDの場合)
position ToioCorePositionIDData ポジションID情報
standard ToioCoreStandardIDData スタンダードID情報

type が ToioCoreIDTypePosition の場合、position 値には、ToioCorePositionIDData 型の構造体が返されます。各メンバーの意味は以下の通りです。

名前 説明
cubePosX uint16_t キューブの中心の X 座標値
cubePosY uint16_t キューブの中心の Y 座標値
cubeAngleDegree uint16_t キューブの角度(度)
sensorPosX uint16_t 読み取りセンサーの中心の X 座標値
sensorPosY uint16_t 読み取りセンサーの中心の Y 座標値
sensorAngleDegree uint16_t 読み取りセンサーの角度(度)

type が ToioCoreIDTypeStandard の場合、standard 値には、ToioCoreStandardIDData 型の構造体が返されます。各メンバーの意味は以下の通りです。

名前 説明
standardID uint32_t Standard ID の値
cubeAngleDegree uint16_t キューブの角度(度)

position および standard の値の詳細仕様は、toio コア キューブ通信仕様をご覧ください。

Standard IDの値についてはStandard ID 一覧をご覧ください。

コードサンプル

ToioCoreIDData data = toiocore->getIDReaderData();
if (data.type == ToioCoreIDTypePosition) {
  M5.Log.printf("posX: %u posY: %u angle: %u\n",
    data.position.cubePosX, data.position.cubePosY, data.position.cubeAngleDegree);
}
else if (data.type == ToioCoreIDTypeStandard) {
  M5.Log.printf("Standard ID: %u\n", data.standard.standardID);
}
else {
  M5.Log.println("no id found.");
}

参考

本ライブラリのToio関数は以下のライブラリの機能を使用しています。さらに細かい情報が必要な場合は参照してください。

https://github.com/kenichi884/M5StackToio/blob/master/README_jp.md

クラス名:xMod.MIDI

index

MIDIの利用に必要な初期処理を行います。

プロトタイプ宣言

void begin(midi::Channel inChannel = MIDI_CHANNEL_OMNI);

引数

No. 変数名 必須 説明
1 inChannel midi::Channel 起動対象のチャンネルです。指定がなければ”MIDI_CHANNEL_OMNI"となります。

MIDIの動作を終了します。

プロトタイプ宣言

void end();

MIDIの動作を有効化します。

プロトタイプ宣言

void enable_MIDI();

MIDIの動作を無効化します。

プロトタイプ宣言

void edisable_MIDI();

MIDIを入力で利用するか、出力で利用するかを指定します。

プロトタイプ宣言

enum xMod_MIDIMode {
    MIDI_MODE_IN,
    MIDI_MODE_OUT
};

void setMode(xMod_MIDIMode mode)

引数

No. 変数名 必須 説明
1 mode xMod_MIDIMode ✔︎ MIDIの入出力モード指定。入力モードなら"MIDI_MODE_IN"、出力モードなら”MIDI_MODE_OUT"を指定。

index

xModクラスに関連した初期処理を全て行います。基本的にsetup()内で実行してください。

プロトタイプ宣言

void begin();

指定されたミリ秒の分だけSDカード上に指定したファイル名で録音を行います。

プロトタイプ宣言

void recordSound(int time, String filename = "/audio.wav");

引数

No. 変数名 必須 説明
1 time int ✔︎ 録音時間(ms)
2 filename String 録音先のファイル名。wavファイルを指定してください。デフォルトは"audio.wav"です。

指定されたアクセスポイントとWifi接続を行います。接続に成功したかどうかをboolで返します。

プロトタイプ宣言

bool connectWifi(String ssid, String pass);

引数

No. 変数名 必須 説明
1 ssid String ✔︎ アクセスポイントのSSID
2 pass String アクセスポイントのパスワード

Wifiを切断します、

プロトタイプ宣言

void disconnectWifi();

デバッグモードとして文字を表示します。 指定された出力先に文字が表示されます。

プロトタイプ宣言

void DisplayDebug(const String& message);

引数

No. 変数名 必須 説明
1 message const String& ✔︎ 表示文章

デバッグモードの出力先を指定します。 出力なし、画面表示、シリアル出力があります。

プロトタイプ宣言

enum xMod_DebugMode {
    DEBUG_MODE_NONE,
    DEBUG_MODE_DISPLAY,
    DEBUG_MODE_SERIAL
};

 void setDebugMode(xMod_DebugMode mode);

引数

No. 変数名 必須 説明
1 mode xMod_DebugMode ✔︎ 表示なしなら”DEBUG_MODE_NONE”、画面表示なら”DEBUG_MODE_DISPLAY”、シリアル出力なら”DEBUG_MODE_SERIAL”

M5stack core2/s3単体で実現する機能についてはM5Unifiedライブラリ、M5GFXライブラリをそのまま利用することができます。

M5UnifiedライブラリはM5stackの機能全般を扱えるライブラリで、M5GFXライブラリは画面表示に特化したライブラリです。

詳細については以下のドキュメントを参考にしてください。

https://docs.m5stack.com/ja/arduino/m5unified/helloworld

https://github.com/m5stack/M5Unified/tree/master

いくつか使用頻度が高いものを挙げます。

ボタン

タッチパネル下部のボタンを扱います。左からボタンA、ボタンB、ボタンCという名前になっています。

それぞれM5.BtnXというクラスでアクセスすることができます。

コードサンプル

if (M5.BtnA.isPressed()){
    M5.Display.println("ボタンAが押されています");
} else {
    M5.Display.println("ボタンAは押されていません");
}

画面表示

M5GFXライブラリを用いてタッチパネル上の表示を実装することができます。

M5.Displayというクラスでアクセスすることができます。

コードサンプル

//文字出力座標を指定 左上(0,0)〜右下(320,240)
M5.Display.setCursor(0, 0);
//文章を表示
M5.Display.println("画面に文字を表示");
//(0,0)から辺の長さ100の正方形の枠を描画
M5.Display.drawRect(0, 0, 100, 100, WHITE);
//画面全体に黒で塗りつぶされた長方形を描画することで画面の削除を行う
M5.Display.fillRect(0, 0, 320, 240, BLACK);