Indoor airplane world
 





 Arduino Bluetooth送受信機で鴨を操縦してみて、改善すべき点が見つかりました。

 ラダーの舵角切り替えと、リバース切り替えは、共に電源をONするときにボタンを押して設定していました。そして元に戻すときは、一度電源をOFFにしてからONし直す必要がありました。

 これでは不便なので、電源ON後にラダーの舵角切り替えと、リバース切り替えができるように改善しました。



 'C'ボタンを押すごとに舵角が50%と100%に切り替わり、'A'ボタンを押ごとにラダーがリバースとノーマルに切り替わるようにしました。

 ところでArduino nano受信機に前進・後進スピードコントローラを実装したときに、PWMが出力できないポート(D7とD8)につないでいたことが分かりました。

 メス鴨でテストしたとき、前進と後進ができたのでOKだと思っていましたが、PWMでコントロールできていなかったのです(汗)。

 Arduino UNOでPWMが出力できるのは、D3、D5、D6、D9、D10、D11。Arduino UNOではD3、D5でテストしていたので、Arduino nanoでも同じピンを使うように修正しました。

 そして小さな子どもたちでも操縦できるように、体験操縦モードを追加してみました。

 小さな子どもたちには、一つのジョイスティックだけで船のスピードと、左右の旋回を操作するのは難しいようです。また見ていると、ジョイスティックを目一杯倒して操縦しています。

 そこで、ジョイスティックは船の前進と後進だけにして、最高スピードを抑えた設定にし、'B'ボタンで右旋回、'D'ボタンで左旋回出来るようにしてみました。ちょっと押しにくい場所にある'E'ボタンで、トレーナーモードとノーマルモードを切り替えられるようにしています。



 今回の送信機はLiPo電池2セルを使っていて、消費電流は約0,05-0.06Aです。

 以下は体験操縦モードを組み込んだ送信機のスケッチです。

// 2チャンネルBluetooth送信機
// ボタン割り当て
// ○A=D2
// ○D=D5 ○B=D3
// ○C=D4
// 2015/06/21電源ON後でもラダーリバースとデュアルレートの切り替えができるように改善
// 2015/06/25トレーナー追加

int rudval;
int thrval;
int buttonStateA; // ラダーノーマル/リバース
int buttonStateB; // トレーナーモード時のラダー右
int buttonStateC; // ラダーデュアレート100%/50%
int buttonStateD; // トレーナーモード時のラダー左
int buttonStateE; // トレーナーモードON/OFF

boolean Dualrate = false;
boolean Reverse = false;
boolean Trainer = false;

void setup() {
Serial.begin(9600);
pinMode(2, INPUT_PULLUP); // Aボタンを入力にしてプルアップ
pinMode(3, INPUT_PULLUP); // Bボタンを入力にしてプルアップ
pinMode(4, INPUT_PULLUP); // Cボタンを入力にしてプルアップ
pinMode(5, INPUT_PULLUP); // Dボタンを入力にしてプルアップ
pinMode(6, INPUT_PULLUP); // Eボタンを入力にしてプルアップ
}

void loop()
{
buttonStateE = digitalRead(6); // Eボタンチェック
if (buttonStateE == LOW){ // トレーナーモード
if (Trainer == true) Trainer = false;
else Trainer = true;
while (buttonStateE = digitalRead(6) == LOW);
}
if (Trainer == false){ // トレーナーモードOFF
buttonStateC = digitalRead(4); // Cボタンチェック
if (buttonStateC == LOW){ // デュアルレート
if (Dualrate == true) Dualrate = false;
else Dualrate = true;
while (buttonStateC = digitalRead(4) == LOW);
}
buttonStateA = digitalRead(2); // Aボタンチェック
if (buttonStateA == LOW){ // リバース
if (Reverse == true) Reverse = false;
else Reverse = true;
while (buttonStateA = digitalRead(2) == LOW);
}
// ラダー処理
int rud = analogRead(A0);
if (Dualrate == false){ // 舵角100%
if (Reverse == false) rudval = map(rud, 0000, 1023, 1000, 2000); // ノーマル
else rudval = map(rud, 0000, 1023, 2000, 1000); // リバース
}
else{ // 舵角50%
if (Reverse == false) rudval = map(rud, 0000, 1023, 1250, 1750); // ノーマル
else rudval = map(rud, 0000, 1023, 1750, 1250); // リバース
}
Serial.print(rudval, DEC); // ラダー値を出力
Serial.print(","); // データ区切り
}
else{ //トレーナーモードON
buttonStateB = digitalRead(3); // Bボタンチェック
buttonStateD = digitalRead(5); // Dボタンチェック
if (buttonStateB == LOW){
if (Reverse == false) rudval = 2000;
else rudval = 1000;
Serial.print(rudval, DEC); // ラダー右
Serial.print(","); // データ区切り
}
else if (buttonStateD == LOW){
if (Reverse == false) rudval = 1000;
else rudval = 2000;
Serial.print(rudval, DEC); // ラダー左
Serial.print(","); // データ区切り
}
else{
rudval = 1500;
Serial.print(rudval, DEC); // ラダーニュートラル
Serial.print(","); // データ区切り
}
}
// スロットル処理
int thr = analogRead(A1);
if (Trainer == false) thrval = map(thr, 0000, 1023, 1000, 2000);
else thrval = map(thr, 0000, 1023, 1220, 1780);
Serial.print(thrval, DEC); // スロットル値を1000~2000の範囲で出力
Serial.println("."); // ドットで終了
delay(100);
}

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


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

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