M5StackToio はソニー・インタラクティブエンタテインメント社の「toio コア キューブ」を操作するための M5Stack 用 Arduino ライブラリです。
- 1. 開発環境セットアップ
- 2. M5StackToio のインストール
- 3. 使い方
- 4.
Toio
オブジェクト - 5.
ToioCore
オブジェクトgetAddress()
メソッド (アドレス取得)getName()
メソッド (デバイス名取得)connect()
メソッド (BLE 接続)disconnect()
メソッド (BLE 切断)isConnected()
メソッド (接続状態取得)onConnection()
メソッド (接続状態イベントのコールバックをセット)getBleProtocolVersion()
メソッド (BLE プロトコルバージョン取得)playSoundEffect()
メソッド (効果音再生)playSoundRaw()
メソッド (サウンド再生開始)stopSound()
メソッド (サウンド再生停止)turnOnLed()
メソッド (LED 点灯)turnOffLed()
メソッド (LED 消灯)getBatteryLevel()
メソッド (バッテリーレベルを取得)onBattery()
メソッド (バッテリーイベントのコールバックをセット)getButtonState()
メソッド (ボタンの状態を取得)onButton()
メソッド (ボタンイベントのコールバックをセット)getMotion()
メソッド (モーションセンサーの状態を取得)onMotion()
メソッド (モーションセンサーのコールバックをセット)controlMotor()
メソッド (モーター制御)drive()
メソッド (運転)
- 6. サンプルスケッチ
- リリースノート
- リファレンス
- ライセンス
本ライブラリーを利用するにあたり M5Stack 開発環境が必要です。M5Stack の公式サイト (英語) に記載された手順に従って開発環境をセットアップしてください。
USB ドライバーのインストール、Arduino-IDE のインストール、Boards Manager の設定、ボードのインストール、ボードの選択、M5Stack Library のインストールが必要となります。
本ページの右上の Code
ボタンをクリックし Download ZIP
を選択し、本ライブラリの zip ファイルをダウンロードしてください。
Arduino IDE を起動し、メニューバーの スケッチ
-> ライブラリをインクルード
-> .ZIP形式のライブラリをインストール...
を選択してください。先ほどダウンロードした本ライブラリの zip ファイルを選択すると、本ライブラリのインストールが完了します。
もし git コマンドが利用できるのであれば、次のようにインストールすることも可能です。以下は Windows10 の PowerShell を使った場合の例です。
cd ~
cd Documents\Arduino\libraries
git clone https://github.com/futomi/M5StackToio.git
以下のサンプルコードは、toio コア キューブをスキャンし、最初に発見した toio コア キューブに接続し、3 秒後に切断します。
#include <M5Stack.h>
#include <Toio.h>
// Toio オブジェクト生成
Toio toio;
void setup() {
// M5Stack の初期化
M5.begin();
M5.Power.begin();
M5.Lcd.clear();
Serial.println("- toio コア キューブをスキャンします。");
std::vector<ToioCore*> toiocore_list = toio.scan(3);
size_t n = toiocore_list.size();
if (n == 0) {
Serial.println("- toio コア キューブが見つかりませんでした。");
return;
}
Serial.printf("- %d 個の toio コア キューブが見つかりました。\n", n);
Serial.println("- toio コア キューブに BLE 接続します。");
ToioCore* toiocore = toiocore_list.at(0);
bool connected = toiocore->connect();
if (!connected) {
Serial.println("- BLE 接続に失敗しました。");
return;
}
Serial.println("- BLE 接続に成功しました。");
Serial.println("- 3 秒後に切断します。");
delay(3000);
toiocore->disconnect();
Serial.println("- BLE コネクションを切断しました。");
}
void loop() {
}
上記サンプルコードを実行する前に、toio コア キューブの電源を入れてください。実行に成功すれば、Arduino IDE のシリアルモニタに次の結果が表示されます。
- toio コア キューブをスキャンします。
- 1 個の toio コア キューブが見つかりました。
- toio コア キューブに BLE 接続します。
- BLE 接続に成功しました。
- 3 秒後に切断します。
- BLE コネクションを切断しました。
上記のサンプルコードを以下に解説します。
以下の通り、.ino
ファイルの先頭で、M5Stack.h
に加え、本ライブラリのヘッダファイル Toio.h
をインクルードしてください。
#include <M5Stack.h>
#include <Toio.h>
次に、グローバル変数として、Toio
オブジェクトを生成します。以下は変数 toio
に Toio
オブジェクトを格納しています。
Toio toio;
以降は .ino
ファイルの setup()
関数の中で実行します。
toio コア キューブを発見するには、Toio
オブジェクトの scan()
メソッドを実行します。scan()
メソッドにはスキャン秒数を指定します。指定しなければ 3 秒間スキャンを行います。
std::vector<ToioCore*> toiocore_list = toio.scan(3);
scan()
メソッドは、指定秒数だけスキャンを実行してから、発見された toio コア キューブのリストを返します。リストの型は std::vector
です。個々の toio コア キューブを表すオブジェクトの型は ToioCore
オブジェクトのポインタです。この ToioCore
オブジェクトを使って、該当の toio コア キューブを操作します。
次の処理に移る前に、発見された toio コア キューブの数をチェックします。
size_t n = toiocore_list.size();
if(n == 0) {
Serial.println("toio コア キューブが見つかりませんでした。");
return;
}
ToioCore* toiocore = toiocore_list.at(0);
上記コードでは、最初に見つかった toio コア キューブを表す ToioCore
オブジェクトのポインタを、変数 toiocore
に格納しています。
発見した toio コア キューブに BLE 接続するには、該当の toio コア キューブを表す ToioCore
オブジェクトのポインタから connect()
メソッドを呼び出します。
bool connected = toiocore->connect();
if(!connected) {
Serial.println("BLE 接続に失敗しました。");
return;
}
connect()
メソッドは BLE 接続が完了すると true
を返します。この戻り値をチェックしてください。
toio コア キューブに BLE 接続できたら、以降で解説する toioCore
オブジェクトのメソッドをポインタ経由で呼び出して toio コア キューブを操作します。
BLE 接続した toio コア キューブを切断するには、ToioCore
オブジェクトのポインタから disconnect()
メソッドを呼び出します。
toiocore->disconnect();
Toio
オブジェクトは次のように生成します。以下のコードでは、変数 toio
に Toio
オブジェクトが格納されます。
Toio toio;
以降、変数 toio
に Toio
オブジェクトが格納されているとして解説します。
scan()
メソッドは指定秒数だけ toio コア キューブをスキャンします。
std::vector<ToioCore*> scan(uint8_t duration);
No. | 変数名 | 型 | 必須 | 説明 |
---|---|---|---|---|
1 | duration |
uint8_t |
スキャン秒数 (デフォルト値: 3) |
std::vector<ToioCore*> toiocore_list = toio.scan(3);
loop()
メソッドはイベント処理を実行します。後述のイベントハンドラ設定関数を使う場合は、.ino
ファイルの loop()
メソッド内で必ず呼び出してください。
void loop();
なし
void loop() {
M5.update();
toio.loop();
...
}
前述の通り、発見した toio コア キューブを操作するには、toioCore
オブジェクトのメソッドをポインタ経由で呼び出します。以下、toioCore
オブジェクトに実装されたメソッドを説明します。以降、変数 toiocore
が toioCore
オブジェクトのポインタとします。
toio コア キューブの MAC アドレスを返します。
std::string getAddress();
なし
std::string mac = toiocore->getAddress();
Serial.println(mac.c_str()); // 例 "d1:52:fa:d2:c6:a1"
toio コア キューブのデバイス名を返します。デバイス名は、toio コア キューブがアドバタイジングパケットにセットした localName
の値です。通常は "toio Core Cube"
固定です。
std::string getName();
なし
std::string name = toiocore->getName();
Serial.println(name.c_str()); // 例 "toio Core Cube"
toio コア キューブに BLE 接続を行います。
bool connect();
なし
bool connected = toiocore->connect();
if (!connected) {
Serial.println("- BLE 接続に失敗しました。");
return;
}
toio コア キューブとの BLE コネクションを切断します。
void disconnect();
なし
toiocore->disconnect();
toio コア キューブとの BLE 接続状態を返します。接続中であれば true
を、切断中であれば false
を返します。
bool isConnected();
なし
if(toiocore->isConnected()) {
Serial.println("接続中");
} else {
Serial.println("切断中");
}
toio コア キューブとの BLE 接続状態イベントのコールバックをセットします。BLE 接続状態に変化があれば、引数に指定したコールバック関数を呼び出します。コールバック関数には接続状態を表す bool 値が引き渡されます。
typedef std::function<void(bool connected)> OnConnectionCallback;
void onConnection(OnConnectionCallback cb);
No. | 変数名 | 型 | 必須 | 説明 |
---|---|---|---|---|
1 | cb |
OnConnectionCallback |
✔ | コールバック関数 |
以下のサンプルスケッチは、10 秒おきに BLE 接続と切断を繰り返します。コールバック関数により、接続状態のイベントが発生すると、その状態を出力します。
コールバックを使う場合は、.ino
ファイルの loop()
関数内で Toio
オブジェクトの loop()
メソッドを呼び出してください。コールバックは、.ino
ファイルの loop()
関数が実行が開始されてから発生したイベントしかハンドリングできませんので注意してください。そのため、以下のサンプルスケッチでは、loop()
関数内で BLE 接続と切断を行っています。
#include <M5Stack.h>
#include <Toio.h>
// Toio オブジェクト生成
Toio toio;
// ToioCore オブジェクトのポインタ
ToioCore* toiocore = nullptr;
// BLE 接続・切断のタイムスタンプ
unsigned long conn_time = millis();
void setup() {
// M5Stack の初期化
M5.begin();
M5.Power.begin();
// toio コア キューブのスキャン開始
std::vector<ToioCore*> toiocore_list = toio.scan(3);
if (toiocore_list.size() > 0) {
toiocore = toiocore_list.at(0);
}
// BLE 接続状態イベントのコールバックをセット
toiocore->onConnection([](bool state) {
Serial.println(state ? "接続" : "切断");
});
}
void loop() {
// コールバックを使う場合には必ず Toio オブジェクトの loop() を呼び出す
toio.loop();
if (toiocore) {
// 10 秒おきに BLE 接続・切断を繰り返す
unsigned long now = millis();
if (now - conn_time >= 10000) {
if (toiocore->isConnected()) {
toiocore->disconnect();
} else {
toiocore->connect();
}
conn_time = now;
}
}
}
toio コア キューブの BLE プロトコルバージョンを取得します。
std::string getBleProtocolVersion();
なし
std::string ble_ver = toiocore->getBleProtocolVersion();
Serial.println(ble_ver.c_str()); // 例 "2.1.0"
toio コア キューブにプリセットされた効果音を再生します。
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 |
toiocore->playSoundEffect(3);
toio コア キューブの通信仕様で定義された生データを、サウンドの Characteristic に書き込みます。主に MIDI データを再生するために使います。詳細は toio コア キューブのサウンドの仕様を参照してください。
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
};
toiocore->playSoundRaw(charumera_data, 39);
サウンド再生を停止します。
void stopSound();
なし
toiocore->stopSound();
toio コア キューブの LED を点灯します。
void turnOnLed(uint8_t r, uint8_t g, uint8_t b);
No. | 変数名 | 型 | 必須 | 説明 |
---|---|---|---|---|
1 | r |
uint8_t |
✔ | 赤コンポーネント (0 ~ 255 ) |
2 | g |
uint8_t |
✔ | 緑コンポーネント (0 ~ 255 ) |
2 | b |
uint8_t |
✔ | 青コンポーネント (0 ~ 255 ) |
toiocore->turnOnLed(0xff, 0xff, 0x00); // 黄色で点灯
※ 黒 (0x00, 0x00, 0x00
) を指定すると消灯になります。
toio コア キューブの LED を消灯します。
void turnOffLed();
なし
toiocore->turnOffLed();
toio コア キューブのバッテリーレベル (%) を取得します。
uint8_t getBatteryLevel();
なし
uint8_t batt_level = toiocore->getBatteryLevel();
Serial.printf("%d パーセント\n", batt_level);
toio コア キューブのバッテリーイベントのコールバックをセットします。5 秒間隔で引数に指定したコールバック関数を呼び出します。コールバック関数にはバッテリーレベル (パーセント) が引き渡されます。
typedef std::function<void(uint8_t level)> OnBatteryCallback;
void onBattery(OnBatteryCallback cb);
No. | 変数名 | 型 | 必須 | 説明 |
---|---|---|---|---|
1 | cb |
OnBatteryCallback |
✔ | コールバック関数 |
以下のサンプルスケッチは、バッテリーイベントを受信する都度、バッテリーレベルを出力します。
コールバックを使う場合は、.ino
ファイルの loop()
関数内で Toio
オブジェクトの loop()
メソッドを呼び出してください。コールバックは、.ino
ファイルの loop()
関数が実行が開始されてから発生したイベントしかハンドリングできませんので注意してください。
#include <M5Stack.h>
#include <Toio.h>
// Toio オブジェクト生成
Toio toio;
void setup() {
// M5Stack の初期化
M5.begin();
M5.Power.begin();
// toio コア キューブのスキャン開始
std::vector<ToioCore*> toiocore_list = toio.scan(3);
if (toiocore_list.size() == 0) {
return;
}
ToioCore* toiocore = toiocore_list.at(0);
// BLE 接続
toiocore->connect();
// バッテリーイベントのコールバックをセット
toiocore->onBattery([](uint8_t level) {
Serial.printf("%d パーセント\n", level);
});
}
void loop() {
// コールバックを使う場合には必ず Toio オブジェクトの loop() を呼び出す
toio.loop();
}
toio コア キューブ裏面のボタン (LED と同じ) の押下状態を取得します。押した状態なら true
を、そうでなければ false
を返します。
bool getButtonState();
なし
if(toiocore->getButtonState()) {
Serial.println("ボタンが押されています。");
} else {
Serial.println("ボタンは押されていません。");
}
toio コア キューブのボタン押下イベントのコールバックをセットします。ボタン押下状態に変化があれば、引数に指定したコールバック関数を呼び出します。コールバック関数にはボタン押下状態を表す bool 値が引き渡されます。
typedef std::function<void(bool state)> OnButtonCallback;
void onButton(OnButtonCallback cb);
No. | 変数名 | 型 | 必須 | 説明 |
---|---|---|---|---|
1 | cb |
OnButtonCallback |
✔ | コールバック関数 |
以下のサンプルスケッチは、ボタン押下状態に変化があると、その都度、その状態を出力します。
コールバックを使う場合は、.ino
ファイルの loop()
関数内で Toio
オブジェクトの loop()
メソッドを呼び出してください。コールバックは、.ino
ファイルの loop()
関数が実行が開始されてから発生したイベントしかハンドリングできませんので注意してください。
#include <M5Stack.h>
#include <Toio.h>
// Toio オブジェクト生成
Toio toio;
void setup() {
// M5Stack の初期化
M5.begin();
M5.Power.begin();
// toio コア キューブのスキャン開始
std::vector<ToioCore*> toiocore_list = toio.scan(3);
if (toiocore_list.size() == 0) {
return;
}
ToioCore* toiocore = toiocore_list.at(0);
// BLE 接続
toiocore->connect();
// ボタン押下状態イベントのコールバックをセット
toiocore->onButton([](bool state) {
Serial.println(state ? "ボタン押下" : "ボタン解除");
});
}
void loop() {
// コールバックを使う場合には必ず Toio オブジェクトの loop() を呼び出す
toio.loop();
}
toio コア キューブのモーションセンサーの状態を取得します。
struct ToioCoreMotionData {
bool flat;
bool clash;
bool dtap;
uint8_t attitude;
};
ToioCoreMotionData getMotion();
なし
ToioCoreMotionData
型の構造体が返されます。各メンバーの意味は以下の通りです。
名前 | 型 | 説明 |
---|---|---|
flat |
bool |
水平検出 (true : 水平, false : 水平でない) |
clash |
bool |
衝突検出 (true : あり, false : なし) |
dtap |
bool |
ダブルタップ検出 (true : あり, false : なし) |
attitude |
uint8_t |
姿勢検出 (後述) |
姿勢検出 attitude
が取る値とその意味は以下の通りです。
値 | toio コア キューブの姿勢 |
---|---|
1 |
天面が上 |
2 |
底面が上 |
3 |
背面が上 |
4 |
正面が上 |
5 |
右側面が上 |
6 |
左側面が上 |
姿勢検出の詳細は toio コア キューブ技術仕様をご覧ください。
ToioCoreMotionData motion = toiocore->getMotion();
Serial.println("- 水平検出: " + String(motion.flat ? "水平" : "水平でない"));
Serial.println("- 衝突検出: " + String(motion.clash ? "あり" : "なし"));
Serial.println("- ダブルタップ検出: " + String(motion.dtap ? "あり" : "なし"));
Serial.println("- 姿勢検出: " + String(motion.attitude));
toio コア キューブのモーションイベントのコールバックをセットします。モーションに変化があれば、引数に指定したコールバック関数を呼び出します。コールバック関数にはモーションを表す構造体が引き渡されます。
struct ToioCoreMotionData {
bool flat;
bool clash;
bool dtap;
uint8_t attitude;
};
typedef std::function<void(ToioCoreMotionData motion)> OnMotionCallback;
void onMotion(OnMotionCallback cb);
No. | 変数名 | 型 | 必須 | 説明 |
---|---|---|---|---|
1 | cb |
OnMotionCallback |
✔ | コールバック関数 |
以下のサンプルスケッチは、モーションに変化があると、その都度、その状態を出力します。
コールバックを使う場合は、.ino
ファイルの loop()
関数内で Toio
オブジェクトの loop()
メソッドを呼び出してください。コールバックは、.ino
ファイルの loop()
関数が実行が開始されてから発生したイベントしかハンドリングできませんので注意してください。
#include <M5Stack.h>
#include <Toio.h>
// Toio オブジェクト生成
Toio toio;
void setup() {
// M5Stack の初期化
M5.begin();
M5.Power.begin();
// toio コア キューブのスキャン開始
std::vector<ToioCore*> toiocore_list = toio.scan(3);
if (toiocore_list.size() == 0) {
return;
}
ToioCore* toiocore = toiocore_list.at(0);
// BLE 接続
toiocore->connect();
// モーションイベントのコールバックをセット
toiocore->onMotion([](ToioCoreMotionData motion) {
Serial.println("------------------------------------------");
Serial.println("- 水平検出: " + String(motion.flat ? "水平" : "水平でない"));
Serial.println("- 衝突検出: " + String(motion.clash ? "あり" : "なし"));
Serial.println("- ダブルタップ検出: " + String(motion.dtap ? "あり" : "なし"));
Serial.println("- 姿勢検出: " + String(motion.attitude));
});
}
void loop() {
// コールバックを使う場合には必ず Toio オブジェクトの loop() を呼び出す
toio.loop();
}
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 |
✔ | 左モーターの速度 (0 ~ 115 ) |
3 | rdir |
bool |
✔ | 右モーターの回転方向 (true : 前進, false : 後進) |
4 | rspeed |
uint8_t |
✔ | 右モーターの速度 (0 ~ 115 ) |
5 | duration |
uint16_t |
モーターの制御時間 (ミリ秒) |
lspeed
および rspeed
の値と実際の速度の対応は、toio コア キューブ通信仕様をご覧ください。
duration
に 0
(デフォルト値) を指定すると、停止 (lspeed
, rspeed
に 0
をセット) 命令を受けるまで動き続けます。
// 右に曲がりながら進む
toiocore->controlMotor(true, 50, true, 40);
delay(5000);
// 停止
displayProgressMessage("Stopping...");
toiocore->controlMotor(true, 0, true, 0);
delay(5000);
// 2 秒間だけ左に曲がりながら進む
toiocore->controlMotor(true, 40, true, 50, 2000);
delay(5000);
ゲームパッドやジョイスティックを使うことを想定したモーター制御メソッドです。モーター制御をスロットルとステアリング操作に置き換えます。
void drive(int8_t throttle, int8_t steering);
No. | 変数名 | 型 | 必須 | 説明 |
---|---|---|---|---|
1 | throttle |
int8_t |
✔ | スロットル (-100 ~ 100 ) |
2 | steering |
int8_t |
✔ | ステアリング (-100 ~ 100 ) |
throttle
に正の値を指定すると前進、負の値を指定すると後進、0
を指定すると停止します。steering
に正の値を指定すると右に曲がり、負の値を指定すると左に曲がります。
steering
の絶対値が大きくなるにつれて、一方のモーターの回転数を緩めることで、ステアリング操作を実現しています。もし throttle
に 100
を指定し、steering
に 100
を指定すると、左モーターの速度は 100
のままに、右モーターの速度が 0
になります。つまり、右タイヤを軸に左にくるくる回ることになります。ラジコンカーのような動きを求めるなら、steering
のリミットを 50
程度に抑えておくのが良いでしょう。
// ゆっくりと左に曲がる
toiocore->drive(20, -10);
delay(5000);
// 停止
toiocore->drive(0, 0);
もし戦車のように左右のタイヤをそれぞれ反対方向に回転させて本体の中心を軸にくるくる回る動きを実現したい場合は、前述の controlMotor()
メソッドを使ってください。
本ライブラリのインストールが完了すると、Arduino IDE のメニューバーの ファイル
-> スケッチ例
の中から M5StackToio
が選択できるようになります。この中には以下の 3 つのサンプルが用意されています。いずれも M5Stack Basic および M5Stack Gray で動作します。
本ライブラリが提供するメソッドを一通り実行するスケッチです。
事前に toio コア キューブ の電源を入れてください。
M5Stack が起動すると自動的に toio コア キューブ をスキャンします。toio コア キューブ が見つかると M5Stack の画面にデバイス名と MAC アドレスが表示されます。見つからなければ、再度、M5Stack ボタンのリセットボタンを押して再起動してください。
toio コア キューブ が発見されると、自動的に BLE 接続し、一連のメソッドを順次実行しながら M5Stack の画面に結果を表示します。
一連のメソッドの実行が完了すると、自動的に BLE 接続を切断して終了します。
本ライブラリが提供するイベントをハンドリングするサンプルスケッチです。
事前に toio コア キューブ の電源を入れてください。
M5Stack が起動すると自動的に toio コア キューブ をスキャンします。toio コア キューブ が見つかると M5Stack の画面にデバイス名と MAC アドレスが表示されます。見つからなければ、再度、M5Stack ボタンのリセットボタンを押して再起動してください。
toio コア キューブ が発見された後、M5Stack の A ボタンを押すと toio コア キューブ と BLE 接続します。接続が完了すると、各種イベントを待ち受け、受信したイベント情報を M5Stack の画面に表示します。
M5Stack用ジョイスティックユニットを使って toio コア キューブを運転するサンプルスケッチです。
事前に toio コア キューブ の電源を入れてください。
M5Stack が起動すると自動的に toio コア キューブ をスキャンします。toio コア キューブ が見つかると M5Stack の画面にデバイス名と MAC アドレスが表示されます。見つからなければ、再度、M5Stack ボタンのリセットボタンを押して再起動してください。
toio コア キューブ と BLE 接続する前にジョイスティックをキャリブレーションする必要があります。M5Stack の画面上にジョイスティックの座標が表示されます。もし x と y の値が 0 でなければ、ジョイスティックの中心座標がずれています。M5Stack の C ボタンを押してキャリブレーションしてください。
toio コア キューブ が発見された後、M5Stack の A ボタンを押すと toio コア キューブ と BLE 接続します。接続が完了すると、ジョイスティックで toio コア キューブ を運転することができます。
BLE 接続中、ジョイスティックの z 軸を押すと、チャルメロが再生されます。また、M5Stack の B ボタンを押すと、toio コア キューブ の LED が白で点灯します。
- v1.0.0 (2020-07-19)
- 初版リリース
The MIT License (MIT)
Copyright (c) 2020 Futomi Hatano
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.