我們開課囉!
本月開設新課程 TD102 | TouchDesigner 102 - TOP 圖像處理與混合模式 以及 ISC-01 | 互動感知工作坊 - 光達、深度、體感與紅外線,歡迎報名參加~
⭑⭑⭑⭑⭑⭑⭑⭑⭑⭑⭑⭑⭑⭑⭑⭑
用水果也能做互動裝置!這篇教學教你用 ESP32 製作能感應到有機物、導電物是否有被觸碰到,並控制聲音與影像的作品,不會寫程式也學得會,適合藝術家與設計師。
觀念介紹 你是不是也曾看過那種,碰一下水果或某種物件就能發出聲音、讓燈亮起來或畫面改變的互動裝置?這類作品總是能讓人眼睛一亮,讓原本生活中不具有觸發功能的物件被賦予了新的功能,充滿趣味和驚喜。但其實這類互動作品實現起來比想像中簡單很多,且現今市場上已有許多現成的產品可以完全支援這類應用,例如 Playtronica 推出的 Playtron、Biotron,或是 Bare Conductive 的 Touch Board。但這些設備的價格較高,並不一定適合每個人。
今天這篇教學將會教大家如何使用價格親民的 ESP32 開發板,並搭配 TouchDesigner 來打造一個能賦予各種導電物體觸碰功能的互動裝置,而這套系統也不僅限於聲音互動,還可以用來控制投影的影像變化、燈光亮度等,能輕鬆實現觸碰感測並將其應用在各種互動呈現!
在製作這類互動裝置時,大家應該會先想到 Arduino 系列開發板,這的確是入門學習最常見的選擇,且教學資源非常豐富,不過市面上其實有很多其他類型的開發板可供選擇。像大家最常用的 Arduino Uno,其實它的效能和 I/O 引腳數量有限,因此在功能擴展上可能有所局限,相比之下,ESP32 開發板( 例如常見的 NodeMCU32 或 ESP32 DevKit )提供更多的 I/O 引腳,效能更強,並且價格相對親民,而且在功能上 ESP32 還內建了 Wi-Fi 和藍牙功能,也內建了電容感應引腳,而電容感應便是我們今天實現互動作品的核心。
那甚麼是電容感應呢?簡單來說,它會偵測腳位周圍的電場變化。當我們把一條杜邦線接從 ESP32 的觸控腳位,接到一個導電物體時( 例如水果、金屬片 ),這整個物體就變成了一個「感應天線」。平常它有一個固定的電場狀態,但當你的手靠近或碰到它時,人體也會帶著一點微弱電場,這時 ESP32 就會偵測到這個變化,知道「有人碰了」。它不是用壓力、不是用熱,而是用電場變化來感應觸碰。所以這種感測方式甚至能做到近距離的非接觸感應, 例如你可以把一片鋁箔接到 ESP32 的觸控腳位,鋪在一片 1 公分厚的木板下方,這樣鋁箔就像一個「隱藏的感應天線」。當手指靠近木板上方、接近鋁箔的位置,即使沒有真的碰到,也一樣能被感測到。
當手指靠近導體時,會改變電場分佈,觸控感測器就能偵測到這個變化。
什麼是開發板?為什麼要用到它? 你可以把開發板想像成是一間工廠的「主控制室」 ,它負責指揮所有的感測器、線路、元件協同工作,讓你能掌控整個互動系統的運作。
我們來用一個大家熟悉的例子 —— USB 網路攝影機( Webcam ) 。這類產品就像是一間已經設計好、建造完成的工廠 ,你只需要插上 USB 線,電腦就能直接接收影像訊號,因為所有功能早就內建、整合完畢。
但如果你今天想打造屬於自己的互動裝置,需要自己「蓋一間工廠」時,你會需要三種角色:
開發板 :就像是「工廠的主控制室」,會依照你的指令控制每個設備、處理資料。
感測元件 :像是「工廠的核心生產機器」,負責偵測資訊( 如溫度、觸碰、加速度 ),像 Webcam 的的核心感測元件就是他的鏡頭。
線路與元件 :像是「工廠的水電、輸送帶與機構」,負責傳輸訊號與穩定運作,像是線路、麵包板、通用電路板、電阻、電容等等。
而你寫在電腦裡的程式,會經過燒錄後送到開發板裡,就像是你把「工廠的營運手冊與生產流程圖」交給主控制室。開發板拿到後,才知道什麼時候啟動設備、收資料、發出反應。
純就互動創作這個領域來說,開發板是一個非常方便的工具,雖然技術門檻稍微高了一些,但可以應用的範圍非常多,主要對於創作有以下兩個情境會需要用到開發板:
現有的完整設備套件並沒辦法達成創作所需的互動需求,就算有對應感測的設備,大多也只能與特定的軟體進行通訊、資料傳輸,無法將這些資訊接入互動開發的軟體去進行應用與創作,例如環境光、溫度感測等就屬於這類。 有能達成互動需求的設備,但價格上不太親民,難以入手。例如要做特定物件的三軸陀螺儀角度測量,可以買 HTC VIVE 的設備,整套數萬的價格並不是非常親民,若不是需要非常精準的空間定位,而是只要感測旋轉角度的話,搭配開發板與 IMU Sensor 就能達到步錯的成效,價格也可以控制在數百元內。 那其實也有處於中間,半開發半完整成品的設備,在操作上也是需要一定的技術門檻,有些會是電路設備完整給你,通訊的方式也有手冊給你,但設備與電腦間的通訊通常要自己寫編解碼才能串起來。
為何還要使用 TouchDesigner? 其實只用 ESP32 就可以獨立完成一個包含感應與發聲的互動裝置,但對初學者來說,若直接使用 ESP32 播放聲音,會需要額外接喇叭、DAC 模組、甚至還得從 SD 卡讀取音訊檔案,整體電路與程式會複雜許多。
相比之下,若搭配電腦使用 TouchDesigner,不但可以大幅減少程式撰寫與接線的難度,還能直接使用電腦的音效裝置( 例如喇叭、聲卡 )播放聲音,讓整個流程簡化許多,也更容易與其他軟體( 如 Ableton )整合,互動上也有更多呈現可以玩( 控制螢幕影像的變化等 ),適合想快速完成互動作品或對軟體與電路不熟悉的創作者使用,對想控制其他軟硬體的創作者也是最合適的選項。
準備物品 準備物品
數量
價格區間
ESP32 開發板
1 組
約 NT$140~260
USB 傳輸線
1 條( Type-C 或 Micro-B,視板子而定 )
約 NT$50~150
杜邦線( 公對公 )
1 包( 20cm × 10 條 )
約 NT$10~40
小麵包板
1 個
約 NT$15~60
各種觸發物
一個板子最多接8個
視個人
其實大家會發現,要準備的物品不多,而且有機會在 NT$300 內搞定一整組開發硬體 。不過要特別注意幾點:
開發板的型號與引腳排列 : 因為 ESP32 開發板的型號非常之多,彼此的引腳數量和排列都有些微差異,不熟悉者可能會很容易搞混,一律初學者建議選擇 NodeMCU-32S,本篇教學也會以此型號的板子做示範。
左為 ESP32 DevKit,共 30 個引腳;右為 NodeMCU32,共 38 個引腳
USB 接頭類型 :不同版本的板子使用的 USB 傳輸線可能是 Micro-B 或 Type-C,另外是不是 3.0 也會有所區分,但基本上最常見的是非 3.0 的 Micro-B( 紅框標示 ),購買前請先確認板子的接頭是哪一種。
麵包板 :因為電路非常簡單,可以直接板子接公對母的杜邦線,母頭接板子的引腳,公頭拿來固定在導電物上。但用麵包板整個裝置可以比較穩地放在桌子上,還是建議要購買,另外也有杜邦線一端是鱷魚夾的版本,可直接夾在物體上。
左為使用麵包板 + 公公線;右圖為直接使用公母線的母端接引腳 有鱷魚夾的杜邦線
觸發物: 那整個互動裝置最重要的就是觸發物了,依據不同的物體可以陳述不一樣的故事內容或是不同的主題呈現,這就可以按照創作者的思考去設計了。那到底有哪些東西可以做為觸發物呢?基本上各種具有導電性或能影響電場的物體都能來進行觸發。常見可用的材料包括:
水果與蔬菜 :例如蘋果、香蕉、馬鈴薯等,因為內含水分與電解質,導電性良好植物與花草 :如多肉植物、綠葉等含水植物,非常適合拿來做一些大自然主題的作品金屬與導電物品 :如鋁箔、銅片、鐵釘,導電性強,靈敏度高。也看過別人接吉他的琴弦導電塗料與墨水 :例如導電漆、導電筆畫出的圖案,適合設計成可觸碰的界面或繪畫作品相對地,一些非導電材質如乾燥的塑膠、木頭、玻璃或紙張 ,由於無法導電或影響電場較小,不太適合作為感應材料。但這些材質仍然可以作為感應點的外層包覆物,例如你可以把鋁箔貼在木板背面,透過非接觸方式偵測手指是否靠近特定位置。
像我就準備了香蕉,準備製作香蕉琴! 開發環境設置 延續工廠的舉例,若是要將你對工廠的安排與設計傳送給管理室的話,就必須要在電腦中安裝開發工具,才能將程式燒錄進開發板中,這邊會介紹初學最常見的 Arduino IDE。
下載開發工具(IDE) 到 Arduino 的官網下載並安裝 Arduino IDE(
https://www.arduino.cc/en/software/ ),選擇自己電腦系統的版本。
下載完後點開後就可以看到開發的初始介面,以下會介紹幾個常用的功能和區域,首先看到最大面積的就是寫程式的區域,當我們建立一個新的程式時,會自動出現兩個基本函式:
setup()
:程式啟動時只會執行一次,常用來設定初始化的內容,例如開啟序列埠、設定腳位模式等。loop()
:會不停重複執行的區塊,互動邏輯、感測器資料讀取、LED 控制等都會寫在這裡。左上角的按鈕,「✓」是編譯程式,「→」是上傳到程式到開發板,若程式還未編譯過直接按上傳也會自動幫你先編譯。
右上角的兩個按鈕都是序列埠監控視窗,心電圖 icon 的點開後可用波型的方式觀察板子的序列輸出,放大鏡的則是最常用的監控方式,可直接看序列埠的文字輸出。
左側一排有五個 icon,初學者比較會用到的是由上往下數的第二個跟第三個,第二個是開發板管理員,第三個是程式庫管理員,這兩個名字很接近,常讓初學者搞混,其實它們的功能非常不同,你可以把它們想成:
開發板管理員 :安裝「硬體支援」 → 讓 IDE 認得你接的板子。負責幫 Arduino IDE 安裝「各種開發板的支援套件」,讓你可以選擇 ESP32、ESP8266、STM32、Seeeduino 等不同廠牌的板子來開發程式庫管理員 :安裝「軟體工具包」→ 可直接使用的各種軟體工具。提供各種已寫好的軟體函式庫(Library),幫助你操作感測器、顯示器、網路、MIDI、觸控、Wi-Fi 等功能
那接下來我們要做的第一件事,就是要讓你的電腦能夠開發 ESP32,先點左上角的檔案,選擇喜好設定,將https://espressif.github.io/arduino-esp32/package_esp32_index.json
複製進「其他開發板管理員網址」中。
接著馬上就用到開發板管理員,點開之後在上面搜尋 ESP32,可以一次把兩個都安裝起來,但其實要使用 NodeMCU-32 的話,下載下面由 Espressif 提供的就好,這樣我們在 Arduino IDE 上的設置就完成得差不多了!
確認硬體連線與驅動 在正式開始寫程式之前,我們要先確定硬體連線是否正常。現在可以把開發板接上去電腦,然後開啟 Windows 的裝置管理員 ( Device Manager ),檢查「連接埠( COM & LPT )」底下是否出現開發板的序列埠。大多數開發板所用的 USB↔UART 晶片為 CH340 或 Silicon Labs CP210x ,那通常購買資訊也會寫他傳輸晶片是甚麼。
若是 CP210x ( 如 CP2102/CP2104 ),在 Windows 上通常不需另外安裝驅動 ,可以直接辨識 若是 CH340 晶片,部分電腦可能會顯示「⚠ 驚嘆號」,必須安裝 CH340 驅動後才會出現 COM port 以下是這兩種晶片驅動的官方下載連結:
CH340 驅動( Windows / macOS / Linux ) 那其實像 Arduino Uno 的話就不會這麼麻煩,接上後在裝置管理員會直接看到 Arduino Uno( COMx )。
從圖中可以看到,這張開發板是 CP210x 的晶片
從圖中可以看到,這張開發板是 CP340 的晶片
那看到 COM 的號碼後先記著,我們接著回到 Arduino IDE 做最後一步!我們到左上角點開列表,這裡是硬體和連接埠的選單,通常 ESP32 開發板第一次接上去時會是顯示未知,我們這時就要點你開發板的 COM 號碼之後,再去左邊的蒐尋找「node…」,並點選「Node32s」,我們就能夠上傳程式到開發板,並接收開發板回傳給電腦的訊息了!
測試與 TouchDesigner 的連線 這邊直接複製這個超簡單的程式並上傳就好。
void setup() {
Serial.begin(115200); // 開啟序列通訊,設定傳輸速率
}
void loop() {
Serial.println("Hello TD"); // 傳送字串到序列埠
delay(1000); // 每 1 秒送一次
}
編譯中…
編譯完正在上傳,可以看到左邊視窗有 % 數進度
完成!可以開始測試了
上傳完之後可以先點右上角的序列埠監控,下方就會跳出視窗,並在右方選擇正確的鮑率( 115200 ),也就是在主程式setup()
當中設定的數值。接下來我們就可以去 TD 中看有沒有順利接收到。
接下來我們就可以去 TD 中看有沒有順利接收到,打開 TD 後在 DAT 中選擇「Serial」,在 Port 中選擇正確的 COM 號碼,並設定正確的鮑率,也就是 Baud Rate 就能接收到訊號了!
接收到訊號了!
💡
另外要特別注意 ,因為這個傳輸是單通道的,所以 Arduino 的序列埠監控視窗、TD 的 Serial 接收 OPs、還有上傳程式,這三件事是不能同時開啟的!所以你在 TD 中開 Serial,選對鮑率和 COM 卻還是連不到,可以先檢查是不是 Arduino IDE 的序列埠監控視窗沒關掉;若在上傳程式時發現有報錯,一樣可以檢查 TD 的 Serial 是不是開的,只要把 Active 先關掉就能正常上傳程式了!
可以看到把監控視窗關閉,便不會占用傳輸通道,板子的訊息就能傳給 TD 了!
完整作品開發步驟 1. 撰寫程式 撰寫使用 touchRead()
去偵測特定 Touch Pin 的數值,並定時將訊號以 Serial 回傳。範例如下,直接接上板子上傳即可:
/*******************************************************
T0:GPIO 4
T3:GPIO 15
T4:GPIO 13
T5:GPIO 12
T6:GPIO 14
T7:GPIO 27
T8:GPIO 33
T9:GPIO 32
*******************************************************/
#define TOUCH_PIN_0 4 // ESP32 Pin D4
#define TOUCH_PIN_3 15 // ESP32 Pin D15
#define TOUCH_PIN_4 13 // ESP32 Pin D13
#define TOUCH_PIN_5 12 // ESP32 Pin D12
#define TOUCH_PIN_6 14 // ESP32 Pin D14
#define TOUCH_PIN_7 27 // ESP32 Pin D27
#define TOUCH_PIN_8 33 // ESP32 Pin D33
#define TOUCH_PIN_9 32 // ESP32 Pin D32
// 將所有觸控感測腳位的編號放進一個陣列,方便用迴圈一次處理
const int touchPins[] = {
TOUCH_PIN_0,
TOUCH_PIN_3,
TOUCH_PIN_4,
TOUCH_PIN_5,
TOUCH_PIN_6,
TOUCH_PIN_7,
TOUCH_PIN_8,
TOUCH_PIN_9
};
void setup()
{
Serial.begin(115200);
delay(1000);
Serial.println("電容感測開始");
}
void loop()
{
// 以迴圈去順序讀取每個電容引腳的數值並輸出成字串
for (int i = 0; i < 8; i++) {
Serial.print(":");
Serial.print(touchRead(touchPins[i]));
}
Serial.println();
delay(50);
}
為甚麼會少了 T1 、T2 呢?雖然 ESP32 有 10 個觸控腳位,但其中的 T1 和 T2 會影響板子開機,所以我們通常只用其他 8 個比較穩定的腳位來做互動。
在這個程式裡,我用 Serial.print()
和 Serial.println()
來將感測數據傳送到電腦,其中 Serial.print()
是單純「寫下一段文字」,而 Serial.println()
則是「寫完後順便按下 Enter」,也就是會在輸出內容後自動換行。這樣做的好處是可以讓每次感測到的一整組資料,都像一行一行地排列好,讓電腦可以準確地讀取。舉例來說,我用迴圈一次讀取 8 個觸控腳位的數值,並用「:」分隔,這樣在 TouchDesigner 裡我就可以把每一行的資料拆成 8 格,剛好對應 8 個感測點。透過 Serial.println()
的換行,每組資料就是一個「單位」,在 TD 裡也可以搭配「One Per Line」的設定,把這些資料變成一格一格的表格呈現。
如果這樣還不好理解,我們可以延續工廠的舉例來想像。工廠有 8 台感測機器( 對應 8 個 Touch Pin ),輪流量測不同位置的狀況。每次測完一輪,會把這 8 個數字分別封裝進不同箱子( 透過冒號去切分Serial.print(":")
)並依序排好,這些箱子裝好之後( 透過 println()
換行 ),就會送上一台貨車,出貨到電腦端( 也就是送進 TouchDesigner )。在電腦那邊看到的,就是一箱一箱整齊的資料,能夠被輕鬆拆解、運用,不會混在一起。
⚠️
可以特別注意,在程式與 TD 中的「冒號」,統一打英文的半形就好,以避免出現編碼問題
2. 接線與實體設置 接下來就是將杜邦線接到 ESP32 上具備電容觸控功能的腳位,電容觸控腳位的位置需參考下圖的引腳分配圖。接上電容腳位後另一端則連接到你想感測的物體,例如水果、金屬片等,這些具導電性的物品會成為觸控感應點。為了讓杜邦線與物體之間的接觸更穩定,可以考慮使用透明膠帶將線材固定在表面,避免晃動或脫落影響偵測效果。
將板子接上麵包板後,左右會個空一排可以接線,以這張圖為例,我目前就是接在對應上圖引腳分布的 TOUCH4
我的開發板範例程式與 TD 的接收雖然寫滿了八通道的傳輸,如果是直接用我的範例程式,在使用上可以不用接滿,在 TD 端中去對應的 channel 拉數值即可,其他沒接不會影響運作。
直接把杜邦線公頭插在水果上就可以了
3. TouchDesigner 串接與資料處理 接下來就是用 TD 的 Serial 去接數值了,接到數值後再做資料處裡,並將表格的數值轉換成 CHOP,整串流程如下圖:
接下來我會逐步拆分該怎麼做,基本上就是:接收 ESP 資料 → 做切分資料處裡 → 以表格形式做成 DAT 資料 → 轉成 CHOP。
1. 選擇正確的 COM 和 Baud Rate,並確定 Row/Callback Format 是 One Per Line,要有正確的 COM 和 Baud Rate 才能跟板子對接做資料傳輸,而 Row/Callback Format 是接收板子訊號時,如何接資料並處理的邏輯,One Per Line 的意思是每「行」資料都是一筆,技術上來說就是,我每讀到一個換行符 TD 就會創一個新的 row 去存下一筆資料直到在一個換行符進來為止。
2. 將 Maximum Lines 設定成 1 行,我們不需要同時有這麼多行的資料暫存。
3. 資料接上 convert,並在 Split Cells at 打上「:」,用以切割資料。那這邊再次提醒,開發板程式跟 TD 中統一打半形的冒號就好,或要用其他任何的字母或符號其實也都可以,只要兩邊有統一,且與傳輸的其他資料不會衝突就沒問題,例如你不能以「1」作為切分字符,因為整筆傳輸的數據中,數字 1 可能會作為感測器的數值出現,會讓整個數據無法被正確的分割與解包。
4. 建立表格,可以按右下角的十字編輯,右鍵點行列可以做增減,這個表格的用意是讓資料在 TD 中能有命名,在轉成 CHOP 的時候,這串表格就是每個 channel 的名字。
5. 將原本的資料刪除第一行與第一列,從 convert 接出來並用 select 選取就好,並與 table merge 在一起。
6. 使用 transpose 將表格轉置,變成直的,接著用 datto 就能轉成CHOP了!
節點操作示範影片
7. 那我的範例是很簡單的使用 Math 去搭配 Triger,原本的電容數值初始是會是一個 110~80 的值,在觸碰後會是0~20左右的值,我這邊就先用 math 讓他先乘 -1 再減 100,這樣在初始時就會是比較小的數,觸碰時就會變成一個瞬間衝到 70、80 以上的狀態,這樣就能接上 trigger 並設定閥值去判定是否有被觸發。那你也可以用這個變化的數值去控制其他 TD 當中的物件,例如影像的座標、旋轉等,或是其他訊號。
8. 最後使用 trigger 的數值去觸發音檔的播放就可以了!
9. 最終成品:
⚠️ 注意:不同 Touch Pin 靈敏度不同,接上不同物體後,初始值也會各自變得不一樣,可以接多個 trigger 去個別調整。
範例程式:
延伸 雖然本篇教學介紹的是在硬體與軟體整合上最基礎、也最容易上手的版本 ,但其實觸碰感測的作法遠不只一種,從感測方式、使用的開發板、程式邏輯,到串接的軟體工具都有非常多種組合與變化。想要讓一個裝置能夠偵測觸碰,絕對不是只有一種作法,也沒有「唯一正解」。
舉例來說,在感測器的選擇上,除了使用 ESP32 內建的電容觸控腳位之外,也可以參考像是 MPR121 (支援多點觸控)、TTP223 (單點模組)這類外接感測器,甚至還有一些專為展覽或互動裝置設計的模組化感測器,例如環狀觸控模組、感應片等等。不同的方案各有特性,會影響使用的程式方式、支援腳位數量、靈敏度與抗干擾能力。最終的選擇,取決於你作品的需求與場地條件 —— 沒有最好的感測器,只有最適合的感測器。
另外,除了將導線接到水果、金屬或其他可觸碰物體上,其實也可以利用「鋁箔」這類扁平、容易延伸的導電材料,製作出隱藏式的感測裝置 。鋁箔因為表面積大、導電性強,非常適合應用在需要「非接觸式觸控」的場景。
舉個例子,如果你希望觀眾「靠近牆面」或「手指靠近展板某區域」時就觸發互動,但又不想讓裝置明顯外露,可以將一大片鋁箔貼在木板或壓克力板的背面,並將它接到 ESP32 的觸控腳位。藉由鋁箔延伸出來的電場,只要手指接近(甚至 不需要真正觸碰到 ),就會讓電容值改變,進而被偵測出來。
實測上,如果鋁箔夠大,即使隔著 5~10 mm 的塑膠或木板也能偵測到手的接近 ,這就讓互動方式變得更彈性,也更適合用於展覽、展示板、互動式牆面等場域。這種方式也可以結合裝潢或作品外觀設計,讓互動「藏起來」,但仍保有靈敏的感測效果。
延伸一個實務上常見的問題:當作品的體積或展場面積變大 ,從開發板拉出來的接線(例如連到水果或金屬片)長度也會拉長。以 ESP32 的觸控感測來說,經過實測,使用一般杜邦線或單芯線在長度 1 公尺左右 通常仍可穩定運作,但若距離再拉長,靈敏度可能會下降,甚至產生誤觸或完全無法感測的情況。這時可以考慮加大感應端的面積(例如更大的鋁箔)、增加對地電容、或改用外接感測模組來改善穩定性。
Refer
⭑⭑⭑⭑⭑⭑⭑⭑⭑⭑⭑⭑⭑⭑⭑⭑
Luxmin Institute 互動研究院 策劃了一系列關於互動體驗技術、科技藝術與多媒體整合為核心的主題課程、工作坊、社群、聚會,以及 TXRX 互動體驗大會