ロボットアームをつくろう。①Arduinoから複数のサーボモータを動かす!
注:かなり初心者向けの内容になるかと思います。強い人は優しく見守ってくださいね。
ロボットアームを作りたい!→動力はサーボモータってやつでまかなうっぽいぞ!→マイコンボードから動かそう!
ということで、いくつかのサイトを参考にして、Arduinoからサーボモータ1個を直接繋いで動かすことはできたのですが、
(こんな感じ。)
複数個のサーボを動かすとなると、Arduinoからの電力供給では厳しいので外部電源を使おうね。というようなことが大抵の記事に書いてあった気がしたので、これを使うことにしました。
こちらの電源モジュールは、
・入力電圧:6.5~12V(DC),5V(USB)
ということなので、サーボを動かすために必要かな、と思って4個くらい買っておいた5VのDCアダプタはこの電源モジュールには使えないということがわかりました。。笑
ということで、手持ちの9VのDCアダプタから電源モジュールを通じてブレッドボードに電圧を供給してみます。
先ほどはArduinoの5V端子とGND端子に接続していたサーボの赤ワイヤと黒ワイヤを、そのままブレッドボードの+と-に接続しました。
(Fritzingで電源モジュールっぽいものが見つけられなかったので、この実体配線図は電池で代用しました。電池には9Vと書かれていますが、電源モジュールによって5Vまたは3.3Vに変換されます。今回は5Vになるようにピンを刺しています。)
(こんな感じ。)
すると、先ほどまでArduinoから直接繋いでいた時は動いていたサーボが、思うように動きませんでした。
友人に相談してみると、サーボとArduinoのGNDを繋ぐ必要があるそうです。(電圧の基準を共通化する感じ?)
ということで下の写真のように、ArduinoのGND端子とブレッドボードの-を白いワイヤで繋いでやると、無事サーボを動かすことができました。
電源モジュールからサーボに電力を供給することができたので、2つ目のサーボもつけてみます!
(いろいろと関係ないものが写っていますが。。。)
コードはこんな感じ。
#include <Servo.h>
Servo myservo0, myservo1;
void setup() {
myservo0.attach(9);
myservo1.attach(11);
}
void loop() {
myservo0.writeMicroseconds(1000);
delay(1);
myservo1.writeMicroseconds(1000);
}
(はてなブログでコードを埋め込む方法がわからない。。)
友人によると、Arduinoの動作を記述する言語(Arduino Language?)は、CやC++にJavaを合わせたようなものらしく、だからこんなふうにC言語っぽい #include 宣言をしたり、C#っぽい(オブジェクト指向の)書き方ができるんだなぁと納得しました。
僕が多少知っている、C言語とC#との類推でこのコードを解説すると、
#include <Servo.h>
でサーボモータを動かすための関数やクラスを使うための手続きをし、
Servo myservo0;
でmyservo0という名前のServo型のクラスのインスタンスを生成し、
myservo0.attach(ピン名);
でサーボモータ(myservo0)のSIG端子と接続するArduinoのピンを指定し、
myservo0.writeMicroseconds(1000);
でサーボモータを最小角まで動かしています。
友人に、ここを見るといいよ、と教えてもらいました。
このページを参考に、writeMicrosecondsの引数を1000から2000まで動かしてみたのですが、どうも僕が今回使っているGWS Micro 288MGは180度の範囲を動かないので、ここに書かれている「標準的なサーボ」とは違うようです。
ここを見ると、サーボの角度を0度に指定するときの引数がデフォルトで544、180度に指定するときの引数がデフォルトで2400と書いてあったので、544に指定した後に2400に指定すると、確かに180度ほど回転しました。
同様に3つ目のサーボにも同じ電源モジュールから電力を供給して動かしてみましたが、問題なく動きました。
しかし、4つ目のサーボを繋げると、プログラムの通りの動作(期待していた動作)はしてくれませんでした。
電流が足りないとかそういう話なのか、プログラムにもっと工夫が必要なのかはわかりませんが、とりあえずそんな感じでした。
今回使っている9VのDC電源は1.3Aの電流を供給します。
電源モジュールPOW533BBの出力電流は最大で700mAらしいので、ブレッドボードから4つのサーボを並列につなぐと1個あたり180mAとかそんな感じですかね。
GWS Micro 288MGサーボの必要とする電流がどれくらいなのかわかりませんが、これを上回ってるってことなのかもしれませんね。
とにかく、Arduinoと外部電源のGNDを繋ぐという発想がなかったので、同じようにつまづいた方の参考になればいいな〜と思ってメモを残しておきます。