このたびobnizIoTコンテストに参加させていただきまして
obnizを入手できました、早速開始!
先ずはケース造り
本体そのままでは気を使いますし、
壊してもマズイので、ケース設計から始めました。
その経緯とサンプルを掲載します。
設計思想
1)表示器用のフレキシブル基板とスイッチが近く
そのままだとつい基板を壊しそうだったので
そこをカバーする
2)インターフェイスや電源の開口エリアは
しっかり確保
3)分解/組み立てが楽にしたい
斜面で上下を組み合わせ+ピン固定
ケースが出来たので、次に何を作るのかを考えます
コンセプト(仕様)について
はじめに
IoTであれ、家庭菜園であれ、大事なのはどういう目的で、どの程度のものを造るという最初のコンセプトが重要です
Obnizという素晴らしい"おもちゃ"を手に入れたとき、先ず使ってみようとおもいましたが、その昔TK-80(知っている人いるかな?)で、目的もなく遊んで喜んでいるうちに、いつの間にか飽きたことを思い出し、先ずはコンセプトから入りました。
ベースとなるのは コンテスト応募の際の企画書(というよりも文ですね)
テーマ名「クルマ どうじょう」
道場と同乗をかけたネタ
運転中の動作をGセンサ等で拾い評価判断し、良い場合には段をさずけ悪い場合は段をはく奪する
カメラつけたら、居眠り運転を確認した場合起こしてくれる仕様も検討
当初、最新のドラレコや自動運転車の付属機能のような高度なことも考えたのですが(希望は天に・・・)
今回は、小中学生程度の夏休みの自由研究で出来るレベルということで進めます。(脚は地にってことで(笑)
という仕様に至るまで、家族と意見交換をしながら試作品を作った経緯を少し・・
改良案をみんなで考えると色々出てきます「シンプルにLEDでいいじゃん」という意見でまた試作品を作ると・・
好き放題いいますよねw でもまあ仕方ないので、「じゃ カップホルダーを使えば」という意見で造ってみたら、これがまあいい塩梅でしたが丸い事が災いして
「四角いカップにすればいい」という意見もあったのですが、クルマのカップホルダーが丸いという落とし穴に・・
それなら全方向で検出できるセンサーから自作したらというとんでもない意見が出現。
でもまあそれもいいかもしれないと、センサーの構造を考える間にゴールデンウイーク終了。
締め切りまでに完成できるのか? 本当に間に合うのか? と焦ってるうちに事務局から
「締め切り大丈夫ですかメール」が届き、締め切り日が5/31ではなく5/16だったことを知るw
これはマジで危なかった(大汗)
そこで
当初スマホは使わないで、ローテクで実装しようと考えてましたがw
相方から「せっかくのIoTコンテストに何やってんの?」とツッコみいただきまして、
ならばと、せっかくのobnizのプログラム言語?であるブロック プログラムで、DRIVE-DO-JYO(スマホ版)を作成してみました
・ブロック プログラムのままでこちらには転載できないのでソースコード化しました (資料1参照)
ブロック プログラムを利用した感想
操作が直感でできるのはいいですね。
子供たちも、これならプログラムしようと思うくらい簡単でした(実際には最後に私がまとめましたが(笑)
日本語で書けるのも分かり易いです、ただ、デバッグの際の難点として
1)エラーコードが英文になっている
2)日本語の漢字(2バイト文字)がコード表示となる
ことからエラー文の解析と変数の検索に手間取りました
(→変数を1バイトにすることで解決)
とはいえ
基本構想が完成してから初めて使う言語で制作に入り
学校も始まってからの約2日(延べ10時間位?)で完成したのですから これは価値ありますね。
製作例 動作概要
必要なもの
・obniz Board 1Y
・スマホ(屋外で使うことになるので、テザリングでobnizとつなげられる契約をしていること)
コネタ⇒wi-fiのパスワード入力は本体のスイッチでもできますが、できるなら家でPCからのキー操作を使ってobnizとスマホ繋いでからクルマに乗せたほうが楽ですね(外でチマチマとややこしいパスワードを入力しました(笑)
お詫び
車載用にする場合ブレッドボードでLEDを光らせようとしたのですが、意外に暗く昼間の車内では点灯が確認しにくいことから
スマホのメッセージがあればOKであろうということになり。最終的にはLEDを光らせるのは中止しました。
(説明画像と少し違うことをご容赦ください)
動画
資料1
(ご利用の際には「SET YOUR obniz No.」のところにあなたのobniz番号入れてください)
DRIVE-DO-JYO
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"
integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q"
crossorigin="anonymous"
></script>
<script
src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"
integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl"
crossorigin="anonymous"
></script>
<link
rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css"
/>
</head>
<body>
<h3 id="bploading" style="text-align:center;">LOADING...</h3>
<div id="OBNIZ_OUTPUT"></div>
<br />
<script
src="https://unpkg.com/obniz@latest/obniz.js"
crossorigin="anonymous"
></script>
<script
src="https://unpkg.com/obniz-parts-kits@0.16.0/iothome/index.js"
crossorigin="anonymous"
></script>
<script
src="https://unpkg.com/obniz-parts-kits@0.16.0/airobot/index.js"
crossorigin="anonymous"
></script>
<script
src="https://unpkg.com/obniz-parts-kits@0.16.0/ui/index.js"
crossorigin="anonymous"
></script>
<script
src="https://unpkg.com/obniz-parts-kits@0.16.0/ai/howler2.1.2/howler.js"
crossorigin="anonymous"
></script>
<script
src="https://unpkg.com/obniz-parts-kits@0.16.0/ai/opencv3.4/opencv.js"
crossorigin="anonymous"
></script>
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@3.3.0"></script>
<script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/mobilenet@2.1.0"></script>
<script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/posenet@2.2.2"></script>
<script
src="https://unpkg.com/obniz-parts-kits@0.16.0/ai/clmtrackr/clmtrackr.js"
crossorigin="anonymous"
></script>
<script
src="https://unpkg.com/obniz-parts-kits@0.16.0/ai/clmtrackr/emotion_classifier.js"
crossorigin="anonymous"
></script>
<script
src="https://unpkg.com/obniz-parts-kits@0.16.0/ai/clmtrackr/emotionmodel.js"
crossorigin="anonymous"
></script>
<script
src="https://unpkg.com/obniz-parts-kits@0.16.0/ai/clmtrackr/model_pca_20_svm.js"
crossorigin="anonymous"
></script>
<script
src="https://unpkg.com/obniz-parts-kits@0.16.0/ai/index.js"
crossorigin="anonymous"
></script>
<script
src="https://unpkg.com/obniz-parts-kits@0.16.0/storage/index.js"
crossorigin="anonymous"
></script>
<script>
$("#bploading").text("RUNNING...");
(async function(){
var obniz, LED_BLE, LED_YEL, LED_RED, BTN1, BTN2, STATAS, approch, TIME_span, Gcount, label, _E6_98_87_E6_AE_B5_E8_A9_A6_E9_A8_93, _E5_88_A4_E5_AE_9A_E7_B5_90_E6_9E_9C;
obniz = new Obniz('8211-7925');
await obniz.connectWait();
obniz.display.print('DRIVE-DO-JYO')
LED_BLE = obniz.wired("LED",{"anode":0, "cathode":1});
LED_YEL = obniz.wired("LED",{"anode":2, "cathode":3});
LED_RED = obniz.wired("LED",{"anode":4, "cathode":5});
await _ai.say('ただいまから DRIVE道場 を 開始します');
await _ai.startMotionWait();
await _ai.playAudio(990,1 * 500);
BTN1 = new ObnizUI.Button('出発');
BTN2 = new ObnizUI.Button('到着');
STATAS = '0';
approch = '0';
TIME_span = '0';
Gcount = '99999';
await _ai.say('出発準備ができたら、出発ボタンをクリックしてください');
while (STATAS != '2') {
await ObnizUI.Util.wait(0);
if (BTN1.isClicked()) {
await _ai.playAudio(440,1 * 500);
STATAS = (typeof STATAS == 'number' ? STATAS : 0) + 2;
}
console.log(TIME_span);
console.log(Gcount);
console.log(STATAS);
}
await _ai.say('検定開始');
obniz.display.print('ただいま検定中')
while (STATAS == '2') {
await ObnizUI.Util.wait(0);
if (_ai.isShaked()) {
LED_BLE.on();
await _ai.playAudio(262,1 * 500);
Gcount = (typeof Gcount == 'number' ? Gcount : 0) + 1;
await _ai.say('おおお?');
LED_BLE.off();
} else {
if (BTN2.isClicked()) {
STATAS = approch;
await _ai.say('検定終了、運転お疲れ様でした');
} else {
}
}
console.log('段判定中');
console.log(TIME_span);
console.log(Gcount);
console.log(STATAS);
TIME_span = (typeof TIME_span == 'number' ? TIME_span : 0) + 10;
}
obniz.display.clear();
obniz.display.print('検定終了')
await _ai.say('あなたの運転レベルを報告いたします');
label = new ObnizUI.Label('label');
_E6_98_87_E6_AE_B5_E8_A9_A6_E9_A8_93 = TIME_span / (Gcount * 100);
if (_E6_98_87_E6_AE_B5_E8_A9_A6_E9_A8_93 < 10) {
_E5_88_A4_E5_AE_9A_E7_B5_90_E6_9E_9C = 'あなたは上級です';
await _ai.say('あなたを上級運転者と認定します すばらしいぃい');
LED_BLE.on();
}
if (_E6_98_87_E6_AE_B5_E8_A9_A6_E9_A8_93 >= 10 && _E6_98_87_E6_AE_B5_E8_A9_A6_E9_A8_93 <= 100) {
_E5_88_A4_E5_AE_9A_E7_B5_90_E6_9E_9C = 'あなたは普通です';
await _ai.say('あなたを普通の運転者と認定します');
LED_BLE.off();
LED_YEL.on();
}
if (_E6_98_87_E6_AE_B5_E8_A9_A6_E9_A8_93 >= 100) {
label.setText('あなたは初心者レベルです');
_E5_88_A4_E5_AE_9A_E7_B5_90_E6_9E_9C = 'あなたは初心者レベルです';
await _ai.say('更に運転技量を磨きましょう');
LED_RED.on();
}
obniz.display.print(' ')
obniz.display.print(_E5_88_A4_E5_AE_9A_E7_B5_90_E6_9E_9C)
label.setText(_E5_88_A4_E5_AE_9A_E7_B5_90_E6_9E_9C);
LED_RED.off();
LED_YEL.off();
LED_BLE.off();
await _ai.playMusic('https://obniz.com/blockly/music/happy_birthday.mp3');
console.log(' ');
console.log(_E6_98_87_E6_AE_B5_E8_A9_A6_E9_A8_93);
'0';
})();
</script>
</body>
</html>
-
KH21
さんが
2021/05/10
に
編集
をしました。
(メッセージ: 初版)
Closed
KH21
2021/05/11
1 件の返信が折りたたまれています
-
KH21
さんが
2021/05/11
に
編集
をしました。
-
KH21
さんが
2021/05/12
に
編集
をしました。
-
KH21
さんが
2021/05/12
に
編集
をしました。
-
KH21
さんが
2021/05/12
に
編集
をしました。
-
KH21
さんが
2021/05/13
に
編集
をしました。
-
KH21
さんが
2021/05/16
に
編集
をしました。
-
KH21
さんが
2021/05/16
に
編集
をしました。
-
KH21
さんが
2021/05/16
に
編集
をしました。
-
KH21
さんが
2021/05/16
に
編集
をしました。
-
KH21
さんが
2021/05/16
に
編集
をしました。
-
KH21
さんが
2021/05/16
に
編集
をしました。
-
KH21
さんが
2021/05/16
に
編集
をしました。
-
KH21
さんが
2021/05/16
に
編集
をしました。
ログインしてコメントを投稿するリアクションいただき感謝です。
嬉しくなって まだまだ改良の余地ありますが、
STLデータも掲載しようとおもったけど
STLファイルはアップできないのでしょうか?
それよりこんなデータでも欲しい方いらっしゃいますか?