摘要:針對低速、低成本、快速搭建的特點,采用Arduino與LabVIEW來實現低成本上下位機數據采集系統。Arduino作為下位機,負責A/D轉換以及數據傳輸;LabVIEW編寫的數據采集軟件作為上位機;上下位機利用RS-232串行接口實現通訊。
【注】一般認為上位機為主機,下位機為從機,上位機領導下位機按照上位機機的意愿工作為上位機服務;同時下位機也可以主動向上位機發出請求,上位機響應下位機并配合完成某個請求。
數據采集,是指從傳感器和其它待測設備等模擬和數字被測單元中自動采集信息的過程。相應能夠完成數據采集的系統被稱為數據采集系統。
數據采集系統的任務,就是采集傳感器輸出的模擬信號轉換成計算機能識別的信號,并送入計算機,然后將計算得到的數據進行顯示或打印,以便實現對某些物理量的監測,其中一些數據還將被生產過程中的計算機控制系統用來控制某些物理量。
一、Arduino下位機部分
數據采集系統中的Arduino下位機部分采用Arduino Leonardo實驗板,如圖1所示。
Arduino下位機部分需要完成兩個功能:數據采集和數據傳輸,Arduino Leonardo控制板通過串口接受上位機命令,完成相應的數據采集,并將數據回傳至上位機。
數據采集分為模擬量采集和數字量采集,設置采集路數各為2路,分別采用Arduino UNO上具有模擬量輸入的管腳A0、A1和具有數字量輸入的管腳2、3來實現。模擬量采用接至GND、3.3V和5V來實現不同電壓值,數字量采用接至5V和GND實現高電平與低電平。【注】
【注】如果有電位器,可以用來測量分壓值。由于手頭沒有電位器,我這里只是簡單的實現。
Arduino Leonardo代碼清單:
#define A0_COMMAND
#define A1_COMMAND
#define D0_COMMAND
#define D1_COMMAND
byte comdata[3]={0};
int LED = 13;
int A0_mark=0;
int A1_mark=0;
int D0_mark=0;
int D1_mark=0;
int AD_Value=0;
float float_AD_Value;
int D_Value=0;
void receive_data(void);
void test_data(void);
void do_command(void);
void setup()
{
}
void loop()
{
}
void receive_data(void)
{
}
void test_data(void)
{
}
void do_command(void)
{
}
二、LabVIEW上位機部分
LabVIEW與Arduino通訊已在《Arduino與LabVIEW互動應用01-串口控制LED亮滅》一文中作了簡單的介紹,此處在上次的基礎上修改實現。
串口讀寫的程序框圖如圖2所示。首先,對選擇的通道的串口進行配置,然后串口寫入所需要測量的通道號,等待100ms,從串口中讀取Arduino下位機返回數據,最后對數據進行適當的轉換并顯示出來。
圖2 LabVIEW串口通訊最小部分
LabVIEW上位機前面板設計如圖3所示。
圖3 LabVIEW上位機前面板
LabVIEW上位機程序框圖如圖4和圖5所示,由于有2路模擬量和2路數字量,此處僅給出一路模擬量和一路數字量的程序框圖。不同通道的模擬量或數字量的發送數據幀中,通道號不同;數字量與模擬量采集的發送數據幀中,命令號不同。發送數據幀中,具體的命令號和通道可以自己定義,不過需要上下位機的對應起來。
圖4 模擬量采集程序框圖
圖5 數字量采集程序框圖
三、實驗與演示
通過將模擬量輸入A0依次接入GND、3.3V和5V,然后點擊“測量”按鈕,觀察面板上的儀表盤和數顯框中數值的變化。
通過將數字量輸入2依次接入GND和5V,然后點擊“測量”按鈕,觀察面板上的LED燈的變化,LED亮代表高電平、LED滅代表低電平。
四、總結
在傳感器等領域經常需要用到數據采集的功能,此應用實現了命令發送與數據回傳功能,可以在此基礎上擴展功能,對相關傳感器的數據采集有一定的參考價值。