Arduino サーボモーター制御 完全ガイド:ステップバイステップ解説
このチュートリアルでは、サーボモーターの仕組みと Arduino でサーボモーターを制御する方法を学びます。サーボモーターは使いやすく、優れた位置制御ができるため、多くの Arduino プロジェクトで広く使用されています。 サーボはロボティクス、自動化、RC モデルなどに最適です。私も多くの Arduino プロジェクトで使用してきました。いくつかご紹介します: 以下の動画をご覧いただくか、書面によるチュートリアルをお読みください。Arduino でサーボモーターを使用する複数の例、配線図、コードが含まれています。さらに、PCA9685 PWM ドライバーを使用して複数のサーボモーターを Arduino で制御するガイドも掲載しています。 サーボモーターは、位置フィードバックを使用してその動作と最終位置を制御するクローズドループシステムです。サーボモーターには多くの種類があり、その主な特徴はシャフトの位置を精密に制御できることです。 産業用サーボモーターでは位置フィードバックセンサーとして高精度エンコーダーが通常使用されますが、小型の RC またはホビーサーボでは位置センサーとして単純なポテンショメータが通常使用されます。これらのデバイスで取得された実際の位置はエラー検出器にフィードバックされ、目標位置と比較されます。その後、エラーに応じてコントローラーがモーターの実際の位置を目標位置と一致するように補正します。 このチュートリアルではホビーサーボモーターを詳細に見ていきます。これらのサーボの仕組みと Arduino を使用した制御方法を説明します。 ホビーサーボは、RC トイカー、ボート、飛行機などを制御するために使用される小型のアクチュエーターです。また、ロボティクスの試作、ロボットアームの作成、生物模倣ロボット、人型ロボットなどで工学部の学生にも使用されています。 ホビーサーボの内部には、DC モーター、ギアボックス、ポテンショメータ、制御回路の 4 つの主要コンポーネントがあります。DC モーターは高速・低トルクですが、ギアボックスによって速度を約 60 RPM に減速し、同時にトルクを増大させます。 ポテンショメータは最終ギアまたは出力シャフトに取り付けられているため、モーターが回転するとポテンショメータも回転し、出力シャフトの絶対角度に関連した電圧を生成します。制御回路では、このポテンショメータの電圧が信号線からの電圧と比較されます。必要に応じて、コントローラーは内蔵 H ブリッジを作動させ、2 つの信号の差がゼロになるまでモーターをどちらかの方向に回転させます。 サーボモーターは、信号線を通じて一連のパルスを送信することで制御されます。制御信号の周波数は 50Hz、つまり 20ms ごとにパルスが発生する必要があります。パルス幅がサーボの角度位置を決定し、これらのタイプのサーボは通常 180 度回転できます(物理的な可動範囲の制限があります)。 一般的に、1ms のパルス幅は 0 度位置、1.5ms は 90 度、2ms は 180 度に対応します。ただし、パルスの最小・最大持続時間はブランドによって異なる場合があり、0 度で 0.5ms、180 度で 2.5ms の場合もあります。 RC またはホビーサーボには多くの異なるモデルとメーカーがあります。サーボモーターを選択する際の主な考慮事項は、トルク、動作電圧、消費電流、サイズです。 メーカーの間で最も人気のある 2 つのサーボモデルは、SG90 マイクロサーボと MG996R です。 SG90 マイクロサーボ の技術仕様: MG996R サーボ の技術仕様: 上記の内容を実践し、Arduino を使用してホビーサーボを制御する実例を作成しましょう。ここでは、ストールトルク 10 kg-cm の金属ギアを備えた高トルクサーボである MG996R を使用します。高トルクの代償として、このサーボのストール電流は 2.5A です。定格電流は 500mA〜900mA、動作電圧は 4.8〜7.2V です。 これらの定格電流から、このサーボを Arduino に直接接続することはできず、別電源を使用する必要があることがわかります。 この例の回路図は以下の通りです。 サーボの制御ピンを Arduino ボードの任意のデジタルピンに接続し、GND と電源線を外部 5V 電源に接続し、Arduino の GND もサーボの GND に接続するだけです。 より小型のホビーサーボである S90 マイクロサーボを使用する場合、Arduino の 5V ピンから直接電源を供給することも可能です。 S90 マイクロサーボは消費電流が低く、無負荷時で約 100〜200mA ですが、ストール時は約 500〜700mA です。一方、Arduino の 5V ピンは USB 給電時で約 500mA、バレルコネクタ給電時で最大 1A の出力が可能です。 これらの 9g サーボモーターを Arduino に直接接続して動作させることは可能ですが、より安定した動作のためには常に外部電源を使用することをお勧めします。 この例に必要なコンポーネントは以下のリンクから入手できます: Arduino でサーボモーターを制御するコードを見てみましょう。コードは非常にシンプルです。サーボが接続されているピンを定義し、そのピンを出力に設定し、loop 部分で前述の特定の持続時間と周波数でパルスを生成するだけです。 テストの結果、私のサーボで機能する以下のパルス持続時間の値が得られました。0.6ms で 0 度、1.45ms で 90 度、2.3ms で 180 度です。 サーボと直列にマルチメーターを接続して消費電流を確認しました。ストール時に観測された最大電流は最大 0.63A でした。これはオリジナルの TowerPro MG996R ではなく、性能が明らかに劣る安価なレプリカだからです。 それでも、Arduino でサーボを制御するより便利な方法を見てみましょう。それが Arduino サーボライブラリを使用する方法です。 ここではライブラリをインクルードし、サーボオブジェクトを定義し、attach() 関数を使用してサーボが接続されているピンとパルス持続時間の最小・最大値を定義します。その後、write() 関数を使用してサーボの位置を 0〜180 度で簡単に設定できます。 Arduino サーボライブラリは、ほとんどの Arduino ボードで最大 12 個、Arduino Mega では最大 48 個のサーボを同時に制御できます。さらに、複数のサーボモーターを Arduino で制御することは、単一のサーボを制御するのと同じくらい簡単です。 複数のサーボを制御するサンプルコード: Servo クラスから各サーボモーター用のオブジェクトを作成し、どの Arduino ピンに接続されているかを定義するだけです。もちろん、任意のサーボを任意の位置に、任意のタイミングで移動させることができます。 例として、Arduino MEGA ボードを使用して 22 個のサーボモーターを制御した私の Arduino アリ型ヘキサポッドロボットプロジェクトもご覧ください。 Arduino でサーボを制御する別の方法として、PCA9685 サーボドライバーを使用する方法があります。これは Arduino と I2C バスで通信する 16 チャンネル 12 ビットの PWM およびサーボドライバーです。内蔵クロックを備え、16 個のサーボをフリーランニングで、または Arduino に依存せずに駆動できます。 さらに優れているのは、単一の I2C バス上で最大 62 個のドライバーをデイジーチェーン接続できることです。理論上、Arduino ボードの 2 つの I2C ピンのみを使用して最大 992 個のサーボを制御できます。6 つのアドレス選択ピンは、追加ドライバーごとに異なる I2C アドレスを設定するために使用されます。以下の表に従って半田パッドを接続するだけです。 回路図は以下の通りです。ここでもサーボ用に別電源が必要であることがわかります。 この例に必要なコンポーネントは以下のリンクから入手できます: Arduino コードを見てみましょう。このサーボドライバーを制御するために、GitHub からダウンロードできる PCA9685 ライブラリを使用します。 まずライブラリをインクルードし、PCA9685 オブジェクトを定義します。次に Servo_Evaluator インスタンスを使用して、パルス持続時間またはドライバーの PWM 出力を定義します。出力は 12 ビット、つまり 4096 ステップの分解能であることに注意してください。最小パルス持続時間 0.5ms(0 度位置)は 102 ステップに、最大パルス持続時間 2.5ms(180 度位置)は 512 ステップに対応します。しかし前述の通り、これらの値は使用するサーボモーターに合わせて調整する必要があります。私の場合は 102〜470 の値が 0〜180 度に対応しました。 setup では I2C クロックレートを定義し、ドライバーアドレスを設定し、周波数を 50Hz に設定します。 loop では、setChannelPWM() と pwmForAngle() 関数を使用してサーボを目的の角度に設定します。 2 番目のサーボをドライバーに接続しましたが、予想通り最初のサーボと同じ位置決めにはなりませんでした。これは私が使用しているサーボが安価なコピー品で、それほど信頼性が高くないためです。しかし、Servo_Evaluator インスタンスを使用して各サーボごとに異なる出力設定を定義できるため、これは大きな問題ではありません。90 度位置が正確に中央でない場合も調整可能です。このようにすればすべてのサーボが同じように動作し、正確な角度で位置決めされます。 もう 1 つの例として、複数の連結した PCA9685 ドライバーを使用して多数のサーボを制御する方法を見てみましょう。 そのためにはドライバー同士を接続し、適切なアドレス選択半田パッドを接続する必要があります。回路図は以下の通り: Arduino コードを見てみましょう。 各ドライバーごとに個別の PCA9685 オブジェクトを作成し、各ドライバーのアドレスを定義し、周波数を 50Hz に設定します。これで setChannelPWM() と pwmForAngle() 関数を使用して、任意のドライバーの任意のサーボを任意の角度に位置決めできます。 これはホビーサーボモーター(SG90 マイクロサーボと MG996R)でよくある問題です。前述の通り、負荷がかかったときにかなりの電流を消費するためです。特にサーボを Arduino の 5V ピンから直接給電している場合、Arduino ボードがリセットされる原因になります。 この問題を解決するには、GND と 5V ピンの間にコンデンサを接続します。これはディカップリングコンデンサとして機能し、DC モーターが起動する際のスタートアップ時にシステムに追加の電流を供給します。 これもホビーサーボでよくある問題です。前述の通り、パルス幅 1ms(0.5ms)が 0 度、2ms(2.5ms)が 180 度に対応します。しかし、これらの値はサーボごと、メーカーごとに異なる場合があります。 この問題を解決するには、Arduino でサーボモーターに送信するパルス幅を調整する必要があります。幸い、Arduino サーボライブラリを使用すると、attach() 関数でパルス幅の値を簡単に調整できます。 attach() 関数は 2 つの追加パラメータを取れます。それがマイクロ秒単位の最小・最大パルス幅です。デフォルト値は、最小(0 度)角度で 544 マイクロ秒(0.544ms)、最大で 2400 マイクロ秒(2.4ms)です。これらの値を調整することで、サーボの可動範囲を微調整できます。 最も人気のある 2 つのサーボモーター、SG90 マイクロサーボと MG996R サーボモーターの 3D モデルを作成しました。以下のリンクからダウンロードできます。 3D モデル: Thangs からダウンロード。 寸法: MG996R サーボモーター 3D モデル: Thangs からダウンロード。 寸法: Arduino でサーボモーターを使用するために知っておくべきことはほぼすべてカバーしました。もちろん、ホビーまたは RC サーボモーターには非常に多くのメーカーとモデルがあり、それぞれが上記の説明とは異なる独自の特徴を持っています。 モーターを使用した素晴らしいロボティクス、自動化、RC プロジェクトを作成する可能性は無限大ですが、アプリケーションに適したモデルを選択することが非常に重要です。 このチュートリアルを楽しんでいただき、新しいことを学んでいただけたなら幸いです。下のコメント欄で自由に質問してください。また、私の Arduino プロジェクトコレクションもぜひご覧ください。 Arduino でサーボモーターを使用するのは非常に簡単です。サーボモーターには 3 本のワイヤーがあり、そのうち 2 本は電源用の GND と 5V、3 本目は Arduino ボードに接続する制御線です。 サーボモーターを Arduino から直接動かすことはできますが、電源の問題が発生する可能性があります。サーボモーターが 500mA 以上の電流を消費する場合、Arduino ボードの電力が不足してリセットされることがあります。サーボモーターには常に別電源を使用することをお勧めします。 Arduino サーボライブラリを使用すると、ほとんどの Arduino ボードで最大 12 個、Arduino Mega では最大 48 個のサーボモーターを制御できます。もちろん、サーボモーター用の専用電源が必要です。
サーボモーターとは?




