APP下载

基于树莓派的三维打印上位机控制系统

2019-07-12林志伟徐冠华吴森洋

实验技术与管理 2019年6期
关键词:控制卡固件树莓

林志伟, 徐冠华, 吴森洋

(1. 浙江大学 机械工程学院, 浙江省三维打印工艺与装备重点实验室, 浙江 杭州 310027;2. 浙江大学 机械工程学院 实验教学中心, 浙江 杭州 310027;3. 浙江大学 工程训练(金工)中心, 浙江 杭州 310058)

三维打印是一种从零件几何模型出发,通过软件分层离散,用激光或其他方法将材料逐层堆积而形成三维实体的增材制造技术[1],突破了传统制造业“设计—试验—改进设计—工艺准备—制造”的生产模式[2],被广泛应用于产品原型、模具制造、生物医疗、艺术创作等领域,已成为引领未来制造业的重要技术之一。

三维打印相继出现了选择性激光烧结(SLS)[3]、光固化(SLA)[4]、熔融沉积制造(FDM)[5]等十几种工艺方法。在这些工艺中,FDM具有设备结构简单、操作方便、维护成本低、材料利用率高、安全无毒等特点,应用最为广泛,尤其适合向教育培训行业推广。目前国内一些高校已建立FDM三维打印开放实验室,用于培养学生实践能力及创新能力[6-7]。

桌面式FDM三维打印机一般由打印机本体和上位机组成[8]。运动控制卡是核心单元,通常基于单片机开发,一般运行开源Marlin固件[9-11],主要实现加工代码解析及运动插补等功能。上位机一般为个人计算机(PC),运行打印控制软件,通过串口和打印机连接。使用PC作为上位机的优势是在Windows系统下三维打印控制软件开发难度低,甚至可直接使用免费开源软件(如Repetier-Host),缺点是PC占用空间大,搬运困难,且价格较为昂贵,难以物尽其用。

树莓派(Raspberry Pi)[12-13]是一款采用ARM架构处理器和Linux操作系统的卡片式计算机,外形只有信用卡大小,购买成本只需200元左右,却具有强大的系统功能和接口资源,包括4个USB接口、1个以太网口、1个HDMI口等,可实现普通PC机的全部功能。树莓派支持多种语言进行应用开发,包括C和Python等,开发者社区资源极为丰富[14]。与传统的嵌入式平台相比,树莓派在速度、集成度、价格和效率上有明显优势,近年来在嵌入式开发领域发展迅速。

本文开发一套基于树莓派的三维打印上位机控制软件系统,在树莓派端实现打印控制及人机交互基本功能,包括打印机串口通信、自动打印、打印状态查询等,从而取代PC机,大幅降低桌面式FDM三维打印机成本,提升打印机灵活性和产品竞争力。

1 Marlin固件串口通信协议

1.1 Marlin固件

固件是指烧录在控制卡中的嵌入式软件,其作用是解释上位机程序发来的指令,并让机器执行这些指令。Marlin固件是基于Arduino单片机开发的一种三维打印的开源固件,与其他固件相比,Marlin固件的功能最为健全和强大,功能包括控制板驱动、代码解析、插补运算、各轴步进电机运动控制、挤出机及加热板的温度控制等。

类似于一般数控系统,Marlin固件通过接收上位机发送的G代码指令控制各运动轴进给及I/O点输入输出。Marlin固件常用的G代码及辅助代码(M代码)功能见表1。

表1 Marlin固件常用G和M代码功能

表1中的G0和G1表示直线插补,两者功能一样;G28表示打印机各轴回零,G29用于打印机工作台面水平补偿;G90和G91用于选择坐标系,其中G90为绝对坐标,G91为相对坐标,默认使用G90。如下代码:G1 X10 Y20 Z30 E1.0 F100,X、Y、Z为各轴进给量,E为进丝长度,F为进给速度;该行代码表示打印机喷头从当前点运行至(10, 20, 30)绝对坐标点,绝对进丝长度为1.0 mm,进给速度为100 mm/min。Marlin固件中,辅助代码M105用于查询打印机喷头及热床温度,M106、M107分别用于开启、关闭风扇。

1.2 串口通信

本文使用的运动控制卡集成了USB转RS232串口芯片,对外提供USB接口,可与树莓派直接通过USB数据线建立物理连接,如图1所示。树莓派端外接触摸屏,安装基于Linux的Raspbian操作系统,该系统自带串口驱动,开发人员在系统中可直接使用控制卡对应的串口资源(如“/dev/ttyUSB0”)。本文选用Python语言编程,通过第三方serial组件向控制卡写入G代码字符指令,并读取返回参数,从而实现树莓派和控制卡串口通信。

图1 树莓派与打印机运动控制卡物理通信架构

