在業餘嗜好專案中添加運動和方向感測功能

不知道為什麼,我一直都喜歡打造與 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 Technology102010328 Seeeduino XIAO (圖 2)。XIAO 採用 AtmelATSAMD21G18A-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 度) 的時間點,然後讓「球」以固定速度朝對應的方向移動。接下來是針對慣性和加速度等數據建立精準的模型,然後運用這些功能來實作一系列遊戲。

重要的是,這些實驗第一次就成功,讓我有動力開始在其他專案中加入運動和方向感測功能,讓這些專案比以前更出色。那您呢?您是否有任何業餘嗜好專案?若專案具備偵測運動方式和方向的能力是否有所助益?

關於作者

Image of Max Maxfield

Clive "Max" Maxfield 在 1980 年從英國雪菲爾哈倫大學取得控制工程學士學位,自此開始擔任大型主機電腦中央處理單元 (CPU) 的設計人員。多年來,Max 已設計眾多元件,從矽晶片到電路板,以及腦電波放大器到蒸汽龐克風格的預知引擎 (別問) 等應有盡有。他更是電子設計自動化 (EDA) 領域的先驅,經驗超過 30 年。

Max 是許多書籍的作者和/或共同作者,包括《Designus Maximus Unleashed》(在阿拉巴馬州列為禁書)、《Bebop to the Boolean Boogie》(電子學的另類指南)、《EDA: Where Electronics Begins》、《FPGAs: Instant Access, and How Computers Do Math》。請瀏覽其 Max's Cool Bean 部落格。

More posts by Clive "Max" Maxfield
 TechForum

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

Visit TechForum