<プロジェクトの[完成動画]です。>
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
投稿者の人気記事
-
nakkyi
さんが
2021/04/24
に
編集
をしました。
(メッセージ: 初版)
-
nakkyi
さんが
2021/04/26
に
編集
をしました。
(メッセージ: 回路図面の変更。)
-
nakkyi
さんが
2021/05/04
に
編集
をしました。
(メッセージ: @[youtube](の追加)
-
nakkyi
さんが
2021/05/04
に
編集
をしました。
(メッセージ: すべての動画を@[youtube]()
-
nakkyi
さんが
2021/05/04
に
編集
をしました。
-
nakkyi
さんが
2021/05/04
に
編集
をしました。
(メッセージ: 3-5の編集)
-
nakkyi
さんが
2021/05/04
に
編集
をしました。
(メッセージ: 見出し###編集)
-
nakkyi
さんが
2021/05/04
に
編集
をしました。
(メッセージ: 見出し####追加)
-
nakkyi
さんが
2021/05/04
に
編集
をしました。
(メッセージ: 見出しの編集)
-
nakkyi
さんが
2021/05/04
に
編集
をしました。
(メッセージ: ソースコードタイトル)
-
nakkyi
さんが
2021/05/04
に
編集
をしました。
(メッセージ: ソースコードのタイトル)
-
nakkyi
さんが
2021/05/06
に
編集
をしました。
-
nakkyi
さんが
2021/05/06
に
編集
をしました。
-
nakkyi
さんが
2021/05/06
に
編集
をしました。
-
nakkyi
さんが
2021/05/06
に
編集
をしました。
-
nakkyi
さんが
2021/05/07
に
編集
をしました。
(メッセージ: 動画、静止画の変更。)
-
nakkyi
さんが
2021/05/07
に
編集
をしました。
-
nakkyi
さんが
2021/05/07
に
編集
をしました。
-
nakkyi
さんが
2021/05/08
に
編集
をしました。
(メッセージ: おまけ動画を追加)
-
nakkyi
さんが
2021/05/09
に
編集
をしました。
-
nakkyi
さんが
2021/05/09
に
編集
をしました。
(メッセージ: 動画の修正)
-
nakkyi
さんが
2021/05/09
に
編集
をしました。
-
nakkyi
さんが
2021/05/09
に
編集
をしました。
-
nakkyi
さんが
2021/05/09
に
編集
をしました。
-
nakkyi
さんが
2021/05/10
に
編集
をしました。
-
nakkyi
さんが
2021/05/10
に
編集
をしました。
-
nakkyi
さんが
2021/05/10
に
編集
をしました。
-
nakkyi
さんが
2021/05/10
に
編集
をしました。
-
nakkyi
さんが
2021/05/10
に
編集
をしました。
-
nakkyi
さんが
2021/05/10
に
編集
をしました。
-
nakkyi
さんが
2021/05/11
に
編集
をしました。
-
nakkyi
さんが
2021/05/11
に
編集
をしました。
-
nakkyi
さんが
2021/05/11
に
編集
をしました。
-
nakkyi
さんが
2021/05/12
に
編集
をしました。
ログインしてコメントを投稿する