自製ARC Reactor 方舟反應爐造型燈(全程教學,需要3D列印)PART 3




前面PART 1 PART 2 都已經把外殼及LED燈做好了,那這章要來講一下電路及程式。
如果你還沒看過PART 1 或PART 2,請直接點選PART 1PART 2

雖然PART 2 有講過接下來要用的材料,但我還是再提醒一便好了
注意:如果你在PART 2 就已經準備好所有材料工具,不用理會這篇的前置準備


準備材料:

1. Arduino Nano *1
2. HC-06或YFROBOT 藍芽模組*1


3. 3 pin小開關*1
4. 杜邦線(母頭)5條(因為PART 2 已經用掉四條了)
5. 4號電池*3(簡易版)
.
.
.
以下為進階版,若只想做入門可以不用準備
5. 3.7V聚合物鋰電池(200mah以上推薦,大小不超過35*30*15mm)(進階版)

6. 充電模組TP4056 *1(進階版)
7. 升壓模組(輸出5V)*1(進階版)

準備工具:

1. 尖嘴鉗
2. 熱熔膠槍
3. 銲槍
4. 剪刀
5. 美工刀
6. 絕緣膠帶*1
7. 斜口鉗(建議)


開始製作!!!

第一步:電路
兩張圖上半部都是同一種電路,只是用電池及充電的地方不同
(希望不會太難懂)


   

通訊電路說明:

圈燈的RGB 3腳位,分別接在Arduino Nano板上的D3 D5 D6
圈燈的RGB 3腳位,分別接在Arduino Nano板上的D9 D10 D11
芽模組的腳位有Vcc , Gnd , Txd , Rxd,分別連結3V3 , Gnd , Rxd , Txd
(Rxd接Txd,Txd接Rxd)
以上三個的Gnd接一起
   

充電電路說明:(簡易版忽略)

池與充電模組並聯,並將其中的正極接到開關的一端,而負極連到升壓模組的負極位置
關的中間端連到升壓模組的正極
壓模組的USB接都要去掉,並將負極連到Gnd,正極連到Vin


第二步:接杜邦線
將4條杜邦線依照前面的電路圖連接Arduino板及藍芽模組
注意下面的圖,這相當於前面電路圖LED , 藍芽模組的負極3條接在一起,最後連到Gnd
連好後用絕緣膠帶纏住

把在PART 2已經接好的內圈燈及外圈燈接到Arduino Nano上
(如果你已經接電卻還沒像這樣亮請不要擔心,因為程式還沒灌)

第三步:接電
請先將最後一條杜邦線對切


簡易版:將對切的杜邦線,分別插在VIN、GND上,然後VIN接開關端,GND接電池組負極



進階版:將對切的杜邦線,分別插在VIN、GND上,然後VIN接升壓模組正極,GND接負極


第四步:組裝
請把你已經焊好接好的電路放入基座中
圖中的1號洞是裝充電模組、2號洞是裝開關(簡易版只須看2號洞)
至於電池及升壓模組可以依你的喜好擺放(但盡量讓內部保持不緊繃的狀態)

充電模組裝好後,把開關插在基座側邊的洞口(如果發現你的基座外殼沒有字,不用擔心,這只是我自己的名字)

再來將連接電源的兩條杜邦線接到Arduino Nano上的VIN及GND
(還沒灌程式,所以理論上就算通電了也不會亮)

第五步:灌程式
我們要灌的程式有兩個,一個是給Arduino Nano,另一個是手機app
而下面我先給的是Arduino IDE的原始碼(你可以直接複製,或是點連結下載)
#include <SoftwareSerial.h> 
#include <Wire.h>  //引用二個函式庫SoftwareSerial及Wire SoftwareSerial 
#define LEDR1 9//紅1燈腳位
#define LEDG1 10//綠1燈腳位
#define LEDB1 11//藍1燈腳位  
#define LEDR2 3//紅2燈腳位
#define LEDG2 5//綠2燈腳位
#define LEDB2 6//藍2燈腳位  
  int r1 = 0;
  int g1 = 0;
  int b1 = 0;
  int r2 = 0;
  int g2 = 0;
  int b2 = 0;
  int mode = 1;//
  byte cmmd[10];
  float adjustR1 = 0.5;
  float adjustG1 = 0.3;
  float adjustB1 = 0.3;
  float adjustR2 = 0.9;
  float adjustG2 = 0.9;
  float adjustB2 = 0.9;
  unsigned long previousMillis = 0;
  long randomInterval = 1000;
  long breatheInterval = 50; 
