ブラシレスモーターをL298Nで動かす

#概要
ブラシレスモーターを正転逆転両方に対応させたいのですが，ドローン用のESCは基本的に一方向のみにしか対応していません．
よって，L298Nでとりあえずどこまで動かせるかやってみたいと思います．

結論
現状，失敗している
電流2Aではちょっとパワーが足りないため，脱調がすぐ発生する
センサレスで単純にON,OFFしているためかもしれないが

#参考

ブラシレスモーターの構造
https://www.ipros.jp/technote/basic-motor3/

ESCの自作
https://www.youtube.com/watch?v=W9IHEqlGG1s

#原理

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/51ad845f-bcfa-12b1-a7ba-dbb02ff82628.png)

こんな感じの構造と考えるようです．
![IMG_4222.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/0c49fad2-c5dd-5dfd-1ab0-188797dbd1c2.jpeg)
実際には，コイルがたくさんある感じで
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/811caa23-a886-1ce0-75d4-7814f2e758ab.png)
こんな感じと考えれるでしょう

コイルは12こ（間隔30deg），ステーターの磁石は14個(間隔25.7deg)ある.

数に差を作ることで，回転方向の指定が可能になります．差がなければ，回転方向の指定ができない．

例えば，
>A=Float
>B=HIGH
>C=GND

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/1dbeafe5-7a48-c173-60dd-84dea9317240.png)
この状態の時，次の二つの状態どちらの指定かで回転方向が決定します．

>A=GND
>B=HIGH
>C=Float

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/43b3e464-8b83-5043-25ff-60e4e4394069.png)

>A=HIGH
>B=Float
>C=GND

![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/47974cbd-0321-7710-ef2e-0e6ce293de44.png)

磁石と，コイルの数にずれがあるため，回転方向の指定ができるのです．

こんな感じで考えると，A,B,Cへの$HIGH,GND,Float$の流れは

![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/492d5ad4-f023-1dc4-897a-c6d60fb77654.png)

一つずつ，ずらすような形にすればOKです．
ただし，HIGH,GNDのチェックはした方がよさそうです．A,B，Cのどれか一つでも，HIGH,LOWが逆になっていた場合回りません．

#駆動回路
A,B,Cに接続する回路は次のように，Hブリッジ回路の半分です．ハーフブリッジ回路とかともいうっぽいです（https://techweb.rohm.co.jp/motor/knowledge/basics/basics-03/397）．

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/b4e1c351-463b-eecb-5ade-6d763b8e8f77.png)
この回路をA,B,Cそれぞれにつけるので
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/1076acb0-2896-6430-9d60-22f61ebc5677.png)
6個スイッチ（FET）が必要になります．

###参考:Hブリッジ回路
DCモーターの駆動によく使われます．
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/f2af8ba8-dccf-b004-f613-a0cd5d393c0a.png)

こんな形をしています，

![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/cf6ea86a-0601-d9ab-b80e-bc978558605b.png)

![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/40101fc2-1588-60a4-ae4b-8f94a4bfff35.png)

こんな感じで，正転逆転の指定が可能になります．

#L298N回路
L298Nのデータシートより
https://akizukidenshi.com/download/ds/st/l298n.pdf
回路図
https://www.it-denshi.com/product/215

![l298.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/c9828cdf-a4ae-f498-d886-c2563f9923f7.png)

2つHブリッジ回路が入っています．
![l298_float.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/6a35519d-45c1-aa91-284c-07efcaf9b27c.png)

![l298_GND.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/9c21c925-880f-26c2-6944-77d04c10e814.png)
![l298_HIGH.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/facdf0d5-a066-148d-05f6-8b5dda01c0d9.png)

Hブリッジ回路一つを使えば，ブラシレスモータのための$HIGH,GND,Float$の指定が可能になります．
制御信号がつながっているため，L298Nは2つ必要になります．

各Hブリッジ回路は2Aまでなので，そこにも気を付ける必要があります．

#配線　ver.1

非常に雑ですが
![IMG_4223.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/f1174aa4-fd7a-f9c0-76b0-30f18ac397c9.jpeg)

ブラシレスモータの3線はL298Nの出力2つのうち一つにつけています．
今回はFloat状態が必要なため，Enableへの接続も必要になってます．3本（IN1,IN2,ENA）×3セット=9本　Arduinoにつないでます．
ただし，このままだと，確実にPWM信号線が足りなくなるので，何らかの工夫が必要でしょう．

