SSブログ

リモートコントロール(RC)戦車をつくる【XBeeコントロール受信機】 [RC戦車]

XBeeコントロール受信機を作製します。

RC戦車搭載のArduino Pro Miniとモータドライバが5V仕様なので、XBeeとの接続するためにBee3.3V⇔5V変換アダプタを使います。
XBeeエクスプローラ5Vマイコン用
"https://www.switch-science.com/catalog/1166/"

コネクタは6ピンインターフェースに合わせて、L字型をチョイスして付けました。
XBeeエクスプローラ5Vマイコン用.JPG

【スケッチ】
/*******************************************************************************
XBeeコントロール受信機

++++++ note ++++++
・ペアとして、XBeeコントロール送信機が必要
・ジョイスティックの方向と出力値のマッピング
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;
    }
  }
}




profile_picture_40×40.JPG

続きを読む


nice!(0)  コメント(0) 

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。