以上を接続して、制御してみます。
駆動にはArduinoの標準ライブラリであるServoを利用します。
配線
シンプルなので、直接Arduinoのpinにサーボモーターのコードをさします。
- SG-90のコネクターに、Arduinoをはじめようキット - スイッチサイエンスに付属していた柔らかいジャンパワイヤを刺す
- 秋月電子さんの製品ページからリンクされている SG-90(PDFデータシート)http://akizukidenshi.com/download/ds/towerpro/SG90_a.pdfを開いて、仕様を確認
- 茶色はグランドなので、ArduinoのGNDへ
- 赤は4.8Vの電源供給なので、Arduinoの5Vへ
- オレンジは信号線なので、Arduinoの9か10のデジタルピンへ(ここでは、9にしました)
動作の決定
Servoライブラリでは、以下の2つの関数でサーボモーターを制御できます。
- write(0〜180)
- サーボの角度が指示の度数になるように回転させる
- 連続回転タイプのサーボの場合は、0で振るスピード回転。180で逆方向に振るスピード回転。90で静止
- SG-90は連続回転タイプではないので、角度のしていになる
- writeMicroseconds(約1000〜2000)
- マイクロ秒単位で、角度を指定
- 標準的なサーボモーターでは、1000で反時計回りいっぱい、1500が中央,2000が時計回りいっぱい。ただし、この範囲外が使えるものもある
writeの0と180の方向や、writeMicrosecondsの意味がよくわからないので、その辺りを試せるスケッチを作成しましょう。以下のステップで動かすことにします。
- 開始したら、write(0)を実行
- 2秒待つ
- write(180)を実行
- 2秒待つ
- write(90)を実行
- 2秒待つ
- writeMicroseconds(1000)を実行
- 2秒待つ
- writeMicroseconds(2000)を実行
- 2秒待つ
- writeMicroseconds(1500)を実行
- 4秒待つ
スケッチの作成
Arduinoアプリを起動して、以下のコードを書きます。
#include <Servo.h> // サーボのピン番号 const int SERVO_PIN = 9; // サーボのインスタンス Servo servo; // INITがtrueの時は、モーターの位置を0にするだけ const bool INIT = true; void setup() { // put your setup code here, to run once: servo.attach(SERVO_PIN); servo.write(0); } void loop() { // put your main code here, to run repeatedly: if (INIT) return; servo.write(0); delay(2000); servo.write(180); delay(2000); servo.write(90); delay(2000); servo.writeMicroseconds(1000); delay(2000); servo.writeMicroseconds(2000); delay(2000); servo.writeMicroseconds(1500); delay(4000); }
実行
上記のスケッチをビルドして、プログラムを書き込むと、サーボモーターが0の位置に移動して停止します。この状態で、プロペラをわかりやすい位置になるように取り付けましょう。
プロペラが取り付けられたら、以下のようにスケッチ内のINITの宣言をfalseに変更して、ビルドしてプログラムを書き込みます。
const bool INIT = false;
これで、テスト内容が動きます。これにより、SG-90の挙動として以下のことが把握できました。
- write(0)は、時計回りで端まで動く
- write(180)は、反時計回りの端まで動く
- write(90)は、上記の中央に動く
- writeMicroseconds(1000)は、時計回りで45度ぐらいのところに動く
- writeMicroseconds(2000)は、反時計回りで135度ぐらいのところに動く
- writeMicroseconds(1500)は、write(90)と同じ場所になる
以上で、テスト完了です。回転速度が変わるわけでもなさそうで、writeMicroseconds()の使い所がよく分かりませんが、まあそれはいいでしょうということで。write()で進めます。