王 杰, 高俊濤, 嚴周穎, 孫悅妍, 楊廣權
(廣州大學 機械與電氣工程學院,廣東 廣州 510006)
電子琴是現代電子科技與音樂結合的產物,是一種新型的鍵盤樂器。電子琴設計的方法有很多,由于嵌入式開發板具有強大的控制功能和靈活的編程實現特性,在電子琴設計中應用比較廣泛[1]。基于此,本設計采用嵌入式開發板FriendlyArm Mini6410為核心控制元件,通過Qtopia軟件編寫了電子琴面板模擬界面和控制代碼,通過觸摸式按鍵實現了電子琴演奏和播放功能。
一首音樂是由許多不同的音階組成的,而每個音階對應著不同的頻率,通過不同的頻率組合,可得到不同的音樂。對于嵌入式來說,產生不同的頻率非常簡單[2-3],可以利用嵌入式開發板上的定時/計數器T0來產生這樣方波頻率信號,從而使蜂鳴器發出聲音。因此,如果可以獲得一首歌曲的音符的頻率、升降調、每個音符的演奏長度、連音和頓音的時間長度,可利用Mini6410的定時/計數器Timer來產生這樣方波頻率信號,從而在開發板上彈奏或播放出這首歌,實現電子琴的功能[4-5]。
在Mini6410開發板上的芯片S3C6410X中有5個定時器,這些定時器產生內部中斷。其中,Timer0和Timer1具有PWM功能,而Timer2,3,4沒有此功能。PWM具有兩種操作模式:自動裝載模式,一次觸發模式。為實現PWM功能,芯片提供了16個功能寄存器。這些功能寄存器都連接APB總線。
由于本設計利用蜂鳴器產生聲音,所以采用Timer0定時器產生PWM信號。首先編寫PWM驅動程序pwm.c腳本文件,并生產pwm.o和pwm.ko文件,把pwm.ko文件通過ftp方式發送到Windows的超級終端,再通過超級終端把PWM驅動程序燒寫進Linux內核[6-8],再編寫QT應用程序,根據程序功能的需要調入PWM驅動程序,蜂鳴器發出聲音,實現系統的音樂播放功能。
本電子琴包含了虛擬鍵盤輸入,s3c6410芯片處理輸入指令并產生相應的PWM波至蜂鳴器,使蜂鳴器發出聲音,并且伴隨著LED燈的閃爍[9]。圖1為電子琴設計的系統圖。

圖1 系統結構圖
2.2.1Mini6410介紹
Mini6410SDK是采用Mini6410核心板的一款參考設計底板[10],它具有三個LCD接口、4線電阻觸摸屏接口、100M標準網絡接口、標準DB9五線串口、Mini USB 2.0接口、USB Host 1.1、3.5 mm音頻輸入輸出口、標準TV-OUT接口、SD卡座、Mini PCIe接口、電容屏接口等;另外還引出4路TTL串口,另1路TV-OUT、SDIO2接口(可接SD WiFi)接口等;在板的還有蜂鳴器、I2C-EEPROM、備份電池、AD可調電阻、8個中斷式按鍵等。
Mini6410采用2.0 mm間距的雙排插針,總共引出4組:P1,P2,CON1,CON2。其中P1和P2各為60 Pin;CON1和CON2各為30Pin,總共引出180 Pin。Mini6410在板引出10 Pin Jtag接口,如其布局說明見表1。

表1 Mini6410引腳
2.2.2蜂鳴器
Mini6410開發板的蜂鳴器Buzzer 是通過 PWM 控制的,蜂鳴器驅動電路原理圖如圖2所示,其中PWM0端信號為開發板上的計數器timer產生的方波頻率信號,可通過引腳GPF14測量,該引腳可通過軟件設置為 PWM 輸出,也可以作為普通的GPIO使用。

圖2 PWM電路
2.2.3發光二級管
Mini6410開發板具有4個用戶可編程LED,它們位于核心板上,直接與CPU的GPIO相連接,實現在演奏時有節奏閃爍的功能,增加電子琴的娛樂性。LED電路和IO口如圖3所示。

