サーボモータ制御:完全ガイド
主な学習点:
サーボモータ制御の定義:サーボモータ制御は、電子信号を通じてモータの位置、速度、および加速度を正確に操作することができます。
フィードバックメカニズム:フィードバックシステム(通常はポテンショメータまたはエンコーダ)は、モータの出力が制御入力と正確に一致するようにします。
PWM信号:パルス幅変調(PWM)は、電気パルスの持続時間を変化させることでサーボの位置を設定するために重要です。
Arduinoとサーボモータ:Arduinoボードを使用してサーボモータをプログラミングし制御することは、ハードウェアのセットアップが最小限で効果的な方法です。
サーボモータの応用:サーボモータは、ロボット工学や自動化システムなど、正確な位置制御が必要なプロジェクトに不可欠です。
サーボモータは、回転における高精度と正確性のために設計されたモータです。一般的なDCモータとは異なり、特定の位置を保持する能力を持っています。この特徴により、サーボモータはロボット工学、自動化、趣味のプロジェクトに適しています。
この記事では、サーボモータ制御の機能、さまざまなタイプのサーボモータ、およびさまざまな制御方法とデバイスについて説明します。また、サーボモータの応用例とプロジェクトも提供します。
サーボモータとは何ですか?
サーボモータは、位置(角度)、速度、および加速を精密に制御できるアクチュエータとして定義されます。典型的なサーボモータは、DCモータ、制御回路、およびフィードバックデバイスの3つの主要なコンポーネントで構成されています。
DCモータはサーボを駆動し、ギアに接続して出力軸の速度を減速しトルクを増大させます。

出力軸は、サーボの回転部分であり、負荷を移動させる部分です。
制御回路は、外部コントローラからの入力信号を受け取り処理する役割を持ちます。これらの信号は、サーボがどの位置、速度、または方向に移動するかを指示します。制御回路はまた、DCモータを駆動するための電力を供給します。
フィードバックデバイスは通常、ポテンショメータまたはエンコーダで、出力軸の現在位置を測定します。

フィードバックデバイスは位置データを制御回路に送り返し、制御回路はDCモータの電力を調整して実際の位置を入力信号の希望位置に合わせます。
制御回路とフィードバックデバイス間のフィードバックループにより、サーボはその可動範囲内の任意の位置に正確に移動し維持することができます。
サーボモータをどのように制御するか?
サーボモータは、PWM(パルス幅変調)信号をサーボの信号線に送ることで制御されます。PWMは、信号を高速にオンとオフを切り替えて幅の異なるパルスを作成する技術です。パルスの幅が出力軸の位置を決定します。
たとえば、パルス幅が1.5ミリ秒(ms)のPWM信号を送ると、サーボはニュートラル位置(90度)に移動します。

