2016-08-07

ルノーB1bis(カモさんチーム)その16

ルノーB1bis(カモさんチーム)その16です。
その前に・・・また買ってしまいました。今回は八九式中戦車アヒルさんチーム かるろべろーちぇバージョンでした。前回のピヨピヨと合わせてアンツィオ戦練習バージョンです。

長々と作っているB1bisなので、ここらで完成と行きたかったんですが、写真撮りの祭に落としてしまって修理に追われてました。せっかくコピーした排気管は取れるは、履帯接合ピンは折れるはで災難です。なんとか修復できたので一安心です。動作確認でokしたので、まずはここらで回路図とソフトを載せておきます。近々写真と動画を撮って載せます。 
///
/// B1bis
/// 6ch HC-05 BT serial receiver
///
//#include
//LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
#include
int ND0 = 0; //serial data 0 L_UD
int ND1 = 0; //serial data 1 L_LR
int ND2 = 0; //serial data 2 R_LR
int ND3 = 0; //serial data 3 R_UD
int ND4 = 0; //serial data 4 LSW
int ND5 = 0; //serial data 5 RSW
int PWML = 0;//左速度
int PWMR = 0;//右速度
int CENTER = 92; //砲塔トリム
int R = 10;  //砲塔回転速度
int ROT;
int SPD = 1; //走行スピード
Servo servo09;  //サーボの名称を設定
Servo servo10;  //サーボの名称を設定
int unsigned long time = 0;
int unsigned long dt;

void setup() {
  pinMode(3, OUTPUT);//L正転(490Hz)
  pinMode(5, OUTPUT);//L反転(977Hz)
  pinMode(6, OUTPUT);//R反転(977Hz)
  pinMode(11, OUTPUT);//R正転(490Hz)
  pinMode(12, OUTPUT);//砲火
  servo09.attach( 9);//サーボ割り当て
  ROT = CENTER;
  servo09.write(ROT);//センター初期位置
  //servo10.attach(10);//サーボ割り当て
  //servo10.write(90);//センター初期位置
  Serial.begin(115200); // HC05 serial speed
  Serial.write(65); //'A'
  //  lcd.begin(16, 2);
  //  lcd.clear();
  time = millis();
}

void loop() {
  //バッファ領域に7個以上のデータがあるとき
  if (Serial.available() > 6 ) {
    if (Serial.read() == 63 ) { //'?'
      ND0 = Serial.read(); //L_UD //L_UD
      ND1 = Serial.read(); //R_UD //L_LR
      ND2 = Serial.read(); //L_LR //R_LR
      ND3 = Serial.read(); //R_LR //R_UD
      ND4 = Serial.read(); //LSW
      ND5 = Serial.read(); //RSW

      //      lcd.setCursor(0, 0);
      //      lcd.clear();
      //      lcd.setCursor(0, 0);
      //      lcd.clear();
      //      lcd.setCursor(0, 0);
      //      lcd.print(ND0, HEX);
      //      lcd.setCursor(4, 0);
      //      lcd.print(ND1, HEX);
      //      lcd.setCursor(8, 0);
      //      lcd.print(ND2, HEX);
      //      lcd.setCursor(0, 1);
      //      lcd.print(ND3, HEX);
      //      lcd.setCursor(4, 1);
      //      lcd.print(ND4, HEX);
      //      lcd.setCursor(8, 1);
      //      lcd.print(ND5, HEX);

      // ND0をPWML, ND1をPWMRに割り当て
      // NDxのセンターを90度としてPWM出力
      // 120〜136を不感帯とする。

      // 5:L正転、3:L反転
      if (ND0 > 144 ) {
        PWML = (ND0 - 128) * SPD ; //128以上はマイナス128してSPD倍に
        analogWrite(3, PWML)   ; //L正転
        analogWrite(5, 0   )   ;
      }
      else if  (ND0 < 112 ) {
        PWML = (127 - ND0) * SPD ; //128未満は反転してSPD倍に
        analogWrite(3, 0   )   ;
        analogWrite(5, PWML)   ; //L反転
      }
      else {
        PWML = 0;
        analogWrite(3, 0)      ; //L stop
        analogWrite(5, 0)      ; //L stop
      }

      //11:R正転、6:R反転
      if (ND3 > 144 ) {
        PWMR = (ND3 - 128) * SPD ; //128以上はマイナス128してSPD倍に
        analogWrite(11, PWMR)   ; //R正転
        analogWrite(6, 0  )   ;
      }
      else if  (ND3 < 112 ) {
        PWMR = (127 - ND3) * SPD ; //128未満は反転してSPD倍に
        analogWrite(11, 0      );
        analogWrite(6, PWMR)  ; //R反転
      }
      else {
        PWMR = 0;
        analogWrite(11, 0)    ; //R stop
        analogWrite(6, 0)   ; //R stop
      }

      // 0V(000)判定  JOYSTIK_button 砲火
      if (       ND5 <  20 ) {
        digitalWrite(12, HIGH); //砲火点灯
        analogWrite ( 3,   0 ); //
        analogWrite ( 5, 127 ); //L反転
        analogWrite (11,   0 ); //
        analogWrite ( 6, 127 ); //R反転
        delay       (    100 ); //後退

        digitalWrite(12, LOW ); //砲火消灯
        analogWrite ( 3, 127 ); //L正転
        analogWrite ( 5,   0 ); //
        analogWrite (11, 127 ); //正反転
        analogWrite ( 6,   0 ); //
        delay       (    100 ); //前進

        analogWrite ( 3,   0 ); //stop
        analogWrite ( 5,   0 ); //stop
        analogWrite (11,   0 ); //stop
        analogWrite ( 6,   0 ); //stop
        delay       (    100 ); //
      }

      // 4.17V(213)判定 砲塔回転
      if (ND4 >  193 && ND4 < 233 ) {
        ROT = CENTER - R;
      }
      else if (ND5 >  193 && ND5 < 233 ) {
        ROT = CENTER + R;
      }
      else {
        ROT = CENTER;
      }
      servo09.write(ROT);

      // reference
      // ステアリングサーボの例
      //servo10.write(ND2 * 7 / 10); //0<->255 to 0<->180

      // SW判定
      // 0.00V(000)判定  JOYSTIK_button
      //      if (            ND5 <  20 ) {
      //      }  else {
      //      }
      // 0.83V(043 2Ah)Yボタン判定
      //if (ND5 >  23 && ND5 <  63 ) {
      //      } else {
      //      }
      // 1.67V(085 54h)Xボタン判定
      //      if (ND5 >  65 && ND5 < 105 ) {
      //      } else {
      //      }
      // 2.50V(128 7Fh)Aボタン判定
      if (ND5 > 108 && ND5 < 148 ) {
        SPD = 1 ;
        //} else {
      }
      // 3.33V(170 AAh)Bボタン判定
      if (ND5 > 150 && ND5 < 190 ) {
        SPD = 2 ;
      //} else {
      }
      // 4.17V(213 D5h)右前ボタン判定
      //      if (ND5 > 193 && ND5 < 233 ) {  //
      //      } else {
      //      }
      //ドライバ制御ここまで

      Serial.write(65);//合図用のデータ'A'を送る
    }
    //  } else {
    //    dt = millis() - time ;
    //    if (dt > 1000) {
    //      Serial.write(65);//合図用のデータを送る
    //      time = millis();

    //  }
  }
}

0 件のコメント: