Trinketで模型用モータを回す(2)
以前模型用のマブチモータを簡単なドライバ回路を作成して動かしてみた事がありました。(Trinketで模型用モータを回す)あれはあれで面白いのですが、今回はラジコンなんかでよく使われるサーボモータを動かしてみたいと思います。
今回試したのはフタバのS3003というサーボモータです。いつ買ったかわからないんですが、これも我が家のジャンクの中にありました。そんな状態なので、当然、説明書とかもないので、まずは例によってグーグル先生に聞いてみました。
このデータシートによると、
まず、配線がわかります。次にデータ表から、
動作電圧は4.8〜6.0Vとあるので、赤い線に5V、黒い線はGNDに、そして白い線は制御信号としてTrinketに繋げば良さそうです。制御方式はPWMのようですが、よくわからないのは「1520usec Neutral」とあることですかね。動作の方向がCW(時計回り)に1520-1900usecって、どういう意味?動作角度は45度(一方向に400usecパルス移動)とあるので、±45度くらいは動くのかな?
よくわからないけど、とにかくPWMでパルスを与えてやると、ある特定の角度になるってことらしいです。
では、まずは回路から作って行きます。いつものように、Trinketをブレッドボードに挿しておいて、周りに回路を作って行きます。といっても、今回は、サーボモータをつなぐくらいしかありません。
本当は、サーボモータを動かす時は500mA以上電流が流れるのが普通だと思うのですが、今回は、サーボモータに負荷を付けないで、ただ回すだけということにして、(Trinketを含めて)全体で500mA以内に入る前提で、USBからもらった5Vで直接サーボモータを動かしてみます。
という訳で、下の図のように配線しました。
RC servoのところが今回接続するサーボモータです。1に白、2に赤、3に黒のケーブルを接続することになります。
次に、Trinketのソフトウェアです。TrinketはArduino IDEのスケッチサンプルにあるサーボ(とservoライブラリ)は使用できないようです。(参考:Trinket & Gemma Servo Control)その代わり、AdafruitさんがTrinket(とGemma)専用のサーボ用ライブラリを用意してくれていました。実際、Adafruitさんのページを見ればそのまんまなんですが、ここではS3003を動かすという事で、Adafruitさんのページの通りにやってみます。
(ここでは、AdafruitさんのサイトからTrinket用のArduino IDE 1.6.4をダウンロードして、既にインストールしてあるところからスタートします)
まず、上記のAdafruitさんのページから、 「Download Adafruit_Servo library」を選択して、ライブラリをダウンロードします。
次に、Arduino IDEがインストールしてあるところを探します。大抵は「アプリケーション」フォルダに入っていると思いますが、場合によっては違うところにインストールしているかもしれません。
その「Arduino.app」というファイルを右クリックして、コンテキストメニューから「パッケージの内容を表示」を選択します。すると、今まで隠れていた「Arduino.app」以下のフォルダが表示されるようになりますので、表示されたフォルダ内の「Contents」→「Java」→「libraries」とたどって開いて行きます。この「libraries」フォルダがライブラリを格納しているところのようですので、ここに、先程ダウンロードした「Adafruit_SoftServo-master」をフォルダごと入れます。
ここで、ちょっとしたトリックが必要です。「libraries」フォルダに入れておくライブラリには、名前に「-」が使えないらしいので、「Adafruit_SoftServo-master」という名前ではArduino IDEを起動した時に警告が表示されてしまいます。そこで、この名前の「-(ハイフン)」を「_(アンダースコア)」に変更しておきます。(フォルダの名前だけ)
この状態で、Adruino IDEを起動してみてください。警告等が表示されなければインストールが正常にできていると思います。また、Adruino IDEのメニューバーから「スケッチ」を選択して、プルダウンメニューの中から「Include Library」を選択してみましょう。ライブラリのリストが表示され、その中に「Adafruit SoftServo」とあれば、ライブラリのインストールは成功です。そのまま、「Adafruit SoftServo」を選択すると、作成しているスケッチにインクルードされます。
今回作成したスケッチはこんな感じです。
ソースコードを見てみましょう。
まず最初にあるのが、先程ダウンロードして組み込んだ、Adafruit_SoftServoをインクルードしている行です。
次にサーボ出力ピンを定義しています。
また、Adafruit_SoftServoクラスを持つmyServo1というオブジェクトを定義しています。(どうも、Arduinoでは、これでインスタンス化されているみたいです)
Setup()の中の最初の2行はAdafruit_SoftServoライブラリのオマジナイみたいなものだと思ってください。
その次に、myServoをまずattach(SERVOPIN1)で出力先を指定しています。
更に、myServo1をwrite(0)で原点へ移動させています。
loop()の方では、write(0)とwrite(180)で0度と90度に2秒間隔で移動させています。
ソースコードにも書いていますが、S3003は何故か90度動かすために180度を指定しないといけないようです。
最後のSIGNAL(TIMER0_COMPA_vect)関数は、Adafruit_SoftServo特有のもので、20msec毎にmyServo1の出力をリセットするためのものです。
このソースをコンパイルして、Trinketに書き込み、動作させたものが以下の動画です。
見ての通り、いい加減にやってUSBからのバス供給電源でもS3003が動かせている事がわかると思います。(ただし、繰り返しますが、非常に軽い負荷の場合限定と考えた方がよいです)
まずは、動作確認用のプログラムという事で、非常に単純な動作になっていますが、これができれば、これからいろいろなことができるようになるはずです。
今回はここまで。