引言
華爾茲屬于摩登舞,華爾茲舞曲均是三拍,通常給人以優(yōu)美抒情與輕快靈動(dòng)的感覺。本文主要介紹如何使用樹莓派控制雙色LED燈按照華爾茲舞曲的節(jié)拍進(jìn)行閃爍,一方面使讀者對(duì)樹莓派GPIO引腳控制有初步了解,另一方面也希望讀者能夠喜歡華爾茲與華爾茲舞曲。
一、華爾茲簡(jiǎn)介
華爾茲,英文名Waltz,是迄今為止歷史最為悠久、生命力最強(qiáng)的自娛舞蹈,有“舞中之后”的美譽(yù)。華爾茲一詞最早來源于德語“Walzl”,意為滾動(dòng),這一單詞也恰如其分地描繪了華爾茲的主要特點(diǎn),即在跳華爾茲的過程中舞者需要不停地旋轉(zhuǎn),因此華爾茲也被稱為圓舞,進(jìn)而華爾茲所使用的舞曲也被稱為圓舞曲(為了便于閱讀,下文中使用圓舞曲來指代華爾茲舞曲)。圓舞曲均是三拍,第一拍為重音,第二、三拍均為弱音,該節(jié)奏也就是我們常說的“嘭嚓嚓”。
華爾茲主要分為兩類,一類是英國華爾茲,由于其舞步較為緩慢,因此也被稱為“慢三”,跳舞時(shí)所使用的圓舞曲曲風(fēng)較為優(yōu)美抒情;另一類是維也納華爾茲,舞步較快,所使用的圓舞曲曲風(fēng)也相應(yīng)較為輕快靈動(dòng)。
華爾茲頑強(qiáng)的生命力一方面來源于其舞姿的優(yōu)美,另一方面也來源于音樂對(duì)其產(chǎn)生的推動(dòng)作用,世界著名音樂家小約翰·施特勞斯、柴可夫斯基、莫扎特、貝多芬、肖邦等都創(chuàng)作了許多不朽的圓舞曲作品。在眾多圓舞曲作品中,或許最為耳熟能詳?shù)漠?dāng)屬小約翰·施特勞斯所做的《藍(lán)色多瑙河》,該樂曲與《拉德斯基進(jìn)行曲》被作為維也納新年音樂會(huì)的保留壓軸曲目。
由于筆者本人也是音樂愛好者,因此在文末為讀者列出本人比較喜歡的圓舞曲,希望能夠增進(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)頁中找到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庫
源碼安裝:
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開始編號(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開始按順序編號(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í),可以用來讀取元器件發(fā)送的數(shù)據(jù),當(dāng)設(shè)置為輸出模式時(shí),可以輸出3.3V的高電壓與0V低電壓。
三、樹莓派實(shí)現(xiàn)方法
3.1 硬件接線方法
在實(shí)現(xiàn)過程中,我們同樣采用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 程序代碼說明
#!/usr/bin/env python
# encoding: utf-8
說明:#!/usr/bin/env python表示調(diào)用系統(tǒng)環(huán)境變量中Python解釋器,# encoding: utf-8表示采用utf-8的格式對(duì)代碼進(jìn)行編碼。
import RPi.GPIOasGPIO
import time
說明:使用RPi.GPIO與time模塊,這兩個(gè)模塊中包含我們所需要調(diào)用的函數(shù)。由于RPi.GPIO名稱過長(zhǎng),這里使用GPIO替代。
GPIO.setmode(GPIO.BOARD)
說明:如前文所述,樹莓派GPIO引腳共有三種編號(hào)規(guī)則,這里我們指定采用Board規(guī)則來進(jìn)行引腳編號(hào)。
pin_red =11
pin_green =13
說明:由于我們將雙色LED燈的紅色與綠色分別接入到樹莓派的11號(hào)與13號(hào)引腳,因此為了便于記憶與編程,我們分別用pin_red與pin_green來存儲(chǔ)引腳編號(hào)。
GPIO.setup(pin_red, GPIO.OUT,initial= GPIO.LOW)
GPIO.setup(pin_green, GPIO.OUT,initial= GPIO.LOW)
說明:分別將紅色與綠色對(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)
說明:定義雙色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)
說明:定義圓舞曲節(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é)奏相吻合。此外,也可以通過改變r(jià)ange()函數(shù)中的參數(shù)來改變閃爍節(jié)拍的個(gè)數(shù)。
waltz()
說明:調(diào)用waltz()函數(shù)控制LED燈進(jìn)行閃爍。
GPIO.cleanup()
說明:釋放該程序代碼所使用的引腳,并清除引腳編碼規(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:筆者自己也是樹莓派愛好者,會(huì)在公眾號(hào)“樹莓派對(duì)rasparty”中持續(xù)更新樹莓派相關(guān)的文章,歡迎關(guān)注交流!