国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于樹莓派的開關量數(shù)據(jù)采集系統(tǒng)設計與實現(xiàn)

2024-09-14 00:00:00白永強張正娟孫琦
電腦知識與技術 2024年23期

摘要:基于樹莓派功能強大、接口豐富的特點,利用樹莓派的多路GPIO接口,在Qt開發(fā)環(huán)境中設計并實現(xiàn)了一種可靠性高、實用性強、使用方便的開關量數(shù)據(jù)采集系統(tǒng)。本文簡要介紹了樹莓派及其GPIO接口、訪問GPIO接口使用的wiringPi庫等內(nèi)容,從系統(tǒng)硬件設計原理、接口定義、軟件組成結構、數(shù)據(jù)幀結構以及實現(xiàn)中的關鍵代碼模塊等幾個方面進行了詳細的闡述。

關鍵詞:樹莓派;GPIO;wiringPi;指定源組播;開關量數(shù)據(jù)采集系統(tǒng)

中圖分類號:TP399 文獻標識碼:A

文章編號:1009-3044(2024)23-0005-05

開放科學(資源服務)標識碼(OSID)

0 引言

航天發(fā)射場一體化指揮決策系統(tǒng)(以下簡稱一體化指揮決策系統(tǒng))是基于航天發(fā)射綜合測試信息,具備信息獲取、傳輸、處理,以及對航天發(fā)射任務態(tài)勢進行分析判斷、指揮決策和綜合保障等功能的信息系統(tǒng),是航天發(fā)射任務實施的神經(jīng)中樞[1]。近年來,一體化指揮決策系統(tǒng)的軟硬件進行了全面的自主可控改造。改造過程中,不僅要滿足當前在用的航天發(fā)射任務的需求,考慮到未來航天發(fā)射任務的需求,還需要適應一些老舊型號任務的需求,確保在某個老舊型號任務啟動時,系統(tǒng)能夠正常使用。

在某型號航天發(fā)射任務中,使用Intel + Windows平臺下安裝在工控機上的開關量采集卡實現(xiàn)測試數(shù)據(jù)的采集,但目前開關量采集卡無法適配自主可控的軟硬件環(huán)境。樹莓派(Raspberry Pi) 是一種單板機電腦,其GPIO(General Purpose I/O Ports) 接口能夠替代開關量采集卡的功能。因此,在航天發(fā)射任務的軟硬件自主可控環(huán)境中,研制基于樹莓派的開關量采集系統(tǒng)(以下簡稱開關量采集系統(tǒng)),實現(xiàn)開關量數(shù)據(jù)的采集是一種行之有效的解決方案。

1 樹莓派及其相關軟硬件簡介

1.1 樹莓派簡介

樹莓派由英國慈善組織Raspberry Pi基金會開發(fā),是基于ARM控制器和Linux系統(tǒng)的單板機電腦,于2012年3月正式發(fā)售。其大小和一張信用卡相同,具備計算機主機的所有功能,支持多種開發(fā)語言,主流的有C語言和Python語言。樹莓派包含多類接口,如USB、RJ45、HDMI和GPIO等[2]。自問世以來,樹莓派主要經(jīng)歷了B+、3B、3B+、4B、5B等型號的演變。圖1展示了樹莓派4B的外觀布局圖。

1.2 樹莓派的GPIO接口簡介

樹莓派的GPIO是一種數(shù)字輸入/輸出接口,可用于控制和監(jiān)測電子元件。輸入引腳可用于讀取傳感器或按鍵等外部設備輸入的信號,輸出引腳可用于向外部設備(如LED等)輸出電流或電壓。樹莓派4B有40個GPIO引腳,它們被分成兩排,并從編號1到40進行標號。表1為樹莓派4B的GPIO引腳對照表[3],其中2個引腳提供5V的輸出電壓,2個引腳提供3.3V的輸出電壓,8個接地為0V,其他28個端口可以提供輸入輸出功能。

樹莓派的GPIO引腳編號分為3種:

第1種編號是物理引腳BOARD編號,這種編號方式與樹莓派電路板上的物理引腳一一對應,其優(yōu)勢在于在電路板升級更新后,不需要重復編寫代碼,也無須考慮樹莓派版本的問題;

第2種編碼為BCM(Broadcom SOC Channel) 編號,BCM編號是SOC芯片上GPIO控制器內(nèi)部使用的編號,側重CPU寄存器;

第3種編號為wiringPi編號,側重實現(xiàn)邏輯,其優(yōu)點是方便編程。

