管文龍,杜澤強,田會方,吳迎峰
(1.武漢理工大學 機電工程學院,湖北 武漢 430070;2.西安向陽航天材料股份有限公司,陜西 西安 710065)
服務機器人是一種半自動或者全自動工作的機器人,提供有益于人類健康的服務[1-2]。服務機器人在醫療、家政、餐飲、客服、物流等行業有一定的應用[3]。服務機器人在餐飲行業的應用為這個行業帶來了智能服務的新機遇,送餐機器人的發展推動餐飲服務智能化的進步。因此設計了一款遠程控制送餐機器人,代替餐廳服務員送餐給住酒店客人。該系統研究利用安卓手機APP發送控制指令,采用阿里云物聯網平臺轉發數據給STM32單片機,進而實現對送餐機器人的遠程控制。
送餐機器人遠程控制系統是由上位機軟件系統、下位機硬件系統和阿里云物聯網平臺3部分組成。送餐機器人下位機硬件系統是以STM32F103ZET6處理器為核心部件,并掛載多個模塊組成。本研究使用安卓手機APP發送控制信號,經過阿里云物聯網平臺轉發數據給STM32單片機,進而實現對送餐機器人的遠程控制,系統硬件結構框圖如圖1所示。所設計的系統功能包括送餐機器人的動力部分、定位功能、循跡和避障功能、視頻查看功能、無線通信以及送餐狀態檢測功能。

圖1 系統硬件框圖
在送餐機器人中,電機最常用的是步進電機和直流電機。直流電機有良好的調速性能,控制比較簡單,但精度很低。由于本方案對定位精度有要求,因此選擇步進電機作為送餐機器人的驅動力。送餐機器人采用四輪機構,為了滿足送餐機器人全方位角轉向,將在送餐機器人上安裝4個麥克納姆輪,4個輪子一次安裝A、B型麥克納姆輪,安裝方式如圖2所示,每個輪子使用獨立的驅動方式。

圖2 A、B型輪分布圖
設定機器人負重和自重最大質量為100 kg,選擇57BYGH82-401A步進電機,該步進電機能輸出最大的轉矩為2.1 N·m,當送餐機器人輪子直徑為8 cm時,該步進電機能帶動100 kg以上的負載,由于轉矩比較大,即使遇到一些小障礙也能正常行駛,能夠滿足送餐機器人的動力要求。根據步進電機的參數,驅動模塊選用ATK-2MD4850,其是一款高性能細分型2相混合式步進電機驅動器,此驅動器能夠使得電機轉矩波動小,低速運行平穩以及極小振動和噪音;高速時輸出力矩較大,定位精度比較高[4]。
STM32單片機使用高級定時器在輸出引腳產生PWM(pluse width modulation),通過改變定時器預裝載值和輸出比較值來改變步進電機的轉速。步進電機的端口驅動初始化程序如下:
void Driver_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//使能端口時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0| GPIO_Pin_2;
//設置輸出模式
GPIO_InitStructure.GPIO_Mode=GPIO_Mode _Out_PP;
//配置端口速度
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_SetBits(GPIOC,GPIO_Pin_0);
GPIO_ResetBits(GPIOC,GPIO_Pin_2); }
室內移動機器人定位是移動機器人設計的關鍵技術,由于室內環境,GPS(global positioning system)定位無法正常運行[5]。關于自主移動機器人的室內定位方法有很多種,而對于固定位置、固定路線的移動機器人,常常選擇基于信標的定位方法,基于信標的定位系統依賴于一系列環境中已知特征的信標,并需要在移動機器人上安裝傳感器對信標進行觀測[6]。在信標定位中,基于RF(radio frequency)定位(無線傳感器網絡定位)有WLAN,ZigBee,Bluetooth,UWB(ultra wide band)以及無線RFID(radio frequency identification),選用RFID用于酒店定位,RFID[7]是由閱讀器、電子標簽以及保存電子標簽的數據庫組成,RFID定位原理是閱讀器發出射頻信號,當電子標簽處在射頻信號內,電子標簽內的線圈就會產生感應電流,然后電子標簽獲得能量后,發送儲存在芯片內的信息,閱讀器讀取信息并解碼。
設定每個酒店房間分配兩個電子標簽,記錄房間信息,當送餐機器人攜帶閱讀器經過房間,當閱讀器接收到第一個電子標簽信息后,送餐機器人開始減速,當接收到第二個電子標簽信息后送餐機器人停止移動,送餐機器人房間定位原理如圖3所示。

