tanaka's Programming Memo

プログラミングについてのメモ。

マイクロサーボ SG-90 を Arduino で制御する

akizukidenshi.com

akizukidenshi.com

以上を接続して、制御してみます。

駆動にはArduinoの標準ライブラリであるServoを利用します。

配線

シンプルなので、直接Arduinoのpinにサーボモーターのコードをさします。

動作の決定

Servoライブラリでは、以下の2つの関数でサーボモーターを制御できます。

  • write(0〜180)
    • サーボの角度が指示の度数になるように回転させる
    • 連続回転タイプのサーボの場合は、0で振るスピード回転。180で逆方向に振るスピード回転。90で静止
    • SG-90は連続回転タイプではないので、角度のしていになる
  • writeMicroseconds(約1000〜2000)
    • マイクロ秒単位で、角度を指定
    • 標準的なサーボモーターでは、1000で反時計回りいっぱい、1500が中央,2000が時計回りいっぱい。ただし、この範囲外が使えるものもある

writeの0と180の方向や、writeMicrosecondsの意味がよくわからないので、その辺りを試せるスケッチを作成しましょう。以下のステップで動かすことにします。

  • 開始したら、write(0)を実行
  • 2秒待つ
  • write(180)を実行
  • 2秒待つ
  • write(90)を実行
  • 2秒待つ
  • writeMicroseconds(1000)を実行
  • 2秒待つ
  • writeMicroseconds(2000)を実行
  • 2秒待つ
  • writeMicroseconds(1500)を実行
  • 4秒待つ

スケッチの作成

Arduinoアプリを起動して、以下のコードを書きます。

#include <Servo.h>

// サーボのピン番号
const int SERVO_PIN = 9;
// サーボのインスタンス
Servo servo;

// INITがtrueの時は、モーターの位置を0にするだけ
const bool INIT = true;

void setup() {
  // put your setup code here, to run once:
  servo.attach(SERVO_PIN);
  servo.write(0);
}

void loop() {
  // put your main code here, to run repeatedly:
  if (INIT) return;

  servo.write(0);
  delay(2000);
  servo.write(180);
  delay(2000);
  servo.write(90);
  delay(2000);
  servo.writeMicroseconds(1000);
  delay(2000);
  servo.writeMicroseconds(2000);
  delay(2000);
  servo.writeMicroseconds(1500);
  delay(4000);
}

実行

上記のスケッチをビルドして、プログラムを書き込むと、サーボモーターが0の位置に移動して停止します。この状態で、プロペラをわかりやすい位置になるように取り付けましょう。

プロペラが取り付けられたら、以下のようにスケッチ内のINITの宣言をfalseに変更して、ビルドしてプログラムを書き込みます。

const bool INIT = false;

これで、テスト内容が動きます。これにより、SG-90の挙動として以下のことが把握できました。

  • write(0)は、時計回りで端まで動く
  • write(180)は、反時計回りの端まで動く
  • write(90)は、上記の中央に動く
  • writeMicroseconds(1000)は、時計回りで45度ぐらいのところに動く
  • writeMicroseconds(2000)は、反時計回りで135度ぐらいのところに動く
  • writeMicroseconds(1500)は、write(90)と同じ場所になる


以上で、テスト完了です。回転速度が変わるわけでもなさそうで、writeMicroseconds()の使い所がよく分かりませんが、まあそれはいいでしょうということで。write()で進めます。