Indoor airplane world
 



 現在Bluetooth受信機に内蔵している、前進と後進ができる受信機はBTBOAT-2BTTWIN-2で、どちらも最大電流が1.8Aなので、ドライブできるのはせいぜい130モータまでです。



 もっと電流が流せるモータドライバがないか探していましたが、ようやくDRV8850を入手しました。連続出力電流5A(最大8A)。電源電圧は2~5.5V。LiPo電地1セルかNiCd電池4セルなら使えます。前進・後進ができるので便利なのと、少し大きなモータがドライブできます。

 このモータドライバICは0.5ミリピッチの24ピンとピンピッチが狭く、足が出ていないのでリフローはんだするしかありません。

 はんだマスクを作り、プリント基板を作ってはんだ付けしましたが、1回目のリフローでピン間にはんだブリッジができて失敗。2回目で前進・後進のできるスピードコントローラができました。



 Zigbee TWE受信機が載っている鴨に、Arduino UNOを仮に載せて、前進・後進スピードコントローラをテストしました。モータは3V仕様のFK-180-3240を使っています。

 NiCd電池4セルで、スクリューを水中に入れてフルスロットルで約4A近い消費電流でした。しばらく回し続けましたがモータドライバの発熱はほとんどありません。

 このモータドライバには過電流保護、出力ショート保護、低電圧保護、過電圧保護、過温度保護回路が組み込まれているので、実装さえできれば自分でHブリッジを組むより便利です。



 問題なく動作することが分かったので、コネクタケーブルをはんだ付けして、シュリンクチューブをかぶせました。

 

 そしてArduino nano受信機のスケッチを変更して、前進・後進スピードコントローラも使えるようにしました。

 最新のBluetooth受信機のスケッチです(2015/06/26PWM出力ポート訂正)

// 2チャンネルArduino nano Bluetooth受信機
// 2015/06/09 信号が途絶えたらモータをストップするようにした
// 2016/06/19 スロットルをサーボパルスとPWMパルスを出力するようにした

#include <Servo.h>

// オブジェクトの宣言
Servo servo1;
Servo servo2;

// グローバル変数の宣言
char input[13]; // 文字列格納用
int i = 0; // 文字数のカウンタ
int yval = 1000; // スロットル初期値
int xval = 1500; // サーボ初期値
int center = 13; // 前進・後進モード時スロットルセンタの不感帯設定

// 初期設定
void setup() {
Serial.begin(9600); // シリアルポートを9600bpsで初期化
servo1.attach(4); // サーボ出力ピン
servo2.attach(3); // スロットルサーボパルス出力ピン
analogWrite(73, 0); // スロットルPWM出力ピン
analogWrite(85, 0); // スロットルPWM出力ピン
}

// メインループ
void loop(){
// データを受信した時の処理
if (Serial.available()) {
input[i] = Serial.read();
if (input[i] == ','){ // 2のデータをカンマ区切
input[i] = '\n'; // 末尾に終端文字の挿入
yval = Serial.parseInt(); // カンマ前のデータを数値で取得
xval = Serial.parseInt(); // カンマ後のデータを数値で取得
i = 0;
}
else{ i++; }
}
else { // データが途絶えたらモータをストップ
yval = 1000;
analogWrite(73, 0);
analogWrite(85, 0);
}
// スロットルPWM出力
int thrval = map(yval, 1000, 2000, -255 - center, 255 + center);
// 正回転
if (thrval > center){
int pwm = abs(thrval - center);
analogWrite(73, 0);
analogWrite(85, pwm);
}
// 逆回転
else if (thrval 85, 0);
analogWrite(73, pwm);
}
// ストップ
else{
analogWrite(73, 0);
analogWrite(85, 0);
}
// スロットルサーボパルス出力
yval = map(yval, 1500, 2000, 1000, 2000);
if (yval >= 1000 && yval <= 2000) servo2.writeMicroseconds(yval);
else servo2.writeMicroseconds(1000);
// ラダーサーボ出力
if (xval >= 1000 && xval <= 2000) servo1.writeMicroseconds(xval);
else servo1.writeMicroseconds(1500);
}



コメント ( 0 ) | Trackback (  )
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする


« Arduino nano ... 今日の辻堂海... »
 
コメント
 
コメントはありません。
コメントを投稿する
 
名前
タイトル
URL
コメント
コメント利用規約に同意の上コメント投稿を行ってください。

数字4桁を入力し、投稿ボタンを押してください。