サーボモーターの仕組み


Arduino プロジェクトで人気の RC / ホビーサーボ

ストールトルク 1.2kg·cm @4.8V, 1.6kg·cm @6V 動作電圧 3.5 – 6V 無負荷電流 100mA ストール電流 650mA 最大速度 60度 / 0.12秒 重量 9g
ストールトルク 11kg·cm @4.8V, 13kg·cm @6V 動作電圧 4.8 – 7.2V 無負荷電流 220mA @4.8V, 250mA @6V ストール電流 650mA 最大速度 60度 / 0.20秒 重量 55g Arduino によるサーボモーター制御

回路図


サーボモーター制御 Arduino コード
/* Servo Motor Control - 50Hz Pulse Train Generator by Dejan, https://howtomechatronics.com */
#define servoPin 9
void setup() {
pinMode(servoPin, OUTPUT);
}
void loop() {
// 20ms ごとにパルス
digitalWrite(servoPin, HIGH);
delayMicroseconds(1450); // パルス持続時間(マイクロ秒)
digitalWrite(servoPin, LOW);
delayMicroseconds(18550); // 20ms - パルス持続時間
// パルス持続時間: 600 - 0度; 1450 - 90度; 2300 - 180度
}
/* Servo Motor Control using the Arduino Servo Library by Dejan, https://howtomechatronics.com */
#include <Servo.h>
Servo myservo; // サーボを制御するサーボオブジェクトを作成
void setup() {
myservo.attach(9, 600, 2300); // (ピン, 最小, 最大)
}
void loop() {
myservo.write(0); // サーボに特定の角度へ移動を指示
delay(1000);
myservo.write(90);
delay(500);
myservo.write(135);
delay(500);
myservo.write(180);
delay(1500);
}Arduino で複数のサーボモーターを制御

