Arduinoでサーボモーターを動かす場合、Arduinoに標準で用意されている「Servoライブラリ」を使えば簡単に動かすことが出来ます。
サーボモーターはPWM(Palse Width Modulation)というパルス幅変調方式で制御されています。
PWMは一定周期内のHIGHとLOWの割合(デューティーサイクル)を変えて制御する方式ですが、Arduinoの場合このような面倒な処理を行う専用ライブラリを使うことによりあまり意識することなく動かすことが出来ます。
サーボモーターを動かすのに必要なPWM信号をServoライブラリが計算し出力してくれるので、実際にはサーボの動く角度やパルス幅(μS)を指定するだけでサーボモーターを簡単に動かすことが出来ます。
サーボモーターやPWM制御に関して詳しくはこちらの記事を参考にして下さい!
そしてサーボモーターを使い何かを動かしたい場合、その動作速度(回転スピード)を調整しながら動かしたい場合が出てきます。
しかしArduino標準のServoライブラリを使った動作では、サーボモーターは動作の指令を受け取るとそのサーボの動作電圧で可能な最大速度で指定角度まで動こうとします。
今回はArduino標準のServoライブラリでは出来ない(面倒となる)、サーボモーターの速度をコントロールして動かすことが出来る『VarSpeedServoライブラリ』を使ってサーボモーターを動かしてみたいと思います。
目次
【Arduino】VarSpeedServoライブラリを使いサーボモーターの速度をコントロールして動かしてみる!
冒頭でお話したようにArduinoに標準で用意されている「Servoライブラリ」は簡単に使える非常に便利なライブラリとなりサーボモーターを動かすための定番ライブラリです。
PWM信号の事をあまり意識することなく、動作角度を指定するだけで(またはパルス幅μSで指定)簡単にサーボモーターを動かすことが出来る便利なArduino用ライブラリとなります。
しかし、ゆっくりとサーボモーターを指定角度まで動かしたい場合など速度をコントロールして動かす用途にはServoライブラリは対応していません。(スケッチを工夫して組む必要があります)
サーボモーターはデータシートや製品サイトなどを見るとその動作速度が書かれています。
例えば定番サーボで言うと、マイクロサーボSG90では60°動かすのに0.1秒、またMG996Rでは4.8V動作時では60°動かすのに0.19秒、6.0V動作時では0.15秒で動作すると書かれています。
使用するサーボモーターにより動作電圧の違いなどがありますが、基本的にその動作電圧で可能な最大速度で動くようになっています
サーボモーター | 動作速度 |
SG90 | 0.1秒/60°(5V) |
MG996R | 0.19秒/60°(4.8V動作時)、0.15秒/60°(6.0V動作時) |
SG90/MG996Rに関してはこちらの記事も参考にして下さい。
そしてサーボモーターの使用用途によってはその動作速度を変えて(スピードをコントロールしながら)動かしたい場合も出てきます。
これまで電子工作でサーボモーターを使った製作物をいくつか作ってきました。
4足歩行ロボットでは複数のサーボモーターを同時に動かすわけですが、その動作速度をコントロール出来れば動きも面白いものとなってきます。
Arduino標準のServoライブラリを拡張した『VarSpeedServoライブラリ』を使えば、標準のServoライブラリでは少し面倒となるサーボモーターの速度をコントロールして動かすことが出来ます。
VarSpeedServoライブラリの仕様
少しVarSpeedServoライブラリの仕様を見ておきます。
VarSpeedServoライブラリのダウンロードや仕様の詳細に関しては、以下サイトから確認することが出来ます。
VarSpeedServoライブラリはArduino標準のServoライブラリを拡張する形で作られたライブラリとなり、Arduinoのタイマー処理により指定角度まで動かす際に速度を考慮した動作が可能となっています。
タイマー処理で実装されたライブラリとなるので、ループ内の他の処理に影響しませんがタイマーでの割り込みを使用しているのでサポートできるのは最大8つまでのサーボモーターとなっているようです。
移動速度(回転スピード)の設定以外にもいくつかのオプションが用意されています。(詳しくは上記ライブラリページをご覧下さい)
- 最大8つのサーボモーターをサポート
- 全てのサーボを非同期に同時に動かすことが出来る
- attach()やwrite()関数など、ほぼ標準Servoライブラリと同様に使用する事が出来る
- write()関数を使用し引数に角度や速度、動作完了を待つか否かを指定して動かすことが出来る
PWMサーボをArduinoを使って制御する時、標準のServoライブラリを使う場合が多いと思います。
そしてwrite()関数を使い角度を指定したりwriteMicroseconds()関数を使ってパルス幅を指定して動かしますが、この方法だと速度のコントロールが出来ません。
ゆっくりとサーボモーターを動かしたい場合はループ内で角度を少しずつ変えてdelay()関数を入れたりして動かすなどの工夫が必要となり他の処理に影響を受けたり与えたりなどするため、なかなかスケッチが面倒となってきます。
VarSpeedServoライブラリを使えば、標準のServoライブラリとほぼ同様に使うことができ回転スピードのコントロールも出来るようになります。
ライブラリのインストール
まずライブラリを使えるようにするためArduino IDEにVarSpeedServoライブラリをインストールしておきます。
上記Githubのページからライブラリをダウンロードすることが出来ます。
ライブラリのインストールは他のライブラリと同様です。
ダウンロードしたZIPファイルを解凍せずに、[スケッチ]→[ライブラリをインクルード]→[.ZIP形式のライブラリをインストール]へと進み、先程ダウンロードしたライブラリのZIPファイルを指定すれば完了です!
【テスト動作①】動作終了を待ち別の動作をさせる
VarSpeedServoライブラリは、標準のServoライブラリとほぼ同様に使えるので簡単です。
簡単なテストスケッチで動作を確認していきます。
テストにはSG90サーボモーターを使いました。
まずはサーボモーターの動作が終了するのを待ち別の動作をさせてみます。
これは標準Servoライブラリと同じ動作になりますが、プラスして回転速度も指定することが出来ます。
テスト動作なのでSG90を直接Arduinoと接続しています。
サーボモーター(SG90) | Arduino |
Signal(オレンジ) | D8 |
VCC(赤) | 5V |
GND(黒) | GND |
こちらはサーボモーターの回転を0°→90°→180°と繰り返すスケッチとなります。
write()関数の第1引数で回転角度を指定するのはServoライブラリと同様ですが、第2引数で速度を指定(1~255)し、第3引数(省略可)の[true]で動作の完了を待つ指定をしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | // VarSpeedServoライブラリを使ってサーボモーターを動かしてみる① // https://burariweb.info #include <VarSpeedServo.h> // ライブラリのインクルード VarSpeedServo myservo; // サーボオブジェクトの作成 const int Servo_Pin = 8; // サーボ接続ピン void setup() { myservo.attach(Servo_Pin); // サーボ接続ピンをD9に } void loop() { myservo.write(0, 30, true); // 速度30で0°まで動かし完了を待つ myservo.write(90, 100, true); // 速度100で90°まで動かし完了を待つ myservo.write(180, 255, true); // 速度255で180°まで動かし完了をまつ } |
180°の位置から0°に戻る時はゆっくりと動作し(速度30を指定)、0~90°に動く時は少し速度を上げ(速度100を指定)、90~180°に動く時は最大速度で動作しているのが確認できるかと思います。
この投稿をInstagramで見る
スケッチ解説
標準Servoライブラリと使い方はほぼ同じです。
Servoライブラリの使い方はこちらの記事を参考にして下さい。
Servoライブラリと異なる部分は、write()関数を使ってサーボを動かす部分です。
上記ライブラリでは、myservo.write(0, 30, true);やmyservo.write(180 , 255, ture);のように第2引数で回転速度を指定する事によりServoライブラリでは出来ない回転スピードを変えることが出来るようになっています。
回転速度の指定は1~255の範囲で指定し、1が最小速度で255で最大速度での動作となります。(0を指定すると最大速度となります)
1 2 3 | myservo.write(0, 30, true); // 速度30で0°まで動かし完了を待つ myservo.write(90, 100, true); // 速度100で90°まで動かし完了を待つ myservo.write(180, 255, true); // 速度255で180°まで動かし完了をまつ |
Servoライブラリでは角度を指定して動かしますが、基本的にそのサーボモーターの最大速度での動作となります。
VarSpeedServoライブラリでは、回転速度も指定して動かす事が出来るようになっています。
- value:回転角度を指定
- speed:回転速度を指定(1~255)
- wait:(省略可)trueを指定すると動作完了を待ちます
第3引数は省略することも可能ですが、上記スケッチでは[true]を指定しています。
[true]を指定することによりServoライブラリと同様に動作完了を待ってから次の処理に移ります。
【テスト動作②】2つのサーボを同時に異なる速度で動かしてみる!
次に2つのサーボモーターを異なる速度で同時に動してみたいと思います。
先程の接続にSG90をもう1台追加しArduinoのD9に繋いでいます。
スケッチの内容は先程とほぼ同じですが、サーボを動かすwrite()関数で先程のスケッチでは第3引数にtrueを指定し動作の完了を待ってから次の動作に移っていましたが、trueを省略する(指定しない)事により2つのサーボモーターを同時に異なる速度で動かしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | // VarSpeedServoライブラリを使ってサーボモーターを動かしてみる② // https://burariweb.info #include <VarSpeedServo.h> // ライブラリのインクルード VarSpeedServo myservo1; // サーボオブジェクトの作成 VarSpeedServo myservo2; const int Servo_Pin1 = 8; // サーボ接続ピン const int Servo_Pin2 = 9; int SPEED1 = 30; // スピードの設定 int SPEED2 = 100; void setup() { myservo1.attach(Servo_Pin1); // サーボ接続ピンを指定 myservo2.attach(Servo_Pin2); } void loop() { myservo1.write(0, SPEED1); // サーボ①を0°までSPEED1で動かす myservo2.write(180, SPEED2); // サーボ②を180°までSPEED2で動かす myservo1.wait(); // サーボ①の動作完了を待つ myservo2.wait(); // サーボ②の動作完了を待つ myservo1.write(180, SPEED2); // サーボ①を180°までSPEED2で動かす myservo2.write(0, SPEED1); // サーボ②を0°までSPEED1で動かす myservo1.wait(); // サーボ①の動作集完了を待つ myservo2.wait(); // サーボ②の動作完了を待つ } |
サーボ①が速度30で0°まで動く動作をかしながらサーボ②は速度100で180°まで動かし、2つのサーボの動作完了を待ってから次にサーボ①を速度100で180°まで動かしながらサーボ②を速度30で0°まで動かす動作を繰り返しています。
この投稿をInstagramで見る
第3引数を指定しないことに事によりサーボ①とサーボ②を同時に異なる速度で動かすことが出来ます。
上記スケッチではサーボ2台での動作テストなのでwait()関数を使いそれぞれのサーボの動作終了を待ってから次の処理に移るようにしています。
タイマー処理で実装しているのでwait()関数を入れずに動作完了を待たずサーボが動いている間もLEDを点灯させるなど別の処理も出来るようになっています。
これも速度のコントロール以外にServoライブラリとは大きく違うポイントですね!
最後に!
Arduino標準のServoライブラリは使いやすく便利なサーボモーター用のライブラリとなりますが、速度を変えて動かしたい場合は対応していないので、割り込みやスケッチを工夫するなど少し面倒となってきます。
そのような用途で使用したい場合はVarSpeedServoライブラリが使えます。
Servoライブラリとほぼ同様に使えるので簡単でこちらも便利なライブラリですね!
またライブラリ内部でArduinoのタイマー処理を使っているのでループ内で他の処理の影響を受けないなどの利点もありますが、そのため接続できるサーボモーターは最大8つまでとなっています。
以前製作した4足歩行ロボットでは関節部分に8つのサーボモーターを使っているのでVarSpeedServoライブラリを実装しサーボの速度制御を考えていましたが、1足に2関節という形状上あまりスピードを落とすと動作がカクカクしてしまい綺麗ではないので・・・こちらのロボくんでは標準のServoライブラリのみを使って動かしています。
この投稿をInstagramで見る
また1関節増やしたこちらの4足歩行ロボットでは、合計12サーボ構成になるためVarSpeedServoライブラリは使えませんでした。
そのためServoライブラリとFlexTimer2というタイマー割り込みを行うライブラリを併用して動かしています。
この投稿をInstagramで見る
標準のServoライブラリでは個別でサーボモーターの速度を変えて動かしたい場合、自分で実装する必要がありスケッチがかなり面倒となります。
VarSpeedServoライブラリは8台までのサーボモーターを速度を変えて動かすことが出来る便利なライブラリなので参考になればと思います。
コメントを残す