在業餘嗜好專案中添加運動和方向感測功能
不知道為什麼,我一直都喜歡打造與 LED 有關的業餘嗜好專案。我常常這麼說:「看到 LED 閃爍,我就會流口水。」最近,我熱衷於在業餘嗜好專案中加入運動和方向感測功能。事實上,我才在 12 x 12 的乒乓球陣列中加入這個功能,每顆球都裝上一個三色 LED。
或許我應該從頭說起才是。大約在 2020 年春季,我和一位已經退休的工程師朋友透過電子郵件閒聊。他叫 David Humrich,住在澳洲。David 跟我說他買了一個小型的三色 LED 矩陣,問我可拿來作什麼。我在回信中貼上一則簡易毛毛蟲程式的短片,這是幾年前我在 8 x 8 的 LED 陣列上實作的程式。
幫 David 製作這則影片讓我想起一個被我「擱置」的專案,那就是打造更大的陣列。我看過一些非常有趣的乒乓球架構顯示器,因此我決定動手來做。首先,我買了一大袋物美價廉的乒乓球,並將這些球裝成一個 12 x 12 = 144 的陣列 (圖 1)。
圖 1:作者很驕傲地將 12 x 12 乒乓球陣列拿在手上,每顆球都有一個三色 LED (圖片來源:Max Maxfield)
在 LED 部分,適合此類型專案的最佳選擇是 Adafruit 的 WS2818 三通道 LED 驅動器式 NeoPixel,例如每公尺含有 30 顆 NeoPixel 的 1376 燈條。五公尺的燈條就可提供 150 個像素:其中 144 個用於陣列,一個作為電壓位準轉換器,另外五個備用。我將燈條以單像素為單位進行切割,然後在每個乒乓球背面貼上一個像素。
最後,再以蛇形 (之字形) 圖案佈線,將像素連接起來,從一個角落開始,然後在陣列上來回穿梭。實際上,如果您決定建構自己的陣列,像素的佈線順序並不重要,因為我們會將此陣列視為 12 列 (X 軸) 和 12 行 (Y 軸),兩個軸均從 0 至 11 進行編號,像素 [0,0] 則在左下角 (面向陣列時)。因此,要編寫程式來驅動陣列時,我們會加入一個稱為 GetNeoNum() 的函數。此函數允許將 X 值和 Y 值作為引數,經由演算法 (視陣列的佈線方式而定) 的演算,再傳回與燈條中像素對應的編號。
驅動陣列時,我需要一個記憶體夠大、時脈速度較快而且處理能力強大的微控制器,因為我打算實作一些有趣的效果,包括多彩漸淡效果。我選擇了 Seeed Technology 的 102010328 Seeeduino XIAO (圖 2)。XIAO 採用 Atmel 的 ATSAMD21G18A-MUT SAMD21G18 微控制器驅動,尺寸僅一張郵票大小,是 Seeeduino 系列中與 Arduino 相容且最小的微控制器開發板。此微控制器具有 32 位元 ArmCortex-M0+ 處理器核心,運作頻率為 48 MHz,並具有 256 KB 快閃記憶體和 64 KB 的 SRAM。
圖 2:容易用於試驗電路板的 Seeeduino XIAO,是 Seeeduino 系列中目前與 Arduino 相容且最小型的微控制器開發板,可為使用者提供功能強大的 32 位元 Arm Cortex-M0+ 處理器,運作頻率為 48 MHz。(圖片來源:Seeed Studio)
XIAO 有 11 個引腳,每個都可以作為類比輸入、數位輸入或數位輸出使用。其中 10 個引腳可支援脈寬調變 (PWM),且有一個引腳配備數位類比轉換器 (DAC),因此可提供真正的類比輸出能力。此外,若有需要,引腳 4 和 5 可用於支援 I2C 介面,引腳 6 和 7 可支援 UART 介面,引腳 8、9 和 10 則可支援 SPI 介面。
正如前面所提及,我最近喜歡在嗜好專案中加入運動和方向感測功能。我決定試驗一次,將這項功能加入我的 12 x 12 乒乓球陣列中。
我想到的是用一個小型分接板 (BOB) 搭配備微機電系統 (MEMS) 感測器,而感測器中包含三軸加速計、三軸陀螺儀和三軸磁力計。我很快就發現,若想嘗試操控並理解感測器的原始資料,其中所牽涉的複雜度遠遠超乎我的能力所及。所以我改用 Adafruit 的 2472 BOB,其採用 Bosch 的 9 自由度 (DoF) BNO055 感測器。
圖 3:除了三軸加速計、三軸陀螺儀和三軸磁力計之外,Adafruit 2472 BOB 的 BNO055 感測器還包含一個 Arm Cortex-M0 處理器,可執行感測器融合。(圖片來源:Adafruit)
此 BOB 透過雙線 I2 C 介面與 XIAO 微控制器進行通訊。BNO055 的優點在於含有一個 32 位元的 Arm Cortex-M0+ 處理器,可擷取三個感測器的原始資料、執行精密的感測器融合,然後以我可用的形式提供我需要的資料。如這段影片所示,初次試驗時我先水平拿著陣列,然後將陣列傾斜,讓「球」(像素) 在顯示器上四處「滾動」。
結論
初次試驗的表現比我預期的好很多,但實際上,試驗本身非常簡單。我只不過是偵測陣列傾斜度超過特定值 (目前設定為 10 度) 的時間點,然後讓「球」以固定速度朝對應的方向移動。接下來是針對慣性和加速度等數據建立精準的模型,然後運用這些功能來實作一系列遊戲。
重要的是,這些實驗第一次就成功,讓我有動力開始在其他專案中加入運動和方向感測功能,讓這些專案比以前更出色。那您呢?您是否有任何業餘嗜好專案?若專案具備偵測運動方式和方向的能力是否有所助益?

Have questions or comments? Continue the conversation on TechForum, Digi-Key's online community and technical resource.
Visit TechForum