その前に・・・また買ってしまいました。今回は八九式中戦車アヒルさんチーム かるろべろーちぇバージョンでした。前回のピヨピヨと合わせてアンツィオ戦練習バージョンです。
長々と作っている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();
// }
}
}