本系統(tǒng)的研制使用了wiringPi編號方式。

1.3 wiringPi庫簡介

開關量數(shù)據(jù)采集系統(tǒng)的研制在Linux操作系統(tǒng)中的Qt平臺下使用了wiringPi庫。wiringPi是一個強大而靈活的C語言庫,提供了簡化的樹莓派GPIO訪問接口,允許開發(fā)者配置和使用樹莓派的GPIO引腳。通過幾個簡單的函數(shù)調(diào)用,可以設置引腳模式(輸入或輸出)、讀取或寫入引腳狀態(tài),以及處理中斷等。wiringPi使用底層的BCM2835芯片庫,提供對樹莓派GPIO的低級別訪問,因此能夠實現(xiàn)高精度的計時和快速的響應速度。

wiringPi需要在系統(tǒng)中安裝,下載地址為:https://project-downloads.drogon.net/wiringpi-latest.deb。在Linux操作系統(tǒng)中使用 sudo dpkg -i wiringpi-latest.deb 命令進行安裝。

在Qt開發(fā)環(huán)境中使用wiringPi庫前,需要包含wiringPi.h文件。主要用到以下函數(shù):

1) 初始化:int wiringPiSetup();

2) 設置針腳輸入/輸出模式:void pinMode(int pin, int mode);

3) 設置針腳信號為上拉/下拉:void pullUpDnControl(int pin, int pud);

4) 信號上升沿/下降沿/上升或下降觸發(fā)工作函數(shù):wiringPiISR(int pin, int edgetype, void (*function)(void));

5) 向針腳寫入高/低電平:void digitalWrite(int pin, int value);

6) 讀取針腳電平:int digitalRead(int pin)。

2 開關量采集系統(tǒng)的設計

針對某型號航天發(fā)射任務,火箭系統(tǒng)通過48孔航空插座向一體化指揮決策系統(tǒng)發(fā)送22路開關量數(shù)據(jù)。系統(tǒng)利用樹莓派具有多路GPIO輸入/輸出的特點,實現(xiàn)對開關量信號的實時采集,并將其轉換為一體化指揮決策系統(tǒng)內(nèi)部數(shù)據(jù)收發(fā)所需的網(wǎng)絡幀結構。為保證運行的可靠性,系統(tǒng)使用兩塊樹莓派以主/備方式工作。主備同時采集開關量數(shù)據(jù),但僅有主用設備向外發(fā)送數(shù)據(jù)。當主用設備出現(xiàn)故障時,啟動備用設備。主備切換通過心跳機制實現(xiàn)。

2.1 硬件設計原理

開關量數(shù)據(jù)采集系統(tǒng)的硬件連接電路原理如圖2所示。開關量信號發(fā)生端有多路開關,所有開關的公共端接+3.3V電源,另一端分兩路通過防逆流二極管分別接至兩塊樹莓派的GPIO端口。每塊樹莓派通過GPIO輸出連接發(fā)光二極管,用于提供工作狀態(tài)指示。為了實現(xiàn)安全關機,系統(tǒng)使用關機按鍵連接兩塊樹莓派的GPIO端口以輸入關機信號。系統(tǒng)為樹莓派提供+5V電源,為開關量信號發(fā)送端提供+3.3V電源。系統(tǒng)加電即樹莓派開機。

開關量數(shù)據(jù)采集系統(tǒng)實現(xiàn)以下功能:

1) 開關量信號采集。系統(tǒng)采集信號共22路,兩塊樹莓派以主備方式同時采集,但只有主機向外發(fā)送采集結果數(shù)據(jù)。為了防止兩塊樹莓派之間信號相互干擾,每一路開關信號分支都增加防逆流二極管,保證信號單向傳輸。樹莓派所有采集端子的初始狀態(tài)為低電平,當信號發(fā)送端開關閉合后,采集端子采集到高電平,此時應用程序處理并向外發(fā)送采集到的數(shù)據(jù)。

2) 心跳監(jiān)測。為了保證系統(tǒng)的可靠性,通過使用兩塊樹莓派同時采集數(shù)據(jù),并使用心跳線通信。主機定時向備機發(fā)送心跳信號(即定時置高低電平),當備機監(jiān)測不到主機心跳時,備機切換為主機,承擔主機工作。主機向外發(fā)送采集數(shù)據(jù),備機不向外發(fā)送。

