TA7291P情報系でもわかるモータードライバーの使い方

#この記事について
この記事は、[Aizu Advent Calendar 2018](https://adventar.org/calendars/3023)の２５日目ハリボテ記事です。
作ろうとしてたアプリが進捗ゼロなので、はよ書け攻撃を避けるために即興で書きました。よろしく！ 現在、本来の記事も製作中！


TA7291Pのデータシートを見ても、「●●電源端子」ばっかりで理解分かりにくい。
モータードライバーの使い方は、初見の僕には分かりませんでした。

そこで、「情報系の電子工作をあまりしない人でも使えるTA7291P解説記事」を目指して書いていこうと思います！

具体的には、
- データシートのピン配置表を一行ずつ解説
- 様々な接続例を提示
の２部構成でお送りします！

# 端子の本当の意味はこれだ

これが、TA7291Pのピン配置のに繋ぐものの一覧です。

| 端子記号 | ピン番号 |                    |                                                         |
|----------|----------|--------------------|---------------------------------------------------------|
| Vcc      | 7        | ロジック側電源端子 | マイコンや回路の最大出力電圧を接続                      |
| Vs       | ８       | 出力側電源端子     | モーターで使用する電源のプラスを接続                    |
| Vref     | ４       | 端子電源端子       | モーターに流す電圧を決定する電圧を接続                  |
| GND      | １       | GND                | マイコンのGND端子とモータで使用する電源のマイナスを接続 |
| IN1      | ５       | 入力端子           | 命令表にしたがって操作を選択するHighまたはLowを接続     |
| IN2      | ６       | 入力端子           | 命令表にしたがって操作を選択するHighまたはLowを接続     |
| OUT1     | ２       | 出力端子           | モーターの片側を接続                                    |
| OUT2     | １０     | 出力端子           | モーターのもう片側を接続                                |

### HighとLowってなに

2進数で言えば、Highは１、Lowは0です。
つまり、Highは電源の電圧に近い電圧を、LowはGNDに近い(0V)電圧を接続すればいいです！

# ロジック側電源端子　(Vcc)

ロジック側電源端子には、モータードライバーに命令を送る装置の出力ピンの最高電圧の電源を接続します。

###マイコンなどでデジタル処理をする場合
例えば、Arduinoの場合、「High」の電圧は5Vなので、5Vの電源を接続します。
mbedの場合は、「High」の電圧は3.3Vなので、3.3Vの電源を接続します。

###可変抵抗などでマイコンを使わず処理をする場合
電池のプラスを直接接続しましょう！

# 出力側電源端子 (Vs)

出力側電源端子とは、モーターを動かすための電源のことです。

モーターは、TA7291Pと別の電源で動作させることができます。（USBからの電源と電池からの電源など）
モーターとTA7291Pを同じ電源で動かす場合は、ロジック側と同じ電源を接続しましょう！

###モーターとマイコンの電源を分ける必要性

DCモーターは消費電力が少ないので、１つくらいならUSBからとったマイコンと同じ電源でも問題なく動きます。
しかし、モーターが多くなった場合は、電流の出力がオーバーしてしまうので、外部電源が必要になります。
よく分からない場合や不安な場合は、外部電源にすることをおすすめします。

###よくある例

ロジック側電源端子(Vcc)には、TA7291PをArduinoの5V出力ピンをつなぎ、
出力側電源端子(Vs)には、モーター用の電源として3Vの電池を繋ぐ

# 端子電源端子 (Vref)
端子側電源端子とは、モーターの速度を調節する端子です。
このピンの電圧は、Vsピンからモーターに供給する電圧を決定します！

###マイコンなどでデジタル処理をする場合
マイコンの場合は、Pwm出力ができるピンに接続します。

Arduino Unoでは、3,5,6,9,10,11ピンのいずれか、
mbed LPC1768では、p21〜p26ピンのいずれかに接続しましょう！

###可変抵抗などでマイコンを使わず処理をする場合

可変抵抗の中央のピンを直接繋いでね！
ちなみに両側のピンは、片側を電源のプラスに、もう片側をマイナスに繋ぎます。

# GND
極論、ここまでの説明で未接続のマイナス部分を接続しちゃえばいいです！
電源が複数ある場合も、全ての電源のマイナス部分を接続します！

よく分からない場合は、最後の回路図例をご覧ください！！

# 入力端子 (IN1, IN2)

入力端子は、モーターの動かし方を決める端子です。
表のように高電圧の「High」または低電圧の「Low」を与えることで、
回転の方向を制御することができます。

| IN1 | IN2 |                    |
|-----|-----|--------------------|
| LOW   | LOW   | ストップ(出力なし) |
| HIGH   | LOW   | 正回転             |
| LOW   | HIGH   | 逆回転             |
| HIGH   | HIGH   | ブレーキ           |

###マイコンなどでデジタル処理をする場合
この２つの端子は、それぞれマイコンのDigitalOutピンに接続してください。

###可変抵抗などでマイコンを使わず処理をする場合
マイコンを使わない場合は、トグルスイッチなどを用いて、これを切り替えられるような回路を作りましょう！
IN1、IN2それぞれを、「High」のときはVccに、「Low」のときはGNDに繋ぎます。

# 出力端子 (OUT1, OUT2)

出力端子は、モーターそのものを接続する端子です。
２つあるので、１つをモーターのプラス、１つをマイナスに繋いでください。

# Arduinoと繋ぐ時の例

## Arduinoとモーターが同じ電源を共有する場合
![image.png](https://qiita-image-store.s3.amazonaws.com/0/293301/3660f22d-9198-f80a-7f20-9f799fb48bdc.png)



## Arduinoとモーターが別の電源を使用する場合
Arduinoの電源はUSBからとります！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/293301/f5634f40-c5a0-2b53-14a2-5348ed575356.png)

## Arduinoのサンプルプログラム

```C
#define VREF 3
#define IN1 4
#define IN2 5

void setup() {
  
}

void moveAhead(byte speed){
    digitalWrite(IN1,HIGH);
    digitalWrite(IN2,LOW);
    analogWrite(VREF,speed);
}

void moveBack(byte speed){
    digitalWrite(IN1,LOW);
    digitalWrite(IN2,HIGH);
    analogWrite(VREF,speed);
}

void stop(){
    digitalWrite(IN1,LOW);
    digitalWrite(IN2,LOW);
    analogWrite(VREF,255);
    delay(1000);
}

void loop() {
    stop(); //起動時にはIN1、IN2ともにLOWにしておく
    delay(3000);
    while(1){
        for(byte i = 128; i<256; i+=16){
            moveAhead(i); //速度(Pwmの割合)は0から255の整数で指定する
            delay(3000);
            stop(); //ブレーキをかけて確実にモーターを止める
        }
    }
}
```
# mbedと繋ぐ時の例

## mbedとモーターが同じ電源を共有する場合
![image.png](https://qiita-image-store.s3.amazonaws.com/0/293301/15603e7a-d442-238b-7fd2-ca5739a5584b.png)

## mbedとモーターが別の電源を使用する場合
mbedの電源はUSBからとります！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/293301/2ead93a1-9dc7-235c-47af-299fab05e422.png)


## mbedのサンプルプログラム
```c++:main.cpp
#include "mbed.h"

PwmOut vref(p21);
DigitalOut in1(p22);
DigitalOut in2(p23);

void moveAhead(float speed){
    in1 = 1;
    in2 = 0;
    vref = speed;
}

void moveBack(float speed){
    in1 = 0;
    in2 = 1;
    vref = speed;
}

void stop(){
    in1 = 0;
    in2 = 0;
    vref = 1.0f;
    wait(1);
}

int main() {
    stop(); //起動時にはIN1、IN2ともにLOWにしておく
    wait(3);
    while(1){
        for(int i = 5; i<10; i++){
            moveAhead((float)i/10); //速度(Pwmの割合)は0.0から1.0の間で指定する
            wait(3);
            stop(); //ブレーキをかけて確実にモーターを止める
        }
    }
}
```

# 可変抵抗でマイコンを使わずに制御する例

モータードライバを使ってモーターの速度を変えられるようにしました。
トグルスイッチが手元になかっため写真ではスイッチになっていませんが、IN1とIN2に繋がっている青と黄色のピンを逆にすると逆回転します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/293301/a54d561c-54f0-12b8-4b01-56d403fd2b7e.png)

# おわりに

今回はモータードライバーの使い方を説明しました。
「先輩に聞かなくても理解できる電子工作の方法」をこれからも投稿していくつもりです！
ライントレーサー作りに関わってくれた皆さん、どんどん記事化してくからよろしく！！

えーと、本来書く予定だった在庫管理アプリの記事は絶賛製作中なので、今日はこの記事で攻撃をかわします。(明日)クリスマス中には更新できるように頑張ります！