パルス幅が1 msのPWM信号を送ると、サーボは最小位置(0度)に移動します。パルス幅が2 msのPWM信号を送ると、サーボは最大位置(180度)に移動します。
PWM信号の周波数は50 Hzで、これは20 msごとに繰り返されることを意味します。この期間内でのパルス幅は1 msから2 msまで変化できます。
PWM信号をサーボモータに生成して送る方法はいくつかあります。最も一般的な方法は以下の通りです。
Arduinoボードまたは他のマイクロコントローラーを使用する
ポテンショメータまたは他のアナログセンサーを使用する
ジョイスティックまたは他のデジタル入力デバイスを使用する
専用のサーボコントローラまたはドライバを使用する
次のセクションでは、これらの各方法について詳しく見て、それらがどのように動作するかの例を見ていきます。
Arduinoを使用したサーボモータの制御
Arduinoは、サーボモータを制御する最も人気のあるプラットフォームの一つです。Arduinoボードには、サーボに信号を送るために使用できる組み込みのPWM出力があります。Arduinoにはサーボ制御を容易にするServoライブラリもあります。
Arduinoを使用してサーボモータを制御するには、以下のものが必要です。
Arduinoボード(Arduino UNOなど)
標準的なサーボモータ(SG90など)
ジャンパワイヤ
ブレッドボード(オプション)
サーボの赤いワイヤはArduinoボードの5Vに接続します。サーボの黒いワイヤはArduinoボードのGNDに接続します。サーボの白いワイヤはArduinoボードのピン9に接続します。
Arduinoボードをプログラムするには、Arduino IDE(オンラインまたはオフライン)を使用する必要があります。Servoライブラリの例を使用するか、独自のコードを書くことができます。
次のコードは、forループを使用してサーボモータを180度往復させる方法を示しています。
#include <Servo.h> // Servoライブラリをインクルード
Servo myservo; // Servoオブジェクトを作成
int pos = 0; // 位置用の変数
void setup() {
myservo.attach(9); // Servoオブジェクトをピン9に接続
}
void loop() {
for (pos = 0; pos <= 180; pos += 1) { // 0度から180度までのループ
myservo.write(pos); // 位置をServoオブジェクトに書き込む
delay(15); // 15 ms待つ
}
for (pos = 180; pos >= 0; pos -= 1) { // 180度から0度までのループ
myservo.write(pos); // 位置をServoオブジェクトに書き込む
delay(15); // 15 ms待つ
}
}
このコードは、2つのループを使用して、位置変数を0度から180度まで増加させてから減少させます。myservo.write(pos)を使用してこの値をServoオブジェクトに書き込みます。また、各ステップ間に15 msの遅延を追加して動きを遅くします。
このコードをIDEのUploadボタンを使用してArduinoボードにアップロードすると、サーボモータが滑らかに往復することを確認できます。
ポテンショメータを使用したサーボモータの制御
ポテンショメータは、ノブを回すことで抵抗を変えることができるアナログセンサーです。ポテンショメータを入力デバイスとして使用してサーボモータを制御することができます。
ポテンショメータを使用してサーボモータを制御するには、以下のものが必要です。
Arduinoボード(Arduino UNOなど)
標準的なサーボモータ(SG90など)
ポテンショメータ(10kΩ)
ジャンパワイヤ
ブレッドボード
ポテンショメータとサーボモータをArduinoボードに接続する配線図は以下の通りです。
ポテンショメータの赤いワイヤはArduinoボードの5Vに接続します。ポテンショメータの黒いワイヤはArduinoボードのGNDに接続します。ポテンショメータの緑色のワイヤはArduinoボードのピンA0に接続します。
サーボの赤いワイヤはブレッドボードの別の行の5Vに接続します。サーボの黒いワイヤはブレッドボードの別の行のGNDに接続します。サーボの白いワイヤはブレッドボードの別の行のピンD9に接続します。
Arduinoボードをプログラムするには、前の例と同じコードを使用しますが、いくつかの行を変更します。
#include <Servo.h> // Servoライブラリをインクルード
Servo myservo; // Servoオブジェクトを作成
int potpin = A0; // ポテンショメータに接続されたピン
int val = 0; // ポテンショメータの値を読み取るための変数
void setup() {
myservo.attach(9); // ServoオブジェクトをピンD9に接続
}
void loop() {
val = analogRead(potpin); // ポテンショメータの値を読み取る(0 - 1023)
val = map(val,0,1023,0,180); // 値の範囲をマッピング(0 - 180)
myservo.write(val); // マッピングされた値をServoオブジェクトに書き込む
delay(15); // 15 ms待つ
}
このコードはanalogRead(potpin)関数を使用して、ピンA0に接続されたポテンショメータの値を読み取ります。次にmap(val,0,1023,0,180)関数を使用して値の範囲を0 - 1023から0 - 180度にマッピングします。myservo.write(val)関数を使用してこの値をServoオブジェクトに書き込みます。また、前の例と同じように15 msの遅延を追加します。
このコードをIDEのUploadボタンを使用してArduinoボードにアップロードすると、サーボモータがポテンショメータのノブの位置に応じて動くことを確認できます。
ジョイスティックを使用したサーボモータの制御
ジョイスティックは、2つの軸沿いの方向と大きさを検出できるデジタル入力デバイスです。ジョイスティックを使用してサーボモータを制御することができます。
ジョイスティックを使用してサーボモータを制御するには、以下のものが必要です。
Arduinoボード(Arduino UNOなど)
標準的なサーボモータ(SG90など)
ジョイスティックモジュール(KY-023など)
ジャンパワイヤ
ブレッドボード
ジョイスティックモジュールとサーボモータをArduinoボードに接続する配線図は以下の通りです。
!https://www.makerguides.com/wp-content/uploads/2019/01/Servo-motor-control-with-Arduino-and-joystick-wiring-diagram.png
ジョイスティックモジュールの赤いワイヤはArduinoボードの5Vに接続します。ジョイスティックモジュールの黒いワイヤはArduinoボードのGNDに接続します。ジョイスティックモジュールの緑色のワイヤはArduinoボードのピンA0に接続します。
サーボの赤いワイヤはブレッドボードの別の行の5Vに接続します。サーボの黒いワイヤはブレッドボードの別の行のGNDに接続します。サーボの白いワイヤはブレッドボードの別の行のピンD9に接続します。
Arduinoボードをプログラムするには、前の例と同じコードを使用しますが、いくつかの行を変更します。
#include <Servo.h> // Servoライブラリをインクルード
Servo myservo; // Servoオブジェクトを作成
int joyX = A0; // ジョイスティックのx軸に接続されたピン
int val = 0; // ジョイスティックの値を読み取るための変数
void setup() {
myservo.attach(9); // Servoオブジェクトをピン9に接続
}
void loop() {
val = analogRead(joyX); // ジョイスティックのx軸の値を読み取る(0 - 1023)
val = map(val, 0, 1023, 0, 180); // 値の範囲をマッピング(0 - 180)
myservo.write(val); // マッピングされた値をServoオブジェクトに書き込む
delay(15); // 15 ms待つ
}
このコードはanalogRead(joyX)関数を使用して、ピンA0に接続されたジョイスティックのx軸の値を読み取ります。次にmap(val, 0, 1023, 0, 180)関数を使用して値の範囲を0 - 1023から0 - 180度にマッピングします。myservo.write(val)関数を使用してこの値をServoオブジェクトに書き込みます。また、各ステップ間に15 msの遅延を追加します。
<