3) 工作狀態(tài)指示。兩塊樹莓派各有一個端子連接發(fā)光二極管,以閃爍狀態(tài)指示系統(tǒng)工作狀態(tài)。主機閃爍頻率為每秒1次,備機閃爍頻率為每2秒1次。發(fā)光狀態(tài)通過交替高低電平實現(xiàn)。

4) 關機信號。系統(tǒng)設置了一個關機按鍵,實現(xiàn)兩塊樹莓派同時安全關閉系統(tǒng)。兩塊樹莓派的關機采集端子起始電平設為高電平,分別通過防逆流二極管連接同一個開關。開關閉合后電平拉低,樹莓派采集到低電平信號后,通過應用程序實現(xiàn)關機。

2.2 樹莓派GPIO接口定義

兩塊樹莓派都配置了GPIO端子擴展板,其接口與航空插座連接定義如表2所示。

2.3 軟件模塊組成結構

系統(tǒng)軟件使用Qt開發(fā),由4個模塊組成,即主模塊MainWidget、控制模塊Controller、采集模塊Collector和發(fā)送模塊Sender,軟件組成結構如圖3所示。

主模塊JhiysDeGH6XxIJgP1Lm2OOVj15dBMAMohBpn5MwshgY=MainWidget實現(xiàn)軟件配置文件數(shù)據(jù)的讀取,控制模塊Controller的創(chuàng)建,并向所有模塊傳遞其所需的配置數(shù)據(jù)??刂颇KController完成采集模塊Collector、發(fā)送模塊Sender的創(chuàng)建,控制Collector模塊的采集線程,向MainWidget、Sender模塊傳遞采集到的數(shù)據(jù)。采集模塊Collector通過線程完成數(shù)據(jù)的采集并向Controller發(fā)送采集到的數(shù)據(jù),此外還負責LED發(fā)光二極管的控制、關機控制、心跳發(fā)送與接收、主備切換等工作。發(fā)送模塊Sender完成采集數(shù)據(jù),按照一體化指揮決策系統(tǒng)內(nèi)部幀結構組幀,并以指定源組播的方式向網(wǎng)絡發(fā)送。

指定源組播(Source-Specific Multicast,SSM) 是一種組播服務模型,在一個發(fā)送者和多個接收者之間進行通信。在SSM中,組播接收者在加入組播組時可以指定接收或者拒絕來自特定組播源的組播流量,即匹配上了源地址才接收組播流量,否則丟棄流量。SSM實現(xiàn)了路由協(xié)議的簡化,使組播傳輸?shù)姆€(wěn)定性及安全性得到了增強。并且在實施SSM業(yè)務時,除了要求網(wǎng)絡端支持網(wǎng)絡組播外,還需要網(wǎng)絡和應用支持IGMP v3協(xié)議[4]。

2.4 數(shù)據(jù)幀結構設計

開關量數(shù)據(jù)采集軟件的數(shù)據(jù)組幀后以UDP指定源組播方式向一體化指揮決策系統(tǒng)內(nèi)部發(fā)送,幀結構如表3所示。

具體的數(shù)據(jù)幀結構簡介如下:

1) 版本(VER) 。用于表示UDP組播協(xié)議的版本號,用1個字節(jié)表示。

2) 任務代號(MID) 。用于表示當前任務的代號,用2個字節(jié)表示。

3) 信源(SID) 。用于表示信息發(fā)送方的標識。

4) 信宿(DID) 。用于表示信息接收方的標識。

5) 數(shù)據(jù)分類標志(BID) 。用于表示傳輸?shù)臄?shù)據(jù)為數(shù)值型、狀態(tài)型和指令型等類別,開關量數(shù)據(jù)為狀態(tài)型數(shù)據(jù)。

6) 數(shù)據(jù)段序號(No) 。用于表示對發(fā)送的數(shù)據(jù)段連續(xù)計數(shù),發(fā)送第一個數(shù)據(jù)段時,計數(shù)值為1,以后每發(fā)送一個數(shù)據(jù)段,計數(shù)值加1,0~232-1循環(huán)計數(shù)。

7) 數(shù)據(jù)處理標志(FLAG) 。用于表示發(fā)送的數(shù)據(jù)是模擬數(shù)據(jù)還是真實數(shù)據(jù),分別用00H和01H表示。

8) 備用(B) 。用于后續(xù)擴充使用。

9) 發(fā)送日期(DATE) 。表示信源發(fā)送該數(shù)據(jù)段的日期,相對于2000年1月1日的累計天數(shù),2000年1月1日為第1天。

