過 怡,張 振,張 棋
(蘇州市職業大學 計算機工程學院,江蘇 蘇州 215000)
AGV(Automated Guided Vehicle) 智能車是由汽車和智能技術演變而來,是一種在計算機監控下根據具體規劃和作業要求完成取貨、 送貨、 充電等任務的無人駕駛自動化車輛, 其效率高、靈活性好,在國內的物流行業、裝配及制造行業中得到了廣泛應用[1,2],大大降低了生產成本,提高了生產效率。AGV智能車在安裝調試及故障檢測中的數據監測通常由下位機采集傳感器數據,通過有線的方式傳遞給上位機系統(PC機),對于靜態的數據比如溫度、濕度、光照度等可以滿足監測的需求,但是對于動態數據,比如智能車的直行速度、轉彎速度,需要在智能車行駛過程中實時監測,從而判斷問題所在,進行合理的配置。
因此,采用移動手機作為信息監測的上位機系統,采用無線的方式采集下位機發送的傳感器數據,便于工程人員通過數據實時獲得智能車的狀況,提高安裝調試的效率。
AGV智能車通過兩組L298驅動四個直流電機控制小車的行進。為了簡化控制,兩組L298分別同時驅動左側和右側的兩個直流電機,即左側的兩個電機同時驅動左側前后輪,右側的兩個電機同時驅動右側前后輪。左、右側的電機上都安裝有單路輸出測速碼盤,碼盤數據通過外部中斷方式發送給STM32單片機。智能車所處環境的光照度采用BH1750FVI進行采集,通過GPIO口采集光照數據后通過IIC總線傳輸給MCU。 智能車在行進中的避障采用超聲波傳感器實現。MCU內部的定時器每隔固定的時間周期將上述傳感器數據通過串口發送給無線傳輸模塊HLK-RM04,該模塊將數據發送給手機模塊。智能車信息監測系統的整體結構如圖1所示。

圖1 智能車信息監測系統整體結構
當智能車安裝的傳感器數量較多時,可以采用分布式結構進行系統設計[3],即采用多MCU控制單元,分為數據采集單元、核心主控單元、驅動控制單元和其他控制單元等。各控制單元間采用CAN總線互聯,如圖2所示。

圖2 復雜系統多MCU結構
系統的WIFI通信采用HLK-RM04模塊實現,這是一個低成本、高性能的串口-以太網-無線網模塊,該模塊內置TCP/IP協議棧,可以實現串口、以太網、無線網三個接口之間數據的任意傳輸[4]。系統中MCU使用串口1發送引腳PA9、接收引腳PA10與WIFI模塊的接收引腳UART_RX、發送引腳UART_TX連接。引腳10ES/RST為恢復原廠設置,復位時長按7 s以上可以恢復原廠設置。HLK-RM04模塊初始串行波特率為115 200 Bauds,端口默認為6000。圖3為無線通信模塊的電路原理圖。

圖3 無線通信模塊原理圖
2.2.1 光照度傳感器模塊
系統使用數字型光強度傳感器BH1750FVI進行環境光強度數據采集。BH1750FVI是一種兩線制串行總線接口的數字型光強度傳感器模塊,具有較大的光強度測試范圍(1 lx~65 535 lx)[5,6]。該模塊通過IIC總線與STM32MCU進行數據傳輸。模塊的地址線ADDR、時鐘線SCL、數據線SDA分別與STM32的PB5、PB6、PB7引腳連接。圖4為光照度傳感器原理圖。

圖4 光照度傳感器原理圖
2.2.2 超聲波傳感器模塊
系統的測距模塊使用超聲波傳感器實現,通過調節可調電阻RW3的電阻值控制555定時器的輸出頻率,555定時器的輸出頻率控制在40 kHz以內,同時將電平控制引腳INC設置為低電平,控制超聲波的發射。超聲波接收電路通過調節可調電阻RW2電阻值來控制接收解碼,并將接收信號發射給STM32的外部中斷4(PB4引腳)。圖5為超聲波傳感器發送和接收原理圖。

