LoginSignup
32
34

More than 5 years have passed since last update.

ArduinoでPWMサーボの速度をコントロールする

Posted at

この記事では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の値に等しいので、絶対的な角速度ではなく、あくまで相対的なものとして捉えた方がよさそうです。

以下は実際に動かしているデモ動画になります。

VarSpeedServoのデモ動画

VarSpeedServoSam(SAMプロセッサ用の修正バージョン)

さて、上記のVarSpeedServo.hには一点問題があって、プロセッサがAVRでしか動きません。筆者が使っているArduino DueはプロセッサがSAM(ARM)で、そのままでは動かないので、こちらでも動くバージョンを作りました。

githubで公開しています。
https://github.com/thorikawa/VarSpeedServoSam

もしArduino Dueを使っている方がいらっしゃったら是非使ってみてください。

まとめ

VarSpeedServoもしくはVarSpeedServoSamを使うと、サーボを任意の速度で回転できていいね、という話でした!

32
34
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
32
34