【ロボットプログラミングへの道】Arudino UnoでサーボモータFS90Rを動かす方法
※ 当ページには【広告/PR】を含む場合があります。
2022/05/18

今回はロボットを動かすのにどうしても欠かせない動力源として、「サーボモータ」を動かしてみます。
例として取り上げるのは、連続で360°回転可能な「
今回は、連続回転可能なサーボモータの使い方の基礎を実機を使って解説していきます。
サーボモータについての前知識
サーボモータは、一般的に内部にエンコーダと呼ばれる回転位置を記録する仕組みをもち、決まった位置(回転角度)を指定できるようなモーター製品の一つです。
決まった角度で可動させることができるため、ロボットアーム操作、車のハンドル操作などがサーボモータの応用の定番になっています。
Arduino(アルディーノ)などで直接動かせるホビーユースのサーボモータはだいたい以下のような感じになっています。

通常では+5VDC程度の電源を与えて、回転の制御にPWM(パルス幅変調)波を使って角度位置を指定します。
今回使用する
よって通常の角度位置を指定するようなサーボモータみたいな使い方は出来ないものの、車輪で移動するロボットの動力源のような利用方法が可能となります。
FS90Rの回転方向と速度の調整
まず回転方向としては、PWM波形がHIGHになる幅時間で、700〜1500マイクロ秒までが時計回り、1500〜2300マイクロ秒までが反時計周りにそれぞれ回転します。
1500マイクロ秒付近で、サーボモータの回転は停止されます。
また回転速度は5Vで110rpmですので、100%の速度で回っても1秒間に2回に届かない程度の速さです。
FS90Rの使い方で特に気を付けないといけないのは、回転速度の調整のパルス幅特性です。
以下の特性図に示すように、狙いの回転速度に設定できる代物ではなく、大雑把に速度を変化させることがせいぜいです。

例えば回転速度を50%にしようとしても、だいたい1500〜1600マイクロ秒間に設定すると良いかも知れませんが、厳密に回転速度50%に調整できるわけはありません。
サーボモータの個体ごとにおそらく特性図にバラツキもあったり、動作温度によって特性曲線がパルス幅の大きい側へシフトすることも考えられます。
基本的にサーボモータと言えば、かなり高価なモーターになります。
このFS90Rは高々1個が500円〜1000円程度で買える格安品ですので、減速までやれると考えるとそれだけでも十分良い製品かと思います。
Arduino Uno実機でFS90Rを回してみる
ここからは実際にアルディーノから
今回テストする構成としては、以下のような模式図のようにしています。

ではこの模式図通り、早速アルディーノとサーボモータを直接接続します。

次にアルディーノとArduino IDEのインストールされたパソコンを接続後、以下のようなアルディーノのプログラムスケッチを書き込んでみましょう。
#include <Arduino.h>
//unsigned int pwmWidth = 700; //👈時計回り,回転速度100%
//unsigned int pwmWidth = 1500; //👈回転停止
unsigned int pwmWidth = 2300; //👈反時計回り,回転速度100%
void setup() {
pinMode(5, OUTPUT);
}
void loop() {
PORTD |= _BV(5);
delayMicroseconds(pwmWidth);
PORTD &= ~_BV(5);
delayMicroseconds(pwmWidth);
}
アルディーノでソフトウェアPWM波形をデジタルピンから出力する方法は別のブログで説明していたので、プログラミングの中身を詳しく知りたい方はそちらの記事を読んでみてください。
とりあえずこれをアルディーノに書き込んだら以下のように直ぐに回転が始まるはずです。
一つの回転パターンだけだとつまらないので、何パターンかの回転をいっぺんに確認できるように少しプログラムを変更してみましょう。
#include <Arduino.h>
#define WLEN 7
unsigned int w[WLEN] = {700, 1400, 1460, 1500, 1560, 1600, 2300};
unsigned int totalTerm = 3000;
void setup() {
pinMode(5, OUTPUT);
}
void loop() {
for (int i=0; i < WLEN; i++) {
for (int j = 0; j < 1000;j++) {
PORTD |= _BV(5);
delayMicroseconds(w[i]);
PORTD &= ~_BV(5);
delayMicroseconds(totalTerm - w[i]);
}
}
}
これで3秒ごとに回転数が切り替わるようにすることができます。
以上、ざっと
今後、気が向けばまた別の記事で、何か簡単なものでも動かしてみようと思います。