2016年3月17日 星期四

Arduino lightsaber DIY


光劍的題材很多人在做,比如說 泡棉光劍..有音效 可對打不怕重傷 又有藍芽控制 真的好棒.
想要當原力武士要打造一把自己專屬光劍,只要會Arduino,靠網路上的分享文章就可以DIY了,
以下文章的資源大部分都來自於網路上的分享.

如想要簡單的光劍,揮舞有音效,開啟以及關閉時會有光線升降的效果
  • 就材料上單晶片挑選Arduino nano當控制板,一來小二來便宜.
  • 音效需要MP3 player. Mini MP3 module *1, 稍嫌貴了些...
    音效coding的部分可參考DFPlayer Mini MP3的範例
  • TF card *1 用來存放MP3檔案,MP3的音效檔可以到The Force Net尋找Lightsaber sound的MP3
  • 劍身先找壓克力燈管 直徑23mm左右的.先把燈管做出來
  • 劍柄的部分找3D印表機列印囉.
  • 電源的部分,可以找單顆18650電池的行動電源提供5V的DC輸出
  • 開關的部分 需要微動開關作為Power ON/OFF的切換
  • 水銀開關作為晃動時的Audio ON/FF的判斷
  • LED數顆,光劍的LED串接可以參考超炫IoT光劍自製HowTo完全公開!
    (以下相關LED連接的圖片都擷取自上述連結)

但使用上 就要規劃一下,看一下如果想要有10段光線升降,會用掉D2~D11 pin
超炫IoT光劍自製的文章中採用的是6段光線升降,用的是3.3V的DC,

可能實際上要考慮一下Arduino是5V的DC
至於5V能並聯幾顆LED,串聯電阻多大,可以先參考一下這篇文章,
為什麼LED需要串聯的電阻值是220 ohm?
也可利用以下連結直接在線上作計算.
LED限流電阻值-線上計算器


針對Arduino的pin define先規劃一下




D0~D1連接Mini MP3 player
D2~D11連接LED Matrix控制LED燈管
剩下的D12 / D13當電源控制開關的訊號囉.
Pin define的規劃如下.剩下就是coding跟買材料來組裝.

Arduino Nano
DFPlayer Mini MP3
Speaker
LED 
N/A
SPK_1
RED Line
 
N/A
SPK_2
Black Line
 
TX/D1
RX
 
 
RX/D0
TX
 
 
RST
 
 
 
GND
GND
GND
GND
D2
 
 
LED matrix 1
D3
 
 
LED matrix 2
D4
 
 
LED matrix 3
D5
 
 
LED matrix 4
D6
 
 
LED matrix 5
D7
 
 
LED matrix 6
D8
 
 
LED matrix 7
D9
 
 
LED matrix 8
D10
 
 
LED matrix 9
D11
 
 
LED matrix 10
D12
 
 
LED On/OFF
D13
 
 
Audio On/OFF
3V3
 
 
 
AREF
 
 
 
A0
 
 
 
A1
 
 
 
A2
 
 
 
A3
 
 
 
A4
 
 
 
A5
 
 
 
A6
 
 
 
A7
 
 
 
5V
VCC
 
VCC
RESET
 
 
 
GND
 
 
 
VIN
 
 
 





就以上的規劃coding的展開如下,剩下就是debug囉.!


#include "SoftwareSerial.h"
#include "DFPlayer_Mini_Mp3.h"

const int LedMartix1 = 2;     //設定LED Martix1接腳在第2pin
const int LedMartix2 = 3;     //設定LED Martix2接腳在第3pin
const int LedMartix3 = 4;     //設定LED Martix3接腳在第4pin
const int LedMartix4 = 5;     //設定LED Martix4接腳在第5pin
const int LedMartix5 = 6;     //設定LED Martix5接腳在第6pin
const int LedMartix6 = 7;     //設定LED Martix6接腳在第7pin
const int LedMartix7 = 8;     //設定LED Martix7接腳在第8pin
const int LedMartix8 = 9;     //設定LED Martix8接腳在第9pin
const int LedMartix9 = 10;      //設定LED Martix9接腳在第10pin
const int LedMartix10 = 11;     //設定LED Martix10接腳在第11pin
const int PowerON = 12;     //設定LED啟動開關接腳在第12pin
const int AudioON = 13;     //設定水銀開關接腳在第13pin
const int LEDdelay = 30;      //延遲0.03秒進行一次LED升降
int LEDstatus = 0;      //定義變量為LEDstatus=0