打印机运动控制卡上的用于暂存G代码的寄存器容量非常有限(100个B左右),仅能保存1~3行指令,因此不能一次性向控制卡发送多行指令,否则会导致固件宕机。上位机在向控制卡发送一条指令后,须等待下位机CPU从寄存器取走该指令后才能继续发送下一条指令。Marlin固件规定:上位机发送的每条指令必须以‘ ’字符结尾,如“G01 X20 Y20 E1.7 ”;下位机读取该指令后,向上位机返回“ok”字符串;上位机必须在接收到下位机返回的“ok”后才可继续发送下一条指令,即在指令发送过程中,‘ ’和“ok”的数目必须保持一致。根据Marlin固件的这一代码发送规则,可在树莓派上设计相应程序,实现G代码逐行自动发送。

2 树莓派端打印控制程序设计

本文选用Python语言编程,利用Python简洁的语法特性和强大的库支持,实现树莓派端包括打印机串口自动连接、G代码文件逐行自动发送、打印过程参数实时采集以及人机界面交互等功能。树莓派端打印控制程序随树莓派开机启动,总体架构见图2。工作流程简述如下:首先树莓派开机后自动扫描并连接打印机串口,一方面,操作人员可以通过人机交互界面选择需要打印的G代码文件,开始或终止打印;另一方面,树莓派端不断向打印机查询当前打印机状态,如喷头、热床温度等,并将这些参数显示在人机界面上。

图2 树莓派端打印控制程序架构

2.1 串口连接模块

打印控制程序随树莓派启动后,首先进入串口自动连接模块。该模块主要执行一段循环程序,如图3所示,不断扫描树莓派上所有串口资源,即从“/dev/ttyUSB0”扫到“/dev/ttyUSB3”,这些资源分别对应树莓派上4个USB端口。对某一特定串口资源,如“/dev/ttyUSBi”,首先调用serial组件尝试连接该资源。在程序中,设置连接超时(timeout)为2 s,即如果超过2 s尚未建立串口连接,则终止当前尝试,转而连接下一个串口资源。

如果上位机和打印机控制卡建立串口连接,Marlin固件将返回固件初始化信息,包括固件厂商、版本信息等,这些信息最终以“ok”字符串结尾。根据这一原理,树莓派端程序通过识别返回信息中的特定字段(如厂商),可进一步校验当前连接的串口资源是否有效,即当前连接的对象是否确实为打印机。如果连接无效,则断开当前连接,并继续尝试下一个串口资源。如此循环往复,直至连上打印机。树莓派和打印机建立连接之后,控制程序向打印机发送“G28”指令,使其执行回零动作。

图3 树莓派端窗口自动连接流程

根据上述串口连接流程可知,若打印机先于树莓派启动,则树莓派完成启动后能马上连上打印机;若树莓派先于打印机启动,则在打印机启动前,树莓派上的串口连接模块将处于尝试连接的循环状态,直至打印机启动,建立连接。打印机和树莓派的开机先后顺序不影响两者串口连接。在两者建立连接后,如果出现连接异常,如USB线被拔出等,则需重启树莓派才能使两者重新建立连接。

2.2 代码发送模块

由于打印机运动控制卡寄存器大小限制,在三维打印过程中,G代码只能以一行一行的形式发送给打印机。在树莓派和打印机建立串口连接之后,经人机交互界面触发,代码发送模块在独立线程中启动运行,主要实现G代码文件自动逐行发送机制。

根据Marlin固件串口通信规则,当上位机向下位机发送一行指令后,上位机须在接收到下位机返回的“ok”字符串才能发送下一行指令。根据这一规则,设计代码发送模块核心流程(伪代码)如图4所示,该流程包含两重循环。

图4 树莓派端代码发送模块核心流程

图4中,path为指定的代码文件名,open为Python内置文件打开函数,file表示已打开的文件对象。for循环中,readlines函数返回包含该文件所有行的列表。需要强调的是,readlines函数会自动为返回列表的每行字符串元素结尾添加‘ ’字符,因此在下面的串口发送中无需额外添加‘ ’字符。树莓派在向串口写完一行G代码指令后,随即读取下位机返回的内容。为了增加代码发送流程的鲁棒性,这里在读取串口部分也添加了一个循环,即如果返回的字符串(recvtxt)中不包含“ok”字符串,则继续读取串口,直至返回内容包含“ok”,跳出读取循环。随后重新进入外部循环继续发送下一行G代码。

树莓派上位机通过上述模式可实现G代码文件自动逐行发送,直至文件末尾,退出循环。图4仅给出了树莓派发送G代码的核心流程,在实际程序编写过程中,还需考虑诸如异常处理、线程同步等问题。

2.3 数据采集模块

数据采集模块主要实现打印参数实时采集功能。类似于代码发送模块,它同样运行于独立线程中。不同的是,数据采集模块不用从人机交互界面触发,它随树莓派启动并建立串口连接后开始运行,随树莓派关闭而结束。下面以打印机喷头及热床温度参数采集为例说明树莓派数据采集方法及流程,其他参数类似。

