選択肢の少ない既製品モータドライバ
タミヤの工作キットなどでちょっとしたロボットを作ると、モータドライバが必要になるが、秋月とかでモータドライバを探してもせいぜい数アンペアであまり高い電流を流せるものはない。
2Aが相場で、ミニ四駆などのFA130サイズのモータを回すのも安心とは言えない。
東芝のTAから始まるモータドライバICで数十アンペア流せるのがあるといいのになーと思っていた折、twitterでAmazonで売られている、1500円で43Aを流せるモータドライバを見かけた。
これのようだ。
1500円だったら安いと思う。45Vまでの電源電圧に対応しているようなのでそこそこのモータならこれでいけるだろう。
と思ったら同じものがAliexpressでも売られているらしい。半額で。
中国製だと思ったらAliで探す癖をつけないといけないなと思う。
自分のロボットはArduinoが脳みそなので、これに接続して使う。
説明書も何もついてこなかった。
端子も単に入力が二本あるのかと思ったら、
Vcc、GND、PWMR、PWML、R_EN、L_EN、R_IS、L_ISの8ピンある。めんどくさそうだ。
とりあえず日本語で書かれたユーザーのページを探したが、英語で書かれたページしか見つからなかった。
モータドライバの海外の販売サイトにデータシートがあったので見てみたがこのボードに使われているBTS7960というハーフブリッジドライバICに関してのみのデータシートだった。
このモータドライバの入力には一旦別のICが噛んでいる。
ISはモータドライバの状態を返すピンなようでオープンでいいらしい。
となるとArduinoに接続するのはVcc、GND、PWMR、PWML、R_EN、L_ENの6本。
モータ用電圧は7Vくらい用意した方がいいです。
5V以下だと動作せず、5Vを少し超えるくらいではモータの回転がだいぶ鈍りました。
実験
よくわからないのでそのページを参考にモータを回すだけのスケッチを書いた。
/* BTS7960モータドライバ テスト */ int RPWM=5; /*右回転PWM*/ int LPWM=6; /*左回転PWM*/ int L_EN=7; int R_EN=8; void reset(){ for(int i=5;i<9;i++){ digitalWrite(i,LOW); } } void setup() { for(int i=5;i<9;i++){ pinMode(i,OUTPUT); } reset(); Serial.begin(9600); } void loop() { //パターン1 Serial.write("1\n"); analogWrite(RPWM,255); digitalWrite(R_EN,HIGH); digitalWrite(L_EN,HIGH); delay(1000); reset(); delay(1000); //パターン2 Serial.write("2\n"); analogWrite(LPWM,255); digitalWrite(R_EN,HIGH); digitalWrite(L_EN,HIGH); delay(1000); reset(); delay(1000); //パターン3 Serial.write("3\n"); analogWrite(RPWM,255); digitalWrite(R_EN,LOW); digitalWrite(L_EN,LOW); delay(1000); reset(); delay(1000); //パターン4 Serial.write("4\n"); analogWrite(LPWM,255); digitalWrite(R_EN,LOW); digitalWrite(L_EN,LOW); delay(1000); reset(); delay(1000); }
上記のスケッチではモータはパターン1,2のときに回転し、3,4では動かない。2と3の切り替え中もモータは惰性で回転しているが、ブレーキがかかっている様子はない。これはわかる。
では、こうしたらどうか?左右どちらかのPWMと、左右どちらかのENのHIGHがそれぞれ組み合わされたときと食い違っているときの4パターンを用意した。パターン1,2のときのみモータは回るだろうか。
/* BTS7960モータドライバ テスト */ int RPWM=5; /*右回転PWM*/ int LPWM=6; /*左回転PWM*/ int L_EN=7; int R_EN=8; void reset(){ for(int i=5;i<9;i++){ digitalWrite(i,LOW); } } void setup() { for(int i=5;i<9;i++){ pinMode(i,OUTPUT); } reset(); Serial.begin(9600); } void loop() { //パターン1 Serial.write("1\n"); analogWrite(RPWM,255); digitalWrite(R_EN,HIGH); digitalWrite(L_EN,LOW); delay(1000); reset(); delay(1000); //パターン2 Serial.write("2\n"); analogWrite(LPWM,255); digitalWrite(R_EN,LOW); digitalWrite(L_EN,HIGH); delay(1000); reset(); delay(1000); //パターン3 Serial.write("3\n"); analogWrite(RPWM,255); digitalWrite(R_EN,LOW); digitalWrite(L_EN,HIGH); delay(1000); reset(); delay(1000); //パターン4 Serial.write("4\n"); analogWrite(LPWM,255); digitalWrite(R_EN,HIGH); digitalWrite(L_EN,LOW); delay(1000); reset(); delay(1000); }
モータはまったく動かない。
よくわからんモータドライバだなと思っていたら、
PWMがAnalogWriteで入力されていることに気づいた。
この部分はコピペだったのでラジコンのESCのようにサーボと同じPWMで動かしているものと思い込んで全く気にしていなかった。
そこでこういうスケッチを試してみた。
/* BTS7960モータドライバ テスト */ int RPWM=5; //右回転PWM int LPWM=6; //左回転PWM int L_EN=7; int R_EN=8; //モータドライバ入力ピンのリセット void reset(){ for(int i=5;i<9;i++){ digitalWrite(i,LOW); } } void setup() { for(int i=5;i<9;i++){ pinMode(i,OUTPUT); } reset(); Serial.begin(9600); } void loop() { //パターン1 Serial.write("1\n"); analogWrite(RPWM,255); digitalWrite(R_EN,HIGH); digitalWrite(L_EN,HIGH); delay(2000); analogWrite(LPWM,255); delay(4000); reset(); //パターン2 Serial.write("2\n"); analogWrite(RPWM,255); digitalWrite(R_EN,HIGH); digitalWrite(L_EN,HIGH); delay(2000); analogWrite(RPWM,0); delay(4000); reset(); //パターン2 Serial.write("3\n"); analogWrite(RPWM,255); digitalWrite(R_EN,HIGH); digitalWrite(L_EN,HIGH); delay(2000); digitalWrite(R_EN,LOW); digitalWrite(L_EN,LOW); delay(4000); reset(); }
こうすると、パターン1,2のときはブレーキがかかり、
パターン3ではブレーキがかからなかった。
ようやく理解した。PWMピン二つを使えば2入力4ポジションのフルブリッジドライバを制御するのと同じような操作ができるということだ。
ENは二個同時にHIGHにしないと使えない意味はよくわからないが、用がなければVCCを分岐させて突っ込んでおけば使用に問題はなさそう。
あと、モータドライバのテストをするときはRS540を使った方がいいということが分かった。
はじめRE280を使っていたが、RS540は短絡するとドカンと止まるのに対し、RE280は端子を開放するのと見分けがつかない。
消費電力のでかいモータの方が逆起電力もでかいからだろうか。