《智能小車聲音引導(dǎo)系統(tǒng)設(shè)計與制作報告.doc》由會員分享,可在線閱讀,更多相關(guān)《智能小車聲音引導(dǎo)系統(tǒng)設(shè)計與制作報告.doc(20頁珍藏版)》請在裝配圖網(wǎng)上搜索。
聲音引導(dǎo)系統(tǒng)設(shè)計與制作報告
一、方案選擇與論證
1、整體方案選擇
方案一:本方案采用音頻收發(fā)的方式,由核心控制模塊80C51F020發(fā)出一個特定頻率的音頻脈沖信號,前置音頻接收模塊接收并識別這個脈沖信號。將其轉(zhuǎn)變成TTL電平。采用FPGA對接受的信號進行處理,經(jīng)過無線收發(fā)模塊通訊,將小車的定點位置傳至核心模塊單片機處理并控制小車在特定的范圍內(nèi)運動。
方案二:本方案采用語音收發(fā)的方式來控制小車的運動,由核心控制模塊控制語音芯片,發(fā)送特定的語音信號,再由語音識別模塊對語音進行采集和數(shù)字化。采用FPGA對接受的信號進行處理,經(jīng)過無線收發(fā)模塊通訊,將小車的定點位置傳至核心模塊單片機處理并控制小車在特定的范圍內(nèi)運動。
方案比較:方案一的核心控制算法由80C51F020完成。單片機的算法控制比較簡單,容易實現(xiàn)。而FPGA的算法較復(fù)雜,但其對邊沿信號反應(yīng)時間快,所以利用FPGA處理接受音頻信號。方案二用到語音收發(fā)的方式,由于識別語音的收發(fā)模塊實現(xiàn)困難,所以本設(shè)計采用方案一。
2、控制理論計算方案選擇
方案一:可移動聲源在運動前發(fā)出音頻信號,根據(jù)三個接收器接收音頻的時間不同,可以算出聲源到接收器間的距離和聲源到中線OX的距離,即可移動聲源起始位置定位。然后控制小車做垂直中線OX運動,到達中線OX。再第二次發(fā)音頻信號,定位此時可移動聲源的位置,得出與中心點W的距離,使小車轉(zhuǎn)動90度,運動至W點。
方案二:可移動聲源發(fā)出音頻信號后,得到定位。根據(jù)弧度的計算,控制小車做弧線運動。到達至中線OX??梢苿勇曉吹诙伟l(fā)出音頻信號,得到與中心點W的距離,控制小車到達W點。
方案比較:方案一直接利用走垂直線的方法,算法簡單。方案二用到弧長和角度的算法,控制困難,且調(diào)試繁瑣。為了滿足方案的要求,所以本設(shè)計選擇方案一。
二、硬件設(shè)計與實現(xiàn)
硬件系統(tǒng)的框圖如圖1所示。單片機與FPGA通過無線的方式通訊。
單片機
FPGA
電機控制
音頻發(fā)送
無線收發(fā)
音頻接受
無線收發(fā)
紅外對管測速
液晶顯示
圖1、硬件系統(tǒng)框圖
主要模塊電路如下:
1、 控制器模塊
實現(xiàn)音頻的接受和無線收發(fā)功能。FPGA模塊電路如圖2所示。接收經(jīng)過鎖相環(huán)選頻后的信號和單片機控制發(fā)送的同步無線信號,通過處理后利用無線通訊將命令發(fā)會單片機。
圖2、FPGA控制模塊
2、 音頻接收模塊
該模塊通過駐極體話筒采集音頻信號,駐極體話筒具有結(jié)構(gòu)簡單、重量輕、體積小、無方向性、頻率響應(yīng)寬、保真度好等優(yōu)點。音頻信號通過前置放大、濾波。再將放大信號通過LM567鎖相環(huán)音頻譯碼芯片,構(gòu)建選頻電路,當輸入信號的頻率落在其內(nèi)部壓控振蕩器中心頻率時,輸出端將由原來的高電平變?yōu)榈碗娖?。鎖相環(huán)內(nèi)部壓控振蕩器中心頻率(f=1/1.1RC)由5、6腳外接的電阻與電容決定。所以在5腳接入10K的滑動變阻器調(diào)節(jié),可確定被選定的頻率。經(jīng)過多次計算與驗證,前置放大電路用TL082集成運放。當麥克風接收到6k赫茲左右的頻率時,輸出會有很明顯的電平跳變。電路原理如圖3。
圖3、音頻接收模塊原理圖
3、 電機控制模塊
根據(jù)大賽要求,電機控制采用MMC-ASSP作為電機驅(qū)動的主控芯片。采用串口通信UART模式。該芯片提供三個通道控制電機,即可同時控制三個電機運轉(zhuǎn)。每一路直流電機需要CHnDCPWM和CHnDCDIR兩個引腳,CHnDCPWM用于PWM波輸出,CHnDCDIR用于指定電機轉(zhuǎn)向,外接一個全橋驅(qū)動芯片控制直流電機工作。通過調(diào)節(jié)占空比控制電機的轉(zhuǎn)速。數(shù)據(jù)的輸入輸出端口(TXD和RXD)與主控MCU相連。如圖4所示。采用了H橋驅(qū)動元件L298,避免了使用分立元件帶來的電路板復(fù)雜的問題,電路簡潔。且可以提供最大為4A的電流。MMC-ASSP控制電路如圖4所示,L298驅(qū)動電路如圖5所示。
雙H橋驅(qū)動IC
雙H橋驅(qū)動IC
雙H橋驅(qū)動IC
CH1DCPWM
CH1DCDIR
CH1DCPWM
CH1DCDIR
CH1DCPWM
CH1DCDIR
Vdd
UART/SPI
RESET
SLEEP
RXD/SI
TXD/SO
REGC
Vss
I/O
TXD
RXD
Vdd
GND
電機1
電機2
電機3
主控MCU
MMC-1
圖4、UART模式下直流電機控制模塊
圖5、電機驅(qū)動模塊原理圖
4、 紅外對管測速模塊
用黑線將小車車輪圓盤平均15等分,采用光電傳感器RCRT5000檢測黑線,在一定時間內(nèi)計數(shù)檢測到的黑線條數(shù),計算出車速,由80C51F020控制液晶顯示。紅外對管模塊如圖6。
圖6、紅外對管測速原理圖
5、顯示模塊
顯示模塊主要由80C51F020的開發(fā)板作為控制核心,另外顯示電路作為外圍電路。主要功能:紅外對管采集車輪轉(zhuǎn)動的數(shù)據(jù),由單片機處理后經(jīng)過1602液晶顯示小車的車速。
三、軟件系統(tǒng)設(shè)計
1、80C51F020和FPGA總體程序流程
初始化
定時器開 計數(shù)
等待接收到無線命令
音頻結(jié)束
關(guān)定時器
換算距離
延時
無線發(fā)送
初始化
發(fā)送無線信號
發(fā)送6kHZ音頻信號
延時
是
否
否
是
定位聲源
接收無線信號
(幾乎同時發(fā)送)
控制電機
圖7、程序流程圖
2、MMC-1 ASSP電機控制程序流程
電機驅(qū)動需要配置相對應(yīng)的寄存器,占空比給定寄存器(chnDuty)在用于直流電機驅(qū)動時需要配置,主要是通過設(shè)定該寄存器選擇不同占空比,進而調(diào)節(jié)電機轉(zhuǎn)速。另外,在配置完chnDuty寄存器后,還要設(shè)置工作模式寄存器(chnMode)選擇驅(qū)動電機的類型。本方案選擇的是直流電機。具體程序流程如圖8所示。
延時50us,初始化結(jié)束
MMC-1上電
初始化
設(shè)置chnDuty
寄存器
設(shè)置chnMode寄存器
是
否
結(jié)束
圖8、MMC-1電機控制程序流程
四、硬件與軟件調(diào)試
本方案所用到的硬件電路不多,主要是音頻接收模塊、電機驅(qū)動模塊和核心板電路。有關(guān)的硬件模塊調(diào)試主要就是音頻的接收。該操作比較簡單。難度較大的是軟件調(diào)試,本方案軟件控制是核心。通過對音頻的控制和無線接受模塊控制小車在特定要求下運動。主要用到核心控制器80C51F020和FPGA進行協(xié)同控制。調(diào)試在控制時序方面較困難,對音頻的采集處理有難度。
五、性能與指標測試
1、測試儀器
數(shù)字示波器 DS1102C 功率函數(shù)信號發(fā)生器 YB1605P
直流穩(wěn)壓電源 YB1732A2A 秒表、2米卷尺
2、測試分析
本次設(shè)計用到聲音的引導(dǎo),會受到較大的干擾,前置的音頻接受與轉(zhuǎn)換的硬件也存在一定的誤差,導(dǎo)致FPGA測得的時序浮度比較大,所測得的數(shù)據(jù)穩(wěn)定性不高。不過對小車的控制比較到位。
六、總結(jié)
經(jīng)過4天3夜的努力,我們終于完成了本題的制作,在參數(shù)和功能上盡量完成要求。在理論設(shè)計計算方面,我們充分運用了我們所掌握的知識,力爭做到更好。在實際過程中,關(guān)于音頻信號的處理和相關(guān)時序處理遇到的問題較大。這一方面成為本設(shè)計的關(guān)鍵所在。說明了我們還是缺少相關(guān)知識技術(shù)和實際的工程經(jīng)驗。通過此次大賽,我們隊的每個成員都獲益非淺。
參考文獻
[1] 綜合電子設(shè)計與實踐.田良.南京:東南大學(xué)出版社,2002.3.
[2] FPGA設(shè)計與應(yīng)用.劉皖,何道君,譚明.北京:清華大學(xué)出版社,2006.
[3] C8051F單片機原理及應(yīng)用. 鮑可進. 北京:中國電力出版社,2006.
[4] FPGA原理與實踐.張慶玲, 楊勇.北京:北京航空航天大學(xué)出版社,2006.
附 錄
附錄1. 單片機源程序
//020 串口UART0發(fā)送程序模塊
#include
unsigned int count,count1,count2;
unsigned char lcd[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
unsigned int cnt; //用于控制發(fā)6KHz的方波的個數(shù)
unsigned int a,b,c;
bit flag_sound; //標志位,用于控制發(fā)送方波的個數(shù)
bit flag,flag1,flag2;
bit key_flag;
sbit key1=P0^5;
sbit key2=P0^6;
sbit sound=P0^7;
sbit RS=P2^5;//液晶
sbit RW=P2^6;
sbit EN=P2^7;
sbit P30=P3^0;//EN_1,EN_2
sbit P31=P3^1;
sbit P33=P2^3;
void Delay(unsigned int i);
void PORT_Init(void);
void SYSCLK_Init(void);
void UART0_INT();
void UART1_INT();
void E_int(void);
void Wait_Busy(void);
void Write_Data(unsigned char data_in);
void Write_Code(unsigned char code_in);
void Lcd_Init(void);
void stright(void);
void zhuanwan_left(void);
void zhuanwan_right(void);
void stop_8s(void);
void delay_long(void);
void stop();
void key_puanduan();
void Timer_INT();
void Delay(unsigned int i)//延時子程序
{
while(i--);
}
void Timer_INT() interrupt 1 using 1
{
if (cnt==b) //發(fā)10個周期的6KHz的方波
{
TL0=0x69; //6KHz的頻率產(chǎn)生的定時器的值
TH0=0xff;
flag_sound=1;
TR0=0;
cnt=0;
}
else
{
TL0=0x69;
TH0=0xff;
sound=~sound;
cnt++;
flag_sound=0;
TR0=1;
}
}
void PORT_Init(void) /**********端口的初始化***********/
{
XBR0=0x04; //使UART0的TXD和RXD分別連接到P0.0,P0.1
XBR1=0x04;
XBR2=0x44;
P0MDOUT=0x60; /*******P口輸出方式的設(shè)置*********/
P1MDOUT=0X00;
P2MDOUT&=0x00;
P3MDOUT&=0x00;
}
void SYSCLK_Init(void) /*******系統(tǒng)時鐘初始化**********/
{
unsigned int Q=0; /*******外部時鐘的配置*********/
OSCXCN=0x67;
for(Q=0;Q<255;Q++);
while((OSCXCN&0xe7)!=0xe7);
OSCICN=0x88;
}
void wait_busy(void)
{
P1|=0x80;
RS=0;
RW=1;
EN=1;
Delay(10);
while(P1&0x80);
EN=0;
}
void Write_Data(unsigned char data_in) /*****發(fā)送數(shù)據(jù)函數(shù)*******/
{
Wait_Busy();
RS=1;
RW=0;
EN=1;
P1=data_in;
Delay(100);
EN=0;
}
void Write_Code(unsigned char code_in) /*****發(fā)送指令函數(shù)*******/
{
Wait_Busy();
RS=0;
RW=0;
EN=1;
P1=code_in;
Delay(100);
EN=0;
}
void LCD_Init(void) /********液晶初始化***********/
{
Write_Code(0x01);
Delay(100);
Write_Code(0x38);
Delay(100);
Write_Code(0x0c);
Delay(100);
Write_Code(0x06);
Delay(100);
}
void T1_inter() interrupt 3 /*****計時對數(shù)據(jù)進行處理*****/
{ if (count2==a)
{
TR1=0;
TL1=0xFF;
TH1=0x6f;
flag2=1;
count2=0;
}
else
{
TL1=0xff;
TH1=0x6f;
TR1=1;
flag2=0;
count2++;
}
}
void E_int() interrupt 0//外部中斷函數(shù)
{
if (count1==c)
{
flag=1;
count1=0;
P30=0;
P31=0;
}
else
{
count1=count1+1;
count=count+1;
}
}
void stright(void)//直走50cm
{
///////////////直走///////////////////////////
//***********************//通道1PWMchnfreq的配置
TB80=1; //發(fā)送0X53--5-》寫命令字,3-》通道1占空比給定寄存器
SBUF0=0X53;
while(~TI0);
TI0=0;
Delay(10000);
TB80=1;//發(fā)送0Xcc--占空比(控制轉(zhuǎn)速)
SBUF0=0Xf6;
while(~TI0);
TI0=0;
Delay(10000);
//***********************//通道2PWMchnfreq的配置
TB80=0;//發(fā)送0X57
SBUF0=0X57;
while(~TI0);
TI0=0;
Delay(10000);
TB80=0;//發(fā)送0XCc
SBUF0=0Xf8;
while(~TI0);
TI0=0;
Delay(10000);
//***********************//通道1,2不同步的同步模式寄存器synmode的設(shè)置
TB80=1;//發(fā)送0X5C
SBUF0=0X5C;
while(~TI0);
TI0=0;
Delay(10000);
TB80=1;//發(fā)送0X00
SBUF0=0X00;
while(~TI0);
TI0=0;
Delay(10000);
//***********************//通道1chnmode的配置
TB80=1;//發(fā)送0X50
SBUF0=0X50;
while(~TI0);
TI0=0;
Delay(10000);
TB80=1;//發(fā)送0Xc0
SBUF0=0Xc0;
while(~TI0);
TI0=0;
Delay(10000);
//***********************//通道2chnmode的配置
TB80=0;//發(fā)送0X54
SBUF0=0X54;
while(~TI0);
TI0=0;
Delay(10000);
TB80=1;//發(fā)送0Xc0
SBUF0=0XC0;
while(~TI0);
TI0=0;
P30=1; P31=1;
}
void stop_8s(void)
{
while(~flag);
flag=0;
SCON1&=0xfd;
SBUF1=0x0d; //////發(fā)送13cm/s
while(SCON1&0x02==0x00);
Write_Code(0x80);
Write_Data(0x31);
Write_Data(0x33);
Write_Data(0x63);
Write_Data(0x6d);
Write_Data(0x2f);
Write_Data(0x73);
/////////停止//////////////////////////////////////////////
a=400;
TR1=1;
flag2=0;
while(~flag2)
{
Delay(10000);
P33=~P33;
}
flag2=0; count2=0; P33=0;
}
void zhuanwan_left(void)//////右轉(zhuǎn)
{
EA=0;EX0=0;
/////////轉(zhuǎn)90度//////////////////////////////////////////////
//***********************///通道1PWMchnfreq的配置
TB80=1; //發(fā)送0X53
SBUF0=0X53;
while(~TI0);
TI0=0;
Delay(10000);
TB80=1;//發(fā)送0X33
SBUF0=0XB4;
//SBUF0=0Xf6;
while(~TI0);
TI0=0;
Delay(10000);
//***********************///通道2PWMchnfreq的配置
TB80=0;//發(fā)送0X57
SBUF0=0X57;
while(~TI0);
TI0=0;
Delay(10000);
TB80=1;//發(fā)送0X33
SBUF0=0XB4;
//SBUF0=0Xf7;
while(~TI0);
TI0=0;
Delay(10000);
//***********************///通道1,2不同步的同步模式寄存器synmode的設(shè)置
TB80=1;//發(fā)送0X5C
SBUF0=0X5C;
while(~TI0);
TI0=0;
Delay(10000);
TB80=1;//發(fā)送0X00
SBUF0=0X00;
while(~TI0);
TI0=0;
Delay(10000);
//***********************///通道1chnmode的配置
TB80=1;//發(fā)送0X50
SBUF0=0X50;
while(~TI0);
TI0=0;
Delay(10000);
TB80=1;//發(fā)送0Xe0
SBUF0=0XC0;
while(~TI0);
TI0=0;
Delay(10000);
//***********************///通道2chnmode的配置
TB80=0;//發(fā)送0X54
SBUF0=0X54;
while(~TI0);
TI0=0;
Delay(10000);
TB80=0;//發(fā)送0Xe0
SBUF0=0XE0;
while(~TI0);//發(fā)送0X80
TI0=0;
P30=1;P31=1;
}
void stop(void)
{
/////////停止//////////////////////////////////////////////
P30=0;P31=0;
Write_Code(0x80);
Write_Data(0x20);
Write_Data(0x20);
Write_Data(0x20);
Write_Data(0x20);
Write_Data(0x20);
Write_Data(0x20);
}
void zhuanwan_right(void)//左轉(zhuǎn)
{
EA=0;EX0=0;
/////////轉(zhuǎn)90度//////////////////////////////////////////////
//***********************///通道1PWMchnfreq的配置
TB80=1; //發(fā)送0X53
SBUF0=0X53;
while(~TI0);
TI0=0;
Delay(10000);
TB80=1;//發(fā)送0X33
SBUF0=0XB4;
//SBUF0=0Xf6;
while(~TI0);
TI0=0;
Delay(10000);
//***********************///通道2PWMchnfreq的配置
TB80=0;//發(fā)送0X57
SBUF0=0X57;
while(~TI0);
TI0=0;
Delay(10000);
TB80=1;//發(fā)送0X33
SBUF0=0XB4;
//SBUF0=0Xf7;
while(~TI0);
TI0=0;
Delay(10000);
//***********************///通道1,2不同步的同步模式寄存器synmode的設(shè)置
TB80=1;//發(fā)送0X5C
SBUF0=0X5C;
while(~TI0);
TI0=0;
Delay(10000);
TB80=1;//發(fā)送0X00
SBUF0=0X00;
while(~TI0);
TI0=0;
Delay(10000);
//***********************///通道1chnmode的配置
TB80=1;//發(fā)送0X50
SBUF0=0X50;
while(~TI0);
TI0=0;
Delay(10000);
TB80=0;//發(fā)送0Xe0
SBUF0=0Xe0;
while(~TI0);
TI0=0;
Delay(10000);
//***********************///通道2chnmode的配置
TB80=0;//發(fā)送0X54
SBUF0=0X54;
while(~TI0);
TI0=0;
Delay(10000);
TB80=1;//發(fā)送0Xe0
SBUF0=0Xc0;
while(~TI0);//發(fā)送0X80
TI0=0;
P30=1;P31=1;
}
void main(void)
{
c=0;
WDTCN=0xde; /********關(guān)看門狗*********/
WDTCN=0xad;
count=0;count1=0;
cnt=0;flag_sound=0;
PORT_Init();
SYSCLK_Init();
LCD_Init();
SCON0=0xD0; //UART0工作在方式2,9位UART,可變波特率
SCON1=0x50; //UART1工作在方式1,8位UART,可變波特率
T2CON=0x30;
T4CON=0x30;
RCAP2L=0xb8; //設(shè)置波特率(定時器2作為波特率發(fā)生器)
RCAP2H=0xff;
RCAP4L=0x0b8; //設(shè)置波特率(定時器4作為波特率發(fā)生器)
RCAP4H=0xff;
EA=1;
TR2=1;
T4CON|=0x04; //開定時器4
TI0=0;
IT0=1;
EX0=1;
CKCON=0x00; /*****定時器0,1用的時鐘為系統(tǒng)時鐘的12分頻*****/
TMOD=0x11; /*****定時器1用來定時,定時器0用來計被測脈沖******/
TH1=0x6f;TL1=0xff; /*****定時器1的初值*****/
ET1=1;
TR1=0;
/**********配置定時器0*************/
TL0=0x69;
TH0=0xff;
ET0=1;
EA=1;
TR0=0;
flag=0;
flag1=0;
// P33=1;
while(1)
{
P30=0;P31=0;
// P33=1;
while(key1&&key2);
if (key1==0)
key_flag=1;
if (key2==0)
key_flag=0;
b=1000;
TR0=1;//開定時器0,6Khz方波
while(~flag_sound);
flag2=0;
a=30;
TR1=1;
while(~flag2);
Delay(100);//主控MCU延時50US
c=50;
stright();
stop_8s();
if (key_flag==0)
{
zhuanwan_left(); }
else
{
zhuanwan_right();
}
stop();
EA=1;
b=1500;//音量
TR0=1;//開定時器0,6Khz方波
while(~flag_sound);
a=30;
TR1=1;
while(~flag2);
c=33;
flag=0;
P30=1;P31=1;
EA=1;EX0=1;
stright();
while(~flag);
P30=0;P31=0;
SCON1&=0xfd;
SBUF1=0xc;
while(SCON1&0x02==0x00);
Write_Code(0x80);
Write_Data(0x31);
Write_Data(0x32);
Write_Data(0x63);
Write_Data(0x6d);
Write_Data(0x2f);
Write_Data(0x73);
附錄2. VHDL源程序
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY TOP IS
PORT(
iCLK_50M : in std_logic;
irst_n : in std_logic;
iRXD :in std_logic;
oRW : out std_logic;
oRS : out std_logic;
oEN : out std_logic;
oLCD_DATA : out std_logic_vector(7 downto 0);
F_CS,SD_CS : out std_logic
);
end;
ARCHITECTURE behave OF TOP IS
signal R_data_done:std_logic_vector(7 downto 0);
signal data1,data2,data3:std_logic_vector(7 downto 0);
component rec is
PORT(
iCLK_50M : in std_logic;
irst_n : in std_logic;
iRXD : in std_logic;
oR_data : out std_logic_vector(7 downto 0)
);
end component;
component manage is
PORT(
iCLK_50M : in std_logic;
irst_n : in std_logic;
iR_data : in std_logic_vector(7 downto 0);
odata_1,odata_2,odata_3 : out std_logic_vector(7 downto 0)
);
end component;
component LCD_1602 is
port(
irst_n : in std_logic; --復(fù)位信號
iCLK_50M : in std_logic; --50M時鐘輸入端
iData_1,iData_2,iData_3 : in std_logic_vector(7 downto 0); --預(yù)置值緩存
oRW : out std_logic; --LCD1602控制端RW
oRS : out std_logic; --LCD1602控制端RS
oEN : out std_logic; --LCD1602控制端EN
oLCD_DATA : out std_logic_vector(7 downto 0) --LCD1602數(shù)據(jù)接口
);
end component;
BEGIN
F_CS<=1; SD_CS<=1;
u1:rec
port map(iCLK_50M=>iCLK_50M, irst_n=>irst_n, iRXD=>iRXD,
oR_data=>R_data_done);
u2:manage
port map(iCLK_50M=>iCLK_50M, irst_n=>irst_n, iR_data=>R_data_done,
odata_1=>data1, odata_2=>data2, odata_3=>data3);
u3:LCD_1602
port map(irst_n=>irst_n, iCLK_50M=>iCLK_50M, iData_1=>data1,
iData_2=>data2, iData_3=>data3, oRW=>oRW, oRS=>oRS,
oEN=>oEN, oLCD_DATA=>oLCD_DATA);
end;
附錄3. 電路圖
附錄3.1 FPGA核心板極其配置電路
附錄3.2 音頻接受模塊電路
附錄3.3 電機驅(qū)動模塊電路圖
附錄3.4 紅外對管測速原理圖
附錄3.5電源電路模塊電路
鏈接地址:http://www.3dchina-expo.com/p-8963659.html