ArduinoとTA7291Pでモーターを動かす（単純オンオフ動作からPWM制御まで）


#用意するもの
・Arduino
・モーター(消費電流最大2Aまで。今回はマブチFA130RA使用)
・TA7291P
・ブレッドボード
・配線

##東芝TA7291Pについて
![unnamed.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393970/cefdd51b-a8f4-7e0d-34b0-2ac52ca62e7f.jpeg)


|番号|記号|意味|
|:---------------:|:------------------:|:------------------:|
|   1   |              GND |        GND        |
|   2   |            OUT1 |       モータへ       |
|   3   |              NC|           未使用     |
|   4   |                Vref|         PWM用端子(Arduinoアナログ信号,入力)         |
|   5   |             IN1 |              信号用端子(Arduinoデジタル信号,入力)|
|   6   |           IN2 |      信号用端子(Arduinoデジタル信号,入力)      |
|   7   |            VCC|       電源(モータードライバ用,Arduino5V使用,4.5-20V)       |
|   8   |           Vs |      外部電源(モーター駆動用,外部電源+側,0-20V)    |
|   9   |            NC|       未使用   |
|   10   |           OUT2|      モータへ|
※Vref≦Vs 　PWM制御時の外部電源は5V以上にすること。
なお、生産終了予定のもよう。
####モーター入出力設定
|IN1|IN2|OUT1|OUT2
|:---------------:|:------------------:|:------------------:|:------------------:|
|  0 |                0|         L  |L|   
|   1   |  0|              H | L|
|   0   |  1           |       L  | H  |
|   1  |    1          |           H     |H|

####Vsat検証
**「Vsは0V からですが、内部ロス(Vsat)を考えた電圧を印加しませんと、負荷は駆動できません」**（データシート原文）
実際、Vs=2.0からモーターが回り始めるので、どれだけロスするのか検証。

|外部電源電圧 (Vs,V)|無負荷時電圧(V)|モーター負荷電圧(V)|内部ロス電圧（Vsat,V）|割    合 (%)|
|:--------:|:----:|:------------:|:--------:|:--------:|
|   2   |    1.4          |       0.4        |  1.6        |-80.0
|   3   |      2.4 |    1.3  |         1.7|-57.0
|   4   |    3.4  |       2.1    |    1.9 |-48.0
|   5   |       4.4    |        3.1       |1.9|-38.0
|   6   |          5.4     |        4.0  |  2.0 |-33.3
|   10   |       9.5    |          7.0 |   3.0  |-30.0
|   15   |          14.4    |     11.5          |3.5|-24.4
|   20   |              19.3 |        16.0  |  4.0 |-20.0
無負荷時検証方法：OUT1 OUT2でテスタ測定。
モーター負荷時検証方法：モータ単体で回転させ、モーター側端子でテスタ測定。
テスタ：Sanwa PM3
モーター：マブチFA130RA

※内部ロス（Vsat）の定義が負荷(モーター)込みなのか判らなかったので、実際に駆動させる時を考えて外部電圧から負荷時電圧を引き、内部ロスとして割り出した。この場合だとモーターの型によって割合が変動してくると思うので注意。本当は外部電圧と無負荷電圧との差がVsatなんだろうけどどうなんでしょ…？
※そもそもこのモーターは負荷3.0V以上は保証されてないので高電圧側は気休め程度に見ておくこと

#配線図
![qiita用スイッチ_ブレッドボード.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393970/4c387e7a-175d-702e-fc7e-0fc6190014df.jpeg)
※外部バッテリーは5V辺りを想定
**※PWM制御可能なピンは、デジタル3，5，6，9，10，11番のピンです。**
#プログラム（オンオフ制御）

```ruby:
 int Motor01_in1 = 0;
 int Motor01_in2 = 1;

void setup() {
  pinMode(Motor01_in1,OUTPUT);
  pinMode(Motor01_in2,OUTPUT);
}

void loop() {
digitalWrite(Motor01_in1,HIGH);
delay(1000);
digitalWrite(Motor01_in1,LOW);
delay(100);
digitalWrite(Motor01_in2,HIGH);
delay(1000);
digitalWrite(Motor01_in2,LOW);
delay(100);
}
```
※**「入力を切り替えたときに貫通電流が流れます。入力切り替え時 (正転⇔逆転、正転/逆転⇔ブレーキ) に STOP モード
(約 100 μs) を入れてください。」**（データシート原文）
※正回転→無負荷→反回転→無負荷のループです。
#プログラム（PWM制御）
```ruby
 int Motor01_in1 = 0;
 int Motor01_in2 = 1;
 int PWM =3;

void setup() {
  pinMode(Motor01_in1,OUTPUT);
  pinMode(Motor01_in2,OUTPUT);
}

void loop() {
 digitalWrite(Motor01_in1,HIGH);
 analogWrite(PWM,255); //PWM設定値:0～255　255=5V
 delay(3000);
 digitalWrite(Motor01_in1,LOW);
 analogWrite(PWM,0);
 delay(100);

 digitalWrite(Motor01_in2,HIGH);
 analogWrite(PWM,128);//128=2.5V
 delay(3000);
 digitalWrite(Motor01_in2,LOW);
 analogWrite(PWM,0);
 delay(100);
}
```
※PWM制御ピンのpinMode設定は要らないです。
反回転する際に出力が半分ほどに落ちるのが確認できれば成功です。
※正回転(100%出力)→無負荷→反回転(50％出力)→無負荷のループです。