youtubeの動画( https://www.youtube.com/watch?v=W9IHEqlGG1s) だと,電流が流れすぎてしまい，電源がカバーできず失敗します．
そのため，"Current chopping"という方式で，電流に合わせてHIGHにしている信号線をGNDにしています．

###結果
2本つないでいるL298Nの方は熱を持ったため動作していることがわかったが，もう一方のL298Nの方は熱を持たず，電流が流れていないように見えた．

テスターでA,B,C相の電圧を見た結果，B相のHIGH,LOWが逆になっているため失敗していた

B相のHIGH,LOWを入れ替えた結果回るようになったが，トルクが小さい．すぐ脱調する．電源的には2A以上流れているにも拘わらずだ．
ESC自体の自作が必要になるのだろうか・・・

おそらく，ブラシレスモーターは2Aとかより高電流でないとトルクが小さいのかもしれない・・・

とりあえず，L298Nでブラシレスモーターを回すのは難しい

いいブラシレスモータードライバを探した方がはやいな
もっといい方法・現状の脱調の原因をだれか教えてください．

正弦波とかにしたらうまくいくのかな・・・


```C
#define A_in1 A1
#define A_in2 A2
#define A_enc A3
#define B_in1 6
#define B_in2 5
#define B_enc 4
#define C_in1 9
#define C_in2 10
#define C_enc 11

void setup() {
  pinMode(A_in1, OUTPUT);
  pinMode(A_in2, OUTPUT);
  pinMode(A_enc, OUTPUT);
  pinMode(B_in1, OUTPUT);
  pinMode(B_in2, OUTPUT);
  pinMode(B_enc, OUTPUT);
  pinMode(C_in1, OUTPUT);
  pinMode(C_in2, OUTPUT);
  pinMode(C_enc, OUTPUT);

  digitalWrite(A_enc, LOW); //全部floatにしておく
  digitalWrite(B_enc, LOW);
  digitalWrite(C_enc, LOW);

  Serial.begin(250000);

  A_phase(0);
  B_phase(0);
  C_phase(0);


  //B_phase(1);

}

void loop() {
  /*
  int time_delay = 3000;
  C_phase(0);
  Serial.println("0");
  delay(time_delay);
  C_phase(1);
  Serial.println("1");
  delay(time_delay);
  C_phase(2);
  Serial.println("2");
  delay(time_delay);
  */

  
    int time_delay=5;
    A_phase(2);
    B_phase(1);
    C_phase(0);
    Serial.println("1");
    delay(time_delay);
    A_phase(0);
    B_phase(1);
    C_phase(2);
    Serial.println("2");
    delay(time_delay);
    A_phase(1);
    B_phase(0);
    C_phase(2);
    Serial.println("3");
    delay(time_delay);
    A_phase(1);
    B_phase(2);
    C_phase(0);
    Serial.println("4");
    delay(time_delay);
    A_phase(0);
    B_phase(2);
    C_phase(1);
    Serial.println("5");
    delay(time_delay);
    A_phase(2);
    B_phase(0);
    C_phase(1);
    Serial.println("6");
    delay(time_delay);
  


}

void A_phase(int phase) { //0:float 1:GND 2:HIGH
  if (phase == 0) { //float
    digitalWrite(A_enc, LOW);
  } else if (phase == 1) {
    digitalWrite(A_enc, LOW);
    digitalWrite(A_in1, LOW);
    digitalWrite(A_in2, HIGH);
    digitalWrite(A_enc, HIGH);
  } else if (phase == 2) {
    digitalWrite(A_enc, LOW);
    digitalWrite(A_in1, HIGH);
    digitalWrite(A_in2, LOW);
    digitalWrite(A_enc, HIGH);
  }
}

void B_phase(int phase) {
  if (phase == 0) { //float
    digitalWrite(B_enc, LOW);
  } else if (phase == 1) {
    digitalWrite(B_enc, LOW);
    digitalWrite(B_in1, LOW);
    digitalWrite(B_in2, HIGH);
    digitalWrite(B_enc, HIGH);
  } else if (phase == 2) {
    digitalWrite(B_enc, LOW);
    digitalWrite(B_in1, HIGH);
    digitalWrite(B_in2, LOW);
    digitalWrite(B_enc, HIGH);
  }
}

void C_phase(int phase) {
  if (phase == 0) { //float
    digitalWrite(C_enc, LOW);
  } else if (phase == 1) {
    digitalWrite(C_enc, LOW);
    digitalWrite(C_in1, LOW);
    digitalWrite(C_in2, HIGH);
    digitalWrite(C_enc, HIGH);
  } else if (phase == 2) {
    digitalWrite(C_enc, LOW);
    digitalWrite(C_in1, HIGH);
    digitalWrite(C_in2, LOW);
    digitalWrite(C_enc, HIGH);
  }
}
```