/* Controlling multiple servo motors with Arduino by Dejan, https://howtomechatronics.com */
#include <Servo.h>
Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
Servo servo5;
void setup() {
servo1.attach(8);
servo2.attach(9);
servo3.attach(10);
servo4.attach(11);
servo5.attach(12);
}
void loop() {
// すべてのサーボを位置 0 へ移動
servo1.write(0);
servo2.write(0);
servo3.write(0);
servo4.write(0);
servo5.write(0);
delay(2000);
// すべてのサーボを位置 90 へ移動
servo1.write(90);
servo2.write(90);
servo3.write(90);
servo4.write(90);
servo5.write(90);
delay(2000);
// すべてのサーボを位置 180 へ移動
servo1.write(180);
servo2.write(180);
servo3.write(180);
servo4.write(180);
servo5.write(180);
delay(2000);
}Arduino と PCA9685 PWM / サーボドライバー



Arduino と PCA9685 のコード
/* Servo Motor Control using Arduino and PCA9685 Driver by Dejan, https://howtomechatronics.com Library: https://github.com/NachtRaveVL/PCA9685-Arduino */
#include <Wire.h>
#include "PCA9685.h"
PCA9685 driver; // PCA9685 出力 = 12-bit = 4096 ステップ
// 20ms の 2.5% = 0.5ms ; 20ms の 12.5% = 2.5ms
// 4096 の 2.5% = 102 ステップ; 4096 の 12.5% = 512 ステップ
PCA9685_ServoEvaluator pwmServo(102, 470); // (-90deg, +90deg)
// 2番目のサーボ
// PCA9685_ServoEvaluator pwmServo2(102, 310, 505); // (0deg, 90deg, 180deg)
void setup() {
Wire.begin(); // Wire を最初に開始
Wire.setClock(400000); // サポートされるボーレート: 100kHz, 400kHz, 1000kHz
driver.resetDevices(); // Wire ライン上のすべての PCA9685 デバイスをソフトウェアリセット
driver.init(B000000); // アドレスピン A5-A0 を B000000 に設定
driver.setPWMFrequency(50); // 周波数を 50Hz に設定
}
void loop() {
driver.setChannelPWM(0, pwmServo.pwmForAngle(-90));
delay(1000);
driver.setChannelPWM(0, pwmServo.pwmForAngle(0));
delay(1000);
driver.setChannelPWM(0, pwmServo.pwmForAngle(90));
delay(1000);
}Arduino と PCA9685 ドライバーで多数のサーボを制御


