2024年6月1日土曜日

obniz IoT 四足歩行ロボット

2018年に製作した四足歩行ロボットについて記事にしました。

●obniz Pinに4個のサーボモータを直接接続した四足歩行ロボットをパソコン・スマホからWiFiによる遠隔操作します。
●obniz・サーボモータ電源はモバイルバッテリー2.4Aを使用しました。









動画


サーボモータ固定
●マイクロサーボモータSG90をユニバーサルプレート(タミヤ)に結束バンド固定。
●足はサーボモータのレバーにエアーチューブを挿入して先端を熱で細くしました。









レガシープログラム
https://console.obniz.com/ja/repository】2018年製作したプログラム

















obniz OLED初期画面
サーボモータ1
0 - GNd
1 - VCC
2 - SIGN










パソコン操作画面
動画は【体操】を選択しました。





















プログラム
<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@1.13.1/obniz.js" crossorigin="anonymous"></script>
</head>
<body>

<div id="obniz-debug"></div>
<h3>ROBOT</h3>  
<button id="UP" style="WIDTH: 100px; HEIGHT: 100px ;font-size:30px">直立</button>
<button id="GO" style="WIDTH: 100px; HEIGHT: 100px ;background-color:lightgreen ;font-size:30px ">前↑</button>
<button id="BACK" style="WIDTH: 100px; HEIGHT: 100px ;background-color:lightgreen ;font-size:30px">↓後</button>
 <h1></h1> 
<button id="DOWN" style="WIDTH: 100px; HEIGHT: 100px ;font-size:30px">正座</button>
<button id="LEFT" style="WIDTH: 100px; HEIGHT: 100px ;background-color:lightgreen ;font-size:30px">左←</button>
<button id="RIGHT" style="WIDTH: 100px; HEIGHT: 100px ;background-color:lightgreen ;font-size:30px">→右</button>
<h1></h1> 
<button id="STRETCH" style="WIDTH: 100px; HEIGHT: 100px;font-size:30px ">体操</button>
<button id="FAST" style="WIDTH: 100px; HEIGHT: 100px ;font-size:30px">高速</button>
<button id="SLOW" style="WIDTH: 100px; HEIGHT: 100px ;font-size:30px">低速</button>