类似于G代码逐行发送过程,数据采集模块也需在一个循环内不断向下位机发送查询指令。对喷头及热床温度查询来说,在一次循环内,树莓派首先向打印机发送“M105 ”指令,然后进入和图4相似的串口读取流程,打印机向树莓派返回如下字符串:“T:24.0/200.0 B:24.0/50.0 ”“ok ”。在以上字符串中,T表示喷头温度,24.0为实际温度值,200为设定温度值;B表示热床温度,24.0为实际温度值,50.0为设定温度值;“ok”表示参数读取完毕。据此可从返回字符串中提取当前喷头及热床温度。为了降低树莓派及打印机运动控制卡串口通信压力,在数据采集模块的循环内添加sleep方法,每次数据采集完成后让线程暂停若干秒钟。

必须注意的是,在三维打印过程中,树莓派同时运行代码发送线程和数据采集线程,且在这两个线程中,都需要循环读取串口返回数据,为避免其中一个线程将另一个线程的“ok”读走,造成另一个线程卡死,必须做好线程同步,即对两个线程的串口读写部分分别加上线程锁。

2.4 人机交互模块

树莓派端打印控制程序的人机交互界面(图5)主要用来实现简单的打印控制及打印过程参数显示功能,采用Python自带的tkinter库实现。该界面包含回零、代开代码、开始打印、停止打印、急停等功能按钮。其中回零按钮逻辑上只有当打印机处于空闲(非打印)状态下才有效,通过手动发送一行“G28 ”指令实现。代开代码按钮能从当前树莓派存储卡或U盘选择需要打印的G代码文件,所选的文件名将同时被显示在上方代码标签中。在G代码文件选定之后,点击开始打印按钮可开启打印线程,并在其中调用以上介绍的代码发送模块,实现自动打印功能;停止打印按钮可终止当前打印线程。右上方为急停按钮,该按钮通过强制断开、重连当前串口实现急停功能。

除以上功能按钮外,界面上还包含一些打印状态显示标签。串口标签,显示当前连接的串口资源;喷头和热床标签分别用于显示打印机喷头和热床实际温度,这些参数值通过上述数据采集模块获取;打印标签用于显示当前打印机状态;代码标签用来显示当前选择的代码文件名;进度标签用于显示打印过程中的打印进度,该参数值通过当前已发送的G代码行数除以总G代码行数计算得到。

图5 树莓派端人机交互界面

3 测试平台

为验证树莓派作为上位机的稳定性及树莓派端三维打印控制程序的有效性,搭建如图6所示测试平台。该平台硬件上包含一台FDM三维打印机,一台树莓派及一块触摸屏。该打印机X、Y、Z三向行程均为100 mm左右,其中Z轴负载较大,由2个步进电机双驱。树莓派配置一散热风扇,其上运行基于Linux的Raspbian操作系统,在该系统中,将文本开发的打印控制程序设置为开机启动。树莓派一方面通过USB线和打印机运动控制卡相连,另一方面通过其上DISPlAY端口及专用排线和触摸屏连接。在触摸屏上,可对三维打印过程进行基本控制。

图6 以树莓派为上位机的三维打印测试平台

图7为使用该测试平台打印的爱因斯坦头像。打印层高为0.15 mm,填充率为20%,全局不使用支撑,打印材料为PLA,喷头温度设置为210 ℃,热床温度为0 ℃(即不使用热床),打印时间约为8 h,能够稳定运行。在打印过程中未见各轴移动出现卡顿等现象,且得到的打印样品表面光滑,说明本文设计的G代码逐行发送机制能够完全适应打印机运动控制卡的代码读取速度。

图7 三维打印头像

4 结语

本文开发的基于树莓派的三维打印控制配套软件系统体积小、成本低,能充分发挥卡片式计算机树莓派的强大功能,大幅降低三维打印机成本,而且功能可扩展性强,结合树莓派丰富的接口及Python强大的库支持,可方便将本系统向网络化、智能化等方向扩展。

本文后续工作主要集中在以下两个方面:

(1) 在树莓派端开发CAM功能,即G代码生成功能,充分发挥树莓派强大的运算能力,使其真正意义上取代PC。

(2) 以树莓派为网络节点,构建打印网络集群,开发远程打印控制、数据采集存储等功能,实现三维打印机物联。

猜你喜欢

控制卡固件树莓
兼容多种运动控制卡的V割机数控系统关键技术*
基于树莓派的骑行智能头盔设计
基于树莓派的远程家居控制系统的设计
基于运动控制卡的桁架机器人控制系统设计
基于固件的远程身份认证
响应面法优化红树莓酒发酵工艺
提取ROM固件中的APP
凌华科技四轴伺服/步进运动控制卡PCI-C154+
一种通过USB接口的可靠固件升级技术
奥林巴斯XZ—2新固件升级