前言

做了幾個雷切作品之後,你可能會開始想:「如果這個盒子按下去會亮燈呢?如果這個擺飾能感應到人走過來然後播放音效呢?」

當雷切遇上電子元件,作品就從「靜態手工藝」升級成「互動裝置」。雷切負責外觀和結構,電子元件負責感知和反應。兩者的結合可以創造出非常有趣的作品 — 從會發光的名牌到能偵測溫度的桌面氣象站。

這篇文章會介紹 Arduino 的基礎概念、LED 控制、感測器輸入、雷雕外殼設計的注意事項,最後做一個完整的互動專案範例。


Arduino 基礎

什麼是 Arduino

Arduino 是一塊開源的微控制器開發板。你可以把它想成一台非常小的電腦,能夠:

  • 讀取感測器的數據(溫度、光線、距離、按鈕等)
  • 根據程式邏輯做判斷
  • 控制輸出元件(LED、馬達、蜂鳴器等)

常用的 Arduino 板型

| 板型 | 尺寸 | 特點 | 適用場景 |
|——|——|——|———-|
| Arduino Uno | 69x54mm | 最經典,資源多 | 學習、原型 |
| Arduino Nano | 45x18mm | 小巧,功能等同 Uno | 空間有限的專案 |
| Arduino Pro Mini | 33x18mm | 更小,無 USB | 嵌入式裝置 |
| ESP32 | 依模組而異 | 含 WiFi + 藍牙 | IoT 互聯裝置 |

對於雷切作品,我最推薦 Arduino Nano — 小巧到可以藏進盒子裡,但功能完整。

開發環境

  1. 下載安裝 Arduino IDE
  2. USB 連接 Arduino 到電腦
  3. 選擇正確的板型和連接埠
  4. 撰寫程式(稱為 Sketch)
  5. 按上傳按鈕,程式就燒進 Arduino 了

基本程式結構

// 所有 Arduino 程式都有這兩個函式

