Jump to content

Sending GCODE directly from Python to UM3


Recommended Posts

Posted · Sending GCODE directly from Python to UM3

For a research project, I need to stream gcode commands directly to a UM3 from python.  


1. I see Python is installed on my UM3 board.   Is there python module or existing code that lets me send the Gcode commands from there?

2. If I was to use the REST API, is there a way to do the same?  The seems to be too high level as I can only send a job, not individual commands.


Thanks for any suggestions!

  • Link to post
    Share on other sites

    Posted · Sending GCODE directly from Python to UM3

    Looking though the code, I see how the services work in .../griffin/main.py  


    I also see the .../griffin/command_utils.py which has a command to send gcode using these service.  I though I was good so I tried this as a quick test:


    from griffin import dbusif
    def readFromFile(gcodefile):
        file = open(gcodefile, 'r')
        for line in file:
            count += 1
            print("Line{}: {}".format(count, line.strip()))
    def sendgcode(gcmd):
    def run():
        filename ="UM3E_cm-cube.gcode"
        print("Executing "+ filename)


    Unfortunately, there is no buffering/queueing in the printer.debugSendGCode() command.  All it did was cause the print head to have fits. 


    Looking at a lower level, the Printer service uses a Controler object to  send the gcode.  It is has several functions.  SendRawGcode() is what is called by the printer service but I suspect I need it to call queueGcode()

      ## Send raw gcode to the printer. Note that this ignores any paused state.
        def sendRawGCode(self, gcode_line: str, wait=False) -> str:
            # track position in maintenance mode (assumes no other moves are currently in buffer.)
            return self.__gcode_processor.sendInstantRawGCode(gcode_line, self.getGCodeActiveHotend(), wait)
        ## Send raw gcode to the printer. Note that this ignores any paused state.
        # @param gcode_line: A string containing GCode that needs to be sent to the driver.
        # @return bool: True if the command was queued for sending as soon as possible. False if the buffers were full or the driver is not connected yet.
        def sendRawGCodeNoBlock(self, gcode_line: str) -> bool:
            # track position in maintenance mode (assumes no other moves are currently in buffer.
            return self.__gcode_processor.sendInstantRawGCodeNoBlock(gcode_line, self.getGCodeActiveHotend())
        ## This function is mainly used to queue gcode read from a gcode-file.
        # gcode queued in this way passes through the normal opinicus queue first and is then sent to marlin.
        # When the controller is in a paused state we will blocking wait, unless we are in an un-pausable procedure.
        # @param gcode_line the line of gcode to put in the queue
        def queueGCode(self, gcode_line: str) -> None:
            # only pause if no un-abortable(aka un-pausable) procedures are running.
            if self._abortable.is_set():
                self._running_event.wait()  # Block if the controller is paused
            self.__gcode_processor.processAndQueueGCode(gcode_line, self.getGCodeActiveHotend())


    I hate to muck with the services code and brick my Ultimaker.   Any other thoughts on how to queue up the gcode?





  • Link to post
    Share on other sites

    Posted (edited) · Sending GCODE directly from Python to UM3

    What I thought was no buffering above was a mistake.  I was expecting the printer to pause to heat the build plate not realizing the UM3 doesn't just take a dump of GCODEs from a file.  Darn tricky, these Ultimaker engineers 😉


    It looks like I have to figure out what to do about the header info:


    Edited by burhop
  • Link to post
    Share on other sites

    Create an account or sign in to comment

    You need to be a member in order to leave a comment

    Create an account

    Sign up for a new account in our community. It's easy!

    Register a new account

    Sign in

    Already have an account? Sign in here.

    Sign In Now
    • Our picks

      • Introducing the UltiMaker Factor 4
        We are happy to announce the next evolution in the UltiMaker 3D printer lineup: the UltiMaker Factor 4 industrial-grade 3D printer, designed to take manufacturing to new levels of efficiency and reliability. Factor 4 is an end-to-end 3D printing solution for light industrial applications
          • Thanks
          • Like
        • 3 replies
      • UltiMaker Cura 5.7 stable released
        Cura 5.7 is here and it brings a handy new workflow improvement when using Thingiverse and Cura together, as well as additional capabilities for Method series printers, and a powerful way of sharing print settings using new printer-agnostic project files! Read on to find out about all of these improvements and more. 
          • Like
        • 26 replies
    • Create New...