摘要:針對低速、低成本、快速搭建的特點,采用Arduino與LabVIEW來實現(xiàn)低成本上下位機數(shù)據(jù)采集系統(tǒng)。Arduino作為下位機,負責(zé)A/D轉(zhuǎn)換以及數(shù)據(jù)傳輸;LabVIEW編寫的數(shù)據(jù)采集軟件作為上位機;上下位機利用RS-232串行接口實現(xiàn)通訊。
【注】一般認為上位機為主機,下位機為從機,上位機領(lǐng)導(dǎo)下位機按照上位機機的意愿工作為上位機服務(wù);同時下位機也可以主動向上位機發(fā)出請求,上位機響應(yīng)下位機并配合完成某個請求。
數(shù)據(jù)采集,是指從傳感器和其它待測設(shè)備等模擬和數(shù)字被測單元中自動采集信息的過程。相應(yīng)能夠完成數(shù)據(jù)采集的系統(tǒng)被稱為數(shù)據(jù)采集系統(tǒng)。
數(shù)據(jù)采集系統(tǒng)的任務(wù),就是采集傳感器輸出的模擬信號轉(zhuǎn)換成計算機能識別的信號,并送入計算機,然后將計算得到的數(shù)據(jù)進行顯示或打印,以便實現(xiàn)對某些物理量的監(jiān)測,其中一些數(shù)據(jù)還將被生產(chǎn)過程中的計算機控制系統(tǒng)用來控制某些物理量。 【文獻1】
一、Arduino下位機部分
數(shù)據(jù)采集系統(tǒng)中的Arduino下位機部分采用Arduino
Leonardo實驗板,如圖1所示。
圖1
Arduino Leonardo控制板
Arduino下位機部分需要完成兩個功能:數(shù)據(jù)采集和數(shù)據(jù)傳輸,Arduino
Leonardo控制板通過串口接受上位機命令,完成相應(yīng)的數(shù)據(jù)采集,并將數(shù)據(jù)回傳至上位機。
數(shù)據(jù)采集分為模擬量采集和數(shù)字量采集,設(shè)置采集路數(shù)各為2路,分別采用Arduino
UNO上具有模擬量輸入的管腳A0、A1和具有數(shù)字量輸入的管腳2、3來實現(xiàn)。模擬量采用接至GND、3.3V和5V來實現(xiàn)不同電壓值,數(shù)字量采用接至5V和GND實現(xiàn)高電平與低電平。【注】
【注】如果有電位器,可以用來測量分壓值。由于手頭沒有電位器,我這里只是簡單的實現(xiàn)。
Arduino Leonardo代碼清單:
#define A0_COMMAND 0x10
//A0采集命令字
#define A1_COMMAND 0x11
//A1采集命令字
#define D0_COMMAND 0x20
//D0采集命令字
#define D1_COMMAND 0x21
//D1采集命令字
byte comdata[3]={0};
//定義數(shù)組數(shù)據(jù),存放串口接收數(shù)據(jù)
int LED = 13;
//定義LED連接的管腳
int A0_mark=0;
//定義A0的標(biāo)志位
int A1_mark=0;
//定義A1的標(biāo)志位
int D0_mark=0;
//定義D0的標(biāo)志位
int D1_mark=0;
//定義D1的標(biāo)志位
int AD_Value=0;
//AD轉(zhuǎn)換后的數(shù)字量
float float_AD_Value;
//數(shù)字量換算成浮點電壓量
int D_Value=0;
//數(shù)字量測量的數(shù)據(jù)
void receive_data(void);
//接受串口數(shù)據(jù)
void test_data(void);
//測試串口數(shù)據(jù)是否正確,并更新數(shù)據(jù)
void do_command(void);
//執(zhí)行更新的數(shù)據(jù)
void setup()
{
Serial.begin(9600);
pinMode(LED,
OUTPUT);
}
void loop()
{
while (Serial.available()
> 0) //不斷檢測串口是否有數(shù)據(jù)
{
receive_data();
//接受串口數(shù)據(jù)
test_data();
//測試數(shù)據(jù)是否正確并更新標(biāo)志位
do_command();
//執(zhí)行更新的數(shù)據(jù)
}
}
void receive_data(void)
{
int i
;
for(i=0;i<3;i++)
{
comdata[i] =Serial.read();
//延時一會,讓串口緩存準(zhǔn)備好下一個字節(jié),不延時可能會導(dǎo)致數(shù)據(jù)丟失,
delay(2);
}
}
void test_data(void)
{
if(comdata[0] == 0x55)
//0x55和0xAA均為判斷是否為有效命令
{
if(comdata[1] == 0xAA)
{
if(comdata[2] ==
A0_COMMAND)
{
A0_mark=2;
//A0更新位置位
}
if(comdata[2] ==
A1_COMMAND)
{
A1_mark=2;
//A1更新位置位
}
if(comdata[2] ==
D0_COMMAND)
{
D0_mark=2;
//D0更新位置位
}
if(comdata[2] ==
D1_COMMAND)
{
D1_mark=2;
//D1更新位置位
}
}
}
}
void do_command(void)
{
if(A0_mark==2)
{
A0_mark=0;
//復(fù)位A0更新位
digitalWrite(LED, HIGH);
//打開LED燈
AD_Value =
analogRead(A0);
//讀取A0電壓值
float_AD_Value=(float)AD_Value/1023*5.00;
//換算為浮點電壓值
Serial.println(float_AD_Value,2);
//保留兩位小數(shù)發(fā)送數(shù)據(jù)
delay(500);
digitalWrite(LED, LOW);
//關(guān)閉LED燈
}
if(A1_mark==2)
{
A1_mark=0;
//復(fù)位A1更新位
digitalWrite(LED, HIGH);
//打開LED燈
AD_Value =
analogRead(A1);
//讀取A1電壓值
float_AD_Value=(float)AD_Value/1023*5.00;
//換算為浮點電壓值
Serial.println(float_AD_Value,2);
//保留兩位小數(shù)發(fā)送數(shù)據(jù)
delay(500);
digitalWrite(LED, LOW);
//關(guān)閉LED燈
}
if(D0_mark==2)
{
D0_mark=0;
//復(fù)位D0更新位
digitalWrite(LED, HIGH);
//打開LED燈
D_Value =
digitalRead(2);
//讀取D2數(shù)字量
Serial.println(D_Value);
//發(fā)送數(shù)字量測量數(shù)據(jù)
delay(500);
digitalWrite(LED, LOW);
//關(guān)閉LED燈
}
if(D1_mark==2)
{
D1_mark=0;
//復(fù)位D1更新位
digitalWrite(LED, HIGH);
//打開LED燈
D_Value =
digitalRead(3);
//讀取D1數(shù)字量
Serial.println(D_Value);
//發(fā)送數(shù)據(jù)量測量數(shù)據(jù)
delay(500);
digitalWrite(LED, LOW);
//關(guān)閉LED燈
}
}
二、LabVIEW上位機部分
LabVIEW與Arduino通訊已在《Arduino與LabVIEW互動應(yīng)用01-串口控制LED亮滅》一文中作了簡單的介紹,此處在上次的基礎(chǔ)上修改實現(xiàn)。
串口讀寫的程序框圖如圖2所示。首先,對選擇的通道的串口進行配置,然后串口寫入所需要測量的通道號,等待100ms,從串口中讀取Arduino下位機返回數(shù)據(jù),最后對數(shù)據(jù)進行適當(dāng)?shù)霓D(zhuǎn)換并顯示出來。
圖2
LabVIEW串口通訊最小部分
LabVIEW上位機前面板設(shè)計如圖3所示。

