2021-06-21
▼リクエストがあった事や個人の備忘録として、回路図とArduinoスケッチを掲載します。
MP3プレイヤー用の効果音素材は、フリーの「効果音ラボ」などからダウンロードしました。
掲載内容に関しては個人での使用に限ってフリーとします。
【注意】
内容に関する問い合わせに関しては、原則対応いたしません。
Li-Poiバッテリなど火災などの危険性があります。
掲載内容に関しては、自己責任で利用してください。
【スケッチ】
- /* PS4BT_arduino_pro mini_tank_DRV8835_MP3_74type_ver05j
- Arduino IDE 1.8.12
- Arduino pro min + ミニUSBホストシールド2.0 + PS4コントローラ
- 効果音はDFPlayer Mini
- モータドライバはDRV8835
- 砲撃時のリコイルアクション 車体+砲身
- 主砲、機銃、ヘッドライト、ブレーキランプはミニUSBシールドのGPOUTピン0,1,2,3
- 4個のサーボで姿勢制御動作再現
- 【操作手順】
- SHARE+PSボタンでペアリング開始。白色インジケータランプ高速点滅。
- 戦車の電源投入。
- インジケータランプ青色点灯でペアリング完了。
- 【走行コントロール】
- コントローラーの左スティック上下で前後進、
- 右スティックの左右でステアリングを制御。
- ステアリングを振っていくと回転軸側が減速していき(緩旋回から信地旋回)、
- 一杯に倒すと回転軸側は停止。(信地旋回)
- 左スティック中央で右ステアリングを一杯に振ると超信地旋回(速度50%)
- 停止時にブレーキランプ点灯 ミニUSB GPOUT- 3ピン
- 【砲身上下】 右スティック上下で砲身上下。R3ボタンでセンター。
- 【砲塔旋回】 左スティック左右で砲塔旋回。離した位置で止まる。
- 【主砲】 R1ボタンで主砲発射 ミニUSB GPOUT- 0ピン
- 【機銃】 L1ボタンで機銃射撃 ミニUSB GPOUT- 1ピン
- 【ヘッドライト】L3ボタンを押す毎にヘッドライト点灯、消灯。
- ミニUSB GPOUT- 2ピン
- 【赤外線暗視装置】PSボタンを押す毎に赤外線暗視装置が点灯、消灯。
- ミニUSB GPOUT- 4ピン
- 【姿勢制御】
- 左のUPボタンでお辞儀、DOWNボタンで逆お辞儀
- 左のRIGHTボタンで右お辞儀、LEFTボタンで左お辞儀
- 右スティック上で車高低い、スティック下で車高高い
- 右側の△ボタンで車高UP、×ボタンで車高down、□ボタンで車高水平標準(初期値)
- */
- #include <PS4BT.h>
- #include <usbhub.h>
- #ifdef dobogusinclude
- #include <spi4teensy3.h>
- #endif
- #include <SPI.h>
- USB Usb;
- //USBHub Hub1(&Usb); // Some dongles have a hub inside
- BTD Btd(&Usb); // You have to create the Bluetooth Dongle instance like so
- /* You can create the instance of the PS4BT class in two ways */
- // This will start an inquiry and then pair with the PS4 controller - you only have to do this once
- // You will need to hold down the PS and Share button at the same time,
- // the PS4 controller will then start to blink rapidly indicating that it is in pairing mode
- PS4BT PS4(&Btd, PAIR);
- // After that you can simply create the instance like so and then press the PS button on the device
- //PS4BT PS4(&Btd);
- bool printAngle, printTouch;
- uint8_t oldL2Value, oldR2Value;
- //#include <Usb.h> // needed by Arduino IDE
- #include <USB_Host_Shield_GPIO.h> // GPOUTピンで主砲LEDを発光させるため
- MaxGPIO max;
- int cnt = 0 ;
- byte ser_deta;
- #include <VarSpeedServo.h>
- VarSpeedServo myservo_1;
- VarSpeedServo myservo_2;
- VarSpeedServo myservo_3;
- VarSpeedServo myservo_4;
- VarSpeedServo myservo_5;
- VarSpeedServo myservo_6;
- VarSpeedServo myservo_7;
- int servo1_pos = 75; //servo1 砲身上下
- int servo3_pos = 50; //servo3 砲身リコイル
- int servoF_pos = 75; //姿勢制御前
- int servoB_pos = 70; //姿勢制御後
- int servo_pos = 10;
- int difF = 65; //姿勢制御前増減値
- int difB = 50; //姿勢制御後増減値
- const int servo1_sp = 7; //砲身上下スピード
- const int servo2_sp = 5; //砲塔回転スピード
- const int servo4_sp = 25; //姿勢制御スピード
- int ch = 0;
- int pos_y;
- int pos_x;
- int pos_ry;
- int pos_rx;
- int motor_speed;
- int steering;
- int PWMA = 5; // A入力2/AENABLE 左モータ AIN2
- int PWMB = 6; // B入力2/BENABLE 右モータ BIN2
- int AIN1 = 4; // A入力1/APHASE 左モータ AIN1
- int BIN1 = 7; // B入力1/BPHASE 右モータ BIN1
- int silent = 1;
- int state = 0; //変数stateを設定
- int state1 = 0;
- #include <SoftwareSerial.h>
- #include <DFRobotDFPlayerMini.h>
- SoftwareSerial mySerial(A4, A5); // DFPlayer TX,RX
- DFRobotDFPlayerMini myDFPlayer;
- void setup() {
- Serial.begin (115200);
- #if !defined(__MIPSEL__)
- while (!Serial); // Wait for serial port to connect - used on Leonardo,
- //Teensy and other boards with built-in USB CDC serial connection
- #endif
- if (Usb.Init() == -1) {
- Serial.print(F("\r\nOSC did not start"));
- while (1); // Halt
- }
- Serial.print(F("\r\nPS4 Bluetooth Library Started"));
- pinMode(PWMA, OUTPUT);
- pinMode(PWMB, OUTPUT);
- pinMode(AIN1, OUTPUT);
- pinMode(BIN1, OUTPUT);
- myservo_1.attach(2); //servo1 砲身上下
- myservo_1.write(servo1_pos, servo1_sp, true);
- myservo_1.detach();
- myservo_2.attach(3); //servo2 砲塔旋回
- myservo_2.write(90);
- //myservo_2.detach(); //centerセット時はコメントアウト
- myservo_3.attach(8); //servo3 砲身リコイル
- myservo_3.write(servo3_pos);
- myservo_3.detach();
- myservo_4.attach(A0); //servo4 右前サス
- myservo_5.attach(A1); //servo5 左前サス
- myservo_6.attach(A2); //servo6 右後サス
- myservo_7.attach(A3); //servo4 左後サス
- myservo_4.write(servoF_pos, servo4_sp);
- myservo_5.write(servoF_pos, servo4_sp);
- myservo_6.write(servoB_pos, servo4_sp);
- myservo_7.write(servoB_pos, servo4_sp);
- myservo_4.wait();
- myservo_5.wait();
- myservo_6.wait();
- myservo_7.wait();
- delay(1000);
- myservo_4.detach();
- myservo_5.detach();
- myservo_6.detach();
- myservo_7.detach();
- mySerial.begin (9600);
- myDFPlayer.begin(mySerial);
- if (!myDFPlayer.begin(mySerial)) { //Use softwareSerial to communicate with mp3.
- while (true);
- }
- myDFPlayer.volume(25); //Set volume value (0~30).
- myDFPlayer.play(3); //エンジン始動
- delay(2000);
- //myDFPlayer.loop(5); //Loop 5th mp3 アイドリング
- //delay(200);
- }
- void loop() {
- Usb.Task();
- if (PS4.connected()) {
- // myDFPlayer.play(5);
- // delay(100);
- if (PS4.getButtonClick(CIRCLE)) { //エンジン音停止
- myDFPlayer.play(3); //エンジン始動
- delay(100);
- }
- //砲身上下
- if ( PS4.getButtonClick(R3)) { //CENTER
- myservo_1.attach(2);
- myservo_1.write(servo1_pos, servo1_sp, true);
- // myservo_1.detach();
- }
- pos_ry = PS4.getAnalogHat(RightHatY);
- if (pos_ry < 10) { // UP
- myservo_1.attach(2);
- myservo_1.write(servo1_pos + 40, servo1_sp, true);
- // myservo_1.detach();
- } else if (pos_ry > 245) { //DOWN
- myservo_1.attach(2);
- myservo_1.write(servo1_pos - 22, servo1_sp, true);
- // myservo_1.detach();
- } else { //停止
- myservo_1.detach();
- }
- //砲塔旋回
- pos_rx = PS4.getAnalogHat(LeftHatX);
- if ( pos_rx > 230) { //右旋回
- myservo_2.attach(3);
- myservo_2.write(97);
- } else if (pos_rx < 25) { //左旋回
- myservo_2.attach(3);
- myservo_2.write(83);
- } else { //停止
- //myservo_2.attach(3); //回転初めに一瞬反対側に回転するのでコメントアウトする
- myservo_2.write(90);
- myservo_2.detach();
- }
- //砲撃 + リコイル
- if (PS4.getButtonClick(R1) && ch == 0 ) {
- myDFPlayer.play(2);
- delay(100);
- max.write(0, HIGH); //主砲発光
- myservo_3.attach(8);
- myservo_3.write(servo3_pos + 70, 255); //砲身リコイル
- //myservo_3.wait();
- delay(100);
- motor_run(180, 1, 180, 1, 1);
- ch = 2000; //約2秒間は砲撃不可
- delay(100);
- motor_run(0, 0, 0, 0, 1);
- max.write(0, LOW); //主砲消灯
- delay(100);
- myservo_3.write(servo3_pos, 20);
- motor_run(100, 0, 100, 0, 1);
- delay(200);
- motor_run(0, 0, 0, 0, 1);
- myservo_3.wait();
- delay(640);
- myservo_3.detach();
- } else {
- if (ch > 0) {
- ch--;
- }
- }
- //銃撃
- if ( PS4.getButtonClick(L1)) {
- myDFPlayer.play(10);
- delay(100);
- for ( int i = 0; i < 5 ; i++) {
- max.write(1, HIGH); //機銃発光
- delay(80);
- max.write(1, LOW); //機銃消灯
- delay(120);
- }
- }
- //ヘッドライト
- if (PS4.getButtonClick(L3)) {
- state = 1 - state;
- } // L3ボタンを押す毎にstateが変化する
- if (state == 1) {
- max.write(2, HIGH); //点灯
- } else {
- max.write(2, LOW); //消灯
- }
- //赤外線暗視装置
- if (PS4.getButtonClick(PS)) {
- state1 = 1 - state1;
- } // PSボタンを押す毎にstateが変化する
- if (state1 == 1) {
- max.write(4, HIGH); //点灯
- } else {
- max.write(4, LOW); //消灯
- }
- //走行コントロール
- pos_y = PS4.getAnalogHat(LeftHatY);
- pos_x = PS4.getAnalogHat(RightHatX);
- //左スティックがセンター付近は停止(ブレーキ)
- if (pos_x >= 102 && pos_x <= 152 && pos_y >= 102 && pos_y <= 152) {
- motor_run(0, 0, 0, 0, 1);
- }
- //前進
- if (pos_y <= 102 && pos_x >= 102 && pos_x <= 152) {
- motor_speed = map(pos_y, 102, 0, 0, 255);
- motor_run(motor_speed, 0, motor_speed, 0, 0);
- }
- //後進
- else if ( pos_y >= 152 && pos_x >= 102 && pos_x <= 152) {
- motor_speed = map(pos_y, 152, 255, 0, 255) ;
- motor_run(motor_speed, 1, motor_speed, 1, 0);
- }
- //前進右緩旋回、信地旋回
- //else if ( pos_y <= 102 && pos_x > 152 && pos_x <= 245) {
- else if ( pos_y <= 102 && pos_x > 152) {
- motor_speed = map(pos_y, 102, 0, 0, 255);
- steering = motor_speed * (1.00 - (map(pos_x, 152, 255, 0, 255) / 255.00));
- motor_run(motor_speed, 0, steering, 0, 0);
- }
- //前進左緩旋回、信地旋回
- //else if ( pos_y <= 102 && pos_x < 102 && pos_x >= 10) {
- else if ( pos_y <= 102 && pos_x < 102) {
- motor_speed = map(pos_y, 102, 0, 0, 255);
- steering = motor_speed * (1.00 - (map(pos_x, 102, 0, 0, 255) / 255.00));
- motor_run(steering, 0, motor_speed, 0, 0);
- }
- //後進右緩旋回、信地旋回
- //else if ( pos_y >= 152 && pos_x > 152 && pos_x <= 245) {
- else if ( pos_y >= 152 && pos_x > 152 ) {
- motor_speed = map(pos_y, 152, 255, 0, 255);
- steering = motor_speed * (1.00 - (map(pos_x, 152, 255, 0, 255) / 255.00));
- motor_run(motor_speed, 1, steering, 1, 0);
- }
- //後進左緩旋回、信地旋回
- //else if ( pos_y >= 152 && pos_x < 102 && pos_x >= 10) {
- else if ( pos_y >= 152 && pos_x < 102 ) {
- motor_speed = map(pos_y, 152, 255, 0, 255);
- steering = motor_speed * (1.00 - (map(pos_x, 102, 0, 0, 255) / 255.00));
- motor_run(steering, 1, motor_speed, 1, 0);
- }
- //右超信地旋回
- else if (pos_x > 245 && pos_y >= 102 && pos_y <= 152) {
- motor_speed = 128;
- motor_run(motor_speed, 0, motor_speed, 1, 0);
- }
- //左超信地旋回
- else if (pos_x < 10 && pos_y >= 102 && pos_y <= 152) {
- motor_speed = 128;
- motor_run(motor_speed, 1, motor_speed, 0, 0);
- }
- else { //停止(ブレーキ)
- motor_run(0, 0, 0, 0, 1);
- }
- //姿勢制御
- if ( PS4.getButtonClick(UP)) { //お辞儀
- siseiseigyo(servoF_pos - difF, servoF_pos + difF, servoB_pos + difB, servoB_pos - difB);
- }
- if ( PS4.getButtonClick(DOWN)) { //逆お辞儀
- siseiseigyo(servoF_pos + difF, servoF_pos - difF, servoB_pos - difB, servoB_pos + difB);
- }
- if ( PS4.getButtonClick(RIGHT)) { //右お辞儀
- siseiseigyo(servoF_pos - difF, servoF_pos - difF, servoB_pos - difB, servoB_pos - difB);
- }
- if ( PS4.getButtonClick(LEFT)) { //左お辞儀
- siseiseigyo(servoF_pos + difF, servoF_pos + difF, servoB_pos + difB, servoB_pos + difB);
- }
- if (PS4.getButtonClick(CROSS)) { //車高下げる
- siseiseigyo(servoF_pos - difF, servoF_pos + difF, servoB_pos - difB, servoB_pos + difB);
- }
- if (PS4.getButtonClick(TRIANGLE)) { //車高上げる
- siseiseigyo(servoF_pos + difF, servoF_pos - difF, servoB_pos + difB, servoB_pos - difB);
- }
- if (PS4.getButtonClick(SQUARE)) { //車高標準水平
- siseiseigyo(servoF_pos, servoF_pos, servoB_pos, servoB_pos);
- }
- }
- }
- void motor_run(int D0, int D1, int D2, int D3, int D4) {
- /* D0 : モータスピード(左)
- D1 : モータA(左)1 = HIGH / 0 = LOW
- D2 : モータスピード(右)
- D3 : モータB(右)1 = HIGH / 0 = LOW
- D4 : LED_3 ON/OFF 1 = HIGH / 0 = LOW
- */
- analogWrite(PWMA, D0);
- digitalWrite(AIN1, D1);
- analogWrite(PWMB, D2);
- digitalWrite(BIN1, D3);
- //digitalWrite(LED_3, D4);
- if (D4 == 1) {
- max.write(3, HIGH); //ブレーキ点灯
- } else {
- max.write(3, LOW); //ブレーキ消灯
- }
- }
- void siseiseigyo(int E4, int E5, int E6, int E7) {
- myservo_4.attach(A0); //servo4 右前サス
- myservo_5.attach(A1); //servo5 左前サス
- myservo_6.attach(A2); //servo6 右後サス
- myservo_7.attach(A3); //servo4 左後サス
- myservo_4.write(E4, servo4_sp);
- myservo_5.write(E5, servo4_sp);
- myservo_6.write(E6, servo4_sp);
- myservo_7.write(E7, servo4_sp);
- myservo_4.wait();
- myservo_5.wait();
- myservo_6.wait();
- myservo_7.wait();
- delay(100);
- myservo_4.detach();
- myservo_5.detach();
- myservo_6.detach();
- myservo_7.detach();
- }
【動画】
RC可動化 1/35 74式戦車
RC可動化 1/35 74式戦車
>T34/85の回路図やArduinoスケッチも投稿してもらいたいです!
ご要望にお答えして、スケッチと回路図をアップします。
うる覚えの所も多いので、誤りのところが有るかもしれませんが、問い合わせにはお答えできないのでよろしくお願いします。
https://blog.goo.ne.jp/ganpon26/e/9b5800c7958e817d0b73373f5d4dc9f3