obnizのフォーラムは新しいシステムに移行しております。

新しいフォーラムはこちらになります

サーボモータ接続について



  • サーボモーターSG90を3台(A、B、C)io0~io8までそれぞれ接続して動かそうとしています。
    「Aを動かした後、Bを動かして、Cを動かす。」としていますが、Cを動かそうとした場合Bの動きがなかなか止まらず、Cの挙動が不安定です。
    どのようにしたら安定して制御できるでしょうか?
    ご教示よろしくお願いいたします。



  • Cを動かそうとした場合Bの動きがなかなか止まらず、Cの挙動が不安定です。

    それぞれ単独で動かした場合は安定するでしょうか。

    もしくは
    A : 0~2
    B : 4~6
    C : 8~10

    のピンでおこなったら安定したりしないでしょうか。



  • 早速のご助言ありがとうございます。
    説明不足のところもあったかと思います。
    下記のように、move1(),move2(),move3()という関数を作成しています。そして、順次動かすようにしています。
    move1()を動かして、move2()まではうまく動作しますが、move3()になると動作が安定しません。
    繰り返し処理のwhileの動作なのでしょうか?

       let speed=10;
       let p=0;
        let i=90;
        var servo1 = obniz.wired("ServoMotor", {gnd:2,vcc:1,signal:0});
        servo1.angle(i);
        let m=90;
        var servo2 = obniz.wired("ServoMotor", {gnd:6,vcc:5,signal:4});
        servo2.angle(m);
        let n=90; 
        var servo3 = obniz.wired("ServoMotor", {gnd:10,vcc:9,signal:8});
        servo3.angle(n);
    

    async function move1() {
    servo1.on();
    servo2.off();
    servo3.off();

        while(i<=110){
            i++;  
            servo1.angle(i);
            await obniz.wait(speed);
              if(i==110){
                  while(i>=70){
                        i--;
                        servo1.angle(i);
                          await obniz.wait(speed);
                        }
                  }
             }
         }
    

    //******************************************************************************************
    async function move2() {

     servo1.off();
     servo2.on();
     servo3.off();   
    
          if(p==1){
            servo2.off(); 
             return;
            }
    
        while(m<=110){
            m++;
            servo2.angle(m);                                    
            await obniz.wait(speed);
              if(m==110){
                  while(m>=80){
                        m--;
                        servo2.angle(m);
                        await obniz.wait(speed);
                        }
                   }
             }
        }
    

    //******************************************************************************************
    let t=0;
    async function move3() {

    p++;

          if(p==1){
              servo1.off();  
              servo2.off();
              servo3.on();      
    
             button1.style.backgroundColor = "red";
             button2.style.backgroundColor = "blue";
             //obniz.display.print("Stop")
    
             button3.style.backgroundColor = "blue";
             document.getElementById("button3").innerText = "止まるまで待ってネ!"+p;
             servo3.angle(120);
             
           //}
             
                
                
              button3.style.backgroundColor = "red";
             document.getElementById("button3").innerText = "ハイポーズ!!!!"+p;
             
             
             while(t<=2){
               await obniz.wait(200);
               t++
                obniz.display.print(t)
             
             servo3.angle(55);
             await obniz.wait(100);
             servo3.angle(90);
             }
            window.location.reload();
              //await obniz.wait(500);
            
          }
    

    }



  • サーボモーターのon/offを頻繁にやられていますが、なにか意図しているでしょうか?
    サーボモーターがoffの時は外部からの力に弱くなりますので、その結果、安定しない状態になります。

    一度、サーボモーターを3つともずっとonの状態で試していただけないでしょうか。

    off();
    サーボモーターの電源を切ります。信号の供給も停止します。保持力がなくなりますから、モーターに負荷がかかっている場合はoffにすることで勝手に回転します。
    (https://obniz.com/ja/sdk/parts/ServoMotor/README.md より)



  • 下記のようにbreakでwhileを抜けるように修正したところ遅延なくサーボを停止することができました。
    やりたかったことは、サーボモーターをゆっくり動かして、HTML上に配置したボタンをタップしたら動きが止まるということをしたかったのです。おかげで、うまく制御できました。ご教示ありがとうございました。
    async function move1() {

    sp1++;
    if(sp1==3){
      sp1=1;
    }
    if(sp1==1){
        while(i<=110){
          if(sp1==2){
            break;
          }
            i++;  
            servo1.angle(i);
            await obniz.wait(speed);
    
              if(i==110){
                  while(i>=70){
                    if(sp1==2){
                     break;
                    }
                        i--;
                        servo1.angle(i);
                          await obniz.wait(speed);
                        }
                  }
             }
         }
    }


SUGGESTED TOPICS