圖3 LEDIO口
軟件編程設計采用Qtopia進行演奏和播放功能的軟件設計。
2.3.1界面設計
利用Qtopia設計了電子琴面板模擬界面。如圖4所示。其中1~7分別對應音符“do、re、mi、fa、so、la、ti”頻率的聲音[11-12]并且在按下時LED會有節奏閃爍;當點擊按鍵“同一首歌”, 會播放預置的曲子,按停止鍵時蜂鳴器停止發聲,按開始鍵蜂鳴器繼續發聲。拖動滑動變頻條,蜂鳴器的頻率也會隨之改變。

圖4 模擬界面
2.3.2音樂演奏
音樂演奏功能通過按鍵1-7及1+,以及滑動條來實現。以按鍵1為例,按下時,將觸發相應的代碼:
void PwmWidget::on_noe_clicked() //設定1鍵為“do”
{
ioctl(fd, PWM_IOCTL_SET_FREQ, 523);
}
從而發出對應頻率的音符“do”。結合滑動條來調整音調,就可以演奏任何音調的歌曲。
滑動條所對應的代碼為:
void PwmWidget::changefreq() //設定一個滑動變頻條
{
ioctl(fd, PWM_IOCTL_SET_FREQ, 10*m_ui.chfreq->value());
初始化時,滑動條位于正中間,此時按下1對應C調的多,523hz;升調演奏時,先按下1+,再按1。也可通過拉動滑動條或上下按鈕來調整音調升降。
2.3.3音樂播放
在程序段定義變量處,事先定義了所需點歌的頻率表,例如,“同一首歌”的頻率表事先放在unsigned char Music_Girl[]數組中。
當點擊“同一首歌”按鈕時,音樂點歌按鈕程序啟動,PWM波形在延時10ms后開始輸出,音樂開始播放。程序如下所示:
void PwmWidget::on_tongyishouge_clicked()
{
timer->start(10);//延時啟動10ms
}
音樂開始后,即開始輸出PWM波形之后,開始根據頻率表計算音符、高低音、頓音、不發音等演奏長度等,并循環運行。程序如下所示[13],由于“同一首歌”頻率表里有212個原始頻率,當歌曲演奏完成標志flg=0時,調用PWM驅動中的ioctl()和getfreq(),程序按音符索引lenup所指的頻率設置輸出的PWM波形的頻率,并調用getyinchang()函數計算出對應的蜂鳴時間和停頓時間輸出PWM波形,音樂開始演奏。當lenup小于212時,按順序輸出對應的頻率,順序播放音樂;當lenup自加到數組Music_Girl[]的尾部時,音樂完整播放完畢,為了重新播放音樂,把音符索引lenup復位到0,并標識音樂播放完畢標志flg賦值1;則程序退出if(flg==0)的程序段,但在隨后的else里對標志flg賦值為0,并關掉Pwm信號輸出,使其重新回到if(flg==0)的程序段中執行,音樂得以連續播放。
從Music_Girl[]中獲得原始頻率后,根據調號及升降八度來生成新的頻率表,并計算出高低音、升降調和對應音符的頻率等參數。
unsigned int NewFreTab[12]; //新的頻率表
for(m=0;m<12;m++) // 根據調號及升降八度來生成新的頻率表
SL=i%10; //計算出音符
SM=i/10%10; //計算出高低音
SH=i/100; //計算出是否升半
CurrentFre = NewFreTab[SignTab[SL-1]+SH]; //查出對應音符的頻率
if (SM==1) CurrentFre >>= 2; //低音
if (SM==3) CurrentFre <<= 2; //高音
根據上面算出的音符的頻率和升降調,計算每個音符的演奏長度、連音和頓音的時間長度,進而改變PWM波形的輸出,使得蜂鳴器最終跟隨給定的頻率表來播放音樂。
2.3.4led部分
按下鍵“1”時,對應ARM板[14-15]上的LED1燈被點亮,延時2 s熄滅;當按下鍵“2”時,對應ARM板上的LED2燈被點亮,延時2 s熄滅;當按下鍵“3”時,對應ARM板上的LED3燈被點亮,延時2 s熄滅;當按下鍵“4”時,對應ARM板上的LED4燈被點亮,延時2 s熄滅;當按下鍵“5”時,對應ARM板上的4個LED燈全部被點亮,延時0.5 s全部熄滅,即全部閃爍一次;當按下鍵“6”時,對應ARM板上的4個LED燈全部被點亮,延時2 s;當按下鍵“7”時,對應ARM板上的4個LED燈全部被熄滅,延時2 s。
按鍵“1”,LED1被點亮,延時2秒熄滅,按鍵2,3,4與按鍵1原理類似,所以按鍵“1”為例,代碼如下:
void PwmWidget::on_one_clicked()
{
fd=-1;//if not add it,led will fail
led(1,1);
usleep(2000*1000);
led(1,0);
ioctl(fd, 0);
}
按下按鍵“5”時LED1、2、3、4全被點亮,延時0.5 s全部熄滅。按鍵“5,6,7,8”以按鍵“5”為例,其代碼如下:
void PwmWidget::on_five_clicked()
{
fd=-1;//if not add it,led will fail
int j=0;
for(j=1;j<=4;j++)
{
led(j,1);
usleep(500*1000);
}
for(j=4;j>=1;j--)
{
led(j,0);
usleep(500*1000);
}
ioctl(fd, 0);
}
本設計基于Mini6310開發板使用Qtopia軟件對演奏界面和演奏代碼進行編程,完成了一個電子琴功能,實現了通過按鍵控制PWM波形來演奏及播放歌曲,并能伴隨LED燈有節奏的閃爍。此設計所涉及的系統功能易于拓展和升級,在QT界面中加入下拉框,加入一些各式名曲,并在程序體中多存儲這些歌曲的頻率表,這樣通過選擇不同的曲目,就能播放不同的音樂。
[1] 熊 杰. 簡易電子琴設計[J].企業技術開發,2009(5):33-34.
XIONG Jie. Design of Simple Keyboard [J]. Technological Development of Enterprise,2009(5):33-34.
[2] 苗忠良. Qtopia編程之道[M].北京:清華大學出版社,2005.
[3] 劉樂喜. Mini6410 Qt4和Qtopia編程開發指南[M].武漢:華中科技大學出版社,2005.
[4] 霍福翠.基于FPGA的電子琴設計[J].科學理論,2011(6):350-351.
HUO Fu-Cui. Design of Electronic Piano Based on FPGA [J]. Scientific Theories,2011(6):350-351.
[5] 黃 鑫.基于CPLD的電子琴研究與設計[J].科技廣場,2007(5):232-233.
HUANG Xin. Based on CPLD Electric Piano Research and Design [J]. Technology Square,2007(5):232-233.
[6] 李 曉.Ubuntu Linux從入門到精通[M].北京:科學出版社,2009.
[7] 何曉龍.Ubuntu實戰技巧精粹[M].北京:人民郵電出版社,2009.
[8] 王大亮.Ubuntu標準教程 [M]. 北京:人民郵電出版社,2008.
[9] 王建平. 數字音樂盒設計[J].產品開發與設計,2011(38):65-67.
WANG Jian-Ping. Digital Music Box Design [J].Industrial Design Exploitation,2011(38):65-67.
[10] Mini6410用戶手冊[EB/OL].2012.11.http://www.arm9.net/mini6410-um.asp.
[11] 劉永志.基于VB的MIDI電子琴[J].微型電腦應用,2008(6):61-63.
LIU Yong-Zhi. VB-Based MIDI Electronic Organs [J]. Microcomputer Applications,2008(6):61-63.
[12] 單 丹.基于AT89C51單片機電子琴的設計[J].中國高新技術企業,2010(36):6-7.
SHAN Dan. Design Simple Electronic Organ Based on AT89C51 Single Computer [J]. China High Technology Enterprises,2010(36):6-7.
[13] 馬志強. 基于STM32的PWM音樂播放器應用設計[J].單片機與嵌入式系統應用,2010(20):5626-5627.
MA Zhi-Qiang. Application Design of PWM Music Player Based on STM32[J].Microcontroller & Embedded Systems.2010(20):5626-5627.
[14] 周立功.ARM嵌入式系統基礎教程[M].北京:北京航空航天大學出版社, 2008.
[15] 斯洛斯.ARM嵌入式系統開發:軟件設計與優化[M].北京:北京航空航天大學出版社,2005.