-1-基于nRF24L01的无线遥控器的设计田永强,师卫太原理工大学通信与信息工程系,山西太原(030024)E-mail:tien226@163.com摘要:本文根据气保焊机实际使用中的需要,为其设计了一款无线遥控器。本遥控器采用了低功耗无线技术以降低其功耗,通信软件采用了请求确认的传输方法以保证其可靠性,并详细论述了无线遥控器的菜单,通信协议和应用软件的设计过程。实际应用效果表明该方案是可行的。关键词:低功耗,气保焊机,无线遥控器中图分类号:TN929.51.引言气保焊机在使用过程中要根据实际的焊接效果对焊接时的电流电压参数进行适当的调节,为了方便这种焊接参数的实时显示和调节,无线遥控器应运而生。蓝牙技术作为公开的无线数据传输标准,旨在建立低成本、短距离的无线连接,可将内嵌蓝牙芯片的设备互联起来。其中的小蓝牙使用2.4HzISM频段,功耗较低,抗干扰比较好外,适合低数据流的简单无线网络,被广泛以用在工业控制中。本文所讲述的无线遥控器也使用了这种技术。2.无线遥控器系统设计2.1无线遥控器总体结构无线遥控器是焊接人员实时地查看和调节气保焊机焊接参数的一个手持设备,既要操作方便可靠,又要结实耐用。由于本遥控器是针对焊机做的,电磁环境比较恶劣,所以抗干扰要做好,尤其是无线通信要可靠,这样才能保证可靠操作[1]。还有,作为手持设备,不但尺寸重量要合适,还要保证待机时间足够的长,所以在电源管理方面要做好。本遥控系统采用主从方式,遥控器是主机,焊机是从机。严格按照请求应答模式,主机向从机发送请求命令,从机应答主机的请求,并做到不请求不应答[2]。对于电流电压和焊机状态这些实时数据,遥控器定时向焊机进行请求,同时把自己的状态信息传送给焊机。为保证可靠性,采用请求确认的模式,并且带有CRC校验。在功耗控制方面,不但要采用低功耗的元器件,还要适时地关断不用的器件,以保证电池的使用时间足够的长。2.2无线遥控器硬件结构无线遥控器的硬件结构见图1,主要由AVR系列单片机ATmage16L,2.4GHzISM射频收发芯片nRF24L01,LCD显示屏MS12864J,电源芯片sp6641等构成[3]。ATmage16LnRF24L01电源MS12864J图1无线遥控器硬件结构图Fig.1wirelesscontrollerhardwarestructure并口SPI+5V+2.7V无线遥控器菜单结构本遥控器设置的数据项比较多,要通过菜单的形式表现出来,对应的操作也将转化为菜单操作。所以本遥控用LCD屏显示数据项,用几个按键来实现菜单操作,外观如图1左边所示。由于检气检丝经常要操作,所以左边的两个独立按键分别是检气和检丝,右边的三个按键是菜单操作的,分别是后退,前进和下翻。后退是用来返回上一级菜单,前进是用来进入下一级菜单活着增加参数的数值,下翻主要是在同一级菜单的项目之间切换或者减小参数的数值。遥控器的主菜单界面见图2右边,其中最上面的一行是状态栏,一直显示焊机的状态和焊接方式,中间的电流电压是在焊接时实时更新的,最下面的两个是焊接设置和系统设置子菜单的入口,通过焊接设置子菜单就可以对焊接参数进行设置,系统设置主要是设置是否对焊机的面板锁定,使其不能进行设置,从而使遥控器完全对焊机进行设置。为了降低菜单的深度,所有的子菜单的菜单项显示在左边,对应的参数显示在右边,用后退和前进按键在其间切换。2.4无线遥控器的通讯协议的设计射频收发芯片nRF24L01的增强型ShockBurst模式已经具有了请求确认和超时重发的功能,所以无线遥控器的通讯协议主要是应用层的通信数据格式和通信规程的确定。通信的数据格式由起始码,控制码,状态字,长度和数据等五部分组成,具体见图3。起始码,固定为0xAA,表示一帧的开始;图2遥控器外观和主菜单Fig.2wirelesscontrolleroutwardandmainmenu125mm100mm系统设置焊接设置焊机状态焊接方式电压电流控制码长度状态字起始码图3遥控器帧结构Fig.3controllerframestructure数据(0~255)1B1B2B1BnB控制码,表示本帧的功能,由三个域组成,最高位为0表示此帧是主机发送的,为1则表示是从机发送的;次高位为0表示正常应答,为1表示异常应答;剩下的六位表示命令类型,从0开始取值。命令总共有读命令,写命令,存储,调用,检气,检丝和锁定等七种类型。状态字,表示发送此帧的主机的状态信息;长度取值为0~255,表示下面数据的长度;数据,是要发送的参数部分,根据控制码的不同有不同的格式和取值。例如:主机读命令控制码为0x01,数据项为:数据种类(2B);从机读命令正常应答控制字为0x81,数据项为:数据类别(2)+数据(n)+报警信息(1);从机读命令异常应答控制字为0xC1,数据项为:异常代码(2)+报警信息(1)。通信规程主要是请求应答的模式,遥控用相应的命令帧请求焊机执行某种操作,焊机将执行的结果用相应的正常应答帧返回给焊机,其间如果出现异常,焊机就用异常应答帧回复遥控器,然后遥控器对异常应答进行处理。3.无线遥控器软件设计无线遥控器的软件主要由主程序,菜单程序,显示程序,通信程序,LCD驱动程序和射频芯片驱动程序等组成,在程序的设计中采用了分层的思想[4]。下面就这几类程序进行分析。3.1菜单程序的设计菜单程序主要有主程序和主菜单等程序,遥控器主程序的功能主要有硬件初始化,查询焊机设备,遥控器初始化,进入主菜单程序。主程序的流程图见图4。主程序中的硬件初始化主要是初始化LCD屏幕和无线模块。查找焊机设备是遥控器以广播的方式与焊机的无线模块进行通信,并获得此模块的地址等信息,从而识别出焊机设备。当找到焊机后,开始读取焊机的数据,并用此数据初始化遥控器的变量。如果三次请求不到舒适化数据,初始化就失败,重新开始查找焊机设备。如果初始化成功,则遥控器进入主菜单程序,LCD屏幕显示前面的主菜单。主菜单程序是voidmainmenu(void),其流程图见图5。主菜单程序是一个循环,在状态处理中主要是对焊机发来的状态信息进行分析处理,并更新主菜单最上面的状态栏,状态处理是每级菜单都有的。菜单剩余部分的显示在接下来的菜单显示中进行,包括实时的电流电压值。接下来是对按键的扫描,按键扫描是非等待的,如果此时有按键按下则进行按键处理,否则继续向下执行,这是为了菜单数据的及时更新。如果是退出键,则菜单主程序退出,重新查找焊机设备。(void)和voidsyssetmenu(void)的调用,这两个程序是焊接设置子菜单和系统设置子菜单的入口,如果进入这两个程序则进入了下一级子菜单。其中的焊机设置子菜单中主要有焊接方式,焊丝材质,焊丝直径,保护气体,存储调用,显示方式,详细设置等项目,是遥控器菜单的主体,大部分参数是在其中设置的。菜单函数见表1。voidmainmenu(void);主菜单函数voidweldsetmenu(void);焊接设置子菜单函数voidsyssetmenu(void);系统设置子菜单函数voidweldtypemenu(ucharind);焊接方式子菜单函数voidcallstotemenu(ucharind);存储调用子菜单函数voiddetailsetmenu(void);详细设计子菜单函数voidstateprocess(void);状态处理函数3.2显示程序的设计显示程序并不等于菜单程序,菜单程序是与菜单操作结合在一起的,而显示程序只是用来显示,在菜单程序中用于显示的主要函数是intdprintf(ucharx,uchary,uchart,constchar*format,…)。可以看出这个函数同printf()相似,其中的前两个参数x和y是坐标,第三个参查找焊机设备主菜单程序遥控器初始化硬件初始化开始找到焊机?初始成功?是是否否菜单显示按键处理按键扫描状态处理开始有键按下?是是否是否退出?退出否图5遥控器主菜单流程图Fig.5controllermainmenuflowchart表1菜单函数Tbl.1menufunctionset图4遥控器主程序流程图Fig.4controllermainprogramflowchart是字体的大小,这里用到了不同的字体大小,第四个参数是显示格式。这个函数分别调用了显示汉字的函数voidputHZ12(ucharx,uchary,constuchar*HZmode),和显示字母的函数voidputZM12(ucharx,uchary,constuchar*ZMmode)和voidputZM24(ucharx,uchary,constuchar*ZMmode)。显示汉字和显示字母的函数是通过调用LCD的驱动函数实现的,LCD的驱动函数见表2。显示函数dprintf()先根据显示格式把要显示的数据转化为ASCII或Unicode字符,再根据这些字符和字体的大小在相应的字库中查找字符对应的字模,并分别调用了显示汉字和显示字母的函数将这些字符显示在屏幕上。由于字模不是整数字节的,所以在这三个函数中增加了对半行的处理。voidLcdInit(void);LCD初始化函数voidLcdClear(void);清屏函数voidLcdWriteCmdL(ucharcmd);左控制器写命令函数voidLcdWriteCmdR(ucharcmd)右控制器写命令函数voidLcdReadByte((ucharx,uchary,uchardata);从LCD读数据函数voidLcdWriteByte((ucharx,uchary,uchardata);往LCD写数据函数3.2通信程序的设计通信程序共分为三个层次,最上层是在菜单程序中调用的一组是操作命令,是根据不同的操作定义的,一共有七种,见表3:ucharreadcmd(uintitem);读命令ucharwritecmd(uintitem,intvalue);写命令ucharcallparacmd(ucharchannel);存储命令ucharstoreparacmd(ucharchannel);调用命令ucharcheckgascmd();检气命令ucharcheckrodcmd();检丝命令ucharlockcmd(ucharpara);锁定命令这些命令函数将不同的数据进行打包,用ucharsend(uchar*pkt)函数发送出去,并用ucharrecv(uchar*pkt)函数接收应答包,然后进行包解析并返回解析结果。这两个函数是通信的第二个层次。最后一个层次是射频芯片驱动程序,ucharsend(uchar*pkt)和ucharrecv(uchar*pkt)的功能是通过调用这一组函数实现的,见表4。voidnRFConfig(void);nRF24L01配置函数voidnRFSetTxMode(void);设置为传输模式表4nRF24L01驱动函数Tbl.4nRF24L01driverfunctionset表3操作命令函数Tbl.3operatingcommandfunctionset表2LCD驱动函数Tbl.2LCDdriverfunctionset(void);设置为接收模式ucharnRFReadByte(void);读数据ucharnRFWriteByte(uchardata);写数据4.系统调试软件用iccavr6.31编译通过,并在AVRStudio4.12上通过了调试。图6和图7是调试时各信号在示波器上的波形。图6中的绿色