上周,我構建了一個LED立方體– 64個LED ,您可以對其進行編程以進行夢幻般的未來派燈光秀,而且我希望您也這樣做,因為它激勵您并擴展Arduino技能的絕佳項目。我為您提供了一些基本的應用程序,以幫助您進行思考,但是今天,我將介紹為多維數據集制作的更多軟件以及代碼說明。這樣做的目的不僅是為您提供更多運行的燈光秀,而且是為了了解對多維數據集進行編程的一些限制,并在此過程中學習一些新的編程概念。
這是一些相當高級的編碼。在自定義提供的代碼之前,您確實需要閱讀我以前的所有 Arduino教程和我們的初學者Arduino指南。
應用程序1:迷你蛇
我不想運行一套像蛇一樣的圖案序列,而是想對一條蛇進行編程,這是一種人工的蛇,它可以自己做出隨機選擇,而且完全不可預測。僅限于2個細分,我將在后面解釋,您可以在下面查看演示。在此處下載完整的代碼。
處理3D空間時,單個點需要3個坐標: X, Y 和 Z 。
但是,在我們的立方體中,X和Z平面由LED引腳表示,而Y直接由LED引腳表示。映射到陰極平面。為了方便使用這些坐標并弄清楚立方體周圍的運動,我創建了一個新的數據類型(使用結構)來表示立方體上的單個點,我稱之為“ xyz”。它僅由兩個整數組成:“ xz”和“ y”。通過這種結構,我還可以在下面的特殊(xz,y)坐標系中表示一個方向:
Y運動 (向上,向下):(xz,y + 1),(xz,y-1)
Z 運動 (向前,向后) :(xz-1,y),(xz + 1,y)
X運動 (左,右):(xz + 4,y),( xz-4,y)
例如,要將LED沿一個位置向左移動(0,0),我們應用(xz + 4,y) 并以(0,4)結尾。
對移動有一定限制-即Y坐標只能是可能的 0到3 (0是最底層,3是最上層),而XZ坐標只能是 0到15 。在Z軸運動上設置了另一個限制,以防止從立方體的后部到前面的“跳躍”,反之亦然。在這種情況下,我們使用模數函數測試4的倍數,并拒絕該移動嘗試。這是邏輯,用 valid()函數表示,如果建議的方向是可以接受的移動,則返回true,否則返回false。我添加了另一個函數來檢查反向 –也就是說,如果蛇正朝一個方向前進,即使它是移動到–和 move()《的有效位置,我們也不希望它向后退。/strong》函數,該函數將獲取坐標,方向并返回新坐標。
XYZ 數據類型, valid(), move()和 inverse()函數都可以在下載的 xyz.h 文件中找到。如果您想知道為什么將其放入一個單獨的文件而不是主程序文件中,那是由于一些復雜的Arduino編譯器規則阻止了返回自定義數據類型;它們必須放置在自己的文件中,然后在主文件的開頭導入。
在主運行時文件中,一個方向數組存儲了蛇可能做出的所有可能動作;我們可以簡單地選擇一個隨機數組成員來獲得新的方向。還創建了變量來存儲當前位置(現在),先前的方向和先前的位置。其余代碼對您來說應該是顯而易見的。只需f o r個循環,然后打開和關閉LED。在主循環中,我們檢查建議的方向是否有效,如果是,則按照這種方式進行。如果沒有,我們會選擇一個新的方向。
在主循環中唯一要指出的是一些檢查,以糾正我發現的涉及多路復用的錯誤:如果新位置在相同的陰極平面或相同的陰極平面上陽極引腳,關閉前一個LED會導致兩個LED都熄滅。也是在這一點上,我意識到在我當前的實現中,超越2段蛇形是不可能的:嘗試以角落布置方式點亮3個LED。您不能這樣做,因為激活2層和2個LED引腳后,將打開4個LED,而不是3個。這是我們有限的多維數據集設計固有的問題,但不必擔心:我們只需要使用視覺持久性以重寫繪圖方法。
視覺持久性意味著當光線順序到達我們的眼睛時(比我們能夠處理的快),它看起來像是一幅圖像。在我們的案例中,與其同時繪制所有四個圖層,不如繪制第一層,將其停用,繪制第二層并使其停用:這比我們知道發生任何變化的速度還快。這就是消息編寫者工作的原理,就像這樣:
使用視覺持久性的新繪制方法
首先,是一個新的繪制例程。我創建了一個 4 x 16二維數組(正確或錯誤)以表示LED立方體狀態的文字。繪制例程將通過簡單地對其進行迭代并將每一層刷新到立方體一小會兒來實現視覺的持久性。它將繼續以當前狀態繪制自己,直到刷新時間過去為止,此時我們將控制權傳遞回main loop()。我已將代碼的這一部分保存在此LED_cube_POV文件中,因此,如果您只想開始編寫自己的游戲,然后隨時使用它作為基礎。
應用2:Game of生活
現在,讓我們將其開發為Conway的《人生游戲》的基本版本。對于不熟悉(嘗試使用Google搜索來查找令人敬畏的復活節彩蛋動畫)的人來說,生命游戲是細胞自動機的一個示例,它創造了一種令人著迷的給出的行為只有幾個簡單的規則。
例如,這是螞蟻在智力和蜂巢的思想下如何運動的方式,盡管生物學事實表明它們實際上遵循非常基本的荷爾蒙規則。這是完整的下載代碼:按下 reset 按鈕重新啟動。如果發現自己反復出現相同的模式,請嘗試按住rest按鈕更長的時間。
此處是生命博弈的規則:
任何少于兩個活鄰居的活細胞都會死亡,好像是由人口不足造成的。
有兩個活鄰居的活細胞或三個活著的鄰居繼續生活到下一代。
具有三個以上活著的鄰居的任何活細胞都會死去,就像人滿為患一樣。
任何有三個活著的鄰居的死細胞都會變成
運行代碼。您會注意到,在5到10個“世代”內,自動機可能已經停下來,穩定在某個位置;有時,這種穩定的模式會改變位置并在木板上移動。在極少數情況下,它們甚至可能完全消失。這是只能使用4x4x4 LED的限制,但無論如何都是一個很好的學習練習。
解釋代碼:
您可能不熟悉 memcpy()函數。我用它來保存以前的游戲狀態,因為數組不能像普通變量那樣相互分配-您必須在內存空間中進行實際復制(在這種情況下為64位)。
howManyNeighbours()函數應該可以自我解釋,但如果情況并非如此,則此方法采用單個坐標,并遍歷每個可能的鄰居(與我們先前在蛇中使用的方向相同的數組)應用程序),以檢查它們是否有效。然后,它會檢查那些相鄰的LED在先前的游戲狀態中是否“點亮”,并計數有多少。
該“生活游戲”應用的主要功能是 progressGame(),這會將自動機規則應用于當前游戲狀態。
改進:到目前為止,我已經花了太長時間了,但是您可能想要嘗試添加一張支票,該支票在經過5代左右的相同模式后會自動將板復位。那請告訴我!我也建議您嘗試將POV方法添加到蛇游戲中,以期有可能使更長的蛇成為可能。
今天就是我了。我可能稍后會再訪問一些Arduino LED多維數據集應用程序,但希望您能夠修改我的代碼并創建自己的游戲規則:讓我們知道您在注釋中提出了什么,以便我們都可以下載您的創作!與以往一樣,我將在這里回答您的問題并捍衛我的可怕編碼能力。
責任編輯:wv
-
led
+關注
關注
242文章
23252瀏覽量
660588 -
Arduino
+關注
關注
188文章
6468瀏覽量
186958 -
立方體
+關注
關注
0文章
6瀏覽量
6413
發布評論請先 登錄
相關推薦
評論