龔瑩瑜 謝作如
川劇變臉是川劇的特技之一,演員在舞臺上的一抬手一提足,臉上的面具都可能發生翻天覆地的變化,滿滿的神秘感、震撼的舞臺效果,都給了觀眾不一樣的體驗。
偶然間看到DFRobot社區的一個表白神器——跳動的心(如圖1),一個火柴盒大小的點陣屏,非常適合作為送給女友的小禮物、小伙伴的愛心玩具等。這個創意讓我心動,也引發了我的思考:點陣屏能夠畫出愛心,那能不能繪制出臉譜呢?
● 器材和原理
創客空間剛好有盛思的Duinoplus box實驗箱,這款教學套件整合了8×8的點陣屏(如圖2),很適合做變臉的研究。所謂的8×8是指點陣屏由8行8列的LED組成,共有64個點組成,可以顯示簡單的圖形。
這款點陣屏不僅可以用X、Y來定位,精確控制某一個LED的狀態,也可以用行、列賦值的方法,給某一行寫一個參數,以點亮相應的LED。行賦值的代碼以二進制為基礎,每一行對應的是8位二進制,左邊的位高,右邊的位低(如圖3),賦的值是該行所有亮的點對應值之和。如果給第一行賦值1(十進制),則最右邊的LED亮,其他都暗;賦值255,則所有的LED亮。因為十進制的1對應的二進制數為“00000001”,255對應的則是“11111111”。
為了更好地理解行賦值,需要先學習二進制。二進制是逢2進位的進位制。0、1是基本算符。二進制數據也是采用位置計數法,其位權是以2為底的冪。最后一位是2的0次冪,倒數第二位是2的1次冪,以此類推。
所以把二進制化成十進制只需要將數值乘以2的冪次相加即可。例如,把二進制11111111轉化為十進制,*1+*1+*1+*1+*1+*1+ *1+*1+*1=255。
知道了如何點亮點陣屏后,又一個問題來了——如何用點陣屏顯示圖片呢?其實位圖都是由像素點組成的,只是平時我們看到的圖片像素點很多,而且像素點又很小,所有我們看圖片的時候很難發現。如果把圖片一直放大,就能發現圖片上出現了馬賽克一樣的方格,這就是像素點。所以點陣屏上的這64個點就相當于“像素點”,而我們要做的就是利用這些像素點繪制出不同的臉譜。
● 繪制臉譜
知道了點陣屏的點亮方法和繪圖的原理之后,接下來我們就可以在點陣屏上開始繪制臉譜了。
打開Excel,模擬點陣屏的排布建立一個8×8的表格。然后,在表格中確定圖案所對應的單元格位置,然后求出每行所對應的值。如圖4中畫出的是一張笑臉。
觀察圖4可知:
第0行:*0+*0+*0+*0+*0+*0+ *0+*0+*0=0。
第1行:*0+*1+*0+*0+*0+*0+ *0+*6+*0=66。
第2行:*1+*0+*0+*1+*0+*0+ *1+*0+*1=165。
第3行:*0+*0+*0+*0+*0+*0+ *0+*0+*0=0。
第4行:*0+*0+*0+*0+*0+*0+ *0+*0+*0=0。
第5行:*0+*0+*1+*0+*0+*1+ *0+*0+*0=36。
第6行:*0+*0+*0+*1+*1+*0+ *0+*0+*0=24。
第7行:*0+*0+*0+*0+*0+*0+ *0+*0+*0=0。
確定了每行所對應的值后,就可以開始點亮點陣屏了。每個臉譜都由8行點陣組成,為了讓代碼能簡潔明了,我們用8個長度的數組來存儲點陣屏中每行所對應的值。然后,利用循環語句對數組中的各個值進行讀取,把這些值賦給對應的行,讓點陣屏上顯示笑臉。同理可以繪制其他的臉譜,如圖5所示的三組數字,分別代表笑臉、哭臉和無表情的臉。
● 實現變臉
準備工作完成了,接下來我們開始編寫代碼,以便控制點陣屏實現“變臉”的過程?!白兡槨钡墓ぷ髁鞒倘缦拢寒敵绦蜷_始運行的時候,點陣屏上顯示一種臉譜;當左、中、右按鈕被按下的時候,分別出現不同的臉譜。相對來說,代碼的編寫倒最簡單。當按鈕按下時是高電位,也就是1電位,松開時是低電位,也就是0電位,可以用邏輯模塊中的等于節點進行編程,也可以把按鈕模塊作為條件,因為沒有說明時,就是默認條件是高電位。完整的代碼如圖6所示,效果圖如圖7所示。
● 拓展升級
利用實驗箱制作的作品僅僅是原型,不夠美觀,也不好展示。我們的最終作品應該利用體積較小的Arduino板子和點陣屏模塊,結合3D打印合,呈現各種有趣的作品形態,如會變臉的小寵物、鑰匙掛墜等。圖8所示的作品,是不是很酷炫?
如果對相關內容感興趣,請關注主持人博客。