31章:2自由度マイクロサーボ SG90制御

    作成2016.10.18
     自由度マイクロサーボ SG90制御について検討します。


  1. マイクロサーボ SG90の購入先と価格
    (1)購入先:アマゾン
    (2)品名:マイクロサーボ SG90 (10個入)
    (3)価格:¥ 2,597(配送は無料)


  2. マイクロサーボ SG90の仕様
    (1)質量:9g
    (2)外形;22.2x11.8x31mm
    (3)トルク:1.8kgf・cm
    (4)動作速度:0.1 s/60度
    (5)動作電圧:4.8〜5V
    (6)指令パルス幅の条件
    *パルス幅1.5msのとき中立位置に向かって移動
    *パルス幅2msのとき右回転
    *パルス幅1msのとき右回転
    *パルス電圧はマイコン指令電圧で動作します。
    *1パルスで約10度近く回転します。(かなり大まかな動きです)
    *パルス数を多くしても、一定位置以上には回転しません。

     詳細は10-1.pdfを参照願います。
    [31-1.pdf]をダウンロードする。


  3. 2自由度マイクロサーボ SG90の外観
      2自由度マイクロサーボ SG90の外観を以下に示します。





  4. 2自由度マイクロサーボ SG90制御回路図
      2自由度マイクロサーボ SG90制御回路図を以下に示します。







  5. ESP−WROOM−02用スケッチ
     ESP−WROOM−02用スケッチは以下としました。
    //SG90_V1
    #include <stdlib.h>
    
    #include <ESP8266WiFi.h>
    const char* ssid     = "SSID";//無線LANのSSIDを設定します。
    const char* password = "password";//無線LANのpasswordを設定します。
    const char* host = "192.168.11.2";//パソコンのIPアドレスを設定します。
    const int httpPort = 13000;//TCPサーバのポート
    static String gSendText="";
    
    void WiFi_loop();
    void SG90_Servo();
    void serialEvent();
    
    int gX_T=0,gX_N=0;
    int gY_T=0,gY_N=0;
    
    void setup() 
    {
      Serial.begin(115200);
      pinMode(4, OUTPUT);
      pinMode(5, OUTPUT);
    
      WiFi.begin(ssid, password);//無線LANに接続要求
      
      while (WiFi.status() != WL_CONNECTED) 
      {
        delay(500);
        Serial.print(".");
      }
      Serial.println("");
      Serial.println("WiFi connected");
      int i;
      for(i=0;i<10;i++)
      {
        digitalWrite(4,HIGH);
        digitalWrite(5,HIGH);
        delayMicroseconds(1500);
        digitalWrite(4,LOW);
        digitalWrite(5,LOW);
        delay(10);
      }
    }
    
    void loop() 
    {
      SG90_Servo();
      serialEvent();
      WiFi_loop();
      if(gX_T>8){gX_T=8;}
      if(gX_T<-8){gX_T=-8;}
      if(gY_T>8){gY_T=8;}
      if(gY_T<-8){gY_T=-8;}
    }
    
    
    
    
    void SG90_Servo()
    {
      int i;
      if(gX_T-gX_N>0)
      {
        for(i=0;i<gX_T-gX_N;i++)
        {
          digitalWrite(4,HIGH);
          delay(2);
          digitalWrite(4,LOW);
          delay(10);
        }
        gX_N=gX_T;
      }
      else
      {
        if(gX_T-gX_N<0)
        {
          for(i=0;i<gX_N-gX_T;i++)
          {
            digitalWrite(4,HIGH);
            delay(1);
            digitalWrite(4,LOW);
            delay(11); 
          }
          gX_N=gX_T;
        }
      }
      if(gY_T-gY_N>0)
      {
        for(i=0;i<gY_T-gY_N;i++)
        {
          digitalWrite(5,HIGH);
          delay(2);
          digitalWrite(5,LOW);
          delay(10);
        }
        gY_N=gY_T;
      }
      else
      {
        if(gY_T-gY_N<0)
        {
          for(i=0;i<gY_N-gY_T;i++)
          {
            digitalWrite(5,HIGH);
            delay(1);
            digitalWrite(5,LOW);
            delay(11); 
          }
        }
        gY_N=gY_T;
      }
      
    }
    void serialEvent()
    {
      int gi=0;
      char inputString[50];
      
      while (Serial.available()) 
      {
        String line = Serial.readStringUntil('\n');//受信します。
        Serial.println(line+"\r\n");
    
        if(line.indexOf("BT") == 0)
        {
          int Bracket2 = line.indexOf('#', 2 );
          int Bracket3 = line.indexOf('#',Bracket2+1);
          int Bracket4 = line.indexOf('#',Bracket3+1);
          String inString_gX =line.substring(Bracket2+1,Bracket3);
          String inString_gY =line.substring(Bracket3+1,Bracket4);
          gX_T = inString_gX.toInt();
          gY_T = inString_gY.toInt();
          Serial.println(gX_T)/10;
          Serial.println(gY_T)/10;
        }
        
      }
    }
    
    void WiFi_loop()
    {
      WiFiClient client;
      if (client.connect(host, httpPort))
      {
        if(gSendText.length() > 0)
        {
          client.print(gSendText);//データを送信
          Serial.print(gSendText);
          gSendText="";
          delay(500);
        }
        else
        {
          client.print("NG\r\n");
          Serial.print("NG\r\n");
          delay(1000);
        }
    
        while(client.available())
        {
          String line = client.readStringUntil('\n');//受信します。
          if(line.indexOf("BT") == 0)
          {
            int Bracket2 = line.indexOf('#', 2 );
            int Bracket3 = line.indexOf('#',Bracket2+1);
            int Bracket4 = line.indexOf('#',Bracket3+1);
            String inString_gX =line.substring(Bracket2+1,Bracket3);
            String inString_gY =line.substring(Bracket3+1,Bracket4);
            gX_T = inString_gX.toInt()/10;
            gY_T = inString_gY.toInt()/10;
            Serial.println(gX_T);
            Serial.println(gY_T);
          }
          Serial.print(line+"\r\n");
          gSendText=line + "=OK\r\n";//送信データのセット
        }  
      }
    }
    


  6. ESP−WROOM−0スケッチ_テキストファイル
     ESP−WROOM−0スケッチ_テキストファイルは以下から参照できます。
    ESP−WROOM−0スケッチ_テキストファイルにいく。


  7. スケッチの書込み
    (1)ESP-WROOM-02のフラッシュ書き換え時のピン設定
    *ENピン:(Chip Enable.)→High(10kΩプルアップ)
    *GPIO-15ピン:(Type I/O MTDO;HSPI_CS; UART0_RTS)→LowHigh(10kΩプルダウン)
    *GPIO-2ピン:(Type I/O UART Tx during flash programming)→High(10kΩプルアップ)
    *GPIO-0ピン:(Type I/O SPI_CS2)→Low(10kΩプルダウン)(Lowでラッシュ書き換えモード)
    *TXピン:USBシリアル変換モジュールのRX
    *RXピン:USBシリアル変換モジュールのTX
    *GNDピン:USBシリアル変換モジュールのGND

    (2)ESP-WROOM-02の電源を投入します。
    (3)メニュー「ツール」_「ポート」_「COM14」を選択します。
    (4)メニュー「スケッチ」_「マイコンボードに書込む」を選択します。
    (5)書込みが完了します。
    (6)GPIO-0ピン:(Type I/O SPI_CS2)→High(10kΩプルアップ)に戻します。
    (7)ESP-WROOM-02の電源を再投入します。


  8. processing用スケッチ
     processing用スケッチは以下としました。
    //TCP_Server
    import processing.net.*;
    int port = 13000;
    Server myServer;
    Client thisClient;
    
    float Mx,My;
    int gM=0;
    
    void setup()
    {
      size(400,400,P3D);
      noStroke();
           
      myServer = new Server(this, port);
    }
    
    void draw() 
    {
      //thisClient = myServer.available();
      Mx=map(mouseX, 0, width, -PI/2, PI/2);
      My=map(mouseY, 0, height, PI/2, -PI/2);
      if(abs(Mx)>abs(My))
      {
        if(abs(Mx)<0.3)
        {gM=0;}
        else
        {
          if(abs(Mx)<0.5)
          {gM=3;}
           else{gM=1;}
        }
      }
      else
      {
         if(abs(My)<0.3)
         {gM=0;}
         else
         {
            if(abs(My)<0.5)
            {gM=4;}
            else{gM=2;}
         }
      }
      //thisClient = myServer.available();
      thisClient = myServer.available();
      if (thisClient != null)
      {
        if (thisClient.available() > 0)
        {
          //println(thisClient.ip() + " : " + thisClient.readString());
          println(thisClient.readString());
          int MX=(int)(100*Mx);
          int MY=(int)(100*My);
          thisClient.write("BT"+gM+"#"+MX+"#"+MY+"#\r\n");
        }
      }
      pushMatrix();
      lights();
      background(255);
      fill(0,255,0);
      translate(width / 2, height / 2);
      rotateZ(Mx);
      rotateX(My);
      box(100,20,200);
      popMatrix();
      
    }
    


  9.  processingスケッチ_テキストファイルは以下から参照できます。
    processingスケッチ_テキストファイルにいく



  10. 動作試験
    (1)processing用スケッチをRunします。
    (2)マススを動かすこと、連動して2自由度マイクロサーボ SGが動作します。





  11. 2自由度マイクロサーボ SG90制御まとめ
    (1) 2自由度マイクロサーボ SG90制御は比較的に簡単でした。
    (2)processing用スケッチ「TCP_Server」は28章:WiFi無線とprocessingでおもちゃを動かすと共通です。
    (3)また、30章:高品位DC12Vブラシ付モータPWN10EB12CBのサーボ制御とも共通です。




32章:TCPサーバと加速度センサ、コンパスの統合に行く。

トップページに戻る。