Arduinoでサーボモータ(SG90、SG90-HV)を操作しました。

この記事で学習できること

  • サーボモータの仕組み、Arduinoとの接続方法、操作方法を、標準サーボモーター(SG90)連続回転サーボモーター(SG90-HV)を使って学習します。

サーボモータの仕組みは?

  • 標準サーボモーター(SG90)は、位置フィードバックを使用してその動作と最終位置を制御するクローズドループのシステムです。シャフトの位置を正確に制御できる特徴があります。
  • 連続回転サーボモーター(SG90-HV)は、速度と回転方向を変えて回転できます。

サーボモータの操作方法は?

  • 標準サーボモーターは、サーボの信号線に PWM (パルス幅変調) 信号を送信することによって制御されます。 パルス幅によって出力軸の位置が決まります。 パルス幅 1500usec の信号をサーボに送ると、サーボモーターは90 度の位置 に移動します。 最小 (0 度) と最大 (180 度) の位置は通常、それぞれ 1000usec と 2000usec のパルス幅に対応します。 これは、サーボ モーターの種類やブランドによって若干異なる場合があるります。 (例えば: 最小パルス幅が500usecで最大パルス幅が 2500usecであったりします。) 多くのサーボモータの中間位置はほとんど常に 1500usecです。
  • 連続回転サーボモーターは、モータが連続で回転し続けます。パルス幅1500usec のPWM信号をサーボに送ると回転が止まります。パルス幅1000usec~1500usecとパルス幅1500usec~2000usecで回転方向が変わり、PWM変調の度合いで回転速度が変わります。
  • ライブラリによっては、角度を指定してサーボモータを回転させることができます。たとえば、<Servo.h>を使えば、write(90)で角度90度の指定ができます。またPWM (パルス幅変調) 信号のパルス幅での指定ができます。writeMicroseconds(1500)は中立点の動作です。write(90)と同じ意味です。ライブラリの中のコードを読むと解りますが、write()関数は、引数の角度をusecに変換してwriteMicroseconds()関数を呼んでいます。
サーボモーターのPWM変調と回転角の関係
— サーボモーターのPWM変調と回転角の関係 —

学習に必要な部品は?

部品個数備考
SG901個標準サーボモーター
SG90ーHV1個連続回転サーボモーター
Arduino UNO R31個
ブレッドボード、接続用線材1式

部品の購入先

Arduinoの電子工作をはじめようと思ったらスターターキットを購入するのが便利です。別途SG90-HVを購入すれば、その他のこの記事に必要な部品はArduino UNO R3を含めて全て付属しています。

(広告) Arduino スターターキットと電子部品の購入先
購入先製品備考
AmazonArduino用のUNO R3 最終版スタータキットArduino UNO R3を含み、ブレッドボード、IC、センサなどが含まれています
秋月電子通商各種電子部品各種電子部品を少量から注文できます

Arduinoとサーボモータの接続は?

  • 電源、アース、信号の 3 本のワイヤを接続するだけなので、サーボ モータの配線はとても簡単です。 電源線は通常赤で、5 V に接続する必要があります。 SG90 のようなマイクロ サーボは、アイドル時に約 10 mA、回転時に約 100 ~ 250 mA を消費するため、Arduino の 5 V 出力で直接電力を供給することができます。 ただし、複数台以上のサーボモータを使用する場合は注意が必要です。 モーターが 300 mA 以上を消費する場合、Arduino の損傷を避けるために、外部電源を使用する必要があります。
Arsuino UNO R3とサーボモータの接続図と実際の接続
— Arsuino UNO R3とサーボモータの接続図と実際の接続 —
  • サーボ モータを制御するのにArduino UNO R3ボードを使っています。このボードはサーボモータを制御用のPWM出力ができるポートがあらかじめ決められています。ピン番号の前に”~”の記号が付いている、3, 5, 6, 9, 10, 11ピンがPWM出力に使えます。

サーボモータ用のライブラリはどう使うの?

  • サーボ モーターを制御するには、Arduino IDE にプリインストールされている Servoライブラリを使用します。
  • Servo.h をインクルードします。
#include <Servo.h>
  • Servoのインスタンスを作成します。
Servo myservo;
  • サーボ信号を出力するPin番号を指定します。(9番ピンを指定した例です。)
  myservo.attach(9);
  • サーボモータ-を回転する度数を指定します。(90度の位置を指定した例です。)
  myservo.write(90);
  • サーボモータ-の回転位置はパルス幅でも指定できます。(1500usecを指定した例です。) write()関数は内部で、角度をパルス幅に変換しwriteMicroseconds()関数を呼び出しています。
  myservo.writeMicroseconds(1500);

サーボモータを操作するスケッチは?

  • 標準サーボモーター(SG90)を90度->45度->90度->0度->90度->135度->90度->180度の順番で回転させます。
  • 連続回転サーボモーター(SG90-HV)は同じスケッチで動作しますが動きが異なります。90度の設定で回転が止まり、角度設定がが90以下と90度以上で回転方向が変わり、90度からのずれ量に従って回転速度が変わります。(角度を90度に近い、80度や100度に設定すると回転速度の違いが良くわかります。)
//サーボモータの回転制御

#include <Servo.h>
Servo myservo;

void setup(){
  myservo.attach(9);
  myservo.write(90);// move servos to 90°
  delay(5000);  
} 
void loop(){
  myservo.write(90);// move servos to 90°
  delay(5000);
  myservo.write(45);// move servos to 45°
  delay(2000);
  myservo.write(90);// move servos to 90°
  delay(2000);  
  myservo.write(0);// move servos to 0°
  delay(2000);
  myservo.write(90);// move servos to 90°
  delay(2000);
  myservo.write(135);// move servos to 135°
  delay(2000);
  myservo.write(90);// move servos to 90°
  delay(2000);    
  myservo.write(180);// move servos to 180°
  delay(2000);
}
  • 連続回転サーボモーター(SG90-HV)のスケッチの設定と回転数の関係を調べて記事にしました。
(参考) 連続回転サーボモーター(SG90-HV)の回転数を測定する記事

回転しない場合は?

● 回転しない場合は関連しそうな箇所を調べます。

  • PWM ピンではないピンに接続している
  • 配線ミス(茶=GND、赤=5V、橙=信号)
  • サーボの初期不良
  • コードの書き間違い

サーボモーター固定治具を作りました

  • Ardunoにサーボモータ-を接続して操作する時に、サーボモータ-を固定しないとモーターが回転時にサーボモータ-が振れて動きの観察が難しい場合があります。動作確認時にサーボモータ-を固定する治具を3Dプリンタで作成しました。
サーボモータ固定ケース
— サーボモータ固定ケース —

学習の参考にしたサイトは?

まとめ


ご質問、誤植の指摘などありましたら。「問い合わせ 」のページからお願いします。