2015年3月25日水曜日

Wiiリモコン+Arduino+LEGO でラジコンを作る(2):DCモーターを動かす

もくじ
  1. Wiiリモコン+Arduino+LEGO でラジコンを作る(1):材料選定
  2. Wiiリモコン+Arduino+LEGO でラジコンを作る(2):DCモーターを動かす
  3. Wiiリモコン+Arduino+LEGO でラジコンを作る(3):USB Host Shield で Bluetooth ドングルを使えるようにする
  4. 【完成】Wiiリモコン+Arduino+LEGO でラジコンを作る(4):WiiリモコンでDCモーターを操作する


前回で材料がそろいました。

まずはDCモーターを動かします。



いきなり左右キャタピラのモーターを制御するのは面倒ですので、1個で試してみましょう。

出来上がるとこんな感じになります。







これの回路図は次のようになります。



ArduinoWiiRemoteRC_fig2.jpg



前回書かなかった可変抵抗器と固定抵抗器が含まれていますが、

これらはArduinoでソフトウェア的に代替させることも可能です。

固定抵抗器なしの接続方法については「建築発明工作ゼミ2008」さんが参考になります。



モータードライバ TA7291P


10本のピンが生えていて、上部の鉄板が欠けている側が1番ピンです。

それぞれのピンの役割は次のようになります。


  • 1番ピン:GND

    グランドピンです。

    Arduino の GND に接続します。

  • 2番ピン:OUT1

    モーターへの出力です。

    モーターの片方の端子につなぎます。

    動かしたときにモーターが思ったのと逆向きに回ってしまう場合は、

    2番ピンと10番ピンを入れ替えればOKです。

  • 3番ピン:NC

    使いません。

    誤って逆に挿した場合、ちょうどこの位置にVs(8番ピン)が来ます。

    Vs はモーター電源なので、万が一逆に挿してしまっても

    回路が壊れないように3番ピンをアースしてあるんだと思います。

    これを考えた人って賢いですね。

  • 4番ピン:Vref

    モーター制御ピンです。



    普通はここには抵抗器ではなくArduinoのPWM出力を繋いでモーターの回転速度を制御します。

    その場合は5番6番ピンをデジタル出力するようにArduinoのプログラムを書きます。



    今回はその代わりに4番を固定抵抗にして5番6番をPWM出力にすることで回転速度を制御しています。

    どちらでもモーター制御は可能です。



    「ところでPWMって何?」

    という方は前掲の「建築発明工作ゼミ2008」さんで詳しく説明されていますのでご参照ください。


  • 5番ピン:IN1

    モーター制御用の入力です。

    今回は Arduino の6番ピンにつなぎます。



    IN1をHIGH、IN2をLOWにするとモーターが正転します。

    IN1をLOW、IN2をHIGHにするとモーターが反転します。

    Vrefの電圧で回転速度を制御します。

    というのが普通の使い方です。



    今回の場合、Vrefの電圧を固定にする代わり、

    IN1とIN2の電圧を変化させることで回転速度と方向を一気に制御します。



    つまり、TA7291Pの内部では IN1 - Vref と IN2 - Vref の値を元に

    モーター電源からモーターに流す電圧を変化させているようですね。

  • 6番ピン:IN2

    モーター制御用の入力です。

    5番ピンと組み合わせて使います。

    今回はArduinoの5番ピンにつなぎます。



    IN1, IN2 の両方が LOW だったらモーターは停止します。

  • 7番ピン:Vcc

    Arduino の 5V ピンにつなぎます。

  • 8番ピン:Vs

    モーター用電源です。

    最大20Vまで入力できます。

    Arduinoに20Vを繋ぐと壊れてしまうのでArduino用とモーター用の電源を分ける必要があります。



    Vs の電圧がVrefの電圧より低くなるとTA7291Pが壊れるそうです。

    モーター用電源をエネループ4本(1.2V x 4)にするとUSBの5Vより

    下がってしまう可能性があるので注意してください。



    その場合は USB 電源をやめて Arduino の 5V ピンにモーター用電源も繋ぐと動く可能性がありますが、

    うっかり Arduino の許容電圧以上を掛けてしまうと今度は Arduino が壊れるため、

    それはそれで注意が必要です。



    余談ついでに言うと

    「モーターをパワフルに動かしたいがバッテリーも1つにまとめたいぜ!」

    という欲張りな方は20Vを分圧して5Vに落として繋ぐ方法もあります。



    QuadcopterにArduinoを載せる場合などにはこの方法で軽量化することもありますが

    電圧が不安定になるのであまりお奨めしません。

  • 9番ピン:NC

    使いません。

    万が一、左右反転して挿してしまっても、OUT1(2番ピン)の位置になってモーター回路がカットされます。

  • 10番ピン:OUT2

    モーターへの出力です。