void setup () {
  Serial.begin (9600);
  mp3_set_serial (Serial); //set Serial for DFPlayer-mini mp3 module
  mp3_set_volume (10);
  pinMode(AudioON, INPUT);          //設定水銀開關為輸入端
  pinMode(PowerON, INPUT);          //設定LED啟動開關為輸入端
  pinMode(LedMartix10, OUTPUT);     //設定LED Martix10為輸出端
  pinMode(LedMartix9, OUTPUT);      //設定LED Martix9為輸出端
  pinMode(LedMartix8, OUTPUT);      //設定LED Martix8為輸出端
  pinMode(LedMartix7, OUTPUT);      //設定LED Martix7為輸出端
  pinMode(LedMartix6, OUTPUT);      //設定LED Martix6為輸出端
  pinMode(LedMartix5, OUTPUT);      //設定LED Martix5為輸出端
  pinMode(LedMartix4, OUTPUT);      //設定LED Martix4為輸出端
  pinMode(LedMartix3, OUTPUT);      //設定LED Martix3為輸出端
  pinMode(LedMartix2, OUTPUT);      //設定LED Martix2為輸出端
  pinMode(LedMartix1, OUTPUT);      //設定LED Martix1為輸出端
  digitalWrite(LedMartix10, LOW);    //設定LED Martix10預設LOW
  digitalWrite(LedMartix9, LOW);    //設定LED Martix9預設LOW
  digitalWrite(LedMartix8, LOW);    //設定LED Martix8預設LOW
  digitalWrite(LedMartix7, LOW);    //設定LED Martix7預設LOW
  digitalWrite(LedMartix6, LOW);    //設定LED Martix6預設LOW
  digitalWrite(LedMartix5, LOW);    //設定LED Martix5預設LOW
  digitalWrite(LedMartix4, LOW);    //設定LED Martix4預設LOW
  digitalWrite(LedMartix3, LOW);    //設定LED Martix3預設LOW
  digitalWrite(LedMartix2, LOW);    //設定LED Martix2預設LOW
  digitalWrite(LedMartix1, LOW);    //設定LED Martix1預設LOW
}

void loop() {
  if (LEDstatus == 0 && digitalRead(PowerON) == HIGH) { //當有開關觸發LED亮
    mp3_play (random(6, 8));     //先將光劍啟動的音效檔定為0006.mp3 或0007.mp3, 藉由亂數處理任意播放
    delay (1000);    //播放1秒音效
    for (int i = 2; i <= 11; i++) {
      digitalWrite(i, HIGH);
      delay(LEDdelay);
      LEDstatus = 1;
    }
  }
  if (LEDstatus == 1 && digitalRead(PowerON) == HIGH) { //當有再次開關觸發LED暗
    mp3_play (random(9, 11));     //先將光劍關閉的音效檔定為0009.mp3 或0010.mp3, 藉由亂數處理任意播放
    delay (1000);    //播放1秒音效
    for (int i = 11; i >= 2; i--) {
      digitalWrite(i, LOW);
      delay(LEDdelay);
      LEDstatus = 0;
    }
  }
  if (LEDstatus == 1) { //當光劍啟動時紀錄水銀開關觸發狀態
    for (int i = 0; i < 4; i++) {
      hum[i] = digitalRead(AudioON);
    }
    if ((hum[0] != LOW && hum[1] != LOW && hum[2] != LOW && hum[3] != LOW) || (hum[0] != HIGH && hum[1] != HIGH && hum[2] !=  HIGH && hum[3] != HIGH)) {
      randNumber = random(1, 5);
      mp3_play (randNumber);     //先將揮光劍的音效檔定為0001~0004.mp3, 藉由亂數處理任意播放
      delay (randNumber * 1000);
    }
  }
}

5 則留言:

  1. 你好 請問 hum[i] 如何作宣告 謝謝

    回覆刪除
  2. int hum[]={1,2,3,4,5,6,7,8,9,10};
    int i;
    int randNumber;
    宣告後 開機沒有伸縮功能及聲音 led一直跑來跑去不知哪裡debug囉! 請指導一下 謝謝 !

    回覆刪除
  3. 你好 照這程式及接法 揮動及開關機都沒聲音 不知哪裡宣告錯誤 請指導一下 謝謝

    回覆刪除
  4. 你好 照這程式及接髮 都沒反應及聲音 真是不解 請指導一下 謝謝

    回覆刪除

PC OLD DOS Game Ultima 鍵盤指令說明

  以下清單基於原始 DOS 版及重製版(如 GOG 版本)的官方手冊和社群資料(來源包括 Ultima Codex、GameFAQs)。 Ultima I: The First Age of Darkness (1981/1986 PC 版) 鍵盤指令清單 (以 1986 DO...