圖3
LabVIEW上位機前面板
LabVIEW上位機程序框圖如圖4和圖5所示,由于有2路模擬量和2路數(shù)字量,此處僅給出一路模擬量和一路數(shù)字量的程序框圖。不同通道的模擬量或數(shù)字量的發(fā)送數(shù)據(jù)幀中,通道號不同;數(shù)字量與模擬量采集的發(fā)送數(shù)據(jù)幀中,命令號不同。發(fā)送數(shù)據(jù)幀中,具體的命令號和通道可以自己定義,不過需要上下位機的對應(yīng)起來。

圖4
模擬量采集程序框圖

圖5
數(shù)字量采集程序框圖
三、實驗與演示
通過將模擬量輸入A0依次接入GND、3.3V和5V,然后點擊“測量”按鈕,觀察面板上的儀表盤和數(shù)顯框中數(shù)值的變化。
通過將數(shù)字量輸入2依次接入GND和5V,然后點擊“測量”按鈕,觀察面板上的LED燈的變化,LED亮代表高電平、LED滅代表低電平。
四、總結(jié)
在傳感器等領(lǐng)域經(jīng)常需要用到數(shù)據(jù)采集的功能,此應(yīng)用實現(xiàn)了命令發(fā)送與數(shù)據(jù)回傳功能,可以在此基礎(chǔ)上擴展功能,對相關(guān)傳感器的數(shù)據(jù)采集有一定的參考價值。
參考文獻:
文獻1:基于單片機的數(shù)據(jù)采集系統(tǒng)的控制器設(shè)計
文獻2:http:///
|