void setup() { // 開機時執行一次,用於初始化 pinMode(13, OUTPUT); // 設定第 13 腳為輸出 Serial.begin(9600); // 開啟序列通訊(除錯用) }

void loop() { // 重複執行,這是主程式 digitalWrite(13, HIGH); // 點亮 LED delay(1000); // 等 1 秒 digitalWrite(13, LOW); // 熄滅 LED delay(1000); // 等 1 秒 }


LED 控制

LED 是最容易上手的輸出元件,也是和雷切作品最搭配的。

單顆 LED

接線:
Arduino Pin 9 → 220Ω 電阻 → LED 長腳(+)
                              LED 短腳(-) → GND
int ledPin = 9;

void setup() { pinMode(ledPin, OUTPUT); }

void loop() { // PWM 呼吸效果 for (int brightness = 0; brightness <= 255; brightness++) { analogWrite(ledPin, brightness); delay(5); } for (int brightness = 255; brightness >= 0; brightness--) { analogWrite(ledPin, brightness); delay(5); } }

analogWrite() 使用 PWM(脈衝寬度調變)來模擬類比輸出,可以控制 LED 的亮度。值域是 0(全暗)到 255(全亮)。

NeoPixel(WS2812B)可定址 LED

NeoPixel 是 maker 圈最受歡迎的 LED 類型。每顆 LED 都能獨立控制顏色和亮度,而且只需要一根訊號線。

接線:
Arduino Pin 6 → NeoPixel DATA IN
Arduino 5V → NeoPixel VCC
Arduino GND → NeoPixel GND
#include <Adafruit_NeoPixel.h>

#define LED_PIN 6 #define LED_COUNT 12 // LED 數量

Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);

void setup() { strip.begin(); strip.show(); // 初始化為全暗 strip.setBrightness(50); // 亮度 0-255 }

void loop() { // 彩虹效果 for (long firstPixelHue = 0; firstPixelHue < 65536; firstPixelHue += 256) { for (int i = 0; i < strip.numPixels(); i++) { int pixelHue = firstPixelHue + (i * 65536L / strip.numPixels()); strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue))); } strip.show(); delay(10); } }

NeoPixel 有環形(Ring)、條形(Strip)、矩陣(Matrix)等形態,選擇適合你作品形狀的版本。

LED 在雷切作品中的應用

  • 壓克力燈箱底座:LED 燈條從側面照入壓克力
  • 木盒內部照明:打開盒蓋時亮燈
  • 裝飾邊燈:沿著作品邊緣排列 NeoPixel
  • 訊息指示:不同顏色代表不同狀態

感測器輸入

感測器讓你的作品能「感知」環境,做出反應。

按鈕 / 觸控開關

最基本的輸入。

接線:
Arduino Pin 2 → 按鈕一端
按鈕另一端 → GND
(使用內部上拉電阻)
int buttonPin = 2;

void setup() { pinMode(buttonPin, INPUT_PULLUP); // 內部上拉電阻 pinMode(13, OUTPUT); }

void loop() { if (digitalRead(buttonPin) == LOW) { // 按下時為 LOW digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); } }

光敏電阻

偵測環境光線強度。可以做「天暗了自動亮燈」的效果。

接線:
Arduino A0 → 光敏電阻一端
光敏電阻另一端 → 5V
Arduino A0 → 10kΩ 電阻 → GND
int lightPin = A0;

void setup() { Serial.begin(9600); }

void loop() { int lightLevel = analogRead(lightPin); // 0-1023 Serial.println(lightLevel);

// 天暗時亮燈 if (lightLevel < 300) { // 開燈 } else { // 關燈 } delay(100); }

超音波距離感測器(HC-SR04)

偵測前方物體的距離。可以做「有人靠近就觸發動作」的互動效果。

接線:
Arduino Pin 7 → Trig
Arduino Pin 8 → Echo
VCC → 5V
GND → GND
int trigPin = 7;
int echoPin = 8;

void setup() { pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); Serial.begin(9600); }

void loop() { // 發送超音波脈衝 digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW);

// 計算距離 long duration = pulseIn(echoPin, HIGH); float distance = duration * 0.034 / 2; // 公分

Serial.print("距離: "); Serial.print(distance); Serial.println(" cm");

if (distance < 30) { // 有人靠近!觸發效果 }

delay(100); }

旋轉編碼器

可以偵測旋轉方向和按壓,適合做「旋鈕控制」的介面。


雷雕外殼設計注意事項

把電子元件裝進雷切外殼,設計上有幾個重要的考量。

預留電子元件空間

在設計盒子的內部空間時,需要考慮所有電子元件的尺寸:

元件尺寸參考:
  • Arduino Nano: 45 x 18 x 12 mm
  • Arduino Uno: 69 x 54 x 15 mm
  • 麵包板(迷你): 47 x 35 x 9 mm
  • HC-SR04: 45 x 20 x 15 mm
  • 9V 電池: 49 x 26 x 17 mm
  • 18650 電池座: 75 x 20 x 20 mm(單顆)

盒子內部要比元件總體積大至少 20%,預留走線和散熱空間。

開孔設計

常見的開孔需求:
┌──────────────────────────┐
│                          │
│   ○ LED 指示燈孔 (5mm)  │  ← 前面板
│                          │
│  ┌────┐                  │
│  │USB │ USB 連接埠開口   │  ← 側面板或背面板
│  └────┘                  │
│                          │
│  ╔════╗                  │
│  ║感測║ 感測器窗口       │  ← 前面板
│  ╚════╝                  │
│                          │
│   ⊙ 按鈕孔 (7mm)       │  ← 上蓋或前面板
│                          │
└──────────────────────────┘

開孔尺寸要精確測量:

  • LED 孔:5mm 直徑(標準 5mm LED)
  • USB Micro-B 接口:約 8 x 3mm
  • USB-C 接口:約 9 x 3.5mm
  • HC-SR04 超音波感測器:兩個 16mm 圓孔,中心間距 26mm
  • 6mm 按鈕:7mm 圓孔

固定方式

電子元件在盒子裡要固定好,不能晃動。

| 方式 | 適用元件 | 說明 |
|——|———-|——|
| 螺絲固定 | Arduino(有螺絲孔) | 最牢固 |
| 卡扣固定 | 小型模組 | 設計對應的卡扣結構 |
| 平台架高 | 電路板 | 雷切內部平台,避免背面焊點短路 |
| 熱熔膠 | 各種 | 萬用但不夠美觀 |
| 雙面膠 | 扁平元件 | 方便但不夠穩固 |

Arduino 固定支架

// Arduino Nano 固定支架(雷切用 2D)
nano_w = 18;
nano_l = 45;
hole_d = 1.8;  // 固定孔直徑
hole_spacing_x = 15.2;
hole_spacing_y = 40.6;

module nano_mount() { difference() { // 底板(比 Nano 大一圈) square([nano_w + 6, nano_l + 6]);

// 固定孔 cx = (nano_w + 6) / 2; cy = (nano_l + 6) / 2; translate([cx - hole_spacing_x/2, cy - hole_spacing_y/2]) circle(d=hole_d, $fn=20); translate([cx + hole_spacing_x/2, cy - hole_spacing_y/2]) circle(d=hole_d, $fn=20); translate([cx - hole_spacing_x/2, cy + hole_spacing_y/2]) circle(d=hole_d, $fn=20); translate([cx + hole_spacing_x/2, cy + hole_spacing_y/2]) circle(d=hole_d, $fn=20);

// USB 接口方向的開口 translate([cx - 5, nano_l + 6 - 1]) square([10, 2]); } }

走線管理

盒子內部的導線要整理好:

  • 在內部板材上切小孔或溝槽,用來穿線和固定線路
  • 導線長度留 20% 餘量,方便維修
  • 訊號線和電源線盡量分開走

完整專案範例:互動式桌面時鐘

做一個結合雷切外殼和 Arduino 的桌面裝置,功能包括:

  • 顯示時間(用 LED 指示)
  • 偵測環境亮度(自動調整 LED 亮度)
  • 按鈕切換模式

材料清單

| 品項 | 數量 | 用途 |
|——|——|——|
| Arduino Nano | 1 | 主控制器 |
| DS3231 RTC 模組 | 1 | 即時時鐘 |
| NeoPixel Ring (12顆) | 1 | 時間顯示 |
| 光敏電阻 | 1 | 環境光偵測 |
| 按鈕開關 | 2 | 模式切換 / 設定 |
| 10kΩ 電阻 | 1 | 光敏電阻分壓 |
| USB Micro-B 線 | 1 | 供電 |
| 3mm 椴木合板 | 若干 | 外殼 |
| 3mm 霧面壓克力 | 1片 | 前面板(散光) |

外殼設計

正面圖:
┌──────────────┐
│  ╔════════╗  │
│  ║ 壓克力 ║  │  ← 霧面壓克力,NeoPixel 在後方
│  ║  面板  ║  │
│  ╚════════╝  │
│  ⊙      ⊙   │  ← 按鈕 x2
└──────────────┘

側面圖: ┌──────────────┐ │ 壓克力面板 │ │ NeoPixel Ring│ │ Arduino+RTC │ │ 電池/USB │ └──────────────┘ ↑ USB 孔

外殼由 finger joint 盒型組成,前面板用霧面壓克力代替木板,讓 LED 的光線可以均勻透出。

程式碼

#include <Adafruit_NeoPixel.h>
#include <RTClib.h>
#include <Wire.h>

#define LED_PIN 6 #define LED_COUNT 12 #define BUTTON_MODE 2 #define BUTTON_SET 3 #define LIGHT_PIN A0

Adafruit_NeoPixel ring(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800); RTC_DS3231 rtc;

int mode = 0; // 0: 時鐘, 1: 溫度顯示, 2: 彩虹

void setup() { ring.begin(); ring.show();

rtc.begin(); // 如果 RTC 沒電,用編譯時間初始化 if (rtc.lostPower()) { rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); }

pinMode(BUTTON_MODE, INPUT_PULLUP); pinMode(BUTTON_SET, INPUT_PULLUP); }

void loop() { // 讀取環境光,調整亮度 int light = analogRead(LIGHT_PIN); int brightness = map(light, 0, 1023, 10, 150); ring.setBrightness(brightness);

// 按鈕切換模式 if (digitalRead(BUTTON_MODE) == LOW) { mode = (mode + 1) % 3; delay(300); // 簡單防彈跳 }

switch (mode) { case 0: showClock(); break; case 1: showTemperature(); break; case 2: showRainbow(); break; }

ring.show(); delay(50); }

void showClock() { DateTime now = rtc.now(); int hour = now.hour() % 12; int minute = now.minute();

ring.clear();

// 時針:紅色 ring.setPixelColor(hour, ring.Color(255, 0, 0));

// 分針:藍色(12 顆 LED 對應 60 分鐘,每顆代表 5 分鐘) int minutePixel = minute / 5; ring.setPixelColor(minutePixel, ring.Color(0, 0, 255));

// 如果時分重疊,用紫色 if (hour == minutePixel) { ring.setPixelColor(hour, ring.Color(255, 0, 255)); } }

void showTemperature() { float temp = rtc.getTemperature(); // DS3231 內建溫度感測 int numLeds = map((int)temp, 15, 35, 1, 12); numLeds = constrain(numLeds, 1, 12);

ring.clear(); for (int i = 0; i < numLeds; i++) { // 低溫藍色,高溫紅色 int r = map(i, 0, 11, 0, 255); int b = map(i, 0, 11, 255, 0); ring.setPixelColor(i, ring.Color(r, 0, b)); } }

void showRainbow() { static long hue = 0; for (int i = 0; i < ring.numPixels(); i++) { int pixelHue = hue + (i * 65536L / ring.numPixels()); ring.setPixelColor(i, ring.gamma32(ring.ColorHSV(pixelHue))); } hue += 256; }

組裝步驟

  1. 雷切所有外殼零件
  2. 焊接電路:先在麵包板上測試通過,再轉到洞洞板焊接
  3. 組裝底座和側板:用 finger joint 卡合
  4. 安裝 Arduino 和 RTC:螺絲固定在內部支架上
  5. 安裝 NeoPixel Ring:用雙面膠固定在前面板後方
  6. 穿線接線:注意線路整理
  7. 安裝按鈕:從外殼外側穿入
  8. 蓋上前面板(壓克力)和背板
  9. 插上 USB 供電,測試

供電方案

USB 供電

最簡單的方式。Arduino Nano 的 USB 可以直接從手機充電器或電腦 USB 取電。

  • 優點:穩定、簡單
  • 缺點:需要一直插線

電池供電

| 電池類型 | 電壓 | 容量 | 續航(參考) |
|———-|——|——|————-|
| 9V 方型電池 | 9V | 500mAh | 數小時 |
| 18650 鋰電池 | 3.7V | 2000-3500mAh | 一天以上 |
| 3xAA 電池盒 | 4.5V | 2000mAh | 一天左右 |

使用電池供電時,需要注意:

  • 低功耗設計:用 sleep 模式減少耗電
  • 電壓匹配:Arduino Nano 的 VIN 可接 7-12V,5V pin 可接 5V 穩壓電源
  • 預留電池更換空間

除錯技巧

Serial Monitor

Arduino IDE 的序列監視器是最重要的除錯工具:

Serial.begin(9600);
Serial.print("感測器值: ");
Serial.println(sensorValue);

常見問題

| 問題 | 可能原因 | 解決方式 |
|——|———-|———-|
| LED 不亮 | 接線錯誤、腳位錯 | 檢查接線,確認 pin 號 |
| LED 閃爍不穩 | 供電不足 | 加大電容或換電源 |
| 感測器值亂跳 | 接線接觸不良 | 焊接而非用杜邦線 |
| 按鈕反應遲鈍 | 沒做防彈跳 | 加 delay 或用程式庫 |
| 程式上傳失敗 | COM port 錯誤 | 重新選擇正確的 port |


小結

雷切 + 電子元件的組合,開啟了一個全新的創作維度。你不再只是做一個好看的東西,而是做一個有功能、能互動的裝置。

入門路線建議:

  1. 先用 Arduino + LED 做一個簡單的發光作品(壓克力燈箱加上呼吸燈效果)
  2. 加入感測器,讓作品能「感知」環境
  3. 設計雷切外殼,把所有元件整合進去
  4. 嘗試更複雜的互動邏輯

最重要的一點是:先讓電路在麵包板上跑通,再設計外殼。我見過太多人先做了漂亮的外殼,結果電路裝不進去或功能不正常。

下一篇也是這個系列的最後一篇 — 我們要談談如何把雷切小物「商品化」。從設計考量到成本計算,從量產流程到販售通路,讓你的 maker 技能不只是興趣,也能成為一門小生意。