开源固件Marlin的LabVIEW驱动程序及应用

2023-11-17 03:01唐智超李仲豪蒋世奇郑富中
成都信息工程大学学报 2023年6期
关键词:字符串固件示波器

唐智超,李仲豪,蒋世奇,张 杰,郑富中

(1.成都信息工程大学自动化学院,四川成都 610225;2.四川轻化工大学机械工程学院,四川自贡 643000;3.重庆电子工程职业学院智能制造与汽车学院,重庆 401331)

0 引言

Marlin 是一款开源3D 打印机固件,其强大之处在于支持X-Y-Z直角结构,coreXY、SCARA、三角洲等多种不同结构的3D 打印机,支持多种硬件电路板与多种计算机语言,还附加了自动调平等功能。正因为Marlin 在3D 打印系统中的强大功能且运行稳定,各种基于个人计算机的3D 打印软件也层出不穷,如:Repetier-Host、replicatorG 和SelfCAD 等,基于C++的微型液晶控制面板也已相当成熟。但这些技术不能与其他设备或仪器取得有效衔接和信息互通,不利于3D 控制平台的二次开发,缺乏灵活性[1]。

LabVIEW 是图形化编程语言,随着PC 能力的增强而不断发展其功能,使面向对象编程、多线程、ActiveX,以及在此基础上发展起来的消息队列框架(QMH)、队列消息(JKI)状态机、异步消息通信(AMC)等多线程LabVIEW 程序框架应运而生,进一步简化了科研和工程技术人员的工作[2-5]。这些技术可以快速实现Marlin 与其他设备或仪器的灵活重组和互联互通,同时还可以把Marlin 的各个硬件功能模块便捷地整合成具有独立功能的LabVIEW 控件或子虚拟仪器程序文件(virtual instrument file,VI),供其他LabVIEW 应用程序调用[6]。

近年来,关于通用串口的LabVIEW 程序应用已十分广泛,但是针对开源固件Marlin的LabVIEW驱动程序还没有出现,不能有效利用Marlin 固件上3D 电机驱动、温度控制与获取、限位开关的状态获取、风扇的速度控制等功能。因此,如何利用LabVIEW 编制Marlin 的驱动程序,迅速完成3D 控制平台与其他工程仪器或科研设备的信息互通,为基于高速总线或宽带网络的LabVIEW 集散控制系统的构建提供低成本技术实现的新途径。

1 Marlin 的串口解码

驱动程序的开发步骤依次为:了解Marlin 的硬件结构,串行字符串的识别,串口读取子VI 的实现,驱动程序初始化和温度控制与结果显示应用,如图1所示。

图1 开发步骤框图

1.1 Marlin 的硬件结构介绍

Marlin 开始于2011年,经过10 余年的发展,目前最新的版本为2.0,固件上配置的内容主要包括:1 个STM32 7805 主控芯片、1 个CH340G 数据传输转换芯片、1 个USB 通信接口、4 个42 步进电机的驱动接口、2 个12 V直流电源输出接口、另配2 组加热电源、X-Y-Z3 个轴的限位开关以及2 个温度传感器等,如图2所示。具有利用PID 控制加热温度、温度检测精度高、支持圆弧轨迹的规划、在中断中处理步进电机的梯形加减速、限位开关触发时有中止运作的功能等。

图2 Marlin 的硬件结构组成图

1.2 串口字符串的识别

由Marlin 的硬件组成可知,固件上配有通用串行总线(universal serial bus,USB)接口,能实现与PC 的快速通信,相当于测控系统中的下位机[7-9]。为节省资源,固件上的微处理器STM32 7805 仍采用异步收发传输器(universal asynchronous receiver/transmitter,UART)与外设进行数据收发,而实现USB 与UART 转换的芯片是CH340G,如图3所示[10]。

图3 CH340 的工作方式示意图

在串口方式下,CH340 提供常用的调制解调器联络信号,用于计算机扩展异步串口;或者将普通的串口设备直接升级到USB 总线,芯片内置USB 上拉电阻,它的D+与D-引脚直接连到USB 的两条总线上;又或者直接外加红外收发器即可构成USB 红外线适配器,实现SIR 红外线通信。在并口方式下,可转换并口打印机为USB 打印机。

要实现Marlin 的驱动编程,先在PC 上安装CH340G 的芯片驱动程序,建立PC 与Marlin 的通信。为确认通信是否已建立,利用串口助手软件Termite 3.4检测串口通信是否正常。方法是先在PC 的设备管理器中确认串口编号后,再打开串口助手选中此编号并设置波特率为250000。在串口助手软件的输入窗口中发送G-code 命令M119,获取限位开关状态,在显示区中就会显示出收发的消息,并报告3 个限位开关的状态,如图4所示。当3 个限位开关完全处于断开状态时,显示区将显示第一条M119 命令获得的消息;当把图2 右下部的Y轴限位开关用金属线短路后再发送M119 命令,显示区将获得图4 中第二条M119 命令的应答消息,说明PC 与Marlin 已建立正确的通信。

