obniz から MESH の動き(Move)ブロックの Y 軸に振られた強さを検知するメモ

obniz から MESH の動き(Move)ブロックの Y 軸に振られた強さを検知するメモです。
MESH アプリのように振られた強さによって動作を変えたい
- 動きブロックの使いかた – MESHサポート | 遊び心を形にできる、アプリとつなげるブロック形状の電子タグ
- MESH-100AC 動き(Move)ブロック - 動きがきっかけになる新しい感覚 ワイヤレス加速度センサー | ソニー
この動き(Move)ブロックは、そのままでも内蔵の判定で「振られた」が取れます。
加速度センサー振る動作とか自前でつくれなくはないですが、つくるのは大変なので、それを内蔵でやってくれるのはめっちゃいいのですが、ちょっと振られただけでも反応しちゃうんです。これをなんとかしたい。
このように MESH アプリのように振られた強さによって動作を変えたいのでやってみます。
振るときの持ち方
動きブロック (MESH-100AC) – MESH 技術ドキュメント にあるように、振られたときに、加速度センサーの値が取れます。
こちらの上面が上に向いている状態を基準にします。
手で持ったときに上面を上にしてから振ります。
縦に振って反応する軸を確認 → Y軸だった
こちらののプログラムで、振られた方向の加速度の値を見れるようにして振ってみます。
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
<script src="https://obniz.io/js/jquery-3.2.1.min.js"></script>
<script src="https://unpkg.com/obniz@3.24.0/obniz.js" crossorigin="anonymous"></script>
</head>
<body>
<h1>MESH Move</h1>
<script>
// 今回の obniz を指示するための設定
const obniz = new Obniz("OBNIZ_ID_HERE");
// 接続後、MESH と接続
obniz.onconnect = async function () {
obniz.display.clear();
obniz.display.print("[MESH Move]");
const MESH_100AC = Obniz.getPartsClass('MESH_100AC');
// BLE の初期化待ちコードを加えます
await obniz.ble.initWait();
obniz.ble.scan.onfind = async (peripheral) => {
if (!MESH_100AC.isMESHblock(peripheral)) {
return;
}
console.log('found');
obniz.display.print("found");
// Create an instance
const moveBlock = new MESH_100AC(peripheral);
// Connect to the Move block
await moveBlock.connectWait();
console.log(`connected: ${moveBlock.peripheral.localName}`);
obniz.display.print("connected");
// Shake Event
moveBlock.onShaked = (accele) => {
console.log('shaked! (ax, ay, az) = (' + accele.x + ', ' + accele.y + ',' + accele.z + ')');
};
};
// スキャンの開始待ちのコードを加えます
await obniz.ble.scan.startWait();
}
</script>
</body>
上下に振ってみると Y軸の値が強く反応しました。
これで縦に振った時に今回狙う加速度の軸が分かりました。
縦に強く振られたらを検知
振られたときの加速度センサーの強さは、-2 ~ +1.999 の値で来るようです。
ということで、何度か振って値を確認した結果「強く振られた」を 1.8 以上、-1.8 以下で判定します。
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
<script src="https://obniz.io/js/jquery-3.2.1.min.js"></script>
<script src="https://unpkg.com/obniz@3.24.0/obniz.js" crossorigin="anonymous"></script>
</head>
<body>
<h1>MESH Move</h1>
<script>
// 今回の obniz を指示するための設定
const obniz = new Obniz("OBNIZ_ID_HERE");
// 接続後、MESH と接続
obniz.onconnect = async function () {
obniz.display.clear();
obniz.display.print("[MESH Move]");
const MESH_100AC = Obniz.getPartsClass('MESH_100AC');
// BLE の初期化待ちコードを加えます
await obniz.ble.initWait();
obniz.ble.scan.onfind = async (peripheral) => {
if (!MESH_100AC.isMESHblock(peripheral)) {
return;
}
console.log('found');
obniz.display.print("found");
// Create an instance
const moveBlock = new MESH_100AC(peripheral);
// Connect to the Move block
await moveBlock.connectWait();
console.log(`connected: ${moveBlock.peripheral.localName}`);
obniz.display.print("connected");
// Shake Event
moveBlock.onShaked = (accele) => {
console.log('shaked! (ax, ay, az) = (' + accele.x + ', ' + accele.y + ',' + accele.z + ')');
const powerY = accele.y;
if( powerY > 1.8 ){
console.log('強く振られたよ! powerY > 1.8');
} else if( powerY < -1.8 ){
console.log('強く振られたよ! powerY < -1.8');
}
};
};
// スキャンの開始待ちのコードを加えます
await obniz.ble.scan.startWait();
}
</script>
</body>
このようにコードを書きました。
動かしてみたところ、そーっと弱く上下に動かした場合は反応せず、強く振った時に反応することができました。 1.8 のしきい値は、色々試してみて調整すると良さそうです。
ちなみに、何もしきい値を設定しない時の通常の「振った」判定では、X か Y か Z の軸で加速度が 1.0 以上、-1.0 以下の時に反応しているようです。それ以外の値で降りてくることがなかったので、そのように解釈してます。これだと確かに敏感に反応しすぎなので、このように調整できると、いろいろなシーンで使えそうです。