圖3 房間定位原理圖
送餐機器人給房間送餐,每個房間的位置是固定的,因此送餐機器人的送餐路線也是不變的,送餐機器人可以采用紅外循跡的方法移動。紅外循跡是通過辨別黑色和白色來進行移動[8],在預定規劃好的黑色線路上進行移動。紅外循跡的原理為:在紅外對管模塊中有紅外發射管和紅外接收管,紅外發射管向地面發射紅外線,接收管接收反射回來的紅外線。由于紅外線發射出來的紅外光,當遇到黑色時不反射紅外光,此時在紅外對管模塊中,輸出引腳會輸出低電平;同理,遇到白色,會輸出高電平。送餐機器人需要兩對紅外對管模塊,根據輸出的高低電平改變車輪的轉向,從而實現送餐機器人的循跡功能。
送餐機器人在行駛的過程中,不可避免地會遇到人或其他障礙物,在設計送餐機器人時,需要避障功能,這里選擇紅外避障。此次設計的送餐機器人的避障過程是當傳感器檢測到障礙物時,機器人停止前進,等待前方沒有障礙物時,繼續前進,送餐機器人避障流程如圖4所示。

圖4 避障流程圖
送餐機器人要實現遠程控制,需要將STM32單片機對接阿里云物聯網平臺。ESP8266作為WIFI通信模塊,ESP8266在STA的工作模式下,實現ESP8266通過接收路由器的信號,從而能夠連接互聯網。使用MQTT(message queuing telementry transport)通信協議,實現STM32單片機與阿里云進行數據傳輸,安卓手機APP也同時接入阿里云,實現了APP遠程控制送餐機器人。ESP8266連接阿里云物聯網平臺的程序如下,程序函數返回值的含義如表1所示。

表1 函數返回值
//連接阿里云物聯網平臺
char WiFi_Connect_IoTServer(void)
{
//復位ESP8266
if(WiFi_Reset(50))
return 1;
//使用AT指令,設置STA模式
if(WiFi_SendCmd("AT+CWMODE=1",50))
return 2;
if(wifi_mode==0){
//設置自動連接網絡
if(WiFi_SendCmd("AT+CWAUTOCONN=1",50))
return3; // 連接路由器
if(WiFi_JoinAP(30)), return 4; }
//連接服務器
if(WiFi_Connect_Server(100)) return 5;
return 0; }
市面上大多數移動機器人不能自主移動,而是在機器人前面安裝IP網絡攝像頭模塊,攝像頭將前方路況畫面回傳控制面板上,根據路況來手動控制機器人的移動。而筆者使用IP網絡攝像頭模塊的作用是:當送餐機器人長時間沒有移動或長時間沒有完成送餐,可以通過安卓手機APP,開啟IP網絡攝像頭功能,查看送餐機器人周圍的情況,及時排查送餐機器人長時間停留的原因;當遇到機器人無法判斷繼續前進的狀況時,也可以根據IP網絡攝像頭回傳的畫面,在APP上手動控制送餐機器人的移動,完成送餐任務。
本設計中送餐狀態信息能夠及時在APP中的控制界面中顯示,便于酒店工作人員查看,因此需要設計一種方案,確認送餐機器人到達了指定客房位置,客人是否已經出來取餐,需要將送餐完成情況回傳到遠程控制界面上。目前市面上一些送餐機器人都缺少檢測部分,一般都是酒店工作人員過一段時間撥打客房服務電話,詢問客人餐飲是否已經送達。另一種常見的做法是送餐機器人到達送餐房間后,客人取餐后,客人在送餐機器人按下確認按鍵,但是這種需要客人積極配合,如果客人取餐完成后忘記按確認,酒店工作人員不能及時在控制界面上收到回傳信息,還是需要酒店工作人員打電話確認,這兩種常見的方案,不僅會因為打電話詢問打擾了客人,而且增加了酒店工作人員的工作量。
筆者設計了一種檢測送餐狀態方案,該方案是根據檢測放餐飲位置的重量變化來檢測客人是否取餐完成。在放餐飲位置下安裝一個稱重傳感器,通過稱重傳感器不斷計算出重量,當重量由高變低時,表示客人取餐完成,將完成信息通過阿里云物聯網平臺回傳到APP遠程控制界面上。檢測送餐完成狀態流程如圖5所示。