Arduino UNO


やっと Arduino の登場です。

Arduino へのスケッチ(プログラム)書き込み方法については様々なサイトで紹介されていますので、

簡単な説明だけに留めておきます。


  1. Arduino公式サイトから Arduino IDE をダウンロードしてインストールします。

  2. Arduino UNO を USB ケーブルでPCにつなぎます。

  3. Arduino IDE を起動すると既に認識されているはずです。




今回使用した Arduino IDE のスケッチは次の通りです。

このスケッチは「hiramine.com」さんを参考にさせていただきました。

というか、ピン番号以外ほとんどそのままです。すみません。



このプログラムを Arduino に流し込んで可変抵抗器を動かすと動画のように動くはずです。

レゴはお好みで適当に。




#define IN1PIN 5
#define IN2PIN 6
#define VOLUMEPIN 0

void setup()
{
pinMode(IN1PIN, OUTPUT);
pinMode(IN2PIN, OUTPUT);
}

void loop(){
int iValue = analogRead(VOLUMEPIN);
int iMotor = Map(iValue, 0, 1023, -255, 255, true);

MotorDrive( IN1PIN, IN2PIN, iMotor );
delay(15);
}

int Map(int iIn, int iIn1, int iIn2, int iOut1, int iOut2, boolean bConstrain = false) {
double dValue = (double)(iIn - iIn1) * (iOut2 - iOut1) / (iIn2 - iIn1) + iOut1;
int iValue = (0 < dValue) ? (int)(dValue + 0.5) : (int)(dValue - 0.5);
if( bConstrain ) {
int iOutMin, iOutMax;
if( iOut1 < iOut2 ){
iOutMin = iOut1;
iOutMax = iOut2;
} else {
iOutMin = iOut2;
iOutMax = iOut1;
}
if( iOutMin > iValue ){
return iOutMin;
}
if( iOutMax < iValue )
{
return iOutMax;
}
return iValue;
}
}

void MotorDrive( int iIn1Pin, int iIn2Pin, int iMotor ){
if( -5 < iMotor && iMotor < 5 ){
digitalWrite(iIn1Pin, LOW);
digitalWrite(iIn2Pin, LOW);
} else if( 0 < iMotor ) {
analogWrite(iIn1Pin, iMotor);
analogWrite(iIn2Pin, 0);
} else {
analogWrite(iIn1Pin, 0);
analogWrite(iIn2Pin, -iMotor);
}
}



スケッチの説明



  • void setup()

    Arduino起動時に実行されます。

    Arduinoのスケッチを作る際は必ず必要な関数です。

    pinMode(PIN,MODE) は第一引数に指定したピンを第二引数のモードに設定する関数です。

  • void loop()

    setup() で初期化された後、繰り返し実行されます。

    これも必ず必要な関数です。

    analogRead(PIN) は引数に指定したアナログピンからアナログ値を読む関数で、0~1023の値が返ります。

    何もしないとものすごい勢いでループが回ってしまうので delay(N) で適当にスリープを入れています。

  • int Map

    第一引数で与えた二、三引数の範囲内の値を四、五引数の範囲に丸めています。

    Arduino 自体にも map という関数があるので見比べると参考になるかもしれません。



    Arduino map

  • void MotorDrive

    可変抵抗の値がプラス側だったらモーターを正転させ、マイナス側だったら逆転させています。

    digitalWrite(PIN,VALUE) は VALUE=HIGH だと PIN が 5V になります。

    LOW だと 0V になります。



    analogWrite(PIN,VALUE) は PWM ピンの場合、PWM で電圧が VALUE 相当になります。

    アナログピンでも PWM ピンでもないデジタルピンの場合は正しく動作しません。




以上でモーター1個の制御は出来るようになりましたので、

次回からはいよいよキャタピラ部分を作っていきます。


0 件のコメント:

コメントを投稿