10) 發(fā)送時間(TIME) 。表示數(shù)據(jù)段發(fā)出時的標準時刻(北京時),用4個字節(jié)(DWORD) 的無符號長整型數(shù)表示,量化單位為0.1毫秒。例如,當前時間是8:10:30,則時間值為(8×3600 + 10×60 + 30) ×10 000 = 294 300 000(0.1毫秒)。

11) 數(shù)據(jù)域長(L) 。數(shù)據(jù)域長指該應用數(shù)據(jù)包內(nèi)有效數(shù)據(jù)域(DATA) 的字節(jié)長度,用2字節(jié)無符號整數(shù)表示,范圍為0~65535。

12) 有效數(shù)據(jù)(DATA) 。表示需要傳輸?shù)母黝悢?shù)據(jù),比如本系統(tǒng)中每次采集到的22個開關量數(shù)據(jù)。

3 開關量采集系統(tǒng)的實現(xiàn)

系統(tǒng)實現(xiàn)中使用了多線程技術,除了主線程之外,還包括與主線程并行運行的數(shù)據(jù)采集線程和數(shù)據(jù)發(fā)送線程。其中,數(shù)據(jù)采集線程用于采集開關量的數(shù)據(jù),數(shù)據(jù)發(fā)送線程用于向網(wǎng)絡發(fā)送采集到的數(shù)據(jù)。多線程技術的優(yōu)點是防止線程“堵塞”,增強用戶體驗和程序的效率;缺點是代碼的復雜程度大大提高,而且對硬件的要求也相應提高[5]。

3.1 軟件實現(xiàn)中使用的配置文件說明

軟件研制使用配置文件的作用主要是方便在后續(xù)使用過程中, 參數(shù)需要更改時不更動軟件源代碼。開關量數(shù)據(jù)采集軟件開發(fā)中使用了兩個配置文件,包括系統(tǒng)配置參數(shù)文件和用于系統(tǒng)采集參數(shù)的開關量數(shù)據(jù)配置文件。

1) config文件。用于設置系統(tǒng)需要的各種配置參數(shù)。

- activestandby=active // 主備配置,active為主用,standby為備用

- heartbeat=30 // 心跳信號使用的GPIO端口wPi編號,固定值

- shutdown=8 // 關機信號使用的GPIO端口wPi編號,固定值

- ledlight=9 // LED發(fā)光二極管信號使用的GPIO端口wPi編號,固定值

- multigroup=232.99.99.99:25100 // 組播地址與端口號,可配置多個,中間用“;”分割

- tablenum=9999 // 組幀使用的參數(shù)表號

- openinterval=10000 // 發(fā)送“接通”后到下一次發(fā)送“接通”的間隔,單位毫秒

2) gpio-wPi-config文件。用于設置系統(tǒng)采集的22個開關量數(shù)據(jù)。

- gpio-wPi=0, index=1, text=參數(shù)1

- gpio-wPi=1, index=2, text=參數(shù)2

- gpio-wPi=12, index=3, text=參數(shù)3

- ……

文件中每一行對應一個開關量數(shù)據(jù)的采集配置,gpio-wPi為采集輸入對應的wPi編號,index為組幀使用的參數(shù)編號,text為定義的參數(shù)名稱。其中gpio-wPi對應的wPi編號取自表1(IDSD,IDSC,SDA,SCL除外)。

3.2 軟件實現(xiàn)中的關鍵代碼

3.2.1 樹莓派GPIO端口的初始化

void Collector::initGPIO()

{

for(int i=0; i<GPIOConfigCount; i++)

{

pinMode(ListGPIOConfig.at(i).gpio, INPUT);//配置樹莓派引腳的IO模式為INPUT

pullUpDnControl(ListGPIOConfig.at(i).gpio,PUD_DOWN); //對已設置IO模式為INPUT的輸入引腳設置為“低電平”

wiringPiISR(ListGPIOConfig.at(i).gpio, INT_EDGE_BOTH, &int_collect);//中斷處理注冊函數(shù),注冊的函數(shù)會在中斷發(fā)生時執(zhí)行

}

pinMode(GPIOShutdown, INPUT);//配置樹莓派引腳的IO模式為INPUT

pullUpDnControl(GPIOShutdown, PUD_UP); //對已設置IO模式為INPUT的輸入引腳設置為“高電平”

wiringPiISR(GPIOShutdown, INT_EDGE_BOTH, &int_shutdown); //中斷處理注冊函數(shù),注冊的函數(shù)會在中斷發(fā)生時執(zhí)行

}

