Ganponブログ

趣味の模型作り、ドライブ、旅行など
since Mar.2017

RC可動化 1/35 74式戦車 (回路とArduinoスケッチ)

2021-06-21 15:01:38 | 1/35 タミヤ 74式戦車

2021-06-21
▼リクエストがあった事や個人の備忘録として、回路図とArduinoスケッチを掲載します。
MP3プレイヤー用の効果音素材は、フリーの「効果音ラボ」などからダウンロードしました。
掲載内容に関しては個人での使用に限ってフリーとします。

【注意】
  内容に関する問い合わせに関しては、原則対応いたしません。
  Li-Poiバッテリなど火災などの危険性があります。
  掲載内容に関しては、自己責任で利用してください。

【回路図】
画像をクリックすると拡大します

【スケッチ】

  1. /* PS4BT_arduino_pro mini_tank_DRV8835_MP3_74type_ver05j
  2.   Arduino IDE 1.8.12
  3.   Arduino pro min + ミニUSBホストシールド2.0 + PS4コントローラ
  4.   効果音はDFPlayer Mini
  5.   モータドライバはDRV8835
  6.  
  7.   砲撃時のリコイルアクション 車体+砲身
  8.   主砲、機銃、ヘッドライト、ブレーキランプはミニUSBシールドのGPOUTピン0,1,2,3
  9.   4個のサーボで姿勢制御動作再現
  10.  
  11.    【操作手順】
  12.     SHARE+PSボタンでペアリング開始。白色インジケータランプ高速点滅。
  13.    戦車の電源投入。
  14.    インジケータランプ青色点灯でペアリング完了。
  15.  
  16.    【走行コントロール】
  17.     コントローラーの左スティック上下で前後進、
  18.     右スティックの左右でステアリングを制御。
  19.     ステアリングを振っていくと回転軸側が減速していき(緩旋回から信地旋回)、
  20.     一杯に倒すと回転軸側は停止。(信地旋回)
  21.     左スティック中央で右ステアリングを一杯に振ると超信地旋回(速度50%)
  22.     停止時にブレーキランプ点灯 ミニUSB GPOUT- 3ピン
  23.  
  24.    【砲身上下】 右スティック上下で砲身上下。R3ボタンでセンター。
  25.    【砲塔旋回】 左スティック左右で砲塔旋回。離した位置で止まる。
  26.    【主砲】 R1ボタンで主砲発射 ミニUSB GPOUT- 0ピン
  27.    【機銃】 L1ボタンで機銃射撃 ミニUSB GPOUT- 1ピン
  28.    【ヘッドライト】L3ボタンを押す毎にヘッドライト点灯、消灯。
  29.                   ミニUSB GPOUT- 2ピン
  30.    【赤外線暗視装置】PSボタンを押す毎に赤外線暗視装置が点灯、消灯。
  31.                     ミニUSB GPOUT- 4ピン
  32.  
  33.    【姿勢制御】
  34.     左のUPボタンでお辞儀、DOWNボタンで逆お辞儀
  35.     左のRIGHTボタンで右お辞儀、LEFTボタンで左お辞儀
  36.     右スティック上で車高低い、スティック下で車高高い  
  37.     右側の△ボタンで車高UP、×ボタンで車高down、□ボタンで車高水平標準(初期値)
  38. */
  39.  
  40. #include <PS4BT.h>
  41. #include <usbhub.h>
  42. #ifdef dobogusinclude
  43. #include <spi4teensy3.h>
  44. #endif
  45. #include <SPI.h>
  46.  
  47. USB Usb;
  48. //USBHub Hub1(&Usb); // Some dongles have a hub inside
  49. BTD Btd(&Usb); // You have to create the Bluetooth Dongle instance like so
  50.  
  51. /* You can create the instance of the PS4BT class in two ways */
  52. // This will start an inquiry and then pair with the PS4 controller - you only have to do this once
  53. // You will need to hold down the PS and Share button at the same time,
  54. // the PS4 controller will then start to blink rapidly indicating that it is in pairing mode
  55. PS4BT PS4(&Btd, PAIR);
  56.  
  57. // After that you can simply create the instance like so and then press the PS button on the device
  58. //PS4BT PS4(&Btd);
  59.  
  60. bool printAngle, printTouch;
  61. uint8_t oldL2Value, oldR2Value;
  62.  
  63. //#include <Usb.h> // needed by Arduino IDE
  64. #include <USB_Host_Shield_GPIO.h> // GPOUTピンで主砲LEDを発光させるため
  65. MaxGPIO max;
  66.  
  67. int cnt = 0 ;
  68. byte ser_deta;
  69.  
  70. #include <VarSpeedServo.h>
  71. VarSpeedServo myservo_1;
  72. VarSpeedServo myservo_2;
  73. VarSpeedServo myservo_3;
  74. VarSpeedServo myservo_4;
  75. VarSpeedServo myservo_5;
  76. VarSpeedServo myservo_6;
  77. VarSpeedServo myservo_7;
  78. int servo1_pos = 75; //servo1 砲身上下
  79. int servo3_pos = 50; //servo3 砲身リコイル
  80. int servoF_pos = 75; //姿勢制御前
  81. int servoB_pos = 70; //姿勢制御後
  82. int servo_pos = 10;
  83. int difF = 65; //姿勢制御前増減値
  84. int difB = 50; //姿勢制御後増減値
  85. const int servo1_sp = 7; //砲身上下スピード
  86. const int servo2_sp = 5; //砲塔回転スピード
  87. const int servo4_sp = 25; //姿勢制御スピード
  88.  
  89. int ch = 0;
  90. int pos_y;
  91. int pos_x;
  92. int pos_ry;
  93. int pos_rx;
  94. int motor_speed;
  95. int steering;
  96. int PWMA = 5; // A入力2/AENABLE 左モータ AIN2
  97. int PWMB = 6; // B入力2/BENABLE 右モータ BIN2
  98. int AIN1 = 4; // A入力1/APHASE 左モータ AIN1
  99. int BIN1 = 7; // B入力1/BPHASE 右モータ BIN1
  100. int silent = 1;
  101. int state = 0; //変数stateを設定
  102. int state1 = 0;
  103.  
  104. #include <SoftwareSerial.h>
  105. #include <DFRobotDFPlayerMini.h>
  106. SoftwareSerial mySerial(A4, A5); // DFPlayer TX,RX
  107. DFRobotDFPlayerMini myDFPlayer;
  108.  
  109. void setup() {
  110.   Serial.begin (115200);
  111. #if !defined(__MIPSEL__)
  112.   while (!Serial); // Wait for serial port to connect - used on Leonardo,
  113.   //Teensy and other boards with built-in USB CDC serial connection
  114. #endif
  115.   if (Usb.Init() == -1) {
  116.     Serial.print(F("\r\nOSC did not start"));
  117.     while (1); // Halt
  118.   }
  119.   Serial.print(F("\r\nPS4 Bluetooth Library Started"));
  120.  
  121.   pinMode(PWMA, OUTPUT);
  122.   pinMode(PWMB, OUTPUT);
  123.   pinMode(AIN1, OUTPUT);
  124.   pinMode(BIN1, OUTPUT);
  125.   myservo_1.attach(2); //servo1 砲身上下
  126.   myservo_1.write(servo1_pos, servo1_sp, true);
  127.   myservo_1.detach();
  128.   myservo_2.attach(3); //servo2 砲塔旋回
  129.   myservo_2.write(90);
  130.   //myservo_2.detach(); //centerセット時はコメントアウト
  131.   myservo_3.attach(8); //servo3 砲身リコイル
  132.   myservo_3.write(servo3_pos);
  133.   myservo_3.detach();
  134.   myservo_4.attach(A0); //servo4 右前サス
  135.   myservo_5.attach(A1); //servo5 左前サス
  136.   myservo_6.attach(A2); //servo6 右後サス
  137.   myservo_7.attach(A3); //servo4 左後サス
  138.   myservo_4.write(servoF_pos, servo4_sp);
  139.   myservo_5.write(servoF_pos, servo4_sp);
  140.   myservo_6.write(servoB_pos, servo4_sp);
  141.   myservo_7.write(servoB_pos, servo4_sp);
  142.   myservo_4.wait();
  143.   myservo_5.wait();
  144.   myservo_6.wait();
  145.   myservo_7.wait();
  146.   delay(1000);
  147.   myservo_4.detach();
  148.   myservo_5.detach();
  149.   myservo_6.detach();
  150.   myservo_7.detach();
  151.  
  152.   mySerial.begin (9600);
  153.   myDFPlayer.begin(mySerial);
  154.   if (!myDFPlayer.begin(mySerial)) { //Use softwareSerial to communicate with mp3.
  155.     while (true);
  156.   }
  157.   myDFPlayer.volume(25); //Set volume value (0~30).
  158.   myDFPlayer.play(3); //エンジン始動
  159.   delay(2000);
  160.   //myDFPlayer.loop(5); //Loop 5th mp3 アイドリング
  161.   //delay(200);
  162. }
  163.  
  164. void loop() {
  165.   Usb.Task();
  166.   if (PS4.connected()) {
  167.     // myDFPlayer.play(5);
  168.     // delay(100);
  169.     if (PS4.getButtonClick(CIRCLE)) { //エンジン音停止
  170.       myDFPlayer.play(3); //エンジン始動
  171.       delay(100);
  172.     }
  173.  
  174.     //砲身上下
  175.     if ( PS4.getButtonClick(R3)) { //CENTER
  176.       myservo_1.attach(2);
  177.       myservo_1.write(servo1_pos, servo1_sp, true);
  178.       // myservo_1.detach();
  179.     }
  180.     pos_ry = PS4.getAnalogHat(RightHatY);
  181.     if (pos_ry < 10) { // UP
  182.       myservo_1.attach(2);
  183.       myservo_1.write(servo1_pos + 40, servo1_sp, true);
  184.       // myservo_1.detach();
  185.     } else if (pos_ry > 245) { //DOWN
  186.       myservo_1.attach(2);
  187.       myservo_1.write(servo1_pos - 22, servo1_sp, true);
  188.       // myservo_1.detach();
  189.     } else { //停止
  190.       myservo_1.detach();
  191.     }
  192.  
  193.     //砲塔旋回
  194.     pos_rx = PS4.getAnalogHat(LeftHatX);
  195.     if ( pos_rx > 230) { //右旋回
  196.       myservo_2.attach(3);
  197.       myservo_2.write(97);
  198.     } else if (pos_rx < 25) { //左旋回
  199.       myservo_2.attach(3);
  200.       myservo_2.write(83);
  201.     } else { //停止
  202.       //myservo_2.attach(3); //回転初めに一瞬反対側に回転するのでコメントアウトする
  203.       myservo_2.write(90);
  204.       myservo_2.detach();
  205.     }
  206.  
  207.     //砲撃 + リコイル
  208.     if (PS4.getButtonClick(R1) && ch == 0 ) {
  209.       myDFPlayer.play(2);
  210.       delay(100);
  211.       max.write(0, HIGH); //主砲発光
  212.       myservo_3.attach(8);
  213.       myservo_3.write(servo3_pos + 70, 255); //砲身リコイル
  214.       //myservo_3.wait();
  215.       delay(100);
  216.       motor_run(180, 1, 180, 1, 1);
  217.       ch = 2000; //約2秒間は砲撃不可
  218.       delay(100);
  219.       motor_run(0, 0, 0, 0, 1);
  220.       max.write(0, LOW); //主砲消灯
  221.       delay(100);
  222.       myservo_3.write(servo3_pos, 20);
  223.       motor_run(100, 0, 100, 0, 1);
  224.       delay(200);
  225.       motor_run(0, 0, 0, 0, 1);
  226.       myservo_3.wait();
  227.       delay(640);
  228.       myservo_3.detach();
  229.     } else {
  230.       if (ch > 0) {
  231.         ch--;
  232.       }
  233.     }
  234.  
  235.     //銃撃
  236.     if ( PS4.getButtonClick(L1)) {
  237.       myDFPlayer.play(10);
  238.       delay(100);
  239.       for ( int i = 0; i < 5 ; i++) {
  240.         max.write(1, HIGH); //機銃発光
  241.         delay(80);
  242.         max.write(1, LOW); //機銃消灯
  243.         delay(120);
  244.       }
  245.     }
  246.  
  247.     //ヘッドライト
  248.     if (PS4.getButtonClick(L3)) {
  249.       state = 1 - state;
  250.     } // L3ボタンを押す毎にstateが変化する
  251.     if (state == 1) {
  252.       max.write(2, HIGH); //点灯
  253.     } else {
  254.       max.write(2, LOW); //消灯
  255.     }
  256.  
  257.     //赤外線暗視装置
  258.     if (PS4.getButtonClick(PS)) {
  259.       state1 = 1 - state1;
  260.     } // PSボタンを押す毎にstateが変化する
  261.     if (state1 == 1) {
  262.       max.write(4, HIGH); //点灯
  263.     } else {
  264.       max.write(4, LOW); //消灯
  265.     }
  266.  
  267.     //走行コントロール
  268.     pos_y = PS4.getAnalogHat(LeftHatY);
  269.     pos_x = PS4.getAnalogHat(RightHatX);
  270.  
  271.     //左スティックがセンター付近は停止(ブレーキ)
  272.     if (pos_x >= 102 && pos_x <= 152 && pos_y >= 102 && pos_y <= 152) {
  273.       motor_run(0, 0, 0, 0, 1);
  274.     }
  275.  
  276.     //前進
  277.     if (pos_y <= 102 && pos_x >= 102 && pos_x <= 152) {
  278.       motor_speed = map(pos_y, 102, 0, 0, 255);
  279.       motor_run(motor_speed, 0, motor_speed, 0, 0);
  280.     }
  281.  
  282.     //後進
  283.     else if ( pos_y >= 152 && pos_x >= 102 && pos_x <= 152) {
  284.       motor_speed = map(pos_y, 152, 255, 0, 255) ;
  285.       motor_run(motor_speed, 1, motor_speed, 1, 0);
  286.     }
  287.  
  288.     //前進右緩旋回、信地旋回
  289.     //else if ( pos_y <= 102 && pos_x > 152 && pos_x <= 245) {
  290.     else if ( pos_y <= 102 && pos_x > 152) {
  291.       motor_speed = map(pos_y, 102, 0, 0, 255);
  292.       steering = motor_speed * (1.00 - (map(pos_x, 152, 255, 0, 255) / 255.00));
  293.       motor_run(motor_speed, 0, steering, 0, 0);
  294.     }
  295.  
  296.     //前進左緩旋回、信地旋回
  297.     //else if ( pos_y <= 102 && pos_x < 102 && pos_x >= 10) {
  298.     else if ( pos_y <= 102 && pos_x < 102) {
  299.       motor_speed = map(pos_y, 102, 0, 0, 255);
  300.       steering = motor_speed * (1.00 - (map(pos_x, 102, 0, 0, 255) / 255.00));
  301.       motor_run(steering, 0, motor_speed, 0, 0);
  302.     }
  303.  
  304.     //後進右緩旋回、信地旋回
  305.     //else if ( pos_y >= 152 && pos_x > 152 && pos_x <= 245) {
  306.     else if ( pos_y >= 152 && pos_x > 152 ) {
  307.       motor_speed = map(pos_y, 152, 255, 0, 255);
  308.       steering = motor_speed * (1.00 - (map(pos_x, 152, 255, 0, 255) / 255.00));
  309.       motor_run(motor_speed, 1, steering, 1, 0);
  310.     }
  311.  
  312.     //後進左緩旋回、信地旋回
  313.     //else if ( pos_y >= 152 && pos_x < 102 && pos_x >= 10) {
  314.     else if ( pos_y >= 152 && pos_x < 102 ) {
  315.       motor_speed = map(pos_y, 152, 255, 0, 255);
  316.       steering = motor_speed * (1.00 - (map(pos_x, 102, 0, 0, 255) / 255.00));
  317.       motor_run(steering, 1, motor_speed, 1, 0);
  318.     }
  319.  
  320.     //右超信地旋回
  321.     else if (pos_x > 245 && pos_y >= 102 && pos_y <= 152) {
  322.       motor_speed = 128;
  323.       motor_run(motor_speed, 0, motor_speed, 1, 0);
  324.     }
  325.  
  326.     //左超信地旋回
  327.     else if (pos_x < 10 && pos_y >= 102 && pos_y <= 152) {
  328.       motor_speed = 128;
  329.       motor_run(motor_speed, 1, motor_speed, 0, 0);
  330.     }
  331.  
  332.     else { //停止(ブレーキ)
  333.       motor_run(0, 0, 0, 0, 1);
  334.     }
  335.  
  336.     //姿勢制御
  337.     if ( PS4.getButtonClick(UP)) { //お辞儀
  338.       siseiseigyo(servoF_pos - difF, servoF_pos + difF, servoB_pos + difB, servoB_pos - difB);
  339.     }
  340.     if ( PS4.getButtonClick(DOWN)) { //逆お辞儀
  341.       siseiseigyo(servoF_pos + difF, servoF_pos - difF, servoB_pos - difB, servoB_pos + difB);
  342.     }
  343.     if ( PS4.getButtonClick(RIGHT)) { //右お辞儀
  344.       siseiseigyo(servoF_pos - difF, servoF_pos - difF, servoB_pos - difB, servoB_pos - difB);
  345.     }
  346.     if ( PS4.getButtonClick(LEFT)) { //左お辞儀
  347.       siseiseigyo(servoF_pos + difF, servoF_pos + difF, servoB_pos + difB, servoB_pos + difB);
  348.     }
  349.  
  350.     if (PS4.getButtonClick(CROSS)) { //車高下げる
  351.       siseiseigyo(servoF_pos - difF, servoF_pos + difF, servoB_pos - difB, servoB_pos + difB);
  352.     }
  353.     if (PS4.getButtonClick(TRIANGLE)) { //車高上げる
  354.       siseiseigyo(servoF_pos + difF, servoF_pos - difF, servoB_pos + difB, servoB_pos - difB);
  355.     }
  356.     if (PS4.getButtonClick(SQUARE)) { //車高標準水平
  357.       siseiseigyo(servoF_pos, servoF_pos, servoB_pos, servoB_pos);
  358.     }
  359.   }
  360. }
  361.  
  362. void motor_run(int D0, int D1, int D2, int D3, int D4) {
  363.   /* D0 : モータスピード(左)
  364.     D1 : モータA(左)1 = HIGH / 0 = LOW
  365.     D2 : モータスピード(右)
  366.     D3 : モータB(右)1 = HIGH / 0 = LOW
  367.     D4 : LED_3 ON/OFF 1 = HIGH / 0 = LOW
  368.   */
  369.   analogWrite(PWMA, D0);
  370.   digitalWrite(AIN1, D1);
  371.   analogWrite(PWMB, D2);
  372.   digitalWrite(BIN1, D3);
  373.   //digitalWrite(LED_3, D4);
  374.   if (D4 == 1) {
  375.     max.write(3, HIGH); //ブレーキ点灯
  376.   } else {
  377.     max.write(3, LOW); //ブレーキ消灯
  378.   }
  379. }
  380.  
  381. void siseiseigyo(int E4, int E5, int E6, int E7) {
  382.   myservo_4.attach(A0); //servo4 右前サス
  383.   myservo_5.attach(A1); //servo5 左前サス
  384.   myservo_6.attach(A2); //servo6 右後サス
  385.   myservo_7.attach(A3); //servo4 左後サス
  386.  
  387.   myservo_4.write(E4, servo4_sp);
  388.   myservo_5.write(E5, servo4_sp);
  389.   myservo_6.write(E6, servo4_sp);
  390.   myservo_7.write(E7, servo4_sp);
  391.   myservo_4.wait();
  392.   myservo_5.wait();
  393.   myservo_6.wait();
  394.   myservo_7.wait();
  395.   delay(100);
  396.  
  397.   myservo_4.detach();
  398.   myservo_5.detach();
  399.   myservo_6.detach();
  400.   myservo_7.detach();
  401.  
  402. }
 
【動画】
RC可動化 1/35 74式戦車

 



4 コメント

コメント日が  古い順  |   新しい順
Unknown (ft17)
2024-09-01 17:07:06
T34/85の回路図やArduinoスケッチも投稿してもらいたいです!
返信する
Unknown (Ganpon)
2024-09-15 00:12:10
ft17さん、こんばんは。
>T34/85の回路図やArduinoスケッチも投稿してもらいたいです!

ご要望にお答えして、スケッチと回路図をアップします。
うる覚えの所も多いので、誤りのところが有るかもしれませんが、問い合わせにはお答えできないのでよろしくお願いします。

https://blog.goo.ne.jp/ganpon26/e/9b5800c7958e817d0b73373f5d4dc9f3
返信する
Unknown (Unknown)
2024-10-26 17:28:35
本当にありがとうございます✨
返信する
Unknown (ft17)
2024-10-26 17:32:27
ありがとうございます✨
返信する

コメントを投稿