XBee送信機を作る

リモコン戦車
XBee送信機

XBeeの使い方が分かったところで、送信機(プロポ)を作ります。

プロポ本体は、他の模型のリモコンボックスを流用し、Arduinoで生成した制御信号をXBeeで飛ばします。


回路図です。

ジョイスティックの中立ニュートラルではオープンになっているため、入力ピン(D2, D3, D6, D7)への値が不定となることから、プルダウン抵抗でLowを確定させています。

バッテリーはリモコンボックスを流用するので単三乾電池1本(1.5V)を使い、それをDC-DCコンバータを使って3.3Vへ昇圧しています。

MCP1640 2.0V~5.5V可変DC-DCコンバータモジュール


Arduino Pro Miniへの電源入力は、RAWとVCCの2通りありますが、その違いは以下のとおりです。


Arduino Pro Miniの RAW ピンと VCC ピンは、どちらもボードに電源を供給するためのピンですが、「レギュレータ(電圧調整器)を通すか・通さないか」という決定的な違いがあります。

💡 一目でわかる違い

ピン名入力電圧の目安電圧レギュレータ特徴と使い道
RAW5V〜12V
(※推奨は7V〜9V)
通る
(安全な電圧に変換)
電池(9V乾電池やLiPo電池など)や、不安定な外部電源を直接つなぐときに使う。
VCC5V または 3.3V
(※ボードの仕様による)
通らない
(ダイレクトにICへ)
すでに安定化された5V(または3.3V)を供給するとき、または他のセンサーへ電源を分けるときに使う。

🔍 それぞれのピンの詳しい解説

1. RAWピン(未調整の電源用)

RAW(生、未加工という意味)ピンは、基板上の電圧レギュレータへ繋がっている入力口です。

  • 仕組み: ここに入力された高めの電圧(例: 9V)は、ボード上のレギュレータによって、マイコンが動く安全な電圧(5Vまたは3.3V)にカチッと引き下げられます。
  • 注意点: 12V以上を入れるとレギュレータが異常発熱して壊れる可能性があるので、実用上は 7V〜9V 程度にしておくのが無難です。

2. VCCピン(調整済み電源用・出力用)

VCCピンは、マイコン(ATmega328P)の電源ピンに直接繋がっています。

  • 仕組み: レギュレータを通らないため、ここに入力した電圧がそのままマイコンに流れます。
  • 注意点【超重要】: 5V仕様のボードのVCCに9Vや12Vを突っ込むと、マイコンが一発で過電圧により破損します。 必ず、別で用意した「完全に安定した5V(または3.3V)」を入力してください。
  • 便利な使い方: RAWピンに電池を繋いでいるとき、このVCCピンからは「安定した5V(または3.3V)」が出力されます。これを利用して、他のセンサーやモジュールに電源を分ける(出力ピンとして使う)ことができます。

今回3.3Vですが昇圧回路からの出力電圧がふらつく可能性を考慮して、ここではRAWへ印加しています。


回路はユニバーサル基板に実装しています。完成したプロポの全体観です。

XBee送信機

次にスケッチです。

/*******************************************************************************
XBeeコントロール送信機 for RC_Tank(リモコンボックス)
++++++ note ++++++
・リモコンボックスの前進/更新のジョイスティック操作により、赤白ラインの極性が変わる。
(もともとはモータブリッジ回路が不要になるように、電源ラインでモータの極性を変化できるようにしてある。)
  前進:赤1(3.3V) 白0
  後進:赤0 白1(3.3V)
・ジョイスティックの方向と出力値のマッピング
7  8   9
 ↖ ↑ ↗
4← 5 →6
 ↙ ↓ ↘
1  2  3
・ジョイスティック操作に応じた値をシリアルモニタに表示させる。
・ジョイスティックの中立(ニュートラル)は”オープン”と思われる。
★Arduinoの入力ピンを33[kΩ]の抵抗を介してGNDに接続(プルダウン抵抗)。
 ジョイスティックがニュートラル時でも入力ピンの値をLOWに確定できる。

*******************************************************************************/
#define VERSION "1.00a0"

const int L_RED = 2;
const int L_WHITE = 3;
const int R_RED = 6;
const int R_WHITE = 7;

// 初期化(電源投入/リセット時1回のみ実行):
void setup() {
// initialize the remote_box signal pin as an input(Arduinoにリモコンボックスからのピンが入力であることを伝える)
  pinMode(L_RED, INPUT);
  pinMode(L_WHITE, INPUT);
  pinMode(R_RED, INPUT);
  pinMode(R_WHITE, INPUT);
  Serial.begin(9600); //9600bpsでシリアルポートを開く
}
// main loop:
void loop() {
  if((digitalRead(L_RED) == HIGH)&(digitalRead(R_RED) == HIGH)){ //前進
    Serial.print('8');
    delay(100);  //シリアルポートを溢れさせないように ※delay():単位ms
  }
  else if((digitalRead(L_RED) == HIGH)&(digitalRead(R_WHITE) == HIGH)){ //右超信地旋回
    Serial.print('6');
    delay(100);  //シリアルポートを溢れさせないように ※delay():単位ms
  }
  else if((digitalRead(L_WHITE) == HIGH)&(digitalRead(R_RED) == HIGH)){ //左超信地旋回
    Serial.print('4');
    delay(100);  //シリアルポートを溢れさせないように ※delay():単位ms
  }
   else if((digitalRead(L_WHITE) == HIGH)&(digitalRead(R_WHITE) == HIGH)){ //後進
   Serial.print('2');
   delay(100);  //シリアルポートを溢れさせないように ※delay():単位ms
  }
   else if(digitalRead(L_RED) == HIGH){ //右前進緩旋回
   Serial.print('9');
   delay(100);  //シリアルポートを溢れさせないように ※delay():単位ms
  }
   else if(digitalRead(R_RED) == HIGH){ //左前進緩旋回
   Serial.print('7');
   delay(100);  //シリアルポートを溢れさせないように ※delay():単位ms
  }
   else if(digitalRead(L_WHITE) == HIGH){ //右後進緩旋回
   Serial.print('3');
   delay(100);  //シリアルポートを溢れさせないように ※delay():単位ms
  }
   else if(digitalRead(R_WHITE) == HIGH){ //左後進緩旋回
   Serial.print('1');
   delay(100);  //シリアルポートを溢れさせないように ※delay():単位ms
  }
  else{
    Serial.print('5');  //中立ニュートラル(Stop)
    delay(100);  //シリアルポートを溢れさせないように ※delay():単位ms
  }
}

仕組みとしてはジョイスティックの操作に合わせて、対応する文字列を送信し続けて受信側を制御するようにしています。例えば中立ニュートラルの場合「5」を送信し続けており、「5」を受信している間はリモコン戦車はずっと停止状態を維持しています。

前進8
右超信地旋回6
左超信地旋回4
後進2
右前進緩旋回9
左前進緩旋回7
右後進緩旋回3
左後進緩旋回1
中立ニュートラル5

Arduinoの「0番(RX)」と「1番(TX)」ピンにXBeeを繋いでいる場合
Arduino Unoなどの 0(RX) 1(TX) ピンにXBeeの通信ピンを直接(またはシリアルシールド経由で)接続している場合、Serial.print() を実行するとパソコン(USB)とXBeeの両方に全く同じデータが同時に送信されます。


コメント

タイトルとURLをコピーしました