3.2.2 讀取樹莓派端口的狀態(tài)

void Collector::in_collecting()

{

_mutex.lock();//鎖定互斥量,用于線程同步

for(int i=0; i<GPIOConfigCount; i++)

{

GPIOConfig config_1 = ListGPIOOnce.at(i);

QTime curtime = QTime::currentTime();

if(qAbs(config_1.collecttime.msecsTo(curtime)) >= OpenInterval)

{

config_1.state = 0;

}

ListGPIOOnce.replace(i, config_1);

GPIOConfig config = ListGPIOConfig.at(i);

int data = digitalRead(config.gpio); //讀取樹莓派一個端口的電平值

if(data == LOW)

{

config.state = 0;

}

else

{

config.state = 1;

}

}

_mutex.unlock();//解鎖互斥量

}

3.2.3 樹莓派端口狀態(tài)讀取線程和組幀后發(fā)送線程的創(chuàng)建

Controller::Controller(QObject *parent) : QObject(parent)

{

Collector *collector = new Collector;

InstanceCollector = collector;

//創(chuàng)建數(shù)據(jù)采集線程,用于讀取樹莓派各端口的數(shù)據(jù)

collector->moveToThread(&workerThread);

connect(this, SIGNAL(out_heartbeating()), collector, SLOT(in_heartbeating()));

connect(this, SIGNAL(out_collecting()), collector, SLOT(in_collecting()));

connect(collector, SIGNAL(out_result(bool,QByteArray)), this, SLOT(in_result(bool,QByteArray)));

connect(&workerThread, SIGNAL(finished()), collector, SLOT(deleteLater()));

//創(chuàng)建發(fā)送線程,用于讀取樹莓派各端口的數(shù)據(jù)后組幀向系統(tǒng)網(wǎng)絡發(fā)送

Sender *sender = new Sender;

sender->moveToThread(&workerThread2);

connect(this, SIGNAL(out_result_share(bool,QByteArray)), sender, SLOT(in_result_share(bool,QByteArray)));

connect(&workerThread2, SIGNAL(finished()),

sender, SLOT(deleteLater()));

workerThread2.start();

workerThread.start();

_timerCollect.setInterval(250);//創(chuàng)建250毫秒間隔的時間片

connect(&_timerCollect, SIGNAL(timeout()), this, SLOT(doCollecting()));

_timerCollect.start();

}

4 結束語

經(jīng)測試,基于樹莓派使用Qt開發(fā)語言實現(xiàn)的開關量數(shù)據(jù)采集系統(tǒng)具有高穩(wěn)定性和強可靠性。在自主可控軟硬件環(huán)境中無法安裝使用開關量采集卡的情況下,該系統(tǒng)能夠確保某型號航天發(fā)射任務中開關量數(shù)據(jù)的有效采集和一體化指揮決策系統(tǒng)的正常運行。

參考文獻:

[1] 白永強,高家智,張正娟.自主可控軟硬件在航天發(fā)射場一體化指揮決策系統(tǒng)中的應用[J]. 導彈試驗技術,2020(3):55-58.

[2] 王梁棟.基于樹莓派的智能家居溫度遠程監(jiān)控系統(tǒng)的設計[J].信息通信,2018,31(5):65-66.

[3] 郭亮,王冠南,孫紅靜,等.基于Raspberry Pi的可視化溫濕度測量系統(tǒng)設計[J].單片機與嵌入式系統(tǒng)應用,2016,16(9):57-60,68.

[4] 崔永強,白永強.基于銀河麒麟環(huán)境指定源組播的研究與實現(xiàn)[J].電子技術與軟件工程,2018(18):32-33.

[5] 睿峰科技.蘋果iOS 6開發(fā)從入門到實戰(zhàn):iOS開發(fā)必備應用開發(fā)實戰(zhàn)與案例[M].北京:當代中國出版社,2013.

【通聯(lián)編輯:唐一東】

高陵县| 洪湖市| 温宿县| 侯马市| 乡宁县| 安陆市| 吐鲁番市| 南充市| 丰台区| 鸡西市| 湛江市| 察哈| 浮山县| 茂名市| 察雅县| 酉阳| 河北省| 新竹县| 苏州市| 辉南县| 青龙| 乐都县| 桃园县| 精河县| 区。| 红安县| 二连浩特市| 内黄县| 佳木斯市| 宁河县| 象州县| 苍南县| 榆林市| 金华市| 临湘市| 肃南| 灌云县| 萝北县| 齐河县| 东源县| 广东省|