Ganponブログ

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

タミヤ 1/35 マークⅣメール製作(回路とスケッチ)

2025-02-04 17:00:01 | 1/35 マークⅣメール

2025-02-04
主砲の旋回範囲を微調整し、アクリファイバーの不要分を切除して完成です。
完成画像、動画は後日にアップします。
今日はESP32用スケッチ(プログラム)と回路図を掲載します。

サーボモータの動作範囲はセンター90°、左右45°(45°~135°)としていましたが、
車体に組み込んで10°程度設定を調整しました。

【スケッチ】

  1. /*PS3_ESP32_tank_MP3_JQ8400_MK4_v1b
  2.    2025-02-08
  3.   最大1310720バイトのフラッシュメモリのうち、スケッチが1087009バイト(82%)を使っています。
  4.   最大327680バイトのRAMのうち、グローバル変数が39620バイト(12%)を使っていて、
  5.   ローカル変数で288060バイト使うことができます。
  6.  
  7.   ボード:ESP32 Dev Module
  8.   効果音はJQ8400i
  9.   モータドライバはDRV8835
  10.  
  11.   【操作手順】
  12.    電源スイッチON。
  13.    PSボタンでペアリング開始。
  14.    赤色インジケータランプ高速点滅。点灯でペアリング完了。
  15.  
  16.   【走行コントロール】
  17.    コントローラーの左スティック上下で前後進、
  18.    右スティックの左右でステアリングを制御。
  19.    ステアリングを振っていくと回転軸側が減速していき(緩旋回から信地旋回)、
  20.    一杯に倒すと回転軸側は停止。(信地旋回)
  21.    左スティック中央で右ステアリングを一杯に振ると超信地旋回(速度50%)
  22.  
  23.   【砲塔旋回】左十字キーRボタンで左側砲塔右旋回、Lボタンで左旋回。
  24.    右十字キー 〇ボタンで右側砲塔右旋回、□ボタンで左旋回。
  25.         ボタンを押している間旋回、放した位置で停止。
  26.    純正PS3コントローラでないと、旋回が上手く出来ない。
  27.  
  28.   【主 砲】R1ボタンで右主砲発砲、L1ボタンで左主砲発砲。
  29.   【機関銃】?ボタンで右機関銃発砲、DOWNボタンで左機関銃発砲、
  30.        △ボタンで前機関銃発砲。 
  31. */
  32.  
  33. #include <Arduino.h> // Arduino ヘッダインクルード
  34. //#include "SoftwareSerial.h" // EspSoftwareSerial
  35. //SoftwareSerial mySerial(16, 17); // RX, TX EspSoftwareSerial
  36. HardwareSerial Serial_df(2); // use HardwareSerial UART2 (16pin=RX, 17pin=TX)
  37. #include <JQ8400_Serial.h>
  38. JQ8400_Serial mp3(Serial_df);
  39.  
  40. #include <Ps3Controller.h>
  41. #include <ESP32Servo.h>
  42. Servo servo1;
  43. int servo1Pin = 27;
  44. Servo servo2;
  45. int servo2Pin = 14;
  46.  
  47. int LED_1 = 23; //左主砲
  48. int LED_2 = 22; //右主砲
  49. int LED_3 = 18; //左機関銃
  50. int LED_4 = 19; //右機関銃
  51. int LED_5 = 5; //前機関銃
  52.  
  53. int k = 0;
  54. int s = 0;
  55. int d_time = 50;
  56. int d_time1 = 10;
  57.  
  58. int angle_servo1 = 80; // 左砲塔旋回
  59. int anglenow1 = angle_servo1 ;
  60. int angle_servo2 = 90; // 右砲塔旋回
  61. int anglenow2 = angle_servo2 ;
  62.  
  63. int motor_speed;
  64. float steering;
  65. int pos_ly;
  66. int pos_lx;
  67. int pos_ry;
  68. int pos_rx;
  69.  
  70. int AIN1 = 32; // A入力1/APHASE 左モータ AIN1
  71. int BIN1 = 25; // B入力1/BPHASE 右モータ BIN1
  72. int PWMApin = 33; // A入力2/AENABLE 左モータ AIN2
  73. int PWMBpin = 26; // B入力2/BENABLE 右モータ BIN2
  74. int PWMA = 2; //PWMAチャンネル 0=NG 1=NG 0〜15
  75. int PWMB = 3; //PWMBチャンネル 0=NG 1=NG 0〜15 
  76.  
  77. void setup() {
  78.   servo1.setPeriodHertz(50); // Standard 50hz servo PWMサイクル:20mS FH-1083
  79.   servo1.attach(servo1Pin, 500, 2400); // (servo1Pin, minUs, maxUs)
  80.   servo2.setPeriodHertz(50); // Standard 50hz servo PWMサイクル:20mS
  81.   servo2.attach(servo2Pin, 500, 2400); // (servo1Pin, minUs, maxUs)
  82.  
  83.   //mySoftwareSerial.begin(9600);
  84.   Serial_df.begin(9600); // RX2 = 16, TX2 = 17
  85.   //Serial.begin(116500);
  86.  
  87.   Ps3.begin("00:11:22:33:44:55"); //SixaxisPairToolで調べたmac adresに修正
  88.   Serial.println("PS3 Ready");
  89.  
  90.   // Now we cam reset.
  91.   mp3.reset();
  92.   mp3.setVolume(25);
  93.   mp3.setLoopMode(MP3_LOOP_NONE);
  94.  
  95.   ledcSetup(PWMA, 5000, 8); //チャンネル,周波数,解像度(8bit=256段階)
  96.   ledcAttachPin(PWMApin, PWMA); //ledPinをPWMCHチャンネルに接続
  97.   ledcSetup(PWMB, 5000, 8); //チャンネル,周波数,解像度(8bit=256段階)
  98.   ledcAttachPin(PWMBpin, PWMB); //ledPinをPWMCHチャンネルに接続
  99.   pinMode(AIN1, OUTPUT);
  100.   pinMode(BIN1, OUTPUT);
  101.  
  102.   pinMode(LED_1, OUTPUT); //左主砲
  103.   pinMode(LED_2, OUTPUT); //右主砲
  104.   pinMode(LED_3, OUTPUT); //左機関銃
  105.   pinMode(LED_4, OUTPUT); //右機関銃
  106.   pinMode(LED_5, OUTPUT); //前機関銃
  107.  
  108.   servo1.write(angle_servo1); // 85
  109.   delay(100);
  110.   servo2.write(angle_servo2); // 90
  111.   delay(100);
  112.  
  113.   mp3.playFileByIndexNumber(3); //エンジン始動
  114.   delay(1000);
  115.  
  116.   LEDtenmetsu(LED_5); //Ready go
  117. }
  118.  
  119. void loop() {
  120.   if (Ps3.isConnected()) {
  121.     pos_lx = Ps3.data.analog.stick.lx;
  122.     pos_lx = pos_lx + 128;
  123.     pos_ly = Ps3.data.analog.stick.ly;
  124.     pos_ly = pos_ly + 128;
  125.     pos_rx = Ps3.data.analog.stick.rx;
  126.     pos_rx = pos_rx + 128;
  127.  
  128.     //主砲旋回
  129.     // 左側砲塔 右旋回
  130.     if ( abs(Ps3.event.analog_changed.button.right) && ( anglenow1 > 30 )) {
  131.       anglenow1 -= 1;
  132.       servo1.write(anglenow1);
  133.       delay(d_time1);
  134.     }
  135.  
  136.     //左側砲塔 左旋回
  137.     if ( abs(Ps3.event.analog_changed.button.left) && ( anglenow1 < 125 )) {
  138.       anglenow1 += 1 ;
  139.       servo1.write(anglenow1);
  140.       delay(d_time1);
  141.     }
  142.  
  143.     // 右側砲塔 右旋回
  144.     if ( abs(Ps3.event.analog_changed.button.circle) && ( anglenow2 > 45 )) {
  145.       anglenow2 -= 1;
  146.       servo2.write(anglenow2);
  147.       delay(d_time1);
  148.     }
  149.  
  150.     // 右側砲塔 左旋回
  151.     if ( abs(Ps3.event.analog_changed.button.square) && ( anglenow2 < 145 )) {
  152.       anglenow2 += 1 ;
  153.       servo2.write(anglenow2);
  154.       delay(d_time1);
  155.     }
  156.  
  157.     if (Ps3.event.button_down.r1) { //右主砲 発砲
  158.       digitalWrite(LED_2, HIGH); //右主砲発光
  159.       mp3.playFileByIndexNumber(1);
  160.       delay(300);
  161.       digitalWrite(LED_2, LOW);
  162.       delay(20);
  163.     }
  164.  
  165.     if (Ps3.event.button_down.l1) { //左主砲 発砲
  166.       digitalWrite(LED_1, HIGH); //左主砲発光
  167.       mp3.playFileByIndexNumber(1);
  168.       delay(300);
  169.       digitalWrite(LED_1, LOW);
  170.       delay(20);
  171.     }
  172.  
  173.     if (Ps3.event.button_down.cross) { //右機関銃
  174.       mp3.playFileByIndexNumber(10);
  175.       delay(100);
  176.       for ( k = 0; k < 5; k++) {
  177.         digitalWrite(LED_4, HIGH); //発光
  178.         delay(80);
  179.         digitalWrite(LED_4, LOW);
  180.         delay(120);
  181.       }
  182.     }
  183.  
  184.     if (Ps3.event.button_down.down) { //左機関銃
  185.       mp3.playFileByIndexNumber(10);
  186.       delay(100);
  187.       for ( k = 0; k < 5; k++) {
  188.         digitalWrite(LED_3, HIGH); //発光
  189.         delay(80);
  190.         digitalWrite(LED_3, LOW);
  191.         delay(120);
  192.       }
  193.     }
  194.  
  195.     if (Ps3.event.button_down.triangle) { //前機関銃
  196.       mp3.playFileByIndexNumber(10);
  197.       delay(100);
  198.       for ( k = 0; k < 5; k++) {
  199.         digitalWrite(LED_5, HIGH); //発光
  200.         delay(80);
  201.         digitalWrite(LED_5, LOW);
  202.         delay(120);
  203.       }
  204.     }
  205.  
  206.     //走行コントロール
  207.  
  208.     //前進
  209.     if (pos_ly <= 89 && pos_rx >= 89 && pos_rx <= 165) {
  210.       motor_speed = map(pos_ly, 89, 0, 0, 255);
  211.       motor_run(motor_speed, 0, motor_speed, 0);
  212.     }
  213.  
  214.     //後進
  215.     else if ( pos_ly >= 165 && pos_rx >= 89 && pos_rx <= 165) {
  216.       motor_speed = map(pos_ly, 165, 255, 0, 255) ;
  217.       motor_run(motor_speed, 1, motor_speed, 1);
  218.     }
  219.  
  220.     //前進右緩旋回、信地旋回
  221.     //else if ( pos_ly <= 89 && pos_rx > 165 && pos_rx <= 245) {
  222.     else if ( pos_ly <= 89 && pos_rx >= 165) {
  223.       motor_speed = map(pos_ly, 89, 0, 0, 255);
  224.       steering = motor_speed * (1.00 - (map(pos_rx, 165, 255, 0, 255) / 255.00));
  225.       motor_run(motor_speed, 0, steering, 0);
  226.     }
  227.  
  228.     //前進左緩旋回、信地旋回
  229.     //else if ( pos_ly <= 89 && pos_rx < 89 && pos_rx >= 10) {
  230.     else if ( pos_ly <= 89 && pos_rx <= 89) {
  231.       motor_speed = map(pos_ly, 89, 0, 0, 255);
  232.       steering = motor_speed * (1.00 - (map(pos_rx, 89, 0, 0, 255) / 255.00));
  233.       motor_run(steering, 0, motor_speed, 0);
  234.     }
  235.  
  236.     //後進右緩旋回、信地旋回
  237.     //else if ( pos_ly >= 165 && pos_rx > 165 && pos_rx <= 245) {
  238.     else if ( pos_ly >= 165 && pos_rx >= 165 ) {
  239.       motor_speed = map(pos_ly, 165, 255, 0, 255);
  240.       steering = motor_speed * (1.00 - (map(pos_rx, 165, 255, 0, 255) / 255.00));
  241.       motor_run(motor_speed, 1, steering, 1);
  242.     }
  243.  
  244.     //後進左緩旋回、信地旋回
  245.     //else if ( pos_ly >= 165 && pos_rx < 89 && pos_rx >= 10) {
  246.     else if ( pos_ly >= 165 && pos_rx <= 89 ) {
  247.       motor_speed = map(pos_ly, 165, 255, 0, 255);
  248.       steering = motor_speed * (1.00 - (map(pos_rx, 89, 0, 0, 255) / 255.00));
  249.       motor_run(steering, 1, motor_speed, 1);
  250.     }
  251.  
  252.     //右超信地旋回
  253.     else if (pos_rx >= 245 && pos_ly >= 89 && pos_ly <= 165) {
  254.       motor_speed = 125;
  255.       motor_run(motor_speed, 0, motor_speed, 1);
  256.     }
  257.  
  258.     //左超信地旋回
  259.     else if (pos_rx <= 10 && pos_ly >= 89 && pos_ly <= 165) {
  260.       motor_speed = 125;
  261.       motor_run(motor_speed, 1, motor_speed, 0);
  262.     }
  263.  
  264.     else { //停止(ブレーキ)
  265.       motor_run(0, 0, 0, 0);
  266.     }
  267.   }
  268. }
  269.  
  270.  
  271. void motor_run(int D0, int D1, int D2, int D3) {
  272.   //D0 : モータスピード(左)
  273.   //D1 : モータA(左)1 = HIGH / 0 = LOW
  274.   //D2 : モータスピード(右)
  275.   //D3 : モータB(右)1 = HIGH / 0 = LOW
  276.  
  277.   ledcWrite(PWMA, D0); //(チャンネル,解像度)
  278.   digitalWrite(AIN1, D1);
  279.   ledcWrite(PWMB, D2); //(チャンネル,解像度)
  280.   digitalWrite(BIN1, D3);
  281. }
  282.  
  283. void LEDtenmetsu(int LED) {
  284.   for (int i = 0; i < 2; i++) {
  285.     digitalWrite(LED, HIGH);
  286.     delay(500);
  287.     digitalWrite(LED, LOW);
  288.     delay(500);
  289.   }
  290. }

 

