ArduinoでDCモーターの正転，逆転

ここではArduinoでモーターを正転，逆転する方法を書いていく．
最初にそもそもモーターの回転方向を変える原理について簡単にまとめる．

# モーターの回転方向を変える原理(Hブリッジ)
モーターの回転方向はモーターに入ってくる電流の方向によって決まってくる．したがって，原始的な手法を考えるとモーターの回転を変えたいときにつなぎなおせばよい．このようなことをマイコンなどによって指令を出すことによって行うことができるのがHブリッジ回路である．Hブリッジ回路についての説明はこちらのサイトがわかりやすいかなと思うので参考にしてもらえればと思います．
[DCモーターをArduinoUnoで動かしてみる（その２） ](https://elchika.com/article/14bfedd4-45ef-4db5-8842-eea2a38746df/#h_%E3%83%96%E3%83%AA%E3%83%83%E3%82%B8%E5%9B%9E%E8%B7%AF)


また，この回路において大切な役割を果たすのがトランジスタである．
トランジスタにはPNP型とNPN型があり，その原理については以下のサイトに詳しく書いてあったので参考にしてください．
[【トランジスタとは？】『特徴』や『動作原理』などを分かりやすく説明します！](https://detail-infomation.com/bipolar-transistor/)


# デバイスの準備
arduinoで実際に行うためにトランジスタを実際に用意して行うこともできるが，今回はすでに生産終了予定であるが良くモーターのコントロールで電子工作で使われることが多い(？)東芝のモータードライバであるTA7291Pを用いることにする．こちらの仕様についてはこれらのサイトを参考にしてください．
[TA7291データシート](file:///C:/Users/facto/AppData/Local/Temp/TA7291P_datasheet_ja_20070613.pdf)
より詳しい内容はこちらを参考にするとよくわかる．また，こちらではデータシートの内容をより分かりやすく書かれている．自分でデータシートを読めるようになることが大切だとは思うのでその練習問題の答え合わせとして用いるといいかと思います．
[TA7291P情報系でもわかるモータードライバーの使い方](https://qiita.com/gpioblink/items/d9addbe2851b91e538ac)

# Arduinoの書き方の作法
Arduinoは基本的にはC言語のような書き方をする．簡単な作法についてまとめておく．最初に変数などを宣言ずるときはとりあえず「const int」の形で書いとけばいいと思います．「#define」で宣言するものもあるがどちらがいいのかはっきりさせておきたい人は，ぜひ調べてみてください．私はまだ調べ切れていないのでここについては引用は特にしません．すいません．arduinoの記法やその他作法のようなものについては阪大の先生(石川先生や南先生)が動画で解説されている(正確にはメカトロの講義の中で使用されているようです．)今回のものはそちらをかなり参考にさせていただきました．この場をかりまして感謝申し上げます．
>[メカトロニクス系講再生リスト(石川先生)](https://www.youtube.com/playlist?list=PLV0FVUV8gVBhOTcZKOkC00qkUCnNFjG8S)
[はじめてのメカトロニクス(南先生)](https://www.youtube.com/playlist?list=PLaGJj8hIXEm_LTqh9nY-n4sR33SVSUnzr)


```c:
//最初に変数や使用するPinを宣言する．
const int Pin = pin_number;

int value;//変数

//Pinなどの設定をここで行う
void setup() {
  pinMode(Pin, OUTPUT);  //pinが出力として使うことをここで設定する．
}

//ここから回路内でループされる内容を記述する
void loop() {
　digitalWrite(Pin, LOW);//例えばデジタル信号でPinで0を出力させる．
}

```

# 実際のプログラム
今回利用したプログラムでは基本的には[メカトロ実習⑤ DCモータ](https://www.youtube.com/watch?v=M6x3VJbojIA&list=PLV0FVUV8gVBhOTcZKOkC00qkUCnNFjG8S&index=6)で紹介されているものを参考にプログラムは作成した．PWM出力については可変抵抗を用いてアナログ値を変化させ，それを読み取ることで値によって回転の方向を変えれるようにした．また，実際に値がどのようになっているのかシリアルポートで確認できるようにした．

```c:
const int PWMA = 3; //PWM
const int Pin1 = 4; // Arduino_Pin1を4番ピンに割り当てます。
const int Pin2 = 5; // Arduino_Pin2を5番ピンに割り当てます。
const int STIC = A0;

int speed_cmd;

void setup() {
  pinMode(Pin1, OUTPUT);
  pinMode(Pin2, OUTPUT);
  pinMode(PWMA, OUTPUT);
  Serial.begin(9600); //パソコンとのシリアル通信を宣言します。通信レートは9600bpsで設定します。
}
 
void loop() {
  speed_cmd = analogRead(STIC)-512;
  Serial.println(speed_cmd); //読み取った値をシリアルポート（＝パソコン）に送信
  if (speed_cmd > 0){
    digitalWrite(Pin1, LOW);
    digitalWrite(Pin2, HIGH);
    digitalWrite(PWMA, map(speed_cmd, 0, 511, 0, 255));  //map(変換したい数値，現在の範囲の下限，上限，返還後の下限，上限)
    }else{

    digitalWrite(Pin1, HIGH);
    digitalWrite(Pin2, LOW);
    digitalWrite(PWMA, map(-speed_cmd, 0, 511, 0, 255));
    }

}
```

# 参考文献
>[DCモーターをArduinoUnoで動かしてみる（その２） ](https://elchika.com/article/14bfedd4-45ef-4db5-8842-eea2a38746df/#h_%E3%83%96%E3%83%AA%E3%83%83%E3%82%B8%E5%9B%9E%E8%B7%AF)
[【トランジスタとは？】『特徴』や『動作原理』などを分かりやすく説明します！](https://detail-infomation.com/bipolar-transistor/)
[TA7291データシート](file:///C:/Users/facto/AppData/Local/Temp/TA7291P_datasheet_ja_20070613.pdf)
[TA7291P情報系でもわかるモータードライバーの使い方](https://qiita.com/gpioblink/items/d9addbe2851b91e538ac)
[メカトロ実習⑤ DCモータ](https://www.youtube.com/watch?v=M6x3VJbojIA&list=PLV0FVUV8gVBhOTcZKOkC00qkUCnNFjG8S&index=6)
[Arduino Unoのアナログ入力ポートで光センサーを読み取る ](https://elchika.com/article/250867cd-f01b-4b26-a313-6d5709605f0a/)