Contact me: hankecnc@gmail.com

通过python3控制grbl #899

推推 grbl 3年前 (2023-01-23) 389次浏览

打开
SHAO-1120 开启了这个issue 2020 年 8 月 5 日 · 3条评论
打开

通过python3控制grbl#899

SHAO-1120 开启了这个issue 2020 年 8 月 5 日 · 3条评论

注释

通过python3控制grbl #899

大家好,

我在做一个小项目,需要用python3来控制项目。我在互联网上发现的大多数情况和问题都是由软件控制的,例如 Grbl 控制器。有一个名为“stream.py”的控制代码。我不熟悉 Python。因此我不确定它是否可以用于通过 G 代码控制电机。
问题是有两个文件名为“gcode_file”和“device_file”。关于gcode_file,我认为它是一个包含G代码顺序的文件。但我不知道它的格式。另一个文件是device_file,它似乎与arduino uno的COM端口有关。我通过删除第 66 行更改了 stream.py 中的代码,

parser.add_argument(‘device_file’,

    help='serial device path')

并将第 88 行更改为

s = serial.Serial(‘COM4’, 9600)

但是后来我在第 173 行遇到了 TypeError。

s.write(l_block + ‘\n’) # 发送g代码块到grbl

显示不支持 unicode 字符串,请编码为 bytes: ‘%\n’。

我想是不是因为我改了device_file导致的。

细节:

  1. arduino uno
  2. A4988*2
  3. 2相步进电机*2

我是 python 和这种控制程序的初学者。我真的需要大家的帮助。
感谢您阅读本期杂志。

通过python3控制grbl #899
统计学家 32 评论了 2020 年 8 月 6 日  

我正在使用这个脚本将文件发送到 arduino。
也许看看我的评论,我希望它有帮助

import serial
import time
import argparse

BAUD_RATE = 115200


def remove_comment(string):
    if (string.find(';') == -1):
        return string
    else:
        return string[:string.index(';')]


def remove_eol_chars(string):
    # removed \n or traling spaces
    return string.strip()


def send_wake_up(ser):
    # Wake up
    # Hit enter a few times to wake the Printrbot
    ser.write(str.encode("\r\n\r\n"))
    time.sleep(2)   # Wait for Printrbot to initialize
    ser.flushInput()  # Flush startup text in serial input


def stream_gcode():
    # with contect opens file/connection and closes it if function(with) scope is left
    with open(args.file, "r") as file, serial.Serial(args.port, BAUD_RATE) as ser:
        send_wake_up(ser)
        for line in file:
            # cleaning up gcode from file
            gcode = remove_eol_chars(remove_comment(line))
            if gcode:  # checks if string is empty
                print(f"Sending gcode: {gcode}")
                # converts string to byte encoded string and append newline
                command = str.encode(line + '\n')
                ser.write(command)  # Send g-code
                grbl_out = ser.readline()  # Wait for response with carriage return
                print(f" : {grbl_out.strip().decode('utf-8')}")
                time.sleep(1)


if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        description='This is a basic gcode sender. http://crcibernetica.com')
    parser.add_argument('-p', '--port', help='Input USB port', required=True)
    parser.add_argument('-f', '--file', help='Gcode file name', required=True)
    args = parser.parse_args()
    ## show values ##
    print("USB Port: %s" % args.port)
    print("Gcode file: %s" % args.file)
    stream_gcode()
通过python3控制grbl #899
作者
SHAO-1120 评论了 2020 年 8 月 7 日  

@statist32非常感谢你帮助我。我现在还在想办法。
请问您使用的主要代码是什么?它与 args.port 和 args.file 的定义有关吗?
不好意思再问一个问题,你们用什么软件把图片或者空间图生成G代码的?

通过python3控制grbl #899

@SHAO-1120 if __name__ == "__main__"基本上就像一个主要功能。如果您直接调用该文件,它将被执行。
如果您将此文件/模块导入另一个文件,则不会执行此部分。也许到这里看看。
这个主要部分基本上与 argparser 无关。argparser 只是管理正确的调用以确保 args 可用。
但是 args.port/args.file 当然与 argparser 有关。
如果您对文件名和正在使用的串行端口进行硬编码,则可以删除整个解析器部分。

我现在不生成 gcode。我目前正在开发一个 python 接口来发送 gcode 以进行分配。
稍后我必须生成 gcode,但你可以在谷歌上搜索这样的软件,有很多。GL :)

喜欢 (0)