nakkyiのアイコン画像
nakkyi 2021年04月24日作成 (2021年05月12日更新)
製作品 製作品 閲覧数 1321
nakkyi 2021年04月24日作成 (2021年05月12日更新) 製作品 製作品 閲覧数 1321

obniz 人型ロボット「オブちゃん」プロジェクト

obniz 人型ロボット「オブちゃん」プロジェクト

<プロジェクトの[完成動画]です。>
https://youtu.be/ax8knmo4ljU

ここに動画が表示されます

< もくじ >

1.はじめに
2.用意した物
3.プロジェクト
4.回路図
5.まとめ
6.おまけの動画

1.はじめに

obnizで二足歩行ロボットを歩かせるプロジェクトです。obniz の仕様を見て、これでロボットができると思いました。私は趣味のひとつで、以前からロボットはいろいろ作っていました。
 今回、obnizで二足歩行ロボットを作ってみようと思いました。JavaScriptのプログラムは初めてです。イチから順番にやることにしました。
 ロボットは友人からもらったもので、以前ロボット用のボードを使って動かした機体を使います。
 名前は「オブちゃん」にしました。コンテストの終わりまでどこまで出来るか挑戦です。皆さん、温かい目で見守ってください。

2.用意した物

2-1  2足歩行ロボット × 1体
   ロボットの機体構成(サーボモーター 7個)
   ・腰ヨー 1個
   ・肩ロール 2個
   ・腿ピッチ 2個
   ・足首ピッチ 2個
   ・足はリンク機構です。
2-2 obniz-1Y × 1個
2-3 サーボ接続用基板 × 1個
  ・6個のサーボモーターを駆動させるため自作です。

3.プロジェクト

3-1 サーボモーターを動かす。

はじめに、obunizでサーボモーターを動かすプログラムのテストを行います。
 3-1-1 サーボモーターサンプルコード
・obunizのサンプルを使って、1個のサーボモーターを動かしてみた。
キャプションを入力できます
・サーボモーター1個をサンプルコードで動かした[動画]です。

ここに動画が表示されます

https://www.youtube.com/watch?v=kRzHFrdO03c

3ー2 サーボ接続基板を作る。

obunizのコネクターにはサーボモーターが4個しか接続できないので、接続用の基盤を作りました。(PWMが6個なので、6端子にしました。)

3-2-1 サーボ接続基板の製作
 ユニバーサル基盤を加工して、ピンコネクターをハンダ付けしました。
・サーボ基板の表側
キャプションを入力できます
・サーボ基板の裏側
キャプションを入力できます
・サーボ基板にobunizを取り付け
キャプションを入力できます

3-2-2 コントロール基板の取付
 ロボットの頭部に、obunizコントロール基板をセッティングします。
・この様にぴったりと収まりました。
キャプションを入力できます

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
② ソースコード

スライドバーでサーボモーターを駆動

<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 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 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 lang="en"> <head> ーーー省略(obnizのサンプルコードを使用ーーー <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('立つ!'); while (true) { await ObnizUI.Util.wait(0); // 立上り2 servomotor1.angle(90); //左腿  servomotor2.angle(90); //右腿 servomotor3.angle(90); //左足首 servomotor4.angle(90); //右足首 servomotor5.angle(90); //胸ヨー servomotor6.angle(45); //右腕 await obniz.wait(500); // 座る if (button1.isTouching()) { // 座る1 servomotor1.angle(115); //左腿 servomotor2.angle(60); //右腿 servomotor3.angle(60); //左足首 servomotor4.angle(115); //右足首 servomotor5.angle(90); //胸ヨー servomotor6.angle(45); //右腕 await obniz.wait(50); // 座る2 servomotor1.angle(125); //左腿 servomotor2.angle(50); //右腿 servomotor3.angle(50); //左足首 servomotor4.angle(125); //右足首 await obniz.wait(50); // 座る3 servomotor1.angle(135); //左腿 servomotor2.angle(40); //右腿 servomotor3.angle(40); //左足首 servomotor4.angle(135); //右足首 await obniz.wait(50); // 座る4 servomotor1.angle(145); //左腿 servomotor2.angle(30); //右腿 servomotor3.angle(30); //左足首 servomotor4.angle(145); //右足首 await obniz.wait(1000); } } })(); </script> </body> </html>

3-7 「オブちゃん」を歩かせる。

下半身の4個のサーボモーターを使って、歩くモーションを作りました。よちよち歩きですが、何とか歩かせることが出来ました。スマートフォンを使ってobnizのQRコードを読み、スマートフォンでコントロールしました。なお、完成動画は、最初に上げたものです。

① 歩行のモーションの[動画]です。

ここに動画が表示されます

https://youtu.be/a5zetaZI1P8
② ソースコード

完成モーション

<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.回路図

キャプションを入力できます

5.まとめ

obnizBoardとJavaScriptで作った、二足歩行ロボット「オブちゃん」をよちよち歩きですが、歩かせる事までたどり着きました。
 JavaScriptのソースコードもかなり怪しいと思います。これからさらに勉強をしてスマートなものにしていきたいと思います。
 また、残念なことに、「オブちゃん」は7軸あるロボットですが、obnizのPWMが6個しかないために、足に4個使うため、胸と右手を動かすと、左手を動かすことが出来ません。今後何か対策を探したいと思います。

最後に、これが「オブちゃん」の後ろ姿です。
キャプションを入力できます

6.おまけ動画

オブちゃんの仰向け起上りとうつ伏せ起上りのモーションを作ってみた[動画]です。
https://youtu.be/ppE73jdH28c

ここに動画が表示されます

3
1
ログインしてコメントを投稿する