#概要
ブラシレスモーターを正転逆転両方に対応させたいのですが,ドローン用のESCは基本的に一方向のみにしか対応していません.
よって,L298Nでとりあえずどこまで動かせるかやってみたいと思います.
結論
現状,失敗している
電流2Aではちょっとパワーが足りないため,脱調がすぐ発生する
センサレスで単純にON,OFFしているためかもしれないが
#参考
ブラシレスモーターの構造
https://www.ipros.jp/technote/basic-motor3/
ESCの自作
https://www.youtube.com/watch?v=W9IHEqlGG1s
#原理
こんな感じの構造と考えるようです.
実際には,コイルがたくさんある感じで
こんな感じと考えれるでしょう
コイルは12こ(間隔30deg),ステーターの磁石は14個(間隔25.7deg)ある.
数に差を作ることで,回転方向の指定が可能になります.差がなければ,回転方向の指定ができない.
例えば,
A=Float
B=HIGH
C=GND
この状態の時,次の二つの状態どちらの指定かで回転方向が決定します.
A=GND
B=HIGH
C=Float
A=HIGH
B=Float
C=GND
磁石と,コイルの数にずれがあるため,回転方向の指定ができるのです.
こんな感じで考えると,A,B,Cへの$HIGH,GND,Float$の流れは
一つずつ,ずらすような形にすればOKです.
ただし,HIGH,GNDのチェックはした方がよさそうです.A,B,Cのどれか一つでも,HIGH,LOWが逆になっていた場合回りません.
#駆動回路
A,B,Cに接続する回路は次のように,Hブリッジ回路の半分です.ハーフブリッジ回路とかともいうっぽいです(https://techweb.rohm.co.jp/motor/knowledge/basics/basics-03/397).
この回路をA,B,Cそれぞれにつけるので
6個スイッチ(FET)が必要になります.
###参考:Hブリッジ回路
DCモーターの駆動によく使われます.
こんな形をしています,
こんな感じで,正転逆転の指定が可能になります.
#L298N回路
L298Nのデータシートより
https://akizukidenshi.com/download/ds/st/l298n.pdf
回路図
https://www.it-denshi.com/product/215
Hブリッジ回路一つを使えば,ブラシレスモータのための$HIGH,GND,Float$の指定が可能になります.
制御信号がつながっているため,L298Nは2つ必要になります.
各Hブリッジ回路は2Aまでなので,そこにも気を付ける必要があります.
#配線 ver.1
ブラシレスモータの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でブラシレスモーターを回すのは難しい
いいブラシレスモータードライバを探した方がはやいな
もっといい方法・現状の脱調の原因をだれか教えてください.
正弦波とかにしたらうまくいくのかな・・・
#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);
}
}