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()を使った時間管理が適しています。
また、複数サーボを動かす場合は電源容量も重要です。プログラムと回路の両方を確認することで、安定した電子工作が可能になります。


コメント