图4 串口助手检测通信状态

为更准确地掌握消息的传输方式,将CH340G 的2 和3 引脚分别与示波器的两个信号输入端相连,如图3 的右上角所示,上面的引线接示波器的1 号通道,产生的信号显示在示波器屏幕的下半部分,下面的引线接示波器的2 号通道,产生的信号显示在示波器屏幕的上半部分[11]。

当PC 通过串口助手发送M119 命令时,通过抓取瞬间波形,示波器屏幕下半部分就会出现一串高低电平的方波,时序方向是从右向左,信号下的二进制数从左向右每10 位的前两位1 和0 表示一个字符的停止位和起始位。当信号有了一个从1 到0 的跳变表示发送开始,UART 传送的数据是由低位到高位,需要把二进制数作反转,每8 位逐位对调后,产生第二排二进制数,再查ASCII 码对照表,由此可知PC 向Marlin 发送了M119 指令与换行符。同理,示波器屏幕上半部分显示的接收到的消息头为Rep……(图5)。图6 接收到的消息尾经过译码为ok 与换行符,与图4 接收到的消息头与消息尾是一致的。通过以上实验,确立了PC与Marlin 的数据收发方式。

图5 命令字符串与消息头字符串

图6 消息尾字符串

2 Marlin的LabVIEW驱动程序

利用串口助手或具有瞬间波形抓取功能的示波器,获取Marlin的响应字符串,再利用此字符串消息尾和LabVIEW 中的虚拟仪器软件架构(virtual instruments software architecture,VISA)控件,可快速建立串行读取子VI 和初始化控件。串口读取程序流程如图7所示,其中的双横线代表多线程并行。

图7 串口读取程序流程

2.1 串口读取子VI 的实现

程序开始后,由条件结构检查错误输入控件中有无错误产生。若有错误,直接输出错误后结束;若没有错误,由设备输入控件输入设备端口号,并发送至“Instr”属性节点。字节属性获取端口字节数并输出端口号后,同时进行以下3 个任务:消息头或尾的判断,返回True 和超时判断。

任务1,消息头或尾的判断。其步骤:先将从端口读取到的字符串循环连接后送入“While 循环”的移位寄存器,等待循环结束或继续从端口读取字符串,同时将连接好的字符串去除首尾空白字符。接着,判断前两个字符的大写是否为OK,或颠倒字符串后判断前两个字符的大写是否为OK,将以上两个OK 判断结果做逻辑或运算,即判断字符串头或尾是否存在ok 字符。若存在则逻辑或控件输出布尔值1,点亮LED 灯;否则逻辑或控件输出布尔值0,关闭LED 灯。同时,逻辑或控件输出的布尔值作为“消息头或尾的判断”任务的输出待用。当任务2 和任务3 的布尔值相或后,再和任务1 的待用输出相与布尔值作为是否关闭“While 循环”的依据。

任务2,返回True。其步骤:先判断“While 循环”的移位寄存器中存储的布尔常量是“True” 还是“False”,默认为“False”,判断“Instr”属性节点输出的字节数是否不为0,若为0,则移位寄存器返回“False”,断续等待,直到“Instr”属性节点输出的字节数不为0,则移位寄存器返回“Ture”,进入另一个条件,此条件保持移位寄存器中的布尔值为“Ture”,且“Wait for OK”控件为“False”。“While 循环”是否结束由任务2 和任务3 的输出布尔值相或后决定,判断“Instr”属性节点输出的字节数是否为0。若不为0,则由任务3“超时判断”决定是否结束“While 循环”。如果没有超时,则继续循环,直到“Instr”属性节点输出的字节数为0。然后结束“While 循环”,停止串口读取。最后输出端口号,读取缓存,LED 灯保特熄灭。如果“Wait for OK”控件被置为“True”,当“Instr”属性节点输出的字节数为0,任务2 和任务3 的布尔值相或后输出必为1,则等待字符串中的ok 出现。当任务1 的布尔值输出为1 时,LED 灯被点亮,则可结束循环,停止串口读取,最后输出端口号,读取缓存。

