ON THE HAND

引っ越しました http://tech.andhandworks.com

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

このエントリーをはてなブックマークに追加

  1. --/--/--(--) --:--:--|
  2. スポンサー広告

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個の制御は出来るようになりましたので、
次回からはいよいよキャタピラ部分を作っていきます。

このエントリーをはてなブックマークに追加

  1. 2015/03/25(水) 00:57:29|
  2. Arduino
  3. | コメント:0
関連記事
<<DragonBoard 410c を基板配置から Raspberry Pi2, BeagleBone black と比較してみる | ホーム | Wiiリモコン+Arduino+LEGO でラジコンを作る(1):材料選定>>

コメント

コメントの投稿


管理者にだけ表示を許可する

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。