2014/11/20

続05) Arduino始めてみた - モーターシールド (Adafruit (V1) 互換? Duinofun製 Motor Shield)

前回の続き。
ch1のモーターの挙動がおかしい。
でも、モーター自身は正常だ。
となると、モーターシールドが怪しい。
ちなみにArduinoでは、拡張基板のことをシールドと呼ぶ。

コピー製品だった
その前にこのモーターシールドをどうやって使ったか。
って、書く前にもう一度このモーターシールドを眺めてみると、Adafruit (エイダフルート)製だと思っていたのに、どうもDuinofunのコピー製品であった。1枚目の画像の中央と右のICの間にURLが書いてある。
どうしてコピー製品と思うかというと、Duinofunにはライブラリが存在せず、Adafruitのライブラリを使用し参照していて問題なかったから (というのは根拠が弱いのは承知の助)。
以下は、ずっとAdafruit製だと疑いもせずに調べた結果である。
DCモーターの使用が前提である。

使うまで
  1. まず、Overviewがあるので、困ったらここを参照する。V1用V2用
  2. 次に、ライブラリを入手する。V1(IC)とV2(表面実装)ではライブラリが違うらしい。V1用ライブラリV2用ライブラリ
  3. Arduino IDE (アプリ) にライブラリを追加する。(次のAFMotor.hを読み込めるようにするため)
  4. スケッチ(Arduinoのプログラムのこと)の宣言文コーナーに "#include <AFMotor.h>" を追加する。
スケッチ (プログラム)
まずは、AF_DCMotor Classの定義を使うためにここを参照する。V1用V2用
おっと、V1とV2では、ライブラリの構造が大きく違うようだ。ここまで違うと参考にならない。
V1は廃番なので、ここのスケッチの記述ほとんど未来の自分用だな〜。
以下は、V1用の記述である。

まず、include文とクラスの宣言。g_motorNという4つのモーター毎の変数を宣言する。
#include <AFMotor.h>
AF_DCMotor g_motor1(1, MOTOR12_1KHZ);  // MOTOR12_1KHZの引数は省略可能。以下同じ
AF_DCMotor g_motor2(2, MOTOR12_1KHZ);
AF_DCMotor g_motor3(3, MOTOR34_1KHZ);
AF_DCMotor g_motor4(4, MOTOR34_1KHZ);
スケッチでは、"run" と "setSpeed" という2つのメンバで指定された関数でモーターを制御する。
g_motor1.setSpeed(100); // モーター1のスピードを決める。値は 0〜255。255が最大出力。
g_motor1.run(RELEASE);  // モーター1の回転方向を決める。FORWARD (正)、BACKWARD(逆)、RELEASE (解除)
ちなみに run(RELEASE)は、setSpeed(0)と同じ。
また、ダイナミックブレーキは用意していないので、すぐにストップするわけではない、と書いてある。
試しに"AFMotor.h" の中を覗くと、"BREAK"が"FORWARD"などと同じく定数として用意されているようだが、定義はされていないみたい。

外部電源
PCからのUSB接続では、電圧が足りないっぽい。
そのため、電池を外付けする。
電池はリチウム充電池の18650という規格のもの。
3.7Vで保護回路付き。
4個の電池を直列並列の組み合わせでで7.4Vで使う計算になる。
サイズが特殊なので電池ボックスの入手先はほとんど選択肢がなかった。
14500というのが単3サイズなのでお薦め。
モーターシールドからモーター専用の電源を確保するために、画像上真ん中右よりのジャンパーピンを抜く。
ジャンパーピン自体は失くならないように片方のピンだけに挿しておく。
これで、本体の基板(UnoやMEGA)からモーターへの電源が切断される。
電源ボックスとモーターシールドの電源端子間にトグルスイッチもつける。

トラブル:現象
先にも書いたが、ch1のモーターが動かない。
画像をよく眺めてみると、モータードライバー用のICが2個左右に刺さってる。これかなぁ、と疑い、チップをよく見ると「ST L293D」と書いてあるので検索すると、引っかかった。数日後には手に入れて、交換してみる。