圖5 超聲波傳感器發送和接收原理圖
2.2.3 碼盤測速模塊
智能車的左、右電機分別安裝了單路輸出旋轉測速編碼器,左側編碼器輸出發送給外部中斷10引腳PB10,右側編碼器輸出發送給外部中斷0引腳PB0 。在軟件系統中選擇某一側的碼盤信號作為采用信號。碼盤每轉動一個脈沖,即產生一個外部中斷請求信號,軟件系統通過計算碼盤值測量智能車的速度。圖6為STM32F1X讀取碼盤數據的電路原理圖。

圖6 碼盤測速原理圖
將WIFI通信模塊配置為服務器模式,由于該模塊內置了TCP/IP協議,因此用戶無需設置TCP/IP協議棧。該模塊出廠時端口統一設置為60000,IP地址統一設置為192.168.xxx.254,其中xxx為模塊名稱后三位數字。系統軟件設計前,用戶可以通過電腦查看智能車WIFI通信模塊的IP地址。電腦連接智能車上的WIFI模塊,打開電腦的控制面板,在控制面板中打開網絡和共享中心,在無線網絡圖片上右鍵選擇狀態即可查看IP地址。
WIFI通信模塊采用串行通信方式與主控MCU進行數據通信,為了實現智能車與手機的WIFI通信,必須初始化STM32單片機的串口1,設置STM32F1X中引腳PA9和PA10的工作模式以及串口的比特率與數據格式。
本系統采用安卓手機作為上位機系統,接收智能車發送的傳感器數據并以圖形界面顯示,實時監測智能車的運行狀況。首先,創建Socket對象接收主機名稱和端口號,必須與3.1節中的設置一致;其次,創建數據流對象進行數據傳輸;然后開啟線程時接收數據。代碼中設計了一個中斷和一個計時器,中斷主要用于數據傳輸過程中對數據的獲取。定時器以500 ms為間隔調用run 函數獲得數據,主要代碼如下:
public void connect(final Handler handler, String IP) {
try {
socket = new Socket(IP, port);
bInputStream=new DataInputStream(socket.getInputStream());
bOutputStream=newDataOutputStream(socket.getOutputStream());
reThread.start();
timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
handler.sendMessage(message);
} }
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} }
智能車通過安裝的傳感器可以獲得外界環境參數,包含智能車超聲波數據、光照數據、碼盤值。手機模塊采集傳感器數據需要與智能車間建立通信協議,接收智能車采集的數據。收發雙方定義的通訊協議格式如表1所示。

表1 通訊協議格式
通訊協議的數據由8個字節組成,前2個字節為包頭,第3個字節為主指令,從第4到第6字節為副指令,第7字節為校驗碼,第8位為包尾。包頭和包尾用來表示是否接收到并且接收完畢的標識位,主指令用來判斷接收或者發送的指令的類型,3個字節的副指令主要用來存放在通訊過程中需要傳輸的數據,第7字節校驗和是從主指令開始到副指令結束直接求和并且對256求余所得,主要用來驗證數據傳輸的正確性。
手機模塊APP通過系統對智能車發送的數據進行解析,顯示傳感器的數據。參考代碼如下:
public void handleMessage(android.os.Message msg) {
if (msg.what == 1) {
mByte = (byte[]) msg.obj;
if (mByte[0] == 0xaa) {
UltraSonic = mByte[5] & 0xff; //超聲波數據
UltraSonic = UltraSonic << 8;
UltraSonic += mByte[4] & 0xff;
Light = mByte[7] & 0xff; // 光照強度
Light = Light << 8;
Light += mByte[6] & 0xff;
CodedDisk = mByte[9] & 0xff; // 碼盤
CodedDisk = CodedDisk << 8;
CodedDisk += mByte[8] & 0xff;
if (mByte[1] == (byte) 0x55) {// 顯示數據
show.setText("傳感器信息:" + " 超聲波:" + " + Light + "lx" + " 碼盤:" + CodedDisk+ "光強度:" + psStatus );
} } };
手機模塊運行安卓的APP程序,實時采集和監測從智能車發送的傳感器數據,實現了智能車數據監測的實時性。智能手機攜帶及操作方便,無論何時何地,工程人員隨時可以查看智能車的各項數據情況,大大提高了智能車參數測試和調試的效率。WIFI通信模塊HLK-RM04實現了串行數據和無線數據的透明轉換,簡化了系統設計。