前言
做了幾個雷切作品之後,你可能會開始想:「如果這個盒子按下去會亮燈呢?如果這個擺飾能感應到人走過來然後播放音效呢?」
當雷切遇上電子元件,作品就從「靜態手工藝」升級成「互動裝置」。雷切負責外觀和結構,電子元件負責感知和反應。兩者的結合可以創造出非常有趣的作品 — 從會發光的名牌到能偵測溫度的桌面氣象站。
這篇文章會介紹 Arduino 的基礎概念、LED 控制、感測器輸入、雷雕外殼設計的注意事項,最後做一個完整的互動專案範例。
Arduino 基礎
什麼是 Arduino
Arduino 是一塊開源的微控制器開發板。你可以把它想成一台非常小的電腦,能夠:
- 讀取感測器的數據(溫度、光線、距離、按鈕等)
- 根據程式邏輯做判斷
- 控制輸出元件(LED、馬達、蜂鳴器等)
常用的 Arduino 板型
| 板型 | 尺寸 | 特點 | 適用場景 |
|——|——|——|———-|
| Arduino Uno | 69x54mm | 最經典,資源多 | 學習、原型 |
| Arduino Nano | 45x18mm | 小巧,功能等同 Uno | 空間有限的專案 |
| Arduino Pro Mini | 33x18mm | 更小,無 USB | 嵌入式裝置 |
| ESP32 | 依模組而異 | 含 WiFi + 藍牙 | IoT 互聯裝置 |
對於雷切作品,我最推薦 Arduino Nano — 小巧到可以藏進盒子裡,但功能完整。
開發環境
- 下載安裝 Arduino IDE
- USB 連接 Arduino 到電腦
- 選擇正確的板型和連接埠
- 撰寫程式(稱為 Sketch)
- 按上傳按鈕,程式就燒進 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;
}
組裝步驟
- 雷切所有外殼零件
- 焊接電路:先在麵包板上測試通過,再轉到洞洞板焊接
- 組裝底座和側板:用 finger joint 卡合
- 安裝 Arduino 和 RTC:螺絲固定在內部支架上
- 安裝 NeoPixel Ring:用雙面膠固定在前面板後方
- 穿線接線:注意線路整理
- 安裝按鈕:從外殼外側穿入
- 蓋上前面板(壓克力)和背板
- 插上 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 |
小結
雷切 + 電子元件的組合,開啟了一個全新的創作維度。你不再只是做一個好看的東西,而是做一個有功能、能互動的裝置。
入門路線建議:
- 先用 Arduino + LED 做一個簡單的發光作品(壓克力燈箱加上呼吸燈效果)
- 加入感測器,讓作品能「感知」環境
- 設計雷切外殼,把所有元件整合進去
- 嘗試更複雜的互動邏輯
最重要的一點是:先讓電路在麵包板上跑通,再設計外殼。我見過太多人先做了漂亮的外殼,結果電路裝不進去或功能不正常。
下一篇也是這個系列的最後一篇 — 我們要談談如何把雷切小物「商品化」。從設計考量到成本計算,從量產流程到販售通路,讓你的 maker 技能不只是興趣,也能成為一門小生意。