引言
華爾茲屬于摩登舞反惕,華爾茲舞曲均是三拍尝艘,通常給人以優(yōu)美抒情與輕快靈動(dòng)的感覺(jué)。本文主要介紹如何使用樹莓派控制雙色LED燈按照華爾茲舞曲的節(jié)拍進(jìn)行閃爍姿染,一方面使讀者對(duì)樹莓派GPIO引腳控制有初步了解背亥,另一方面也希望讀者能夠喜歡華爾茲與華爾茲舞曲。
一悬赏、華爾茲簡(jiǎn)介
華爾茲狡汉,英文名Waltz,是迄今為止歷史最為悠久闽颇、生命力最強(qiáng)的自?shī)饰璧付艽鳎小拔柚兄蟆钡拿雷u(yù)。華爾茲一詞最早來(lái)源于德語(yǔ)“Walzl”兵多,意為滾動(dòng)尖啡,這一單詞也恰如其分地描繪了華爾茲的主要特點(diǎn),即在跳華爾茲的過(guò)程中舞者需要不停地旋轉(zhuǎn)剩膘,因此華爾茲也被稱為圓舞衅斩,進(jìn)而華爾茲所使用的舞曲也被稱為圓舞曲(為了便于閱讀,下文中使用圓舞曲來(lái)指代華爾茲舞曲)怠褐。圓舞曲均是三拍畏梆,第一拍為重音,第二、三拍均為弱音具温,該節(jié)奏也就是我們常說(shuō)的“嘭嚓嚓”蚕涤。
華爾茲主要分為兩類,一類是英國(guó)華爾茲铣猩,由于其舞步較為緩慢揖铜,因此也被稱為“慢三”,跳舞時(shí)所使用的圓舞曲曲風(fēng)較為優(yōu)美抒情达皿;另一類是維也納華爾茲天吓,舞步較快,所使用的圓舞曲曲風(fēng)也相應(yīng)較為輕快靈動(dòng)峦椰。
華爾茲頑強(qiáng)的生命力一方面來(lái)源于其舞姿的優(yōu)美龄寞,另一方面也來(lái)源于音樂(lè)對(duì)其產(chǎn)生的推動(dòng)作用,世界著名音樂(lè)家小約翰·施特勞斯汤功、柴可夫斯基物邑、莫扎特、貝多芬滔金、肖邦等都創(chuàng)作了許多不朽的圓舞曲作品色解。在眾多圓舞曲作品中,或許最為耳熟能詳?shù)漠?dāng)屬小約翰·施特勞斯所做的《藍(lán)色多瑙河》餐茵,該樂(lè)曲與《拉德斯基進(jìn)行曲》被作為維也納新年音樂(lè)會(huì)的保留壓軸曲目科阎。
由于筆者本人也是音樂(lè)愛(ài)好者,因此在文末為讀者列出本人比較喜歡的圓舞曲忿族,希望能夠增進(jìn)讀者對(duì)華爾茲與圓舞曲的興趣锣笨。
二恭垦、前期準(zhǔn)備
2.1 本文所需的硬件
●?雙色LED燈
該雙色LED燈可以發(fā)出紅色和綠色兩種光兼吓,不同顏色對(duì)應(yīng)的引腳如圖1所示仔蝌。當(dāng)對(duì)應(yīng)引腳輸入高電平時(shí)巷燥,LED燈就會(huì)發(fā)光轻黑。
● 母對(duì)母杜邦線
● 樹莓派
2.2 本文所需的軟件
● Python3環(huán)境(大多數(shù)linux系統(tǒng)可能已經(jīng)安裝)
i. 從https://www.python.org/選擇最新版本的python3文件还蹲。
ii. 在網(wǎng)頁(yè)中找到Gzipped source tarball稽煤,點(diǎn)擊下載森逮,如圖4所示噪伊。
iii. 解壓縮tgz文件:tar -zxvf Python- x.x.x.tgz
iv. 進(jìn)入Python-3.7.4目錄:cd Python- x.x.x
v. 分別運(yùn)行如下命令進(jìn)行安裝:./configure --> make --> make install
vi. 如果安裝成功簿煌,在終端輸入python3會(huì)出現(xiàn)如圖5所示內(nèi)容。
● RPi.GPIO庫(kù)
源碼安裝:
i. 從https://pypi.org/project/RPi.GPIO/下載RPi.GPIO-x.x.x.tar.gz
ii. 解壓縮tar.gz文件:tar -zxvf RPi.GPIO- x.x.x.tar.gz
iii. 進(jìn)入RPi.GPIO- x.x.x目錄:cd RPi.GPIO- x.x.x
iv. 輸入安裝命令:sudo python setup.py install
命令行安裝:
在終端輸入命令:sudo pip install RPi.GPIO
2.3 預(yù)備知識(shí)
● GPIO引腳介紹
GPIO是General Purpose Input & Output的縮寫鉴吹,意思為通用輸入輸出姨伟,是樹莓派連接并控制其他元器件的接口,GPIO在樹莓派的位置如圖6所示豆励。從圖中也可以看出樹莓派一共有40個(gè)GPIO引腳夺荒,分別從1~40開(kāi)始編號(hào)瞒渠,1號(hào)與2號(hào)引腳位于左側(cè),上面一排的引腳均為偶數(shù)技扼,下面一排的引腳均為奇數(shù)伍玖。
各個(gè)GPIO引腳的功能可以在樹莓派終端中輸入命令gpio readall進(jìn)行查看,具體功能如圖7所示剿吻。從圖中可以看出GPIO引腳有三種編號(hào)規(guī)則窍箍,分別是Board、BCM與wPi丽旅。Board編號(hào)對(duì)應(yīng)于圖7的Physical列表椰棘,這種編號(hào)方式與樹莓派物理引腳編號(hào)方式一致,使用Board編號(hào)的好處是不用擔(dān)心因?yàn)闃漭傻纳?jí)而導(dǎo)致程序代碼中引腳編號(hào)使用錯(cuò)誤榄笙,代碼的通用性更強(qiáng)邪狞。BCM編號(hào)與輸入輸出功能引腳在CPU中所對(duì)應(yīng)的寄存器編號(hào)一致,該編號(hào)方式與底層硬件更為貼近茅撞,但對(duì)于不同版本的樹莓派帆卓,BCM編號(hào)均不同,代碼難以通用乡翅。wPi編號(hào)則將輸入輸出功能的引腳從0開(kāi)始按順序編號(hào)鳞疲,便于編程罪郊。
這里我們采用Board編號(hào)對(duì)GPIO引腳功能進(jìn)行簡(jiǎn)要介紹蠕蚜。例如1號(hào)引腳功能是輸出3.3V的電壓;2號(hào)引腳功能是輸出5V的電壓悔橄;6號(hào)引腳功能是接地靶累,電壓為0V;7號(hào)引腳是輸入輸出引腳癣疟,當(dāng)該引腳設(shè)置為輸入模式時(shí)挣柬,可以用來(lái)讀取元器件發(fā)送的數(shù)據(jù),當(dāng)設(shè)置為輸出模式時(shí)睛挚,可以輸出3.3V的高電壓與0V低電壓邪蛔。
三、樹莓派實(shí)現(xiàn)方法
3.1 硬件接線方法
在實(shí)現(xiàn)過(guò)程中扎狱,我們同樣采用Board編號(hào)規(guī)則侧到,接線方法如圖8所示,該圖中分別把GND淤击、紅色燈與綠色燈接到9號(hào)匠抗、11號(hào)與13號(hào)引腳(注意接線順序要對(duì)應(yīng),接線時(shí)樹莓派要斷電)污抬。
3.2 程序代碼
#!/usr/bin/env python
# encoding: utf-8
import?RPi.GPIO?as?GPIO
import?time
GPIO.setmode(GPIO.BOARD)
pin_red =?11
pin_green =?13
GPIO.setup(pin_red, GPIO.OUT,?initial?= GPIO.LOW)
GPIO.setup(pin_green, GPIO.OUT,?initial?= GPIO.LOW)
def?led(pin):
????GPIO.output(pin, GPIO.HIGH)
time.sleep(1)
????GPIO.output(pin, GPIO.LOW)
time.sleep(0.5)
def?waltz():
? ? for?i?in?list(range(12)):
? ? if?i %?3?==?0:
????????led(pin_red)
? ? else:
????????led(pin_green)
waltz()
GPIO.cleanup()
3.2 程序代碼說(shuō)明
#!/usr/bin/env python
# encoding: utf-8
說(shuō)明:#!/usr/bin/env python表示調(diào)用系統(tǒng)環(huán)境變量中Python解釋器汞贸,# encoding: utf-8表示采用utf-8的格式對(duì)代碼進(jìn)行編碼。
import RPi.GPIOasGPIO
import time
說(shuō)明:使用RPi.GPIO與time模塊,這兩個(gè)模塊中包含我們所需要調(diào)用的函數(shù)矢腻。由于RPi.GPIO名稱過(guò)長(zhǎng)门驾,這里使用GPIO替代。
GPIO.setmode(GPIO.BOARD)
說(shuō)明:如前文所述多柑,樹莓派GPIO引腳共有三種編號(hào)規(guī)則猎唁,這里我們指定采用Board規(guī)則來(lái)進(jìn)行引腳編號(hào)。
pin_red =11
pin_green =13
說(shuō)明:由于我們將雙色LED燈的紅色與綠色分別接入到樹莓派的11號(hào)與13號(hào)引腳顷蟆,因此為了便于記憶與編程诫隅,我們分別用pin_red與pin_green來(lái)存儲(chǔ)引腳編號(hào)。
GPIO.setup(pin_red, GPIO.OUT,initial= GPIO.LOW)
GPIO.setup(pin_green, GPIO.OUT,initial= GPIO.LOW)
說(shuō)明:分別將紅色與綠色對(duì)應(yīng)的引腳設(shè)置為輸出狀態(tài)帐偎,且初始輸出電壓均為0V低電壓逐纬。
def led(pin):
????GPIO.output(pin, GPIO.HIGH)
????time.sleep(1)
????GPIO.output(pin, GPIO.LOW)
????time.sleep(0.5)
說(shuō)明:定義雙色LED燈閃爍函數(shù),函數(shù)的參數(shù)是引腳編號(hào)削樊,函數(shù)的功能是首先讓引腳輸出高電平豁生,并持續(xù)1秒,隨后讓引腳輸出低電平漫贞,并持續(xù)0.5秒甸箱。由于雙色LED燈是高電平發(fā)光,因此該函數(shù)可以讓LED先發(fā)光1秒迅脐,再中斷0.5秒芍殖。
def waltz():
????for i in list(range(12)):
????if i %3==0:
????????led(pin_red)
????else:
????????led(pin_green)
說(shuō)明:定義圓舞曲節(jié)拍閃爍函數(shù),由于圓舞曲是三拍谴蔑,因此我們讓變量i對(duì)3取模豌骏,當(dāng)取模運(yùn)算結(jié)果為0時(shí),控制雙色LED燈發(fā)出紅光隐锭,當(dāng)取模運(yùn)算結(jié)果不為0時(shí)窃躲,控制雙色LED燈發(fā)出綠光。由此雙色LED燈可以按照“紅-綠-綠”的模式進(jìn)行閃爍钦睡,與圓舞曲“嘭嚓嚓”的節(jié)奏相吻合蒂窒。此外,也可以通過(guò)改變r(jià)ange()函數(shù)中的參數(shù)來(lái)改變閃爍節(jié)拍的個(gè)數(shù)荞怒。
waltz()
說(shuō)明:調(diào)用waltz()函數(shù)控制LED燈進(jìn)行閃爍洒琢。
GPIO.cleanup()
說(shuō)明:釋放該程序代碼所使用的引腳,并清除引腳編碼規(guī)則挣输。
圓舞曲推薦列表?
《藍(lán)色多瑙河》小約翰·施特勞斯?
《春之聲圓舞曲》小約翰·施特勞斯
《維也納森林的故事》小約翰·施特勞斯
《皇帝圓舞曲》小約翰·施特勞斯?
《邀舞》卡爾·瑪里亞·恩斯特·馮·韋伯?
《Dernier Vol》Rapha?l Beau?
《Midnight Waltz》Adam Hurst?
《人生的旋轉(zhuǎn)木馬》久石讓(出自《哈爾的移動(dòng)城堡》)?
《永遠(yuǎn)同在(いつも何度でも)》久石讓(出自《千與千尋》)?
《千與千尋》久石讓(出自《千與千尋》)?
《向日葵之家園舞曲》久石讓(出自《懸崖上的金魚姬》)?
《杜鵑圓舞曲》約翰·埃曼努埃爾·約納森?
《舒伯特小夜曲》舒伯特?
《降E大調(diào)華麗圓舞曲(Waltz No.1 in E flat, Op.18Grande valse brillante)》肖邦
ps:筆者自己也是樹莓派愛(ài)好者纬凤,會(huì)在公眾號(hào)“樹莓派對(duì)rasparty”中持續(xù)更新樹莓派相關(guān)的文章,歡迎關(guān)注交流撩嚼!