2018-11-09
Arduino MEGA 2560を入手できたので、LED出力をPIN22以降に移設します。
サーボ出力もPIN46に移設。
更に砲塔旋回用のサーボをPIN44に接続。
砲塔旋回用サーボは連続回転するように改造済みです。
新たに、赤外線バトルシステムの導入を模索。
赤外線リモコンの値を読み取り、送信する方法に関して、ネットの記事などを参考に試行錯誤してみます。
手持ちのアオシマのVSタンクは難しいですが、童友社のバトルタンクJRの信号はなんとか処理できました。
使用するライブラリーはIRremoteです。
読み取ったコードをスケッチに組み込み、実験してみたところ上手く動いてくれました。
IRremoteは、UNOでは赤外線LEDを接続するのはPIN3が指定ですが、MEGAでは上手く作動しません。
解決策を探していると、PIN9でいけそうな情報を入手。
PIN9はUSBシールドと干渉する可能性があるが、試してみたところ支障なく動作します。
これでバトルタンク試作で確認したかったことは、ほぼ出来ました。
今後は小型化に挑戦して、1/35スケールの戦車に搭載したいです。
Arduino PS3 Bluetooth controlled tank ver.5
【赤外線バトル信号送信機能付きArduino MEGA 2560のスケッチ】
/* PS3BT_arduino_MEGA2560_tank_2dcmotor_TB6612_FIRE_IR_D モータドライバはTB6612 46ピンでサーボモータ(砲身上下)を動かす 44ピンで連続回転サーボモータ(砲塔旋回)を動かす 砲塔旋回モータを追加 砲撃時のリコイルアクション+LED点灯、銃撃時のLED点滅(5回)の機能を追加 IRremote(MEGAはPIN9, UNOその他はPIN9)で赤外線対戦システムを組込(砲撃のみ) */ #include <PS3BT.h> #include <usbhub.h> #ifdef dobogusinclude #include <spi4teensy3.h> #endif #include <Usb.h> // needed by Arduino IDE #include <IRremote.h> IRsend irsend; //#include <Servo.h> //Servo myservo; #include <VarSpeedServo.h> VarSpeedServo myservo; VarSpeedServo myservo_1; int servo_pos = 90; const int servo_sp = 50; const int servo1_sp = 50; const int d_time = 20; int ch = 0; int val = 0; int pos_y; int pos_x; int PWMA = 5; // ← 11 Aモータ PWM 左側モータ int AIN1 = 4; // ← 9 Aモータ IN1 ( 9ピンはUSBホストシールド使用 int AIN2 = 2; // ← 8 Aモータ IN2 int BIN1 = 8; // ← 7 Bモータ IN1 int BIN2 = 7; // ← 6 Bモータ IN2 int PWMB = 6; // ← 10 Bモータ PWM 右側モータ( 10ピンはUSBホストシールド使用 int motor_speed; const int motor_sp1 = 128; //超信地旋回速度 const int motor_sp0 = 255; //超高速 const int LED_1 = 22; //主砲 const int LED_2 = 24; //機銃 const int LED_3 = 26; //ブレーキランプ const int LED_4 = 28; //主砲準備中 const int LED_8 = 36; //ヘッドランプ USB Usb; BTD Btd(&Usb); //そうしたBluetooth Dongleの事例を作成する必要があります PS3BT PS3(&Btd); //これで事例が作成されます //PS3BT PS3(&Btd, 0x00, 0x15, 0x83, 0x3D, 0x0A, 0x57); // これにはBluetoothアドレスも格納されます // これはスケッチを実行するときにドングルから取得できます void setup() { pinMode(PWMA, OUTPUT); pinMode(AIN1, OUTPUT); pinMode(AIN2, OUTPUT); pinMode(BIN1, OUTPUT); pinMode(BIN2, OUTPUT); pinMode(PWMB, OUTPUT); pinMode(LED_1, OUTPUT); pinMode(LED_2, OUTPUT); pinMode(LED_3, OUTPUT); pinMode(LED_4, OUTPUT); pinMode(LED_8, OUTPUT); myservo.attach(46); //servo ピン46 (9-11ピンは使えない。) myservo_1.attach(44); //servo_1 ピン44 myservo.write(servo_pos); myservo_1.write(servo_pos); Serial.begin(115200); while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection if (Usb.Init() == -1) { Serial.print(F("\r\nOSC did not start")); while (1); //halt } Serial.print(F("\r\nPS3 Bluetooth Library Started")); } void loop() { Usb.Task(); if (PS3.PS3Connected) { //スティックの中央は127だけどピタリと止まらないので+-10ほど余裕を持たせる。 //左スティック上下の値(最上部0、中央127、最下部255)を読み込む pos_y = PS3.getAnalogHat(LeftHatY); pos_x = PS3.getAnalogHat(LeftHatX); /* 砲身 UP/DOWN スティックが下(20未満)の時は1ずつ下に動く。 スティックが上(235より上)の時1ずつ上に動く。 スティックを中間に戻すと、サーボはその位置で停止。 ボタン(SQUARE)を押すと90°にセット。 */ if ((PS3.getAnalogHat(RightHatY) > 235) && (servo_pos < 179 )) { // UP servo_pos++; myservo.write(servo_pos, servo_sp, true); } else if ((PS3.getAnalogHat(RightHatY) < 20) && (servo_pos > 1 )) { //DOWN servo_pos--; myservo.write(servo_pos, servo_sp, true); } else if (PS3.getButtonClick(SQUARE)) { //90° servo_pos = 90; myservo.write(servo_pos, servo_sp, true); delay(d_time); } //砲塔旋回 (連続回転サーボ) loop処理の関係で停止まで最大1回転する if (PS3.getAnalogHat(RightHatX) < 137 && PS3.getAnalogHat(RightHatX) > 117) { //停止 myservo_1.write(90, servo1_sp); } else if (PS3.getAnalogHat(RightHatX) > 235) { //右旋回 myservo_1.write(0, servo1_sp); } else if (PS3.getAnalogHat(RightHatX) < 20) { //左旋回 myservo_1.write(180, servo1_sp); } //砲撃 + リコイル動作 + 赤外線砲撃信号発光 if (PS3.getButtonClick(R1) && ch == 0 ) { int khz = 38; // 38kHz carrier frequency for the NEC protocol unsigned int irSignal[] = {4068, 1028, 2024, 2088, 964}; // vs BATTLE TANK jr T-72 40MHz /* unsigned int irSignal[] = {4048,1068,2048,2008,1044}; vs BATTLE TANK jr エイブラムス 27MHz AnalysIR Batch Export (IRremote) - RAW */ irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal[0]), khz); Serial.println("FIRE"); digitalWrite(LED_1, HIGH); digitalWrite(AIN1, LOW); digitalWrite(AIN2, HIGH); analogWrite(PWMA, motor_sp0); digitalWrite(BIN1, LOW); digitalWrite(BIN2, HIGH); analogWrite(PWMB, motor_sp0); ch = 20000; //約5秒間は砲撃不可 delay(70); digitalWrite(AIN1, LOW); digitalWrite(AIN2, LOW); analogWrite(PWMA, 0); digitalWrite(BIN1, LOW); digitalWrite(BIN2, LOW); analogWrite(PWMA, 0); delay(20); digitalWrite(LED_1, LOW); digitalWrite(AIN1, HIGH); digitalWrite(AIN2, LOW); analogWrite(PWMA, motor_sp1); digitalWrite(BIN1, HIGH); digitalWrite(BIN2, LOW); analogWrite(PWMB, motor_sp1); delay(130); } else { if (ch > 0) { ch--; digitalWrite(LED_4, HIGH); //装填中 } else { digitalWrite(LED_4, LOW); //砲撃可 } } //銃撃 if ( PS3.getButtonClick(L1)) { for ( int i = 0; i < 5 ; i++) { val++; Serial.print("L1 : "); Serial.println(PS3.getButtonClick(L1)); Serial.println("DA "); Serial.println(val); digitalWrite(LED_2, HIGH); delay(50); digitalWrite(LED_2, LOW); delay(50); Serial.println(""); } } //ヘッドライト if (PS3.getButtonClick(RIGHT)) { //点灯 digitalWrite(LED_8, HIGH); } else if (PS3.getButtonClick(LEFT)) { //消灯 digitalWrite(LED_8, LOW); } //左スティックがセンター付近は停止(ブレーキ) if (pos_x >= 117 && pos_x <= 137 && pos_y >= 117 && pos_y <= 137) { digitalWrite(AIN1, HIGH); digitalWrite(AIN2, HIGH); analogWrite(PWMA, 0); digitalWrite(BIN1, HIGH); digitalWrite(BIN2, HIGH); analogWrite(PWMA, 0); digitalWrite(LED_3, HIGH); //ブレーキランプ点灯 } //前進 else if (pos_y < 117 && pos_x > 117 && pos_x < 137) { //左スティック中央(127)から最上部(0)の値をモーターのスピード0から255に変換 motor_speed = map(pos_y, 117, 0, 0, 255); digitalWrite(AIN1, HIGH); digitalWrite(AIN2, LOW); analogWrite(PWMA, motor_speed); digitalWrite(BIN1, HIGH); digitalWrite(BIN2, LOW); analogWrite(PWMB, motor_speed); digitalWrite(LED_3, LOW); } //後進 else if ( pos_y > 137 && pos_x > 117 && pos_x < 137) { motor_speed = map(pos_y, 137, 255, 0, 255); digitalWrite(AIN1, LOW); digitalWrite(AIN2, HIGH); analogWrite(PWMA, motor_speed); digitalWrite(BIN1, LOW); digitalWrite(BIN2, HIGH); analogWrite(PWMB, motor_speed); digitalWrite(LED_3, LOW); } //前進右旋回 else if ( pos_y < 117 && pos_x > 137) { motor_speed = map(pos_y, 117, 0, 0, 255); digitalWrite(AIN1, HIGH); digitalWrite(AIN2, LOW); analogWrite(PWMA, motor_speed); digitalWrite(BIN1, LOW); digitalWrite(BIN2, LOW); analogWrite(PWMB, motor_speed); digitalWrite(LED_3, LOW); } //前進左旋回 else if ( pos_y < 117 && pos_x < 117) { motor_speed = map(pos_y, 117, 0, 0, 255); digitalWrite(AIN1, LOW); digitalWrite(AIN2, LOW); analogWrite(PWMA, motor_speed); digitalWrite(BIN1, HIGH); digitalWrite(BIN2, LOW); analogWrite(PWMB, motor_speed); digitalWrite(LED_3, LOW); } //後進右旋回 else if ( pos_y > 137 && pos_x > 137) { motor_speed = map(pos_y, 137, 255, 0, 255); digitalWrite(AIN1, LOW); digitalWrite(AIN2, HIGH); analogWrite(PWMA, motor_speed); digitalWrite(BIN1, LOW); digitalWrite(BIN2, LOW); analogWrite(PWMB, motor_speed); digitalWrite(LED_3, LOW); } //後進左旋回 else if ( pos_y > 137 && pos_x < 117) { motor_speed = map(pos_y, 117, 0, 0, 255); digitalWrite(AIN1, LOW); digitalWrite(AIN2, LOW); analogWrite(PWMA, motor_speed); digitalWrite(BIN1, LOW); digitalWrite(BIN2, HIGH); analogWrite(PWMB, motor_speed); digitalWrite(LED_3, LOW); } //右超信地旋回 else if ( pos_y > 117 && pos_y < 137 && pos_x > 137) { digitalWrite(AIN1, HIGH); digitalWrite(AIN2, LOW); analogWrite(PWMA, motor_sp1); digitalWrite(BIN1, LOW); digitalWrite(BIN2, HIGH); analogWrite(PWMB, motor_sp1); digitalWrite(LED_3, LOW); } //左超信地旋回 else if ( pos_y > 117 && pos_y < 137 && pos_x < 117) { digitalWrite(AIN1, LOW); digitalWrite(AIN2, HIGH); analogWrite(PWMA, motor_sp1); digitalWrite(BIN1, HIGH); digitalWrite(BIN2, LOW); analogWrite(PWMB, motor_sp1); digitalWrite(LED_3, LOW); } } } |
知り合いにこちらのサイトを教えてあげたら
赤外線バトル信号送信機能付きArduino MEGA 2560を作りたいと言っていたのですが、こちらの回路図を教えていただくことは可能でしょうか。よろしくお願いします
探してみましたが、当時の回路図は残っていませんでした。
参考になるか判りませんが、パーシングIR対戦仕様の回路なら▼にアップしています。
https://blog.goo.ne.jp/ganpon26/e/e4b9caec61fabe34fc90d7ffb6fa9d76
参考にしてみます。