模型レーシング用ラップカウンタ Rev.0.5
1.概要
obniz deviceは最大5つのアプリから同時接続可能である(*1)。
先のelchika obniz IoTコンテスト 模型レーシング用ラップカウンタ
模型レーシング用ラップカウンタ Rev.0
を使って遠隔地ネットワーク(*2)対戦レースを行うためのアプリを作成した。
2.ネットワーク環境
遠隔地ネットワークを再現するために2つの異なるプロバイダーを使用。
緑領域のラップカウンターと操作端末はauひかりに接続。
白領域のラップカウンターと操作端末は同領域内にある楽天モバイルルーター接続。
3.使用方法
どちらかをホストに,残りをクライアントに設定。
ホストはレース開始ボタンを押下することができる。
レース中はホストとクライアントのラップカウンタを参照表示。
規定周回数5回を先に走行したほうが勝ち。
4.技術的特徴
ホストによるレース開始通知はobniz ioポートを使用(*3)。
ホストはobniz bord 出力端子io4の値を変化させクライアントにレース開始を通知する。
クライアントはobniz bord ad4のアナログ値を読み取ってレース開始を検出する
実装例ブロックプログラム(後述)
f_host01
f_client01
f_broadcast_on
f_broadcast_off
5.動画
便宜上,フォトリフレクタ検出は指で行った。
6.課題
フォトリフレクタ検出信号を確実に取得記録するラップカウンターモジュール適用
obniz board(1Y)はラップカウンターモジュールからデータを取得する
7-2. テキスト
<script>
$("#bploading").text("RUNNING...");
(async function(){
var obniz01, vchar_obniz01, label01, label0101, detector01, label02, led0101, detector02, obniz02, led0201, led0102, vchar_obniz02, vchar_status, vnum_count01, label03, spk01, led0202, spk02, vnum_count02, led0103, led0203, btn_host01_start, vnum_count_max, obniz, btn_host01, btn_client01, vnum_btn_flag;
/**
- この関数の説明…
*/
async function f_def_obniz() {
vchar_obniz01 = '0000-0000';
vchar_obniz02 = '1111-1111';
}
/**
- この関数の説明…
*/
async function f_host01() {
await f_def_Lap();
vchar_status = '3分後にカウントダウンボタンを押してください';
await f_status();
btn_host01_start = new ObnizUI.Button('カウントダウン');
await f_led01_all_on();
while (!btn_host01_start.isClicked()) {
await ObnizUI.Util.wait(0);
}
await f_broadcast_on();
while ((await obniz01.ad4.getWait()) < 2) {
await ObnizUI.Util.wait(0);
}
await f_led01_all_on();
await f_countdown01();
await f_lapcount();
}
/**
- この関数の説明…
*/
async function f_def_Lap() {
label01 = new ObnizUI.Label('label');
label02 = new ObnizUI.Label('label');
label03 = new ObnizUI.Label('label');
label01.setText((['レース:',vnum_count_max,'周'].join('')));
await f_disp_Lap();
}
/**
- この関数の説明…
*/
async function f_status() {
label0101.setText(('状態:' + String(vchar_status)));
await _ai.say(vchar_status);
}
/**
- この関数の説明…
*/
async function f_detector() {
detector01.on();
detector02.on();
}
/**
- この関数の説明…
*/
async function f_lapcount() {
await f_detector();
vnum_count01 = -1;
vnum_count02 = -1;
while (vnum_count01 < vnum_count_max && vnum_count02 < vnum_count_max) {
await ObnizUI.Util.wait(0);
if ((await obniz01.ad2.getWait()) < 4) {
vnum_count01 = (typeof vnum_count01 == 'number' ? vnum_count01 : 0) + 1;
}
if ((await obniz02.ad2.getWait()) < 4) {
vnum_count02 = (typeof vnum_count02 == 'number' ? vnum_count02 : 0) + 1;
}
await f_disp_Lap();
}
}
/**
- この関数の説明…
*/
async function f_broadcast_on() {
obniz01.io4.output(true);
obniz02.io4.output(true);
}
/**
- この関数の説明…
*/
async function f_client01() {
await f_def_Lap();
vchar_status = 'カウントダウンが開始されるまでお待ちください';
await f_status();
await f_led02_all_on();
while ((await obniz02.ad4.getWait()) < 2) {
await ObnizUI.Util.wait(0);
}
await f_countdown02();
await f_lapcount();
}
/**
- この関数の説明…
*/
async function f_broadcast_off() {
obniz01.io4.output(false);
obniz02.io4.output(false);
}
/**
- この関数の説明…
*/
async function f_disp_Lap() {
label02.setText((['ホスト___:',vnum_count01,'周'].join('')));
label03.setText((['クライアント:',vnum_count02,'周'].join('')));
}
/**
- この関数の説明…
*/
async function f_init_obniz01() {
detector01 = obniz01.wired("LED",{"anode":0, "cathode":1});
led0101 = obniz01.wired("LED",{"anode":7, "cathode":6});
led0102 = obniz01.wired("LED",{"anode":8, "cathode":6});
led0103 = obniz01.wired("LED",{"anode":9, "cathode":6});
spk01 = obniz01.wired("Speaker",{"signal":11, "gnd":10});
}
/**
- この関数の説明…
*/
async function f_led01_all_on() {
led0101.on();
led0102.on();
led0103.on();
}
/**
- この関数の説明…
/
async function f_countdown01() {
led0101.on();
spk01.play(262);await ObnizUI.Util.wait(1500);spk01.stop();;
spk01.stop();
await obniz01.wait(500);
led0101.off();
spk01.play(262);await ObnizUI.Util.wait(1500);spk01.stop();;
spk01.stop();
await obniz01.wait(500);
led0102.off();
spk01.play(262);await ObnizUI.Util.wait(1500);spk01.stop();;
spk01.stop();
await obniz01.wait(500);
led0103.off();
spk01.play(523);await ObnizUI.Util.wait(1*500);spk01.stop();;
spk01.stop();
}
/**
- この関数の説明…
*/
async function f_led01_all_off() {
led0101.off();
led0102.off();
led0103.off();
}
/**
- この関数の説明…
*/
async function f_init_obniz02() {
detector02 = obniz02.wired("LED",{"anode":0, "cathode":1});
led0201 = obniz02.wired("LED",{"anode":7, "cathode":6});
led0202 = obniz02.wired("LED",{"anode":8, "cathode":6});
led0203 = obniz02.wired("LED",{"anode":9, "cathode":6});
spk02 = obniz02.wired("Speaker",{"signal":11, "gnd":10});
}
/**
- この関数の説明…
*/
async function f_led02_all_on() {
led0201.on();
led0202.on();
led0203.on();
}
/**
- この関数の説明…
/
async function f_countdown02() {
led0102.on();
spk02.play(262);await ObnizUI.Util.wait(1500);spk02.stop();;
spk02.stop();
await obniz02.wait(500);
led0201.off();
spk02.play(262);await ObnizUI.Util.wait(1500);spk02.stop();;
spk02.stop();
await obniz02.wait(500);
led0202.off();
spk02.play(262);await ObnizUI.Util.wait(1500);spk02.stop();;
spk02.stop();
await obniz02.wait(500);
led0203.off();
spk02.play(523);await ObnizUI.Util.wait(1*500);spk02.stop();;
spk02.stop();
}
/**
- この関数の説明…
*/
async function f_led02_all_off() {
led0201.off();
led0202.off();
led0203.off();
}
obniz01 = new Obniz('OBNIZ_ID_HERE');
await obniz01.connectWait();
await f_def_obniz();
obniz01 = new Obniz(vchar_obniz01);
await obniz01.connectWait();
obniz02 = new Obniz(vchar_obniz02);
await obniz02.connectWait();
await f_init_obniz01();
await f_init_obniz02();
await f_broadcast_off();
label0101 = new ObnizUI.Label('label');
vchar_status = 'ホストまたはクライアントを選択してください';
await f_status();
btn_host01 = new ObnizUI.Button('ホスト');
btn_client01 = new ObnizUI.Button('クライアント');
vnum_count_max = 5;
vnum_btn_flag = 'false';
while (vnum_btn_flag == 'false') {
await ObnizUI.Util.wait(0);
if (btn_host01.isClicked()) {
vchar_status = 'ホストが選択されました';
await f_status();
await f_host01();
vnum_btn_flag = 'true';
} else if (btn_client01.isClicked()) {
vchar_status = 'クライアントが選択されました';
await f_status();
await f_client01();
vnum_btn_flag = 'true';
}
}
if (vnum_count01 > vnum_count02) {
vchar_status = 'ホストが勝ちました';
await f_status();
} else if (vnum_count01 < vnum_count02) {
vchar_status = 'クライアントが勝ちました';
await f_status();
} else if (vnum_count01 == vnum_count02) {
vchar_status = '同着です';
await f_status();
}
await obniz.wait(5000);
vchar_status = 'レース終了';
await f_status();
'-';
})();
</script>
8.参考資料
*1 obniz複数プログラムからの接続
*2 obnizローカルコネクト
*3 obniz Forum io.outputのpinの状態取得
投稿者の人気記事
-
neorobohon
さんが
2021/05/20
に
編集
をしました。
(メッセージ: 初版)
-
neorobohon
さんが
2021/05/20
に
編集
をしました。
ログインしてコメントを投稿する