Arduinoでのサーボモーターの基本

Arduinoボードでのサーボモーターの接続方法と制御方法を学びます。


Author:ArduinoLast revision:2024/03/04

Servoライブラリは、サーボモーター制御用の素晴らしいライブラリです。この記事では、Arduinoボードで利用できる2つの簡単な例を示します。

最初の例では、Arduinoと可変抵抗器でRC(ホビー)用サーボモーターの位置を制御します。2つ目の例では、RCサーボモータのシャフトを180度往復させます。

Servo Githubリポジトリを訪れれば、このライブラリの詳細を学ぶことができます。

必要なハードウェア

  • Arduinoボード
  • サーボモーター
  • 10kΩの可変抵抗器
  • フックアップワイヤー

サーボモーターへの給電

サーボモーターは、サイズと負荷に応じて異なる電力要件があります。Feetech Mini Servo Motorのような一般てきなサーボモーターは、アイドル時に4.8-6V、5-6mAを要求します。静止させているだけであれば、多くの電力を必要としません。

しかし、モーターが動き始めるとすぐに、より多くの電力を使い始め、その電力は電源からより多くの電流を引き出すことで得られます。

重量が追加されたり、物体がその動きをブロックするなど、より高負荷がかかると、障害物を動かすためにより多くの電力が必要となります。結果として、消費電流は増加します。上記のモーターの消費電流は800mAになることもあります。

一般的に、Arduinoボードからこの高電流を引き出すのは、安全ではありません。ボードを損傷させないために、サーボモーターには外部電源から給電する必要があります。他さ強い電源の選択は、利用するサーボモーターに依存するので、常に仕様を確認してください。特に以下のことに注意してください。

  • 動作電圧の範囲
  • 無負荷時電流: 動いていないときの消費
  • 動作時電流: 自由に動いているときの消費
  • ストール時電流: 最大負荷あるいは失速したときの消費

サーボに4.8-6Vを給電するには、5V1AのACアダプタを使うことができます。電線を切断し、例えば、ブレッドボードを使いサーボに接続します。

i
USB充電器は、500mA(USB 2.0)や900mA(USB3.0)に制限されます。

コンセントに接続せずに自由に動き回る必要のあるプロジェクトなら、サーボへの給電にバッテリーを選択することもできます。正確に5Vが必要なら、2つの18650 Li-Ionバッテリと降圧器を使うことができます。

2つの18650 li-Ionバッテリは、約7.4Vなので、降圧器が必要です。最大電流はバッテリーに依存しますが、多くは約1Aを出力するように設計されていて、小さいサーボには十分な電力です。

i
大きな、あるいは、多くのサーボを使うときは、電力要件を確認してください。

サーボモーターに給電する際は、コンデンサーの使用が推奨されます。コンデンサーは電源を安定させ、電圧降下を最小に抑え、電気ノイズを削減します。コンデンサーの容量はサーボモーターの要件により異なりますが、コンデンサーの利用はより良い性能と信頼性を得るには、利用することを勧めます。

Feetech Mini Servo Motorを使うときは、100μFのコンデンサーの仕様を勧めます。

i
極性のあるコンデンサー(方向性があることを意味します)もあるので、回路の接続するには注意が必要です。白い線や'+'記号、長いリード線で示されるマークを確認し、正しく接続してください。コンデンサーこれらがある場合は、+と-記号に注意して、コンデンサーの印が回路に合うようにしてください。また、電圧制限を超えないように注意してください。この予防措置は、回路を壊すリークや損傷などの問題を防ぐのに役立ちます。

回路

サーボモーターは、電源、GND、信号の3線です。電源コードは通常赤で、Arduinoボードの5Vに接続します。GNDは通常黒か茶色で、ボードのGNDに接続します。信号ピンは通常黄色かオレンジ色で、ボードのPWMピンに接続します。今回の例では9番ピンです。

Knob回路

Knobの例では、可変抵抗器の両外側のピンをボードの+5VとGNDに接続し、真ん中のピンをA0に接続します。また、サーボモーターを+5VとGND、9番ピンに接続します。

Sweep回路

Sweepの例では、サーボモーターを+5VとGND、9番ピンに接続します。

Knob

可変抵抗を使ってサーボの位置を制御します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include <Servo.h>

Servo myservo;  // create servo object to control a servo

int potpin = 0;  // analog pin used to connect the potentiometer
int val;    // variable to read the value from the analog pin

void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}

void loop() {
  val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023)
  val = map(val, 0, 1023, 0, 180);     // scale it to use it with the servo (value between 0 and 180)
  myservo.write(val);                  // sets the servo position according to the scaled value
  delay(15);                           // waits for the servo to get there
}

Sweep

RCサーボモータのシャフトを180度往復させます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <Servo.h>

Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards

int pos = 0;    // variable to store the servo position

void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}

void loop() {
  for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
  for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
}

オリジナルのページ

https://docs.arduino.cc/learn/electronics/servo-motors/

最終更新日

August 2, 2026

inserted by FC2 system