== DCモータードライバの使い方 == DCモーターをArduino等のマイコンでコントロールする場合、モーターはたくさんの電流を消費するので直接DCモーターをマイコンに接続することはできません。[[BR]] そのためDCモータードライバという回路が必要になります。[[BR]] スイッチサイエンスで取り扱い中(2015/05/19現在)のDCモータードライバの[http://trac.switch-science.com/wiki/DCMotorDriverList 全てのリストはこちら]です。 ||メーカー||商品名||PLU||モーター数||ロジック電源電圧||モーター電源電圧||最大電流(連続)||最大電流(ピーク)||最大PWM周波数||制御ピン|| ||Pololu||[https://www.switch-science.com/catalog/236/ デュアルモータードライバTB6612FNG]||236||2||2.7V~5.5V||4.5V~13.5V||1A||3A||100kHz||回転方向切替:2本 回転速度:1本|| ||Pololu||[https://www.switch-science.com/catalog/1637/ デュアルモータードライバDRV8835]||1637||2||2V~7V||2V~11V||1.2A||1.5A||250kHz||回転方向切替:1本 回転速度:1本|| 使えるモーターの数、流せる電流の量、モーターの駆動電圧、内蔵されている保護回路の種類等の違いはありますが使い方はほとんど同じです。[[BR]] [http://trac.switch-science.com/wiki/DCMotorDriverList リスト]の制御ピンの欄を見てみると、大きく分けて次の3つに分類できます。中には複数の制御方法を切り替えられるものもありますが、代表的なものを表記しています。[[BR]] * 回転方向切替:2本 回転速度:1本 * 回転方向切替:1本 回転速度:1本 * 回転方向と速度:2本 この3種類の制御方法ごとに使い方を説明します。[[BR]] === ・回転方向切替:2本 回転速度:1本 === このタイプは回転方向(正回転・逆回転)の切替に2本の入力ピン、回転速度(PWM)の指定に1本の入力ピンを持っています。[[BR]] (OUT1 OUT2の状態はモータードライバの種類によって少し異なります。) ||PWM||IN1||IN2||OUT1||OUT2||状態|| ||0||0||0||Z||Z||ストップ|| ||1||0||0||Z||Z||ストップ|| ||0||0||1||L||L||ショートブレーキ|| ||1||0||1||L||H||逆転|| ||0||1||0||L||L||ショートブレーキ|| ||1||1||0||H||L||正転|| ||0||1||1||L||L||ショートブレーキ|| ||1||1||1||H||H||ショートブレーキ|| 例として[https://www.switch-science.com/catalog/236/ デュアルモータードライバTB6612FNG(連続最大1A)]を使ってみます。[[BR]] このモータードライバはモーター駆動電源の推奨値が4.5V~13.5Vですが、下の図では3Vにしています。(非推奨ですが2.5Vから動作します。) このように基本的にモータードライバーを使うときはマイコン用の電源とモーター用の電源の2種類を用意する必要があります。[[BR]] 理由は次の通りです。 * モーターに使う電源の電圧と制御系の電源電圧が違う * モーターの電流消費が大きく、大きなノイズも発生するので制御系への影響を少なくするため 今回の例で言うとVCCがロジック電源(制御系)、これはArduino Unoからもらっています。[[BR]] VMOTがモーター用の電源です。モータードライバの種類によってはロジックとモーター用の電源端子が共通になっているものもあります。[[BR]] AIN1とAIN2をArduino Unoのデジタル12、13番に接続し、PWMAをデジタル11番につなげました。 [[Image(0J4621.1200.jpg,240px)]] [[Image(TB6612_3.png,360px)]] サンプルスケッチです。正転と逆転を繰り返すようになっています。 {{{ #define AIN1 13 #define AIN2 12 #define PWMA 11 void setup() { pinMode(AIN1,OUTPUT); pinMode(AIN2,OUTPUT); pinMode(PWMA,OUTPUT); } void loop() { int i=0; //モーター停止 digitalWrite(AIN1,LOW); digitalWrite(AIN2,LOW); delay(500); //モーター正回転・スピード変化 digitalWrite(AIN1,HIGH); digitalWrite(AIN2,LOW); for(i=0;i<256;i++){ analogWrite(PWMA,i); delay(100); } for(i=255;i>=0;i--){ analogWrite(PWMA,i); delay(100); } //モーター停止 digitalWrite(AIN1,LOW); digitalWrite(AIN2,LOW); delay(500); //モーター逆回転・スピード変化 digitalWrite(AIN1,LOW); digitalWrite(AIN2,HIGH); for(i=0;i<256;i++){ analogWrite(PWMA,i); delay(100); } for(i=255;i>=0;i--){ analogWrite(PWMA,i); delay(100); } } }}} === ・回転方向切替:1本 回転速度:1本 === このタイプは回転方向の制御に信号線を1本、回転速度を指定するために信号線(PWM)を1本使います。[[BR]] (OUT1 OUT2の状態はモータードライバの種類によって少し異なります。) ||IN||EN||OUT1||OUT2||状態|| ||0||PWM||PWM||L||正転|| ||1||PWM||L||PWM||逆転|| ||x||0||L||L||ブレーキ|| 今回は例として[https://www.switch-science.com/catalog/1637/ デュアルモータードライバDRV8835]を使ってみます。[[BR]] APAHSEピンをArduino Unoのデジタル12番にAENABLEピンをデジタル11番に接続しました。[[BR]] VCCがロジック電源で、今回はArduino Unoから5Vをもらっています。VINはモーター駆動用電源で今回は3Vにしました。[[BR]] [[Image(0J4056.1200.jpg,300px)]] [[Image(DRV8835_3.png,360px)]] サンプルスケッチです。正転と逆転を繰り返すようになっています。 {{{ #define APHASE 12 #define AENABLE 11 void setup() { pinMode(APHASE,OUTPUT); pinMode(AENABLE,OUTPUT); } void loop() { int i=0; //モーター停止 analogWrite(AENABLE,0); digitalWrite(APHASE,LOW); delay(500); //モーター正回転・スピード変化 digitalWrite(APHASE,LOW); for(i=0;i<256;i++){ analogWrite(AENABLE,i); delay(100); } for(i=255;i>=0;i--){ analogWrite(AENABLE,i); delay(100); } //モーター停止 analogWrite(AENABLE,0); digitalWrite(APHASE,LOW); delay(500); //モーター逆回転・スピード変化 digitalWrite(APHASE,HIGH); digitalWrite(APHASE,LOW); for(i=0;i<256;i++){ analogWrite(AENABLE,i); delay(100); } for(i=255;i>=0;i--){ analogWrite(AENABLE,i); delay(100); } } }}} === ・回転方向と速度:2本 === 最後のタイプは回転方向と速度の両方を2本の入力で行うタイプです。一見、前のタイプ(回転方向切替:1本 回転速度:1本)と同じように感じますが、少し違います。[[BR]] 前のタイプは速度制御用のPWM出力ピンが1本必要ですが、こちらの場合はPWM出力のピンが2本必要になります。[[BR]] (OUT1 OUT2の状態はモータードライバの種類によって少し異なります。) ||IN1||IN2||OUT1||OUT2||状態|| ||0||0||Z||Z||ストップ|| ||0||PWM||L||PWM||逆転(ストップ)|| ||PWM||0||PWM||L||正転(ストップ)|| ||1||PWM||H||PWM||逆転(ブレーキ)|| ||PWM||1||PWM||H||正転(ブレーキ)|| ||1||1||H||H||ブレーキ|| 今回は例として[https://www.switch-science.com/catalog/1637/ デュアルモータードライバDRV8835]を使ってみます。[[BR]] 前のタイプ(回転方向切替:1本 回転速度:1本)の例で使用したのと同じモータードライバです。このモータードライバはモードを切り替えることで制御方法を変えることができます。[[BR]] 前回はMODEピンをHIGHにしていましたが、今回はLOWにします。 AIN1ピンをArudino Unoのデジタル11番に、AIN2ピンを10番ピンに接続します。[[BR]] [[Image(0J4056.1200.jpg,300px)]] [[Image(DRV8835_5.png,360px)]] サンプルスケッチです。正転と逆転を繰り返すようになっています。 {{{ #define AIN1 11 #define AIN2 10 void setup() { pinMode(AIN1,OUTPUT); pinMode(AIN2,OUTPUT); } void loop() { int i=0; //モーター停止 analogWrite(AIN1,0); analogWrite(AIN2,0); delay(500); //モーター正回転・スピード変化 analogWrite(AIN2,0); for(i=0;i<256;i++){ analogWrite(AIN1,i); delay(100); } for(i=255;i>=0;i--){ analogWrite(AIN1,i); delay(100); } //モーター停止 analogWrite(AIN1,0); analogWrite(AIN2,0); delay(500); //モーター逆回転・スピード変化 analogWrite(AIN1,0); for(i=0;i<256;i++){ analogWrite(AIN2,i); delay(100); } for(i=255;i>=0;i++){ analogWrite(AIN2,i); delay(100); } } }}} この他にアナログ入力で速度を変化させるようなタイプなど、上の3タイプではない制御方法を持つモータードライバも存在します。[[BR]] モータードライバの種類によって制御に必要なピンがいくつか追加されますが、大体のDCモータードライバの基本的な使い方は上記の3タイプです。[[BR]]