【回路図】


タミヤ 1/35 マークⅣメール製作(その11)

2025-02-03 16:35:24 | 1/35 マークⅣメール

2025-02-03
今週は出かける予定が多いのに、大寒波到来との事です。
不要不急の外出は避けたいところですが、どの要件も止めることが出来ません。

ところで、マークⅣの製作は完成までもう少しです。

▼デカールはG大隊のマークと車体番号の2種類4枚のみです。
なので、部分的に光沢クリアを吹いてデカールを貼ります。

▼Mr.ウェザリングカラーのグランドブラウンでボルト周り等にスミ入れします。

▼溶剤を含んだ筆で余分な塗料を拭き取ります。
光沢クリアーを吹いていない所は拭き取りに手間がかかりました。

▼反対側は全面にクリアーを吹いてから墨入れしました。

▼拭き取りはフィニッシュマスターRを使う事で大幅に時短できました。

▼油彩で雨だれを追加します。
4色の絵の具をランダムにドッティングし、溶剤を含んだ筆で縦方向に拭き取り雨だれを表現します。

▼仕上げは艶消しクリアでコーティング。

この後、アクリファイバーの余分な部分を切除して、プログラムを手直しすれば、ほぼ完成というところでしょうか。

 


タミヤ 1/35 マークⅣメール製作(その10)

2025-02-01 23:14:48 | 1/35 マークⅣメール

2025-02-01
マークⅣ戦車はドイツ軍に捕獲されることも有り、味方識別の目的で車体側面前部に白赤白の縦帯が描かれたそうです。
塗装指示図にも味方識別が描かれたものが有ります。

▼マスキングをして塗装するのですが、今回はハセガワのマスキングリキッドNEXTを使ってみます。
クレオスのマスキングゾルより粘度が低く塗り易く、且つ剥がし易いとの評判です。

▼塗装面全体に塗ります。
乾くまで2時間以上かかりました。

▼デザインナイフで切り込みを入れ、白塗装の部分を剥がします。

▼白塗装の次に赤塗装の部分を剥がします。

▼マスキングテープを貼り、白塗装をしてから赤塗装をします。

▼マスキングリキッドNEXTを全て剥がし、車体に取り付けました。