Arduinoで2台のサーボモーターを同時制御する方法|個別に速度を変えるプログラム例と仕組みを解説

工学

Arduinoを使った電子工作では、複数のサーボモーターを同時に動かしながら、それぞれ異なる速度で制御したい場面があります。ロボットの関節制御や模型のギミックなどでは、単純に同じ動きをさせるだけではなく、モーターごとに動作タイミングや速度を調整することが重要です。

この記事では、Arduinoで2台のサーボモーターを同時に動作させ、それぞれの速度を個別に変更する基本的な方法を解説します。Servoライブラリを利用したサンプルコードや、速度を大きく変化させるための考え方も紹介します。

Arduinoでサーボモーターを2台動かす基本的な考え方

Arduinoでは、Servoライブラリを使用することで複数のサーボモーターを簡単に制御できます。1台目のサーボには専用のServoオブジェクトを作成し、2台目も別のオブジェクトとして管理します。

例えば、以下のように2つのサーボを定義します。

Servo servo1;
Servo servo2;

それぞれ別々に角度を指定できるため、同時に異なる位置へ動かすことが可能になります。

2台のサーボモーターを同時制御するArduinoプログラム例

基本的な動作確認用として、2台のサーボを別々の速度で動かすプログラム例を紹介します。

片方はゆっくり動き、もう片方は速く動くようにdelay時間を変えています。

<pre><code>#include <Servo.h>

Servo servo1;
Servo servo2;

int pos1 = 0;
int pos2 = 180;

void setup() {
servo1.attach(9);
servo2.attach(10);
}

void loop() {
for(pos1 = 0; pos1 <= 180; pos1++){
servo1.write(pos1);
delay(15);
}

for(pos2 = 180; pos2 >= 0; pos2–){
servo2.write(pos2);
delay(5);
}
}</code></pre>

この例では、9番ピンに接続したサーボ1は15ミリ秒ごとに角度を変え、10番ピンのサーボ2は5ミリ秒ごとに変化します。そのため、サーボ2の方が約3倍速く動作します。

サーボごとに速度を大きく変える方法

サーボモーターの速度は、基本的には角度を1度変化させる間隔で調整します。delay()の値を大きくするとゆっくり、小さくすると速く動きます。

例えば、以下のように設定できます。

delay値 動作速度
100ms 非常にゆっくり
20ms 通常速度
5ms 高速
1ms 高速だがサーボ性能による

ただし、サーボモーターには物理的な限界があります。プログラム上で高速化しても、モーター内部の制御回路やギアの性能によって、それ以上速くならない場合があります。

より正確に2台を同時制御する方法

単純なdelay()を使った方法では、片方の処理中にもう片方が待たされるため、完全な同時制御には向いていません。

より滑らかな制御を行う場合は、millis()を利用して時間管理を行います。millis()なら待機時間を作らずに、複数の処理を並行して実行できます。

例えば、サーボ1は10ミリ秒ごとに角度変更、サーボ2は50ミリ秒ごとに角度変更というように、それぞれ独立したタイマー処理が可能です。

millis()を使った独立速度制御の考え方

millis()を使う場合は、現在時間と前回動かした時間の差を確認して、一定時間経過したらサーボを動かします。

基本的な考え方は以下のようになります。

  • 現在の時間を取得する
  • サーボごとに前回動作時間を保存する
  • 設定した時間が経過したら角度を変更する

この方法を使えば、サーボ1はゆっくり往復、サーボ2は高速回転というような複雑な動作も可能になります。

電源や配線にも注意が必要

2台以上のサーボモーターを動かす場合、プログラムだけでなく電源にも注意が必要です。

サーボモーターは動き始める瞬間に大きな電流を消費します。Arduino基板の5V端子だけで2台を動かすと、電圧低下やArduinoのリセットが発生する場合があります。

安定動作させるためには、外部5V電源を使用し、ArduinoのGNDとサーボ電源のGNDを共通に接続する方法がおすすめです。

まとめ|Arduinoではサーボごとに速度設定して同時制御できる

ArduinoではServoライブラリを使うことで、2台のサーボモーターを同時に制御できます。それぞれ別のServoオブジェクトとして管理すれば、角度や動作速度を個別に設定できます。

簡単な制御ならdelay()で速度調整できますが、複雑な動作や滑らかな制御を行いたい場合はmillis()を使った時間管理が適しています。

また、複数サーボを動かす場合は電源容量も重要です。プログラムと回路の両方を確認することで、安定した電子工作が可能になります。

コメント

タイトルとURLをコピーしました