圖5 檢測送餐完成狀態流程圖
使用應變式稱重傳感器和A/D轉換器芯片HX711,應變式稱重傳感器的模擬輸出電壓信號給HX711轉換芯片,HX711將模擬信號轉換成數字信號,得出餐飲的重量變化量。筆者使用STM32F1單片機作為主控制器,對A/D轉換器進行測量數據的采集,實現實時測量。測量出的數據再與設定值進行比較,如果測量數值大于設定值,表示送餐未完成,置位餐飲未取出標志位HX711_Flag;當測量數值小于設定值,復位餐飲未取出標志位HX711_Flag,表示送餐完成,回傳送餐完成信息。送餐狀態檢測硬件程序如下:
/檢測送餐完成程序
void Get_Weight(void)
{
HX711_m = HX711_Read();//讀出采樣值
//計算出實際重量
HX711_m = HX711_m/GapValue;
//重量大于300,則表示餐飲沒有取出來
if(HX711_m > 300)
{
HX711_Flag=1;
Completion_Flag=0;
}
else
{
HX711_Flag=0;
delay_ms(1000);
}
//重量小于300,表示送餐完成
if(HX711_m <=300&&HX711_Flag!=1)
{
HX711_Flag=0;
Completion_Flag=1;
}
}
送餐機器人主控芯片為STM32F103ZET6,在使用各個模塊時,首先要初始化每一個模塊。下位機與阿里云建立連接時,需要ESP8266無線通信模塊,ESP8266完成初始化后,使用AT指令,設置ESP8266工作在STA模式下,連接路由器,ESP8266開始與阿里云平臺建立TCP(transmission control protocal)連接,建立成功后,根據MQTT通信協議和阿里云平臺提供的STM32_MCU控制端三元組信息,發送連接報文。與阿里云平臺建立連接后,發送訂閱報文,訂閱設備的Topic,用于接收APP控制端的控制信號,下位機控制流程如圖6所示。

圖6 下位機程序控制流程圖
送餐機器人要實現遠程控制,需要將送餐機器人接入阿里云平臺上。首先,用戶要登錄阿里云,在物聯網平臺上創建產品,在產品下,添加設備,這次需要添加兩個設備,分別是Android_APP控制端和STM32_MCU控制端,添加完成后,會生成唯一產品和設備,獲得設備三元組[9]:ProductKey(產品密鑰)、DeveiceName(設備名稱)、DeviceSecret(設備密鑰)。設備的三元組是上位機、下位機與阿里云建立MQTT報文通信協議標識符。為了區分APP向下發送消息,需要在設備管理欄下的產品中自定義功能類型,確保功能按鈕的唯一性[10],部分功能定義如表2所示。

表2 功能定義
所設計的送餐機器人遠程控制端使用Android Studio開發環境開發安卓APP。本系統設計的遠程控制界面是由登錄界面、注冊界面、MQTT協議、多線程管理、送餐房間號管理、遠程監控界面、手動操作界面組成,遠程控制界面APP系統流程如圖7所示。

圖7 遠程控制界面APP系統流程圖
使用Android Studio開發遠程控制界面APP的核心技術是建立Socket,數據的發送或接收,需要使用到Android系統中的Handler消息傳遞機制[11],Android系統調用Handler消息傳遞機制時,需要開啟Message,Message Queue以及Looper[12]。Handler的任務是負責處理Message,在本系統中需要處理MQTT連接阿里云物聯網平臺的消息,包括MQTT連接阿里云成功、失敗反饋消息以及阿里云收到單片機回傳消息。
APP與單片機使用的通信協議是MQTT,APP連接上阿里云物聯網平臺,APP通過按鈕的點擊事件,將控制信息以JSON的ALINK協議格式上傳到阿里云,然后通過阿里云以同樣的數據格式下發給STM32MCU,STM32MCU執行相應命令。
在安卓手機上安裝已設計完成的APP,打開APP,酒店工作人員需要先登錄,登錄成功后,才能有使用權限。
酒店工作人員登錄成功,可以根據實際情況選擇送餐房間,確定房間以后,APP界面跳轉到遠程控制界面上,遠程控制界面如圖8所示。

圖8 遠程控制界面
當送餐狀態長時間處于未完成時,工作人員可以在遠程控制界面上,按下手動按鈕,進入手動操作界面。工作人員可根據攝像頭拍攝情況進行手動調整完成送餐任務。
送餐機器人使用STM32F103ZET6單片機作為核心控制器,使用ESP8266無線通信模塊,根據MQTT通信協議,將單片機的數據上傳到阿里云物聯網平臺。在Android Studio開發環境下,使用Java編程語言,開發遠程控制界面APP,使用手機可以遠程控制和監控送餐機器人。該機器人可以應用到酒店、醫院及特殊隔離房間等場合,可以減輕工作人員的工作強度,減少運營成本。