編集履歴一覧に戻る
nakkyiのアイコン画像

nakkyi が 2021年05月09日19時58分26秒 に編集

コメント無し

本文の変更

<プロジェクトの[完成動画]です。> (https://youtu.be/ax8knmo4ljU) ## < もくじ > 1.はじめに 2.用意した物 3.プロジェクト 4.回路図 5.まとめ 6.おまけの動画 ## 1.はじめに

-

 obnizで二足歩行ロボットを歩かせるプロジェクトです。 obniz の仕様を見て、これでロボットができると思いました。 私は趣味のひとつで、以前からロボットはいろいろ作っていました。  今回、obnizで二足歩行ロボットを作ってみようと思いました。 JavaScriptのプログラムは初めてです。イチから順番にやることにしました。 ロボットは、友人が製作したもので、以前ロボット用のボードを使って動かした機体を使います。

+

 obnizで二足歩行ロボットを歩かせるプロジェクトです。obniz の仕様を見て、これでロボットができると思いました。私は趣味のひとつで、以前からロボットはいろいろ作っていました。  今回、obnizで二足歩行ロボットを作ってみようと思いました。JavaScriptのプログラムは初めてです。イチから順番にやることにしました。  ロボットは、友人が製作したもので、以前ロボット用のボードを使って動かした機体を使います。

 名前は「オブちゃん」にしました。コンテストの終わりまでどこまで出来るか挑戦です。皆さん、温かい目で見守ってください。 ## 2.用意した物 2-1  足歩行ロボット × 1体    機体の構成(サーボモーター 7個)    ・腰ヨー 1個    ・肩ロール 2個    ・腿ピッチ 2個    ・足首ピッチ 2個    ・足はリンク機構です。 2-2 obniz-1Y × 1個 2-3 サーボ接続用基板 × 1個   ・6個のサーボモーターを駆動させるため自作です。 ## 3.プロジェクト ### 3-1 サーボモーターを動かす。  はじめに、obunizでサーボモーターを動かすプログラムのテストを行います。  3-1-1 サーボモーターサンプルコード ・obunizのサンプルを使って、1個のサーボモーターを動かしてみた。 ![キャプションを入力できます](https://camo.elchika.com/43e353118037489c053ca0e4063288572a904948/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f62333466356663372d613730652d343463362d613263362d6132336663343963626131382f66383163396630372d616562332d343630312d393734342d356131623436643063393339/) ・サーボモーター1個をサンプルコードで動かした[動画]です。 (https://www.youtube.com/watch?v=kRzHFrdO03c) ### 3ー2 サーボ接続基板を作る。  obunizのコネクターにはサーボモーターが4個しか接続できないので、接続用の基盤を作りました。(PWMが6個なので、6端子にしました。)  3-2-1 サーボ接続基板の製作  ユニバーサル基盤を加工して、ピンコネクターをハンダ付けしました。 ・サーボ基板の表側 ![キャプションを入力できます](https://camo.elchika.com/7913fe7c2d38776afc0eecf5feab4aa70a8b6836/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f62333466356663372d613730652d343463362d613263362d6132336663343963626131382f33636261353863352d653436392d343832302d613337662d646339323065303430343864/) ・サーボ基板の裏側 ![キャプションを入力できます](https://camo.elchika.com/30c548915556f6c2fa8880ef1de5b3152cd3b2db/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f62333466356663372d613730652d343463362d613263362d6132336663343963626131382f33656234303262322d653630382d346166652d613863612d623439376633656434666661/) ・サーボ基板にobunizを取り付け ![キャプションを入力できます](https://camo.elchika.com/1ccfb4c1ddbc4cca449865c87deed6e8dd4dd9cd/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f62333466356663372d613730652d343463362d613263362d6132336663343963626131382f30393439323332642d373164622d346264322d613661632d383234363061663362386438/)  3-2-2 コントロール基板の取付  ロボットの頭部に、obunizコントロール基板をセッティングします。 ・この様にぴったりと収まりました。 ![キャプションを入力できます](https://camo.elchika.com/cb416635a12e7fd78a4aa6cb7652ff63627a126f/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f62333466356663372d613730652d343463362d613263362d6132336663343963626131382f35623461666362632d326535352d343036632d623163652d396461356534633734313761/) ### 3-3 上半身サーボモーターの作動テスト  上半身の、腰ヨー軸と左右の腕のロール軸のサーボモーターを動かしてみます。  3-3-1 3個のサーボモーターの配線  サーボモーターをコントロール基板のピンに配線します。   ピンはobniz側から、signal:、vcc:、gnd:です。  サーボモーターのコネクターはobnizの次の番号に刺します。   1番ピン 左腕サーボ24   2番ピン 腰サーボ8   3番ピン 右腕サーボ9 3-3-2 上半身のサーボモーターを動かす。  サンプルコードを変更して3個にサーボのソースコードを作りました。 ① 画面のスライドバーをスライドさせて、各サーボモーターを動かす[動画]です。 (https://youtu.be/ikNNA3TFVto) ② ソースコード ```html:スライドバーでサーボモーターを駆動 <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <script src="https://obniz.io/js/jquery-3.2.1.min.js"></script> <script src="https://unpkg.com/obniz@3.14.0/obniz.js" crossorigin="anonymous"></script> </head> <body> <div id="obniz-debug"></div> <h1>ServoMotor</h1> <input id="slider1" type="range" min="45" max="180" /> <input id="slider2" type="range" min="60" max="120" /> <input id="slider3" type="range" min="0" max="135" /> <script> var obniz = new Obniz("     "); obniz.onconnect = async function () { var servo1 = obniz.wired("ServoMotor", {gnd:0, signal:1}); var servo2 = obniz.wired("ServoMotor", {gnd:0, signal:2}); var servo3 = obniz.wired("ServoMotor", {gnd:0, signal:3}); $("#slider1").on('input', function() { servo1.angle($("#slider1").val()) }); $("#slider2").on('input', function() { servo2.angle($("#slider2").val()) }); $("#slider3").on('input', function() { servo3.angle($("#slider3").val()) }); }; obniz.onclose = async function(){ $("#slider1").off('input'); $("#slider2").off('input'); $("#slider3").off('input'); }; </script> </body> </html> ``` ### 3-4 上半身のモーション作成  上半身の3個のサーボモーターを使って、「いやいや!」と「バンザイ!」のモーションをコントロールする。 ① 「いやいや!」と「バンザイ!」の[動画]です。 (https://youtu.be/DDo4C7MAqeA)   ② ソースコード ```html:上半身・ボタン・モーション ```<html lang="en"> <head> ーーー省略(obnizのサンプルコードを使用ーーー <script> $("#bploading").text("RUNNING..."); (async function(){ var obniz, servomotor1,servomotor2,servomotor3, button1,button2; obniz = new Obniz('     '); await obniz.connectWait(); servomotor1 = obniz.wired("ServoMotor",{"signal":1, "gnd":0}); servomotor2 = obniz.wired("ServoMotor",{"signal":2, "gnd":0}); servomotor3 = obniz.wired("ServoMotor",{"signal":3, "gnd":0}); button1 = new ObnizUI.Button('イヤイヤ!'); button2 = new ObnizUI.Button('バンザイ!'); while (true) { await ObnizUI.Util.wait(0); if (button1.isTouching()) { servomotor2.angle(45); await obniz.wait(500); servomotor2.angle(90); servomotor2.angle(136); await obniz.wait(500); } else { servomotor2.angle(90); } if (button2.isTouching()) { servomotor1.angle(45); servomotor3.angle(135); await obniz.wait(1000); servomotor1.angle(180); servomotor3.angle(0); await obniz.wait(1000); } else { servomotor1.angle(45); servomotor3.angle(135); } } })(); </script> </body> </html> ``` ### 3-5 ロボット下半身を駆動させ立つ、座るをする。 脚部の、腿ピッチ軸(左右)と足首ピッチ軸(左右)の4個のサーボモータを駆動し立つ、座るモーションを作る。 3-5-1 下半身の4個のサーボモーターの配線 サーボモーターをコントロール基板のピンに配線します。   ピンはobniz側から、signal:、vcc:、gnd:です。  サーボモーターのコネクターはobnizの次の番号に挿します。   1番ピン 左腿サーボ3   2番ピン 左足首サーボ5   3番ピン 右腿サーボ22   4番ピン 右足首サーボ20 3-5-2 下半身のサーボモーターの駆動。  サーボモーターを駆動させ、真っすぐに立つモーション(初期位置)を作る。 ① 直立モーションの[動画]です。 (https://youtu.be/WDyVnfaMI80) ② ソースコード ```html:初期位置・直立モーション <html lang="en"> <head> ーーー省略(obnizのサンプルコードを使用ーーー <script> $("#bploading").text("RUNNING..."); (async function(){ var obniz, servomotor, button; obniz = new Obniz('     '); await obniz.connectWait(); servomotor1 = obniz.wired("ServoMotor",{"signal":1, "gnd":0}); servomotor2 = obniz.wired("ServoMotor",{"signal":2, "gnd":0}); servomotor3 = obniz.wired("ServoMotor",{"signal":3, "gnd":0}); servomotor4 = obniz.wired("ServoMotor",{"signal":4, "gnd":0}); button = new ObnizUI.Button('起立!'); while (true) { await ObnizUI.Util.wait(0); if (button.isTouching()) { servomotor1.angle(90); servomotor2.angle(90); servomotor3.angle(90); servomotor4.angle(90); await obniz.wait(500); } else { servomotor1.angle(120); servomotor2.angle(60); servomotor3.angle(60); servomotor4.angle(120); } } })(); </script> </body> </html> ``` ### 3-6 座る、立つモーションを作成。  下半身のサーボモーターをモーションボタンによりコントロールする。 ① 座る、立つのモーションの[動画]です。 (https://youtu.be/zv9871EB2K4) ② ソースコード ```html:初期位置・直立モーション <html lang="en"> <head> ーーー省略(obnizのサンプルコードを使用ーーー <script> $("#bploading").text("RUNNING..."); (async function(){ var obniz, servomotor, button; obniz = new Obniz('    '); await obniz.connectWait(); servomotor1 = obniz.wired("ServoMotor",{"signal":1, "gnd":0}); servomotor2 = obniz.wired("ServoMotor",{"signal":2, "gnd":0}); servomotor3 = obniz.wired("ServoMotor",{"signal":3, "gnd":0}); servomotor4 = obniz.wired("ServoMotor",{"signal":4, "gnd":0}); button = new ObnizUI.Button('起立!'); while (true) { await ObnizUI.Util.wait(0); if (button.isTouching()) { servomotor1.angle(90); servomotor2.angle(90); servomotor3.angle(90); servomotor4.angle(90); await obniz.wait(500); } } })(); </script> </body> </html> ``` ### 3-7 「オブちゃん」を歩かせる。  下半身の4個のサーボモーターを使って、歩くモーションを作りました。よちよち歩きですが、何とか歩かせることが出来ました。スマートフォンを使ってobnizのQRコードを読み、スマートフォンでコントロールしました。なお、完成動画は、最初に上げたものです。  ① 歩行のモーションの[動画]です。 (https://youtu.be/QloTmNb2B88) ② ソースコード ```html:完成モーション <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, servomotor1,servomotor2,servomotor3, button1,button2; obniz = new Obniz('1332-6225'); await obniz.connectWait(); servomotor1 = obniz.wired("ServoMotor",{"signal":1, "gnd":0}); servomotor2 = obniz.wired("ServoMotor",{"signal":2, "gnd":0}); servomotor3 = obniz.wired("ServoMotor",{"signal":3, "gnd":0}); servomotor4 = obniz.wired("ServoMotor",{"signal":4, "gnd":0}); servomotor5 = obniz.wired("ServoMotor",{"signal":5, "gnd":0}); servomotor6 = obniz.wired("ServoMotor",{"signal":6, "gnd":0}); button1 = new ObnizUI.Button('前進!'); button2 = new ObnizUI.Button('後退!'); button3 = new ObnizUI.Button('手を挙げる!'); button4 = new ObnizUI.Button('座る!'); button5 = new ObnizUI.Button('イヤイヤ!'); while (true) { await ObnizUI.Util.wait(0); // 前進 if (button1.isTouching()) { // 右足前に servomotor1.angle(90); //左腿 servomotor2.angle(60); //右腿 servomotor3.angle(90); //左足首 servomotor4.angle(90); //右足首 servomotor5.angle(90); //胸ヨー servomotor6.angle(45); //右腕 await obniz.wait(500); // 左足前に servomotor1.angle(120); //左腿 servomotor2.angle(90); //右腿 servomotor3.angle(90); //左足首 servomotor4.angle(90); //右足首 servomotor5.angle(90); //胸ヨー servomotor6.angle(45); //右腕 await obniz.wait(500); } // 後退 else if (button2.isTouching()) { // 左足後ろに servomotor1.angle(60); //左腿 servomotor2.angle(90); //右腿 servomotor3.angle(90); //左足首 servomotor4.angle(90); //右足首 servomotor5.angle(90); //胸ヨー servomotor6.angle(45); //右腕 await obniz.wait(500); // 右足前に servomotor1.angle(90); //左腿 servomotor2.angle(120); //右腿 servomotor3.angle(90); //左足首 servomotor4.angle(90); //右足首 servomotor5.angle(90); //胸ヨー servomotor6.angle(45); //右腕 await obniz.wait(500); } // 手を挙げる else if (button3.isTouching()) { servomotor1.angle(90); //左腿 servomotor2.angle(90); //右腿 servomotor3.angle(90); //左足首 servomotor4.angle(90); //右足首 servomotor5.angle(90); //胸ヨー servomotor6.angle(180); //右腕 await obniz.wait(1000); } // 座る else if (button4.isTouching()) { servomotor1.angle(150); //左腿 servomotor2.angle(30); //右腿 servomotor3.angle(30); //左足首 servomotor4.angle(150); //右足首 servomotor5.angle(90); //胸ヨー servomotor6.angle(45); //右腕 await obniz.wait(500); } // イヤイヤ else if (button5.isTouching()) { servomotor1.angle(90); //左腿  servomotor2.angle(90); //右腿 servomotor3.angle(90); //左足首 servomotor4.angle(90); //右足首 servomotor5.angle(60); //胸ヨー servomotor6.angle(45); //右腕 await obniz.wait(500); servomotor1.angle(90); //左腿  servomotor2.angle(90); //右腿 servomotor3.angle(90); //左足首 servomotor4.angle(90); //右足首 servomotor5.angle(120); //胸ヨー servomotor6.angle(45); //右腕 await obniz.wait(500); } // 初期位置(起立) else { servomotor1.angle(90); //左腿  servomotor2.angle(90); //右腿 servomotor3.angle(90); //左足首 servomotor4.angle(90); //右足首 servomotor5.angle(90); //胸ヨー servomotor6.angle(45); //右腕 await obniz.wait(500); } } })(); </script> </body> </html> ``` ## 4.回路図 ![キャプションを入力できます](https://camo.elchika.com/08ab65efaa89aecf69ddf0e2734604ca91859b89/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f62333466356663372d613730652d343463362d613263362d6132336663343963626131382f61656234346339392d343766382d343637302d623839362d346438663230626661303566/) ## 5.まとめ  obnizBoardとJavaScriptで作った、二足歩行ロボット「オブちゃん」をよちよち歩きですが、歩かせる事までたどり着きました。  JavaScriptのソースコードもかなり怪しいと思います。これからさらに勉強をしてスマートなものにしていきたいと思います。  また、残念なことに、「オブちゃん」は7軸あるロボットですが、obnizのPWMが6個しかないために、足に4個使うため、胸と右手を動かすと、左手を動かすことが出来ません。今後何か対策を探したいと思います。 最後に、これが「オブちゃん」の後ろ姿です。 ![キャプションを入力できます](https://camo.elchika.com/5b593d73cd3516fd410ecb2ed5080c1d3abaa8a7/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f62333466356663372d613730652d343463362d613263362d6132336663343963626131382f62386562643863312d633634342d343730642d386530352d623930303266336536363064/) ## 6.おまけ動画 オブちゃんの仰向け起上りとうつ伏せ起上りのモーションを作ってみた[動画]です。 (https://youtu.be/4-HWAwPMFtE)