管文龙,杜泽强,田会方,吴迎峰
(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,使用手机可以远程控制和监控送餐机器人。该机器人可以应用到酒店、医院及特殊隔离房间等场合,可以减轻工作人员的工作强度,减少运营成本。