KH21 が 2021年05月16日19時02分17秒 に編集
コメント無し
本文の変更
このたびobnizIoTコンテストに参加させていただきまして obnizを入手できました、早速開始! ==**先ずはケース造り**== 本体そのままでは気を使いますし、 壊してもマズイので、ケース設計から始めました。 その経緯とサンプルを掲載します。 ![#001](https://camo.elchika.com/1a54f9e9c9e8958c5d5929e064e6628fd26c97dc/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f36663937616366322d376133332d343165352d623061322d6339666139653762353439332f34623936643339302d376636322d343635382d613436322d313331313837666664376231/) ==**設計思想**== 1)表示器用のフレキシブル基板とスイッチが近く そのままだとつい基板を壊しそうだったので そこをカバーする 2)インターフェイスや電源の開口エリアは しっかり確保 3)分解/組み立てが楽にしたい 斜面で上下を組み合わせ+ピン固定 実際のプリンタ出力 サンプル ![#002](https://camo.elchika.com/34f98db82e271f00a52b0b4336e0e6541e9153f5/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f36663937616366322d376133332d343165352d623061322d6339666139653762353439332f61313438613163642d333136642d343962352d386164312d663564356166343466373266/) ==**ケースが出来たので、次に何を作るのかを考えます**== コンセプト(仕様)について はじめに IoTであれ、家庭菜園であれ、大事なのはどういう目的で、どの程度のものを造るという最初のコンセプトが重要です Obnizという素晴らしい"おもちゃ"を手に入れたとき、先ず使ってみようとおもいましたが、その昔TK-80(知っている人いるかな?)で、目的もなく遊んで喜んでいるうちに、いつの間にか飽きたことを思い出し、先ずはコンセプトから入りました。 **ベースとなるのは コンテスト応募の際の企画書**(というよりも文ですね) テーマ名「クルマ どうじょう」 道場と同乗をかけたネタ 運転中の動作をGセンサ等で拾い評価判断し、良い場合には段をさずけ悪い場合は段をはく奪する カメラつけたら、居眠り運転を確認した場合起こしてくれる仕様も検討 当初、最新のドラレコや自動運転車の付属機能のような高度なことも考えたのですが(希望は天に・・・) 今回は、小中学生程度の夏休みの自由研究で出来るレベルということで進めます。(脚は地にってことで(笑) ![#100](https://camo.elchika.com/916fc9b66a12f982fcbbbb09a1552ae7a4e676b7/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f36663937616366322d376133332d343165352d623061322d6339666139653762353439332f39396665326563642d323966652d343537362d623130352d633663303931653863313637/) ![#101](https://camo.elchika.com/987420ee57343c25ffbfd408fef0bef4cec3c659/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f36663937616366322d376133332d343165352d623061322d6339666139653762353439332f64366134356639652d633231302d343131322d386363332d353734643239646636343261/) ==という仕様に至るまで、家族と意見交換をしながら試作品を作った経緯を少し・・== ![](https://camo.elchika.com/103df4f99e532910b7c84eee87b9d3480774703b/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f36663937616366322d376133332d343165352d623061322d6339666139653762353439332f37633965333961642d663734342d343061652d623738652d353934383765626466636365/) ==改良案をみんなで考えると色々出てきます「シンプルにLEDでいいじゃん」という意見でまた試作品を作ると・・== ![キャプションを入力できます](https://camo.elchika.com/d647241a0a362d2b17fa51b5e49bafb2fccc61cc/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f36663937616366322d376133332d343165352d623061322d6339666139653762353439332f66313861333564382d623134302d343434332d623939372d333864633731666238356137/) ==好き放題いいますよねw でもまあ仕方ないので、「じゃ カップホルダーを使えば」という意見で造ってみたら、これがまあいい塩梅でしたが丸い事が災いして== ![キャプションを入力できます](https://camo.elchika.com/bb399804f4a4ac82bcde8b571f9d76fb2787f78e/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f36663937616366322d376133332d343165352d623061322d6339666139653762353439332f65373063333061652d663133652d343938662d393238632d633836623262363335313563/) ==「四角いカップにすればいい」という意見もあったのですが、クルマのカップホルダーが丸いという落とし穴に・・ それなら全方向で検出できるセンサーから自作したらというとんでもない意見が出現。== でもまあそれもいいかもしれないと、センサーの構造を考える間にゴールデンウイーク終了。 ![キャプションを入力できます](https://camo.elchika.com/63b0d22ed73b564228f05e6a2098a42d1df9f25f/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f36663937616366322d376133332d343165352d623061322d6339666139653762353439332f34636233303831652d633966372d343664342d626666322d396632303065636434386634/) 締め切りまでに完成できるのか? 本当に間に合うのか? と焦ってるうちに事務局から 「締め切り大丈夫ですかメール」が届き、締め切り日が5/31ではなく5/16だったことを知るw これはマジで危なかった(大汗) そこで 当初スマホは使わないで、ローテクで実装しようと考えてましたがw 相方から「せっかくのIoTコンテストに何やってんの?」とツッコみいただきまして、
ならばと、せっかくのobnizのプログラム言語?であるブロック式プログラムで、DRIVE-DO-JYO(スマホ版)を作成してみました
ならばと、せっかくのobnizのプログラム言語?であるブロック プログラムで、DRIVE-DO-JYO(スマホ版)を作成してみました
![キャプションを入力できます](https://camo.elchika.com/9d7c1d7b332554235345e3f815086d8d9390f652/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f36663937616366322d376133332d343165352d623061322d6339666139653762353439332f66613837663035322d343764622d346532612d396630312d363436366633633565376166/)
・ブロックのままでこちらには転載できないのでソースコード化しました (SET YOUR obniz No.のところにご利用の際obniz番号入れてください)
・ブロック プログラムのままでこちらには転載できないのでソースコード化しました (資料1参照)
==ブロック プログラムを利用した感想==
操作が直感でできるのはいいですね。 子供たちも、これならプログラムしようと思うくらい簡単でした(実際には最後に私がまとめましたが(笑) 日本語で書けるのも分かり易いです、ただ、デバッグの際の難点として 1)エラーコードが英文になっている 2)日本語の漢字(2バイト文字)がコード表示となる ことからエラー文の解析と変数の検索に手間取りました (→変数を1バイトにすることで解決) とはいえ 基本構想が完成してから初めて使う言語で制作に入り 学校も始まってからの約2日(延べ10時間位?)で完成したのですから これは価値ありますね。 ==最終版 動作概要== ![キャプションを入力できます](https://camo.elchika.com/12b6900cbf3effc192aa8ff66c0dd89a670b2d85/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f36663937616366322d376133332d343165352d623061322d6339666139653762353439332f30333130343732352d353430622d343438312d623266312d343761663637333131383431/) ![キャプションを入力できます](https://camo.elchika.com/cfa5e6473914edcdecbc49eec0bb07a6343bb680/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f36663937616366322d376133332d343165352d623061322d6339666139653762353439332f37326434313132332d663736622d343761312d393563312d643637383033393464646434/) ![キャプションを入力できます](https://camo.elchika.com/92c288e5bf27739eb09059f1dd9d83433ae62bad/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f36663937616366322d376133332d343165352d623061322d6339666139653762353439332f63326530343636632d636461332d343766362d396633352d663033333636323466656564/) ![キャプションを入力できます](https://camo.elchika.com/4d227f9418412afc5faeb1db4af799a3f4c157af/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f36663937616366322d376133332d343165352d623061322d6339666139653762353439332f63366634623966642d653566392d346139612d623165612d383839336133666433366631/) ==資料1== (ご利用の際には「SET YOUR obniz No.」のところにあなたのobniz番号入れてください)
```arduino: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('SET YOUR obniz No.');
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(_E6_98_87_E6_AE_B5_E8_A9_A6_E9_A8_93)
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(Gcount);
console.log(' ');
console.log(_E6_98_87_E6_AE_B5_E8_A9_A6_E9_A8_93); '0'; })(); </script> </body>
</html>
</html>