トラブル:障害箇所切り分け
L293Dが届くまでの間、同じくArduinoでマシンを組み立てている保護者の方の好意に甘えて、双方のマシンで入れ替え合戦をしてダメそうな箇所を特定してみる。
  • 私のArduino MEGA2560をUnoに変えてみる → NG。
  • 私のモーターシールドを先方のUnoに乗せてみる → OK
ここで時間切れとなった。
MEGAが互換品だし、相性ですかね? ということになったので、Unoを発注する。

トラブル:モータードライバIC(L293D)を交換
Unoが届いたので、MEGA2560をUnoに交換する。
やっぱりNGなので L293Dを2個とも交換してみる。すると、1回目だけは動いた。
おお、これか、と安心したところ、 次からダメ。
L293Dの交換後にいろいろやっていると、これまでに2度ほど超音波センサー(HC-SR04)の裏面をドライバを不用意に接触、ショートさせたことを思い出したので、その時にチップを飛ばしてしまったか、と思いあたり、さらにL293Dを4個発注する。

トラブル:FAQに答えが
ここで、ch1のモーターが正常に動作しないまま、本番の日を迎える。

間に合わず、と思ったが、他にできることもないので会場で何か情報はないかとAdafruitのFAQを眺めていると、あれ? 書いてあるわ、ディジタルピンの10番はch1で使用していると。
えーっと、10番は超音波センサーと干渉しているではないか。
がっくし、だけど、やったー。
時間もないので、超音波センサーのジャンパーワイヤーを11番から9番へ変更して、スケッチも変更してみる。
何事もなかったように動く。
MEGAとモーターシールドとの相性なんかじゃなかった。
あーぁ。

What pins are not used on the motor shield?

All 6 analog input pins are available. They can also be used as digital pins (pins #14 thru 19)
Digital pin 2, and 13 are not used.
The following pins are in use only if the DC/Stepper noted is in use:
Digital pin 11: DC Motor #1 / Stepper #1 (activation/speed control)
Digital pin 3: DC Motor #2 / Stepper #1 (activation/speed control)
Digital pin 5: DC Motor #3 / Stepper #2 (activation/speed control)
Digital pin 6: DC Motor #4 / Stepper #2 (activation/speed control)
The following pins are in use if any DC/steppers are used
Digital pin 4, 7, 8 and 12 are used to drive the DC/Stepper motors via the 74HC595 serial-to-parallel latch
The following pins are used only if that particular servo is in use:
Digitals pin 9: Servo #1 control
Digital pin 10: Servo #2 control
DCモーターではデジタルピンの3番(ch2)、5番(ch3)、6番(ch4)、11番(ch1)を使用とのこと。
また、4番、7番、8番、12番もモーターシールドの真ん中に鎮座しているシフトレジスタIC 74HC595 で使用されているとのこと。
9番、10番はステッピングモーターで使用されるとのことだが、DCモーターオンリーなので空きとなる。
0番と1番はArduinoとPCをUSB接続するときに使われるので実質的に使用できない。
となると、UnoでDCモーターを4ch利用する場合、デジタルピンの空きは2番、9番、10番、13番の4本となる。
アナログピンは6本ともオールフリー(使用可能)。 
でもね、FAQ以外に書くところなかったのかよ、が魂の叫びであった(FAQに対する考え方の相違)。

他にもいろいろミスがあって、本番は散々であった。

トラブル:後日談
根本的な原因が判明した3日後にL293Dが 4個 届いた。
基板に刺さっている2個を含めて 合計8個 もある。
つまり、予備が6個。
MEGAも余ったよ(まだUnoから元に戻していない)。
うーむ。

これから
モーターに高周波ノイズキャンセラー(といってもコンデンサ1個だが)を取り付けてみたい。


次回の記事は、方位センサーにしよう。

0 件のコメント:

コメントを投稿

zenback