SoftwareSerial I2CBT(0,1); //定義PIN0及PIN1分別為RX及TX腳位 
void setup() { 
  Serial.begin(9600); //Arduino起始鮑率9600 
  I2CBT.begin(9600); //藍牙鮑率9600

  pinMode(LEDR1, OUTPUT);
  pinMode(LEDG1, OUTPUT);
  pinMode(LEDB1, OUTPUT);  
  pinMode(LEDR2, OUTPUT);
  pinMode(LEDG2, OUTPUT);
  pinMode(LEDB2, OUTPUT);  

} 

void loop() {  
  unsigned long currentMillis = millis();  
  analogWrite(LEDR1, r1);
  analogWrite(LEDG1, g1);
  analogWrite(LEDB1, b1);
  analogWrite(LEDR2, r2);
  analogWrite(LEDG2, g2);
  analogWrite(LEDB2, b2);
  if (((I2CBT.available()))>0)
  {  //判斷有沒有訊息接收 
    for (int i=0; i<7; i++) {
      Serial.println(cmmd[i]=I2CBT.read());//將接收的訊息顯示出來      
    }//for
  } //if
  Serial.print("cmmd[0] = ");
  Serial.println(cmmd[0]);
  
  switch(cmmd[0]){
    case 0:
    r1=cmmd[1];
    g1=cmmd[2]*0.9;
    b1=cmmd[3]*0.9;
    r2=cmmd[4]*0.3;
    g2=cmmd[5]*0.2;
    b2=cmmd[6]*0.2;
    break;
    case 1:
    if(currentMillis - previousMillis >= randomInterval){
      previousMillis = currentMillis;
      Random();
      randomInterval = cmmd[1]*10;     
    }
    break;
    case 2:
    if(currentMillis - previousMillis >= breatheInterval){
      Breathe();
      previousMillis = currentMillis;
      breatheInterval = cmmd[1]*10;
    }
    
    break;    
    default:
    r1=cmmd[1];
    g1=cmmd[2];
    b1=cmmd[3];
    r2=cmmd[1];
    g2=cmmd[2];
    b2=cmmd[3];
    break;   
}
}
void Breathe(){
  Serial.print("mode = ");
  Serial.println(mode);
  if (mode == 1){
    if(r1>=250){
      mode = 2;
    }
    else{
      r1+=5;
      r2+=5;
    }
  }
  else if (mode == 2){
    if(g1>=250){
      mode = 3;
    }
    else{
      g1+=5;  
      g2+=5; 
    }
  }
  else if (mode == 3){
    if(b1>=250){
      mode = 4;
    }
    else{
      b1+=5;
      b2+=5;
    }
  }  
  else if (mode == 4){
    if(r1<=5){
      mode = 5;
    }
    else{
      r1-=5;
      r2-=5;
    }
  }
  else if (mode == 5){
    if(g1<=5){
      mode = 6;
    }
    else{
      g1-=5;
      g2-=5;
    }
  }
  else if (mode == 6){
    if(b1<=5){
      mode = 1;
    }
    else{
      b1-=5;
      b2-=5;
    }
  }      
}
void Random(){
  r1 = random(0, 255);
  g1 = random(0, 255);
  b1 = random(0, 255);    
  r2 = random(0, 255);
  g2 = random(0, 255);
  b2 = random(0, 255);    
}

在上傳程式時,要注意:
記得先在開發版選Arduino Nano,以及選擇序列埠(圖片僅供參考)


而手機程式呢,我則是使用App Inventor 2來撰寫
App的用法我在這裡就不多做說明了,因為本身在第一次啟動程式就會出現教學

至於你可能會在App的教學中看到右下角有個錄音的按鍵
但到了正式的程式中卻又沒有,那是因為之前我有多做了一個錄音的功能,但在這次的實作中並不會用到,所以我把那個功能刪了


第六步:收尾
當以上所有步驟都完成後,我們要來把最後的收尾動作做好
但其實也不難,除了測試好所有功能外,還要檢查有沒有短路或接觸不良,你不妨可以拿它甩一甩或敲一敲,不要害怕不小心弄壞,因為如果作品是堅固的話,這點小動作是不會影響品質的,接著要小心外圈和內圈接觸的地方,因為那裏極有可能會短路,一旦短路了也不要怕,中間隔著幾張小紙片就好。

在蓋上燈罩前,先保持連線狀態,並讓燈保持全亮,這樣可以檢視在移動的過程中是否有問題,最後蓋上你的蓋子,如果過程都沒有問題的話,那麼恭喜你,你已經完成了這考驗耐性及手藝的艱鉅任務,並且成功自製了一顆方舟反應爐(偽)>.<

最後希望你很enjoy在手製的過程中,就如同一位Maker般,也謝謝你願意耐心地看完我這篇長文!

留言

這個網誌中的熱門文章

超低價打造mearm Ver1.0 機械手臂 PART1

超低價打造mearm Ver1.0 機械手臂 PART2

自製ARC Reactor 方舟反應爐造型燈(全程教學,需要3D列印)PART 1