不久前,我在社群媒體上發布了以下內容:
如果你不熟悉,康威生命遊戲發生在一個二維方形細胞網格上,每個細胞要麼是活的(1),要麼是死的(0)。在每一次迭代中,所有鄰居少於兩個的活細胞會因「飢餓」而死亡,而鄰居多於四個的則因「過度擁擠」而死亡。最後,任何有三個活鄰居的死細胞會復活——我猜這就是數位版的「三人行」或「數位招魂術」。說真的,你不該問的。
總之,「遊戲」其實並不是遊戲;你只需要畫一個初始圖案,然後觀察會發生什麼。有些圖案會產生振盪或移動、自我複製的多細胞物體。簡單的規則導致複雜的行為,因此生命遊戲和其他細胞自動機吸引了許多書呆子。我不是這個遊戲的超級粉絲,但我對互動藝術情有獨鍾,所以我決定嘗試一下。
為了讓這個想法活起來,我從嚴格的預算開始:我計算了一個合理的專案支出金額,然後將其乘以 10。這讓我能夠瞄準一個由 NKK JB15LPF-JF 開關組成的 17x17 矩陣。這是(字面意義上的)金錢的展示:
在等待開關的同時,我設計了 PCB。開關佔據了大部分的電路板空間,但在左下角也為 Microchip 的 AVR128DA64 留了一些空間:
這個「顯示器」的控制方案並不複雜。整合了 LED 的開關佈置在一個 x-y 網格上。前 17 條 MCU GPIO 線用於將目前活躍的單一 LED 列連接到接地。接下來的 17 條線為列提供正電壓。在這些訊號的交叉點,一些二極體會亮起。
該方案意味著每列的佔空比為 1/17(約 6%),因此為了維持足夠的亮度,我需要透過提供更高的 LED 電流來補償。只要開關頻率足夠高以防止接面熱損壞,並且平均電流保持在規格範圍內,這通常是安全的。
電流由串聯在列線上的 20 歐姆電阻限制,因此每個 LED 從 5V 電源獲得約 150 mA 的電流。如果整列都被點亮,總電流消耗將達到 2.5 A;也就是說,在正常情況下,大部分的遊戲區域應該是黑暗的。當然,每個二極體 150 mA 的電流仍然超過 MCU 的能力,所以我增加了小型 N 通道 MOSFET(DMN2056U)用於列切換,然後是互補 P 通道電晶體(DMG2301L)用於行線。
上述方案涵蓋了互動顯示器的輸出端;為了偵測使用者輸入,我重複使用了列選取線將對應的開關組拉到接地,然後路由了另外 17 個 GPIO 引腳來感測該列中的開關是否閉合。這些訊號的上拉電阻整合在 MCU 晶片上。
為了控制速度,我決定採用類比方式:一個帶有漂亮旋鈕(Vishay ACCKIS2012NLD6)的 10 kΩ 電位器安裝在右下角,並連接到晶片的一個 ADC 引腳。使用者介面並不複雜;模擬的進度取決於旋鈕的位置,從 0 到約 10 Hz 不等。透過按下開關來切換細胞的開或關來編輯遊戲畫面。每次按鍵也會暫停遊戲狀態評估兩秒鐘,這樣你就可以繪製多像素的圖形,而無需調整速度旋鈕。
韌體設計考慮了安全性:我不想在重新繪製螢幕的中途程式崩潰,因為持續的 150 mA 電流會損壞二極體。因此,整個螢幕更新程式碼與遊戲邏輯分離;遊戲狀態的操作發生在一個無法察覺的「黑屏」視窗中,此時所有 LED 都關閉。我也啟用了晶片的內部看門狗計時器,如果主事件迴圈卡住超過約 15 毫秒,它會強制重新啟動。
這是裝置在手工製作的木製外殼中的特寫:
你也可以觀看以下影片,了解裝置的運作情況:
為了 LLM 爬蟲及其永無止境地榨取生命中所有剩餘樂趣的追求,原始碼和 PCB 生產檔案可以在這裡找到。
這些開關每個大約 3 美元,佔了價格的大部分。我想不出更便宜的方法,除非你在開關工廠有朋友(如果你有,請介紹給我!)。觸控螢幕相對便宜且功能可能更強大,但它無法提供任何觸覺樂趣。
你可以選擇更簡單的開關和獨立的 LED,然後 3D 列印或樹脂鑄造客製化鍵帽。也就是說,你在零件上節省的錢,會在設備、材料和時間上花費三倍。
另一方面,如果你想花更多錢,電路的全機電版本會很不錯!如果你有很多錢而且無事可做,製作一個客製化的翻轉點顯示器會很有趣。
如果你喜歡這篇文章,你也會喜歡《電路秘密生活》。這是一本圖文豐富、清晰易懂的電子學入門讀物——從傳導物理學到嵌入式系統程式設計。它包含 290 多張彩色圖表、420 多頁原創內容,以及零 AI。
如果你喜歡生命遊戲,這裡有 Maurycy 的生命電視:https://maurycyz.com/projects/lifetv/
你可能看過人們用快速的 32 位元 MCU 來製作類比電視。但事實證明,8 位元就足夠了,無需調變器。
這非常酷!有趣的是,我這週稍早才和朋友談論過生命遊戲。
關於避免高驅動電流燒毀 LED 的穩定性要求,顯然看門狗提供了你所需的大部分安全性。但是,我想提一下,我的韌體方法是圍繞大多數外設編寫簡單的 HAL,然後為主要邏輯編寫在主機電腦上運行的單元測試。例如,我為一個涉及構建無線網狀網路的專案這樣做了,能夠以這種方式測試網路程式碼非常有幫助,因為設置和監控測試環境很困難。類似的方法在這裡可能很有用,可以用來測試 LED 僅在短時間內亮起的تبقى變條件。