/* Servo Motor Control using Arduino and PCA9685 Driver by Dejan, https://howtomechatronics.com Library: https://github.com/NachtRaveVL/PCA9685-Arduino */
#include <Wire.h>
#include "PCA9685.h"
PCA9685 driver; // PCA9685 出力 = 12-bit = 4096 ステップ
// 20ms の 2.5% = 0.5ms ; 20ms の 12.5% = 2.5ms
// 4096 の 2.5% = 102 ステップ; 4096 の 12.5% = 512 ステップ
PCA9685_ServoEvaluator pwmServo(102, 470); // (-90deg, +90deg)
// 2番目のサーボ
PCA9685_ServoEvaluator pwmServo2(102, 310, 505); // (0deg, 90deg, 180deg)
void setup() {
Wire.begin(); // Wire を最初に開始
Wire.setClock(400000); // サポートされるボーレート: 100kHz, 400kHz, 1000kHz
driver.resetDevices(); // Wire ライン上のすべての PCA9685 デバイスをソフトウェアリセット
driver.init(B000000); // アドレスピン A5-A0 を B000000 に設定
driver.setPWMFrequency(50); // 周波数を 50Hz に設定
}
void loop() {
driver.setChannelPWM(0, pwmServo.pwmForAngle(-90));
delay(1000);
driver.setChannelPWM(0, pwmServo.pwmForAngle(0));
delay(1000);
driver.setChannelPWM(0, pwmServo.pwmForAngle(90));
delay(1000);
}トラブルシューティング
サーボモーターがジッターし、Arduino ボードがリセットされる
サーボモーターが 0〜180 度の全範囲で動かない
myservo.attach(9, 600, 2300); // (ピン, 最小, 最大)寸法と 3D モデル
SG90 マイクロサーボ


MG996R サーボモーター


まとめ
よくある質問(FAQ)
Arduino でサーボモーターを使うにはどうすればいいですか?
製造プロセス
- スマート貯金箱を作ろう:Arduino Nanoでコインアクセプターを制御
- ArduinoとHC-SR04で作るサーボ駆動障害物回避ロボット
- ArduinoでBluetooth経由でLEDを制御 – シンプルDIYガイド
- Arduino Nanoとジョイスティックで2軸ステッピングモーターを制御:Visuinoで簡単プログラミング
- Arduino & MPU6050:SG90 & MG996Rサーボの精密制御
- ThimbleKrox: Arduino MicroとMPU-6050を用いた指装着型マウス制御
- Arduinoで楽器演奏:音階生成のステップバイステップガイド
- ArduinoをNMEA-0183に接続するステップバイステップガイド
- Arduinoでゴキブリ制御システムを自作 - 30ドル以下で構築
- アルミニウム半田付けのマスター:エキスパート技術と実践ガイド
- クラッチのメカニズム:産業向け包括ガイド