任务3,超时判断。其步骤:用循环外的时间减去循环内的时间,其中,循环内的时间是指程序每次在“While 循环”内进行字符串读取时,循环内的一个时钟开始计时的时刻,循环外的时间是指进入“While 循环”的时刻,两者的差值与设定的默认等待10 s 比较。若大于等于设定时间则报错,并输出布尔值1。如果“Wait for OK”控件被置为“False”,则结束“While 循环”;如果“Wait for OK”控件被置为“Ture”,则等待ok 字符串来结束“While 循环”[12]。若小于设定时间,同样分“Wait for OK”控件为“Ture”和“False”两种情况讨论,但是否结束循环则由任务1 和任务2 的输出布尔值决定。

2.2 驱动程序初始化

要调用串口,首先要对串口进行初始化编程,整个初始化程序也可被封装为一个控件,简称初始化控件,其程序流程如图8所示。以默认方式打开VISA 控件,先通过“VISA 资源名”的枚举型控件选择准备好的端口号,如果作为控件则可通过创建引脚来接收输入[13]。通过VISA 清空源缓存,判断有没有错误产生。若有错误,关闭资源,清除错误;同时,通过“Instr”属性节点获得设备的初始化接口类型,与预先选定的接口类型比较,产生真假两种条件,并设定等待获取的超时时间为10 s。如果获取的接口类型与预先在枚举型字符串常量控件中选定的字符串Serial 不相等,进入假条件,重新选取对应的接口类型;如果相等,则进入真条件,进行串口设置。在串口设置部分,首先给端口属性赋值,通过“Instr”属性节点将输入与输出的结束终端字符都设定为0 换行符,波特率设置为250000。然后清空接收与发送的缓存,再将接收和发送的缓存大小都设置为4096 字节。随后,进行条件判断“有无错误?”。若有,则直接输出错误和端口号;若无,则进入假条件中,调用串口读取子VI 进行串行读取,延时3 s且无需字符串首或尾的ok 字符串来停止串行读取,防止没有消息。然后向对应的串口缓存中写M27 指令加换行符字符串,清除未知消息,再次调用串口读取子VI,超时参数采用默认10 s且需要字符串首或尾的ok字符串来停止读串口,结束后输出端口号和错误,供其他控件使用,同时生成初始化控件。

3 实验结果与分析

初始化程序可以作为公共的函数控件出现在Instrument I/O 下的Instr Drivers 面板中供其他程序调用,而串口读取程序则是作为私有的子VI,可通过复制或拖拽的方式调用,进一步还可建立Marlin 上各硬件的VI 控件[14-15]。以Marlin 对3D 打印机中热床和打印头的温度控制与结果显示为例,演示Marlin 串口驱动的运行效果。串口完成初始化后,设置打印头温度为200 ℃,热床温度为60 ℃,如图9所示。程序设置约10 ms从串口读取一个温度数据,并把图形的更新频率设置为1 s,确保实时清楚地观察到曲线的变化[16-18]。从图9 可以看出,约在80 s时,打印头的温度达到预设的200 ℃。

图9 初设温度跟踪曲线

接下来将打印头和热床的温度又分别设置为100 ℃和50 ℃,经过约1 s的时间即调整为设定值。随后打印头的温度立刻开始下降,而热床的温度仍有一个较短的上升过程才开始缓慢下降,如图10所示,这与两次温度设置的温差有关。当温差设得较大时,温度变化会较明显,温差设得较小时温度变化较缓慢。

图10 变温跟踪曲线

4 结束语

为实现开源固件Marlin 的LabVIEW 串口驱动程序,利用串口助手和示波器的瞬间波形抓取功能,准确地掌握Marlin 通过USB 接口的消息发送与接收方法,从而确立在PC 上利用LabVIEW 编程驱动Marlin 的串行通信模式,开发串行读取子VI 和初始化控件,以供开发Marlin 的其他硬件功能时调用。在此基础上,以温度控制与结果显示为例,调用初始化控件和串行读取子VI,同时利用LabVIEW 的图形化显示控件,对Marlin 的两个温度传感器通路实验了实时的温度控制与温度数据采集及其图形化显示。为3D 运动控制设备的开发和优化提供了便利,具有良好的应用前景。

实验结果表明针对Marlin的LabVIEW驱动程序能够稳定运行,完成了PC 与Marlin 之间的串行数据通信,为Marlin 的高效利用开辟了新路线。

致谢:感谢过程装备控制工程四川省高校重点实验室资助项目(GK202010)对本文的资助

猜你喜欢
字符串固件示波器
基于文本挖掘的语词典研究
一款教学示波器的Y通道设计与实现
可携带式虚拟双踪示波器
基于固件的远程身份认证
提取ROM固件中的APP
一种通过USB接口的可靠固件升级技术
一种新的基于对称性的字符串相似性处理算法
多路手机固件升级工具设计
依据字符串匹配的中文分词模型研究
一种针对Java中字符串的内存管理方案