前往
大廳
主題

1/350 大和 砲塔燈/音效 教學

軍火 | 2022-12-17 02:32:52 | 巴幣 0 | 人氣 161

前段時間把1/450跟1/350大和動力做完之後
又加了探照燈
但一直總覺得少了點什麼
再網上看其他大佬的影片後
決定加點其他功能上去
因為是走戰艦路線 主砲跟副砲的旋轉就是必不可免了
至於防空炮及其他小副砲 1/350對我來說還是太小了 手殘實在上不了就放棄
有想過直接使用SG90轉動
但會有速度不均勻 角度有限制 這兩個問題
參考ミチシルベ的頻道之後 第一版決定使用馬達加渦桿以及齒輪的配置


將主砲黏上2mm不鏽鋼軸
甲板的主砲底座黏上內徑2.1mm的銅管
有條件的就使用承軸
這樣可以降低旋轉時的阻力
在甲板下裝上齒輪及渦桿
先進行假組合稍微加固  確定旋轉順暢後再進行整體固定
再將sg90內部可變電阻直接固定 讓它可以一直轉
我的第一次改版到這基本就結束了
但會有三個問題
一是因為SG90黏在甲板上 故障時拿下來有點小麻煩
二是用遙控器直接控制會有轉過頭的問題
三是還是有點少了什麼
所以玩了一段時間後又拆了
進行第二次改版
新增砲塔旋轉限位 以及音效還有開炮特效
這次會使用到老朋友 - arduino nano
搭配DFPLAYER MINI MP3撥放器 跟迷你版 L298N
電路圖如下
大致邏輯為 ARDUINO 接收2.4G 訊號
ARDUINO傳輸訊號給MP3撥放器撥放指定樂曲
ARDUINO傳輸訊號給迷你版 L298N 控制馬達旋轉 馬達上連接渦桿 推動齒輪進而旋轉砲塔
ARDUINO 接收微動開關訊號 確定砲塔是不是轉到指定位置 進而停止砲塔轉動
/---------------------------------------------------------------------------------------
ARDUINO 接收2.4G 訊號
要能接收2.4G訊號要將接收器的訊號腳以及GND連接到ARDUINO上
GND只要一條就好 但一定要接
程式使用pulseIn來判斷輸入
一般而言遙控器中心點為1500上下  而這也是他讀到的值
依我的遙控器mc6c為例 使用搖桿為900(搖桿往下)-1500(不動)-2100(搖桿往上)
指撥開關則有1500-2100 或是900-1500這兩種 需要進程式看才看的到
而旋鈕也是依樣概念
但有些高階的遙控器本身就能顯示
(目前好像有使用M.BUS讀取ˋ數值 但沒什麼研究)
/------------------------------------------------------------------------------
ARDUINO傳輸訊號給MP3撥放器撥放指定樂曲
由於模組本身為mp3模組 所以要再準備一張記憶卡 4g就十分足夠
模組需接5V及GND 5V來源為ARDUINO上的5V接腳
SPK1及SPK2接至喇叭 記憶卡需格式化並創建MP3資料夾 歌名需命名為0001 . 0002等
大致上依些小細節的教學網上都有
而我們必須透過RX.TX來進行訊號溝通 不過我找的程式碼好像只用到單通就是
喇叭依DFPLAYER官方是能推到3W 若要在上去要另外增加放大晶片
這次我只用到3W喇叭而已
/-----------------------------------------------------------------------------
ARDUINO傳輸訊號給迷你版 L298N
這就比較簡單一點
電路配置接腳為第五及第六腳 可使用PWM進行速度控制快慢 來進行起步延遲 加速 減速等功能 不過我沒多寫就是
/-------------------------------------------------------------------------------------
ARDUINO 接收微動開關訊號
在齒輪上我黏了舵機臂
舵機臂需長於齒輪 才能在齒輪轉至你要的角度後來推動微動開關
此時開關反向作動 ARDUINO接收到訊號後停止馬達往該方向轉動
好處是可往反方向移動
在這裡馬達我是直接把SG90電路板拆了 在馬達上加顆104電容後直接拿來用
一是防潑水二是有現成的減速器用(如圖一)
/-----------------------------------------------------------------------------
到這裡基本上算完成了我的第二次改版
土砲的電路板外觀大致如下
有使用到排針 減少空間 避免斷線 方便更換
不過一堆飛線還是有點糟糕就是

也順便做了外盒
基本上針對狹長的驅逐艦可以做成長形的
我是裝戰艦所以做成方形的
我總共用了四個音效 船笛 開火聲 防空火砲聲 以及一首進行曲
/-----------------------------------------------------------------------------
第三次改裝為新增開火特效
因為很麻煩所以拖很久
一開始在做時沒想到這 所以使用套件的金屬砲管
但是等要進行改裝的時候 壓跟用不了 只能拆了換成一般銅管(血虧)
內徑為2.6mm() 使用貼片式led 型號有點忘了 反正挺小的
線也是 用越細越好 焊接好後固定起來放進砲管裡確定能運作後再固定
對眼睛就不太好的我真的是折磨
有辦法做更細的就用更細的 不然這真的算超大和等級了
因為砲塔本身需要旋轉 而線材本身有韌度 所以我做成三管同時作動
在砲塔裡並聯 這樣只需要牽兩條線出來
這樣減少旋轉時的阻力以及點位用量
有條件的可以用導電滑環 就沒這問題
至於開火間隔則是搭配音效 慢慢修改數值測出來的


