理系男子の自己改革日記

言語化するのって難しい。

ロボットアームをつくろう。①Arduinoから複数のサーボモータを動かす!

注:かなり初心者向けの内容になるかと思います。強い人は優しく見守ってくださいね。

 

ロボットアームを作りたい!→動力はサーボモータってやつでまかなうっぽいぞ!→マイコンボードから動かそう!

 

ということで、いくつかのサイトを参考にして、Arduinoからサーボモータ1個を直接繋いで動かすことはできたのですが、

 

f:id:es355Ocean:20180930173050p:plain

(こんな感じ。)

 

 

 

複数個のサーボを動かすとなると、Arduinoからの電力供給では厳しいので外部電源を使おうね。というようなことが大抵の記事に書いてあった気がしたので、これを使うことにしました。

 

www.sengoku.co.jp

 

 

こちらの電源モジュールは、

・入力電圧:6.5~12V(DC),5V(USB)

ということなので、サーボを動かすために必要かな、と思って4個くらい買っておいた5VのDCアダプタはこの電源モジュールには使えないということがわかりました。。笑

 

 

ということで、手持ちの9VのDCアダプタから電源モジュールを通じてブレッドボードに電圧を供給してみます。

先ほどはArduinoの5V端子とGND端子に接続していたサーボの赤ワイヤと黒ワイヤを、そのままブレッドボードの+と-に接続しました。

(Fritzingで電源モジュールっぽいものが見つけられなかったので、この実体配線図は電池で代用しました。電池には9Vと書かれていますが、電源モジュールによって5Vまたは3.3Vに変換されます。今回は5Vになるようにピンを刺しています。)

 

f:id:es355Ocean:20180930174113p:plain

(こんな感じ。)

 

 

すると、先ほどまでArduinoから直接繋いでいた時は動いていたサーボが、思うように動きませんでした。

 

友人に相談してみると、サーボとArduinoのGNDを繋ぐ必要があるそうです。(電圧の基準を共通化する感じ?)

 

ということで下の写真のように、ArduinoのGND端子とブレッドボードの-を白いワイヤで繋いでやると、無事サーボを動かすことができました。

 

 

f:id:es355Ocean:20180930173430j:plain

 

電源モジュールからサーボに電力を供給することができたので、2つ目のサーボもつけてみます!

 

 

f:id:es355Ocean:20180930174843j:plain

 

(いろいろと関係ないものが写っていますが。。。)

 

 

コードはこんな感じ。

 

 

#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);

サーボモータを最小角まで動かしています。

 

 

Arduino 日本語リファレンス

友人に、ここを見るといいよ、と教えてもらいました。

 

このページを参考に、writeMicrosecondsの引数を1000から2000まで動かしてみたのですが、どうも僕が今回使っているGWS Micro 288MGは180度の範囲を動かないので、ここに書かれている「標準的なサーボ」とは違うようです。

 

 

 

Arduino 日本語リファレンス

ここを見ると、サーボの角度を0度に指定するときの引数がデフォルトで544、180度に指定するときの引数がデフォルトで2400と書いてあったので、544に指定した後に2400に指定すると、確かに180度ほど回転しました。

 

 

同様に3つ目のサーボにも同じ電源モジュールから電力を供給して動かしてみましたが、問題なく動きました。

 

しかし、4つ目のサーボを繋げると、プログラムの通りの動作(期待していた動作)はしてくれませんでした。

 

電流が足りないとかそういう話なのか、プログラムにもっと工夫が必要なのかはわかりませんが、とりあえずそんな感じでした。

今回使っている9VのDC電源は1.3Aの電流を供給します。

電源モジュールPOW533BBの出力電流は最大で700mAらしいので、ブレッドボードから4つのサーボを並列につなぐと1個あたり180mAとかそんな感じですかね。

GWS Micro 288MGサーボの必要とする電流がどれくらいなのかわかりませんが、これを上回ってるってことなのかもしれませんね。

 

とにかく、Arduinoと外部電源のGNDを繋ぐという発想がなかったので、同じようにつまづいた方の参考になればいいな〜と思ってメモを残しておきます。