【Arduino】Arduinoでサーボモーターを制御する
1.サーボモーターとは
※「サーボモータ」には「ACサーボモータ」と「DCサーボモータ」がありますが、
一般的に電子工作や個人的な作品において「サーボモータ」という場合、「DCサーボモータ」をさします。
サーボモータは、このような外観をしています。
サーボモーターとは、「サーボ機構」を用いて位置や回転速度を制御することができるモーターです。
通常の「DCブラシモーター」などは電圧で回転数やトルクを変更することができますが、「制御」と言えるほど精密なものではありません。
一方、サーボモータには回転角を読み取る検出器(センサー)がついており、その検出された値をフィードバックすることで、回転角や回転速度を正確に制御できます。
そのため、通常のサーボモーターは180度程度しか回転できません。(
因みに、位置や回転速度を制御することができるモーターには「ステッピングモーター」もあります。しかし、ステッピングモーターには検出器がついていないため、脱調した場合角度の特定ができなくなります。
ステッピングモーターについてはこちらの記事をご覧ください。
shizenkarasuzon.hatenablog.com
2.回路図
下のような回路を組んでください。
(あまり電流を必要としないサーボの場合)
私は、Tg9eという小さいサーボモーターを使用しました。
Turnigy TG9e Servo Specifications and Reviews
そのため、USBから電源を供給しても、なんとか回ってくれました。
しかし、MG996等の大きめのサーボモータになると、大電流が必要になるため、サーボ側の電源をもう少し強いものにした方がよいかもしれません。
(サーボ駆動に大電流を使う場合)
このようなATX電源等を使っておけば最強です。
shizenkarasuzon.hatenablog.com
サーボに流れる電流は各自データシートを読んで調べたほうが良いです。
サーボモータからは、電源-、電源+、信号線の3種類のコードが出ています。
多くのサーボは、それぞれのコードに対して色が決まっており、
コードの色 | 用途 |
---|---|
黒・茶色 | 電源-(GND) |
赤色 | 電源+ |
黄色、オレンジ | 信号線 |
という仕様が多いです。
ですが、念のためデータシートでの確認をお願いします。
3.サンプルプログラム
#include <Servo.h> Servo myservo; void setup() { //9ピンからサーボモーターの回転信号をPWM出力 myservo.attach(9); } void loop() { myservo.write(0); //0度に回転 delay(1000); //1000㎳待つ myservo.write(90); delay(1000); myservo.write(180); delay(1000); myservo.write(90); delay(1000); }
以下のプログラムをArduinoに書き込んで実行してください。
4.実行結果
電源を入れると、
サーボモータが0度に回転
→1秒後、90度に回転
→さらに1秒後、180度に回転
→さらに1秒後、90度に戻る
→さらに1秒後、0度に戻る
→1秒後、90度に回転
...(以下無限ループ)
を繰り返すはずです。
5.解説
以下は、↑のコードの簡単な解説です。
STEP1.初期設定
Arduinoを使ってサーボモータを回転させるには、「Servo.h」というファイル(ライブラリ)をインクルードする必要があります。
#include <Servo.h> Servo myservo;
PWM機能を使って独自でライブラリを開発することもできますが、それはまた別の機会にします。
Servoライブラリをインクルードすると、新しくmyservoというクラスを作っておきます。
そして、回転命令を出力するピンを指定します。
myservo.attach(9);
と書くと、9ピンから信号が出力されます。
また、attach()関数を実行すると、設定したピンはI/Oピンとして使えなくなります。
STEP2.回転
myservo.write(degree);
でdegre度に回転させることができます。
指定した角度に到達するまで時間がかかるので、↑のプログラムでは回転命令を出すごとに1秒間待つようにしています。
上記以外にも、サーボの現在角度を読み取ったり、サーボのピン設定を解除したりする関数があるので、
詳しく知りたい方は以下のサイトを見てください。
Arduino - Servo