2017年6月29日 星期四

Arduino PWM控制100W聚光燈模組

         週二夜晚是ArkLab的工程師之夜,很多好玩有趣的事情都會在今晚發生,而今天要來玩的就是利用PWM訊號去控制100W的聚光燈(LED矩陣),PWM主要用於穩壓、穩流、調光、控制轉速等,透過調整PWM的脈波寬度可以改變LED亮暗的程度,當把聚光燈的亮度調到最大255(100%)時,那強光真的極度刺眼呀!

從此圖就可以看出當開啟100%的亮度會有多亮,我整個都被照到反光了呢





計畫所準備硬體部份的東西主要有以下:

1. 100W聚光燈(LED矩陣)模組 * 1
2. 20W-100W LED專用升壓定電流模組 * 1
3. 3S鋰電池 * 1
4. 麵包板 * 1
5. Arduino nano * 1
6. mini USB * 1
7. 電腦一台 * 1
(如右圖所示)




        首先要先將電池供電給升壓定電流模組,將升壓定電流模組上的IN+接線到電池的正極,IN-接到負極,再將OUT+接給聚光燈的正極,OUT-接給負級,另外還要從IN-再接一條線給Arduino nano的GND,讓兩邊共地,不然到時聚光燈會收不到nano的訊號,再來就把聚光燈的訊號線接到PWM的輸出腳位(筆者設定D3為PWM輸出腳位)。我們在聚光燈上加了一顆BJT作為開關,此外我們還在聚光燈背面安裝的風扇散熱,因為聚光燈的功率很高,當亮度調到最大時,可以發現聚光燈漸漸發熱,開太久旁邊鐵片會燙。

PS.請確保各條連接線要確保接對、接好,不然一短路不只會看到電、聽到電的聲音,各元件都可能燒壞。

硬體接完後,再來是軟體的部分,以下是程式碼:
int outputPin = 3;
int LEDpwm;
int count = 0;
char input[4];
boolean flag = false;
String inputString = "";

void setup(){
  Serial.begin(9600); //初始化序列埠,以9600bps速率連線
  pinMode(outputPin,OUTPUT); //設定輸出腳位
 }

void loop(){
  if(flag == true){
    inputString.toCharArray(input,4); //將輸入字串放進字元陣列中
    str2DEC(); //將讀進來的數字字串轉換為十進位數值
    Serial.println(LEDpwm); //列印出輸入的值
    for(int i = 0; i < 3 ;i++){  //讓聚光燈閃三下      
      analogWrite(outputPin,LEDpwm);                        
      delay(1000);                                                          
      analogWrite(outputPin,0);                                     
      delay(1000);                                                          
    }
    inputString = "";
    flag = false;
    count = 0;
  }
}

void serialEvent(){
  char inputChar = (char)Serial.read(); //buffer裡有資料時讀取第一個byte並轉為字元
  inputString += inputChar; //將輸入字元加入字串當中
  count++; //計數有幾個字元
  if(inputChar == '\n'){
    flag = true;
  }
}

void str2DEC(){
    switch(count){ //透過計數的字元了解使用者輸入的值為幾位數
      case 4:
        LEDpwm = (input[0] - 48) * 100 + (input[1] - 48) * 10 + (input[2] - 48);
      break;
      case 3:
        LEDpwm = (input[0]-48) * 10 + (input[1] -48);
      break;
      case 2:
         LEDpwm = (input[0]-48);
      break; 
  }
}



        原本程式只要輸入0~255範圍的值analogWrite就會一直保持此值,而我後來加了for迴圈,讓每次輸入值後閃三下,如果想長亮LED直接打 analogWrite(outputPin,LEDpwm )即可。




  這次的計畫是透過電腦輸入值讓Arduino nano接收後再傳PWM訊號給聚光燈,之後的計畫希望可以透過我們的遙控器可以去調整聚光燈的亮暗程度,等測試成功後,我們不僅可以把聚光燈放在飛機上當作夜晚探照燈,可以應用在其他需要有光的地方。敬請期待吧,各位!


最後再附上工作照以及元件的照片,還有測試的影片喲~