arduino程式片段

#include "SoftwareSerial.h"
SoftwareSerial mySerial(10, 11);
//gun tower
#define M1A 5
#define M1B 6
# define ACTIVATED LOW
int leftbutton = 9;
int rightbutton = 12;
int GUN_FIRE_LED_1=2;
int GUN_FIRE_LED_2 = 3;
//2.4g in
# define CH1_IN 7
# define CH2_IN 8
# define CH5_IN 4
int CH1_Value;
int CH2_Value;
int CH5_Value;
int motor_star =0;
//mp3
# define Start_Byte 0x7E
# define Version_Byte 0xFF
# define Command_Length 0x06
# define End_Byte 0xEF
# define Acknowledge 0x00  //Returns info with command 0x41 [0x01: info, 0x00: no info]
void setup () {
  pinMode(leftbutton, INPUT);
  digitalWrite(leftbutton,HIGH);
  pinMode(rightbutton, INPUT);
  digitalWrite(rightbutton,HIGH);
  pinMode(CH1_IN, INPUT);
  pinMode(CH2_IN, INPUT);
  pinMode(CH5_IN, INPUT);
  pinMode(M1A, OUTPUT);
  pinMode(M1B, OUTPUT);
  pinMode(GUN_FIRE_LED_1, OUTPUT);
  pinMode(GUN_FIRE_LED_2, OUTPUT);
   mySerial.begin (9600);
   Serial.begin(115200);
      setVolume(28);
}
void loop () {
CH1_Value=pulseIn(CH1_IN,HIGH);
CH2_Value=pulseIn(CH2_IN,HIGH);
CH5_Value=pulseIn(CH5_IN,HIGH);
//if(digitalRead(leftbutton) != ACTIVATED){Serial.println("1");}
// Serial.print("ch2");
//Serial.println(CH1_Value);
// Serial.println(CH2_Value);
//Serial.println(CH5_Value);
//停止轉動
if(CH2_Value <= 1700 && CH2_Value >= 1350)
{
  if(motor_star==1)
    {motorGo(0,0); motor_star=0;}
}
//左轉
if(CH2_Value >= 1700 && CH2_Value <=2000)
{
  if(digitalRead(leftbutton) != ACTIVATED){motorGo(150,0);Serial.println("1");}
  //限位
  if(digitalRead(leftbutton) == ACTIVATED){motorGo(0,0);Serial.println("3");}
}
//右轉
if(CH2_Value >= 900 && CH2_Value <=1200)
{
  if( digitalRead(rightbutton) != ACTIVATED){motorGo(0,150);Serial.println("2");}
  //限位
  if( digitalRead(rightbutton) == ACTIVATED){motorGo(0,0);Serial.println("4");}
}

if(CH1_Value >= 1700 && CH1_Value <= 2050)
{
    PlayHorn();
  // Serial.println(CH1_Value);
  }
if(CH1_Value >= 900 && CH1_Value <= 1150)
{
  PlayFire();
// Serial.println(CH1_Value);
  }
if(CH5_Value >= 1700 && CH5_Value <= 2050)
{
  PlayMusic();
  }
if(CH5_Value >= 900 && CH5_Value <= 1150)
{
  PlayAAgun();
  }
Serial.println(CH5_Value);
}
void motorGo(int M1AS, int M1BS)
{analogWrite(M1A, M1AS);analogWrite(M1B, M1BS);motor_star=1;}
void PlayFire()
{execute_CMD(0x03,0,1); Serial.println("1"); delay(1000);digitalWrite(GUN_FIRE_LED_2,HIGH); delay(150);digitalWrite(GUN_FIRE_LED_2,LOW); delay(700);digitalWrite(GUN_FIRE_LED_1,HIGH); delay(150);digitalWrite(GUN_FIRE_LED_1,LOW);}
void PlayHorn()
{execute_CMD(0x03,0,2);Serial.println("2");delay(500); }
void PlayAAgun()
{execute_CMD(0x03,0,4);Serial.println("4");delay(500); }
void PlayMusic()
{execute_CMD(0x03,0,3);Serial.println("3"); delay(500); }
void setVolume(int volume)
{
  execute_CMD(0x06, 0, volume); // Set the volume (0x00~0x30)
  delay(1000);}
// 執行命令及傳入參數
void execute_CMD(byte CMD, byte Par1, byte Par2) {
  word checksum = -(Version_Byte + Command_Length + CMD + Acknowledge + Par1 + Par2);
  byte Command_line[10] = { Start_Byte, Version_Byte, Command_Length, CMD, Acknowledge,
  Par1, Par2, highByte(checksum), lowByte(checksum), End_Byte};
  for (byte k=0; k<10; k++){
    mySerial.write( Command_line[k]);
  }
}



由於程式部分幾乎都是參考網上的 也針對我的設備跟使用習慣做過調整
所以無法做到每個人能直上
目前依這種配置 1/350的戰艦幾乎都沒問題
1/450比例只有做在大和上 但都能裝得下 其餘型態的船得需各位船長調整了
註解方面 近期比較忙 只能等之後有時間再慢慢補上
祝各位艦長一帆風順


創作回應

更多創作