この記事ではArduinoでPWMサーボを回転させるときに、速度をコントロールする方法を紹介します。シリアルサーボ使えばいいんだけど、高いしね、、、
はじめに
PWMサーボをArduinoを使ってコントロールするとき、多くの場合、標準のServoライブラリを使ってServo.write
でサーボの角度をセットすると思いますが、この方法だと速度がコントロールできません。なのでゆっくりとサーボを動かしたい場合は、角度を少しづつ変えてループの中でServo.write
したりするのですが、サーボによってはぎこちない動きになったり、ループの他の処理に影響を受けてしまったりしていけてないです。
VarSpeedServo.h
この問題を解決するライブラリがVarSpeedServo.hというArduinoのライブラリです。
これはArduino標準のServoライブラリを改造して、Arduinoのタイマー処理の中で速度を考慮した角度を設定するものです。タイマー処理で実装しているので、ループ内の他の処理にブロックされませんし、内部的にServo.write
よりも高い解像度で角度を処理しているので、より滑らかな動きになります。
簡単なサンプルコードです。
# include <VarSpeedServo.h>
VarSpeedServo myservo;
void setup() {
myservo.attach(9);
}
void loop() {
myservo.write(180, 30, true); // サーボを180度まで速度30で動かし、完了まで待つ
myservo.write(0, 30, true); // サーボを30度まで速度30で動かし、完了まで待つ
}
上記のようにwriteの第二引数に速度値(1が最小、255が最大のスピード、0の場合は最大スピードになる)、第三引数(省略可)に完了まで待つかどうかを指定します。速度値はタイマーが呼び出されるごとに加算されていくPWMのtickの値に等しいので、絶対的な角速度ではなく、あくまで相対的なものとして捉えた方がよさそうです。
以下は実際に動かしているデモ動画になります。
VarSpeedServoSam(SAMプロセッサ用の修正バージョン)
さて、上記のVarSpeedServo.hには一点問題があって、プロセッサがAVRでしか動きません。筆者が使っているArduino DueはプロセッサがSAM(ARM)で、そのままでは動かないので、こちらでも動くバージョンを作りました。
githubで公開しています。
https://github.com/thorikawa/VarSpeedServoSam
もしArduino Dueを使っている方がいらっしゃったら是非使ってみてください。
まとめ
VarSpeedServoもしくはVarSpeedServoSamを使うと、サーボを任意の速度で回転できていいね、という話でした!