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