<script>
var obniz = new Obniz("9406-4305");
obniz.onconnect = async function () { 
  
      var servoRL = obniz.wired("ServoMotor", {signal:2,vcc:1, gnd:0});
      var servoRR = obniz.wired("ServoMotor", {signal:5,vcc:4, gnd:3});
      var servoFL = obniz.wired("ServoMotor", {signal:8,vcc:7, gnd:6});
      var servoFR = obniz.wired("ServoMotor", {signal:11,vcc:10, gnd:9});
 
     


  $("#UP").on("click",async function(){      
      obniz.display.clear();
      obniz.display.pos(1,10);
      obniz.display.font(null,40)
      obniz.display.print("直立");
    //up
      servoRL.angle(95);
      servoRR.angle(85);
      servoFL.angle(95);
      servoFR.angle(85);
      await obniz.wait(1000);
  });
  
  $("#GO").on("click",async function(){      
      obniz.display.clear();
      obniz.display.pos(1,10);
      obniz.display.font(null,40)
      obniz.display.print("前進");    
    //go
     for (count = 0; count < 6; count++){
      servoRL.angle(125);
      servoRR.angle(115);
      servoFL.angle(35);
      servoFR.angle(25);
      await obniz.wait(500);
      servoRL.angle(65);
      servoRR.angle(55);
      servoFL.angle(155);
      servoFR.angle(145);
      await obniz.wait(500);   
    }  
    //up
      servoRL.angle(95);
      servoRR.angle(85);
      servoFL.angle(95);
      servoFR.angle(85);
      await obniz.wait(1000);
  });
  
  $("#BACK").on("click",async function(){      
      obniz.display.clear();
      obniz.display.pos(1,10);
      obniz.display.font(null,40)
      obniz.display.print("後退"); 
    //back
    for (count = 0; count < 6; count++){
      servoRL.angle(35);
      servoRR.angle(25);
      servoFL.angle(125);
      servoFR.angle(115);
      await obniz.wait(500);
      servoRL.angle(155);
      servoRR.angle(145);
      servoFL.angle(65);
      servoFR.angle(55);
      await obniz.wait(500);   
    }  
     //up
      servoRL.angle(95);
      servoRR.angle(85);
      servoFL.angle(95);
      servoFR.angle(85);
      await obniz.wait(1000);
  });
  
  $("#DOWN").on("click",async function(){      
      obniz.display.clear();
      obniz.display.pos(1,10);
      obniz.display.font(null,40)
      obniz.display.print("正座");
    
    //down
      servoRL.angle(10);
      servoRR.angle(170);
      servoFL.angle(170);
      servoFR.angle(10);
      await obniz.wait(1000);
    
  });
  
  $("#LEFT").on("click",async function(){      
      obniz.display.clear();
      obniz.display.pos(1,10);
      obniz.display.font(null,40)
      obniz.display.print("左折");
    //left
    for (count = 0; count < 6; count++){
      servoRL.angle(125);
      servoRR.angle(115);
      servoFL.angle(65);
      servoFR.angle(25);
      await obniz.wait(500);
      servoRL.angle(65);
      servoRR.angle(55);
      servoFL.angle(125);
      servoFR.angle(145);
      await obniz.wait(500);   
    }  
    //up
      servoRL.angle(95);
      servoRR.angle(85);
      servoFL.angle(95);
      servoFR.angle(85);
      await obniz.wait(1000);
  });
  
  $("#RIGHT").on("click",async function(){      
      obniz.display.clear();
      obniz.display.pos(1,10);
      obniz.display.font(null,40)
      obniz.display.print("右折");
    //right
    for (count = 0; count < 6; count++){
      servoRL.angle(105);
      servoRR.angle(95);
      servoFL.angle(55);
      servoFR.angle(65);
      await obniz.wait(500);
      servoRL.angle(55);
      servoRR.angle(55);
      servoFL.angle(155);
      servoFR.angle(115);
      await obniz.wait(500); 
        
    }
    //up
      servoRL.angle(95);
      servoRR.angle(85);
      servoFL.angle(95);
      servoFR.angle(85);
      await obniz.wait(1000);
  });
  
  $("#STRETCH").on("click",async function(){      
      obniz.display.clear();  
      obniz.display.pos(1,10);
      obniz.display.font(null,40)
      obniz.display.print("体操");
    //bup
    for (count = 0; count < 2; count++){
      servoRL.angle(145);
      servoRR.angle(35);
      servoFL.angle(95);
      servoFR.angle(85);
      await obniz.wait(1000);
      servoRL.angle(95);
      servoRR.angle(85);
      servoFL.angle(95);
      servoFR.angle(85);
      await obniz.wait(1000);
   } 
    //fup
    for (count = 0; count < 2; count++){
      servoRL.angle(95);
      servoRR.angle(85);
      servoFL.angle(35);
      servoFR.angle(145);
      await obniz.wait(1000);
      servoRL.angle(95);
      servoRR.angle(85);
      servoFL.angle(95);
      servoFR.angle(85);
      await obniz.wait(1000);
      
   } 
    
    for (count = 0; count < 2; count++){
      servoRL.angle(145);
      servoRR.angle(35);
      servoFL.angle(35);
      servoFR.angle(145);
      await obniz.wait(1000);
      servoRL.angle(95);
      servoRR.angle(85);
      servoFL.angle(95);
      servoFR.angle(85);
      await obniz.wait(1000);
     }
    
    for (count = 0; count < 2; count++){
      servoRL.angle(35);
      servoRR.angle(145);
      servoFL.angle(35);
      servoFR.angle(145);
      await obniz.wait(1000);
      servoRL.angle(95);
      servoRR.angle(85);
      servoFL.angle(95);
      servoFR.angle(85);
      await obniz.wait(1000);
     }
    for (count = 0; count < 2; count++){
      servoRL.angle(145);
      servoRR.angle(35);
      servoFL.angle(145);
      servoFR.angle(35);
      await obniz.wait(1000);
      servoRL.angle(95);
      servoRR.angle(85);
      servoFL.angle(95);
      servoFR.angle(85);
      await obniz.wait(1000);
     }
     for (count = 0; count < 1; count++){
      servoRL.angle(95);
      servoRR.angle(85);
      servoFL.angle(95);
      servoFR.angle(135);
      await obniz.wait(1000);
      servoRL.angle(95);
      servoRR.angle(85);
      servoFL.angle(95);
      servoFR.angle(85);
      await obniz.wait(1000);
     }
     for (count = 0; count < 1; count++){
      servoRL.angle(95);
      servoRR.angle(85);
      servoFL.angle(55);
      servoFR.angle(85);
      await obniz.wait(1000);
      servoRL.angle(95);
      servoRR.angle(85);
      servoFL.angle(95);
      servoFR.angle(85);
      await obniz.wait(1000);
     }
     for (count = 0; count < 1; count++){
      servoRL.angle(135);
      servoRR.angle(85);
      servoFL.angle(95);
      servoFR.angle(85);
      await obniz.wait(1000);
      servoRL.angle(95);
      servoRR.angle(85);
      servoFL.angle(95);
      servoFR.angle(85);
      await obniz.wait(1000);
     }
     for (count = 0; count < 1; count++){
      servoRL.angle(95);
      servoRR.angle(45);
      servoFL.angle(95);
      servoFR.angle(85);
      await obniz.wait(1000);
      servoRL.angle(95);
      servoRR.angle(85);
      servoFL.angle(95);
      servoFR.angle(85);
      await obniz.wait(1000);
     }
    //up
      servoRL.angle(95);
      servoRR.angle(85);
      servoFL.angle(95);
      servoFR.angle(85);
      await obniz.wait(1000);
  });
  
  $("#FAST").on("click",async function(){      
      obniz.display.clear();
      obniz.display.pos(1,10);
      obniz.display.font(null,40)
      obniz.display.print("高速");
    for (count = 0; count < 10; count++){
      servoRL.angle(105);
      servoRR.angle(95);
      servoFL.angle(55);
      servoFR.angle(45);
      await obniz.wait(150);
      servoRL.angle(85);
      servoRR.angle(75);
      servoFL.angle(135);
      servoFR.angle(125);
      await obniz.wait(150);   
    }  
   for (count = 0; count < 10; count++){
      servoRL.angle(55);
      servoRR.angle(45);
      servoFL.angle(105);
      servoFR.angle(95);
      await obniz.wait(150);
      servoRL.angle(135);
      servoRR.angle(125);
      servoFL.angle(85);
      servoFR.angle(75);
      await obniz.wait(150);   
    } 
    //up
      servoRL.angle(95);
      servoRR.angle(85);
      servoFL.angle(95);
      servoFR.angle(85);
      await obniz.wait(1000);
  });
  
  $("#SLOW").on("click",async function(){      
      obniz.display.clear();
      obniz.display.pos(1,10);
      obniz.display.font(null,40)
      obniz.display.print("低速");
    for (count = 0; count < 4; count++){
      servoRL.angle(135);
      servoRR.angle(125);
      servoFL.angle(25);
      servoFR.angle(15);
      await obniz.wait(1000);
      servoRL.angle(55);
      servoRR.angle(45);
      servoFL.angle(165);
      servoFR.angle(155);
      await obniz.wait(1000);   
    }  
    for (count = 0; count < 4; count++){
      servoRL.angle(25);
      servoRR.angle(15);
      servoFL.angle(135);
      servoFR.angle(125);
      await obniz.wait(1000);
      servoRL.angle(165);
      servoRR.angle(155);
      servoFL.angle(55);
      servoFR.angle(45);
      await obniz.wait(1000);   
    }  
    //up
      servoRL.angle(95);
      servoRR.angle(85);
      servoFL.angle(95);
      servoFR.angle(85);
      await obniz.wait(1000);
    
  });  
};

</script>
</body>
</html>




0 件のコメント:

コメントを投稿

FST3253 - 直交ミキサ製作

アマゾンの口コミ(SDRトランシーバーに使用出来る)を見てFST3253MTCとピッチ変換基板を購入、FST3253 直交ミキサ基板を製作してPi Pico Rxで受信確認できました。  ●Pi Pico Rx  【 https://101-things.readthedocs....