XBee受信機を作る

リモコン戦車

次にリモコン戦車に搭載するXBee受信機を作ります。
これはすでに「制御回路を作る①」で作製済みなので、制御回路とXBeeを接続して受信機にします。
接続するのは、VCC(+5V)とGND、シリアル線の3本です。


Arduino Pro Mini5V版を使用しているため、XBee向けに5V – 3.3Vにレベル変換が必要となります。SparkFunの「XBeeエクスプローラ5Vマイコン用アダプタ」を使用します。

XBeeエクスプローラ5Vマイコン用


/*******************************************************************************
XBeeコントロール受信機 for RC_Tank

++++++ note ++++++
・ペアとして、XBeeコントロール送信機 for RC_Tank(リモコンボックス)が必要
・ジョイスティックの方向と出力値のマッピング
7  8   9
 ↖ ↑ ↗
4← 5 →6
 ↙ ↓ ↘
1  2  3

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

#define SPEED_0 0               //モータへの電圧(スピード)を3種類用意
#define SPEED_1 153             //0~255(MAX):Vref電圧を3Vまでに制限

int val = 0;                    //ジョイスティックからの受信データを一時格納する変数を定義

// set pin numbers:
 // 右キャタピラ用ピン
const int R_Vref = 5;           //D5(PWM)
const int R_OUT1 = 3;           //D3
const int R_OUT2 = 4;           //D4
 // 左キャタピラ用ピン
const int L_Vref = 6;           //D6(PWM)
const int L_OUT1 = 7;           //D7
const int L_OUT2 = 8;           //D8

// 初期化(電源投入/リセット時1回のみ実行):
void setup() {
// initialize the motor driver pin as an output(Arduinoにモータドライバへのピンが出力であることを伝える)
  pinMode(R_Vref, OUTPUT);
  pinMode(R_OUT1, OUTPUT);
  pinMode(R_OUT2, OUTPUT);
  pinMode(L_Vref, OUTPUT);
  pinMode(L_OUT1, OUTPUT);
  pinMode(L_OUT2, OUTPUT);
  
  Serial.begin(9600);                 //9600bpsでシリアルポートを開く
}
// main loop:
void loop() {
  if(Serial.available() > 0){         //受信したデータが存在する
    val = Serial.read();              //受信データを読み込み、その値をvalに代入
    switch(val){
      case '8':                       //前進
        analogWrite(R_Vref, SPEED_1); //モータドライバのスピードを指定
        analogWrite(L_Vref, SPEED_1);

        digitalWrite(R_OUT1, LOW);    //貫通電流防止(ストップ)
        digitalWrite(R_OUT2, LOW);
        digitalWrite(L_OUT1, LOW);
        digitalWrite(L_OUT2, LOW);

        digitalWrite(R_OUT1, HIGH);
        digitalWrite(R_OUT2, LOW);
        digitalWrite(L_OUT1, HIGH);
        digitalWrite(L_OUT2, LOW);
        break;
      case '6':                       //右超信地旋回
        analogWrite(R_Vref, SPEED_1); //モータドライバのスピードを指定
        analogWrite(L_Vref, SPEED_1);

        digitalWrite(R_OUT1, LOW);    //貫通電流防止(ストップ)
        digitalWrite(R_OUT2, LOW);
        digitalWrite(L_OUT1, LOW);
        digitalWrite(L_OUT2, LOW);

        digitalWrite(R_OUT1, LOW);
        digitalWrite(R_OUT2, HIGH);
        digitalWrite(L_OUT1, HIGH);
        digitalWrite(L_OUT2, LOW);
        break;
      case '4':                       //左超信地旋回
        analogWrite(R_Vref, SPEED_1); //モータドライバのスピードを指定
        analogWrite(L_Vref, SPEED_1);

        digitalWrite(R_OUT1, LOW);    //貫通電流防止(ストップ)
        digitalWrite(R_OUT2, LOW);
        digitalWrite(L_OUT1, LOW);
        digitalWrite(L_OUT2, LOW);

        digitalWrite(R_OUT1, HIGH);
        digitalWrite(R_OUT2, LOW);
        digitalWrite(L_OUT1, LOW);
        digitalWrite(L_OUT2, HIGH);
        break;
      case '2':                       //後進
        analogWrite(R_Vref, SPEED_1); //モータドライバのスピードを指定
        analogWrite(L_Vref, SPEED_1);

        digitalWrite(R_OUT1, LOW);    //貫通電流防止(ストップ)
        digitalWrite(R_OUT2, LOW);
        digitalWrite(L_OUT1, LOW);
        digitalWrite(L_OUT2, LOW);

        digitalWrite(R_OUT1, LOW);
        digitalWrite(R_OUT2, HIGH);
        digitalWrite(L_OUT1, LOW);
        digitalWrite(L_OUT2, HIGH);
        break;  
      case '9':                       //右前進緩旋回
        analogWrite(R_Vref, SPEED_0); //右キャタピラの速度を遅く(停めて)
        analogWrite(L_Vref, SPEED_1); //左キャタピラの速度を速く

        digitalWrite(R_OUT1, LOW);    //貫通電流防止(ストップ)
        digitalWrite(R_OUT2, LOW);
        digitalWrite(L_OUT1, LOW);
        digitalWrite(L_OUT2, LOW);

        digitalWrite(R_OUT1, HIGH);
        digitalWrite(R_OUT2, LOW);
        digitalWrite(L_OUT1, HIGH);
        digitalWrite(L_OUT2, LOW);
        break;
      case '7':                       //左前進緩旋回
        analogWrite(R_Vref, SPEED_1); //右キャタピラの速度を速く
        analogWrite(L_Vref, SPEED_0); //左キャタピラの速度を遅く(停めて)

        digitalWrite(R_OUT1, LOW);    //貫通電流防止(ストップ)
        digitalWrite(R_OUT2, LOW);
        digitalWrite(L_OUT1, LOW);
        digitalWrite(L_OUT2, LOW);

        digitalWrite(R_OUT1, HIGH);
        digitalWrite(R_OUT2, LOW);
        digitalWrite(L_OUT1, HIGH);
        digitalWrite(L_OUT2, LOW);
        break;
      case '3':                       //右後進緩旋回
        analogWrite(R_Vref, SPEED_0); //右キャタピラの速度を遅く(停めて)
        analogWrite(L_Vref, SPEED_1); //左キャタピラの速度を速く
          
        digitalWrite(R_OUT1, LOW);    //貫通電流防止(ストップ)
        digitalWrite(R_OUT2, LOW);
        digitalWrite(L_OUT1, LOW);
        digitalWrite(L_OUT2, LOW);

        digitalWrite(R_OUT1, LOW);
        digitalWrite(R_OUT2, HIGH);
        digitalWrite(L_OUT1, LOW);
        digitalWrite(L_OUT2, HIGH);
        break;
      case '1':                       //左後進緩旋回
        analogWrite(R_Vref, SPEED_1); //右キャタピラの速度を速く
        analogWrite(L_Vref, SPEED_0); //左キャタピラの速度を遅く(停めて)

        digitalWrite(R_OUT1, LOW);    //貫通電流防止(ストップ)
        digitalWrite(R_OUT2, LOW);
        digitalWrite(L_OUT1, LOW);
        digitalWrite(L_OUT2, LOW);
        
        digitalWrite(R_OUT1, LOW);
        digitalWrite(R_OUT2, HIGH);
        digitalWrite(L_OUT1, LOW);
        digitalWrite(L_OUT2, HIGH);
        break;
      case '5':                       //中立ニュートラル(Stop)
        analogWrite(R_Vref, SPEED_0); //モータドライバのスピードを指定
        analogWrite(L_Vref, SPEED_0);

        digitalWrite(R_OUT1, LOW);    //貫通電流防止(ストップ)
        digitalWrite(R_OUT2, LOW);
        digitalWrite(L_OUT1, LOW);
        digitalWrite(L_OUT2, LOW);

        digitalWrite(R_OUT1, HIGH);   //ブレーキ
        digitalWrite(R_OUT2, HIGH);
        digitalWrite(L_OUT1, HIGH);
        digitalWrite(L_OUT2, HIGH);

        digitalWrite(R_OUT1, LOW);    //ストップ
        digitalWrite(R_OUT2, LOW);
        digitalWrite(L_OUT1, LOW);
        digitalWrite(L_OUT2, LOW);
        break;
      default:
        break;
    }
  }
}

スケッチです。


リモコン戦車にXBee受信機を搭載します。
制御回路とXBee間はジャンパー線で接続しています。


コメント

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