Duet3D Logo Duet3D
    • Tags
    • Documentation
    • Order
    • Register
    • Login

    Sending GCode commands to duet3D Mini 5+ using python

    Scheduled Pinned Locked Moved
    General Discussion
    7
    29
    1.5k
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • shenouda13undefined
      shenouda13
      last edited by

      Hi all,

      I am new to the duet. I have connected a duet3D Mini 5+ to a raspberry pi 4 with a usb cable. I am trying to send gcode commands to the duet through the serial package in python. I have a stepper motor connected to the duet. So i am trying to send a command to rotate it. when i run the python script in the image below it just stops at line 6 (ser.write) and it doesn't execute the subsequent lines.

      Am I missing something?

      I would really appreciate your help on how to do it.

      thanks

      WhatsApp Image 2022-11-29 at 12.46.20.jpeg

      jay_s_ukundefined 1 Reply Last reply Reply Quote 0
      • jay_s_ukundefined
        jay_s_uk @shenouda13
        last edited by

        @marco13 why not run the board in SBC mode instead and then use execonmcode (https://plugins.duet3d.com/plugins/DSF_ExecOnMcode_Plugin.html) or dsfPython (https://github.com/Duet3D/dsf-python) to interact with the firmware?

        Owns various duet boards and is the main wiki maintainer for the Teamgloomy LPC/STM32 port of RRF. Assume I'm running whatever the latest beta/stable build is

        shenouda13undefined 1 Reply Last reply Reply Quote 0
        • shenouda13undefined
          shenouda13 @jay_s_uk
          last edited by

          @jay_s_uk thank you for the response, I would prefer use only the usb port for communication

          Sindariusundefined 1 Reply Last reply Reply Quote 1
          • Sindariusundefined
            Sindarius @shenouda13
            last edited by

            @marco13 try adding a \n at the end of the gcode

            shenouda13undefined 1 Reply Last reply Reply Quote 0
            • shenouda13undefined
              shenouda13 @Sindarius
              last edited by shenouda13

              @Sindarius thank you for your reply. I have tried that and no luck.. 😕

              if I connect the duet to the laptop and execute the gcode line in the YAT terminal it works fine.

              I don't really know what I am missing

              Falcounetundefined 1 Reply Last reply Reply Quote 0
              • Falcounetundefined
                Falcounet @shenouda13
                last edited by

                @marco13 Try with ser.write(b'G1 Y60 F5000\n')

                shenouda13undefined 1 Reply Last reply Reply Quote 0
                • shenouda13undefined
                  shenouda13 @Falcounet
                  last edited by

                  @Falcounet I have tried that and still no luck..

                  Falcounetundefined 1 Reply Last reply Reply Quote 0
                  • Falcounetundefined
                    Falcounet @shenouda13
                    last edited by

                    @marco13 To answer your initial question, the code blocks because write_timeout parameter isn't specified to serial.Serial.
                    The default value is set to None which means write() is blocking by default. Set a value for non-blocking mode. See https://pyserial.readthedocs.io/en/latest/pyserial_api.html#serial.Serial.write

                    shenouda13undefined 1 Reply Last reply Reply Quote 0
                    • shenouda13undefined
                      shenouda13 @Falcounet
                      last edited by shenouda13

                      @Falcounet yes. if I set a value for write_timeout in serial.Serial() then it exits the code with an error after the amount of time that I set, but still cannot tell the duet to rotate the motor

                      alankilianundefined 1 Reply Last reply Reply Quote 0
                      • alankilianundefined
                        alankilian @shenouda13
                        last edited by

                        @marco13 Is it possible that the 'Y' motor is already at the Y=60 position and so it doesn't move?

                        Try sending Y0 and then try sending Y60 and see if it moves.

                        You can change this behavior and get Y60 to move 60 in the positive direction each time by changing to relative-motion-mode first. (I don't know the code off the top of my head, but you can find it in the GCODE reference)

                        SeemeCNC Rostock Max V3 converted to V3.2 with a Duet2 Ethernet Firmware 3.2 and SE300

                        Falcounetundefined shenouda13undefined 2 Replies Last reply Reply Quote 0
                        • Falcounetundefined
                          Falcounet @alankilian
                          last edited by

                          Actually, the problem is not related to python or the code.
                          Something wrong seems to appear between the board and the pi but not sure what.

                          I just did some tests and if I connect my Duet Wifi 5+ to my computer and open a serial connection using putty, I can read a M122 output.
                          I close the serial connection, disconnect the USB cable from my computer and connect it to a RaspberryPi 4.
                          I open a serial communication using picocom -c --imap lfcrlf /dev/ttyACM0 but issuing M122 doesn't get any output.

                          I connect back the USB cable to my computer and try again with putty : M122 doesn't get any output anymore.
                          However, when I power off the board, I get Warning: VIN under-voltage event (9.4V) so the serial connection still works.

                          RYANPDXundefined Falcounetundefined 2 Replies Last reply Reply Quote 0
                          • RYANPDXundefined
                            RYANPDX @Falcounet
                            last edited by RYANPDX

                            @Falcounet I wonder if this is related to the issue I am current troubleshooting.

                            https://forum.duet3d.com/topic/30554/issue-with-usb-serial-on-duet-3-mini-5

                            Could you try connecting it to the Pi4, opening the serial port, and then pressing the 'reset' button on the Mini 5+? That would indicate you are experiencing the same thing I am, which seems to be unique to the Mini 5+ USB->Serial connection on Linux.

                            1 Reply Last reply Reply Quote 0
                            • Falcounetundefined
                              Falcounet @Falcounet
                              last edited by Falcounet

                              The problem is the RTS control signal has to be raised after the serial connection is open.
                              The firmware use that control signal to check the IsConnected state. Thanks @gloomyandy !

                              For picocom : picocom -c --raise-rts --imap lfcrlf /dev/ttyACM0 do the trick

                              For python; ser.setRTS(True) will do the trick :

                              import serial
                              
                              with serial.Serial('/dev/ttyACM0') as ser:
                                  ser.setRTS(True)
                                  ser.write(b'\n')
                                  ser.write(b'M122\n')
                                  eof = False
                                  while not eof:
                                      line = ser.readline()
                                      if line == b'ok\n':
                                          eof = True
                                      print(line)
                              
                              RYANPDXundefined shenouda13undefined dc42undefined 4 Replies Last reply Reply Quote 1
                              • RYANPDXundefined
                                RYANPDX @Falcounet
                                last edited by

                                @Falcounet at least in my case, this did not work. Not sure if this is a different issue than OP on this thread, so if so I apologize for cross-posting.

                                157fb322-ffca-4393-87ef-3667bb6404f8-CleanShot 2022-11-29 at 18.45.59.png

                                1 Reply Last reply Reply Quote 0
                                • shenouda13undefined
                                  shenouda13 @alankilian
                                  last edited by

                                  @alankilian thank you for your reply. I have tried that but still didn't work

                                  1 Reply Last reply Reply Quote 0
                                  • shenouda13undefined
                                    shenouda13 @Falcounet
                                    last edited by shenouda13

                                    @Falcounet in my case I have got this output:

                                    b'=== Diagnostics ===\n'
                                    b'RepRapFirmware for Duet 3 Mini 5+ version 3.2.2 running on Duet 3 Mini5plus WiFi (standalone mode)\n'
                                    b'Board ID: QMD5L-P296U-D65J0-40KMY-2203Z-HKNTX\n'
                                    b'Used output buffers: 1 of 40 (4 max)\n'
                                    b'=== RTOS ===\n'
                                    b'Static ram: 98732\n'
                                    b'Dynamic ram: 106852 of which 68 recycled\n'
                                    b'Never used RAM 39564, free system stack 152 words\n'
                                    b'Tasks: NETWORK(ready,358) HEAT(blocked,315) CanReceiv(blocked,947) CanSender(blocked,372) CanClock(blocked,363) TMC(blocked,106) MAIN(running,517) IDLE(ready,20) AIN(blocked,269)\n'
                                    b'Owned mutexes: WiFi(NETWORK) USB(MAIN)\n'
                                    b'=== Platform ===\n'
                                    b'Last reset 00:00:27 ago, cause: power up\n'
                                    b'Last software reset at 2022-11-29 10:16, reason: User, GCodes spinning, available RAM 39564, slot 0\n'
                                    b'Software reset code 0x0003 HFSR 0x00000000 CFSR 0x00000000 ICSR 0x00000000 BFAR 0xe000ed38 SP 0x00000000 Task MAIN Freestk 0 n/a\n'
                                    b'Error status: 0x00\n'
                                    b'Aux0 errors 0,0,0\n'
                                    b'Aux1 errors 0,0,0\n'
                                    b'Supply voltage: min 0.0, current 24.2, max 24.3, under voltage events: 0, over voltage events: 0, power good: yes\n'
                                    b'Driver 0: position 0, standstill, SG min/max 0/0, read errors 0, write errors 0, ifcnt 9, reads 3849, writes 9, timeouts 0, DMA errors 0\n'
                                    b'Driver 1: position 0, standstill, SG min/max 0/0, read errors 0, write errors 0, ifcnt 9, reads 3849, writes 9, timeouts 0, DMA errors 0\n'
                                    b'Driver 2: position 0, standstill, SG min/max 0/0, read errors 0, write errors 0, ifcnt 9, reads 3849, writes 9, timeouts 0, DMA errors 0\n'
                                    b'Driver 3: position 0, standstill, SG min/max 0/0, read errors 0, write errors 0, ifcnt 9, reads 3848, writes 9, timeouts 0, DMA errors 0\n'
                                    b'Driver 4: position 0, standstill, SG min/max 0/0, read errors 0, write errors 0, ifcnt 9, reads 3849, writes 9, timeouts 0, DMA errors 0\n'
                                    b'Driver 5: position 0, assumed not present\n'
                                    b'Driver 6: position 0, assumed not present\n'
                                    b'Date/time: 1970-01-01 00:00:00\n'
                                    b'Cache data hit count 59010343\n'
                                    b'Slowest loop: 4.53ms; fastest: 0.13ms\n'
                                    b'=== Storage ===\n'
                                    b'Free file entries: 10\n'
                                    b'SD card 0 detected, interface speed: 22.5MBytes/sec\n'
                                    b'SD card longest read time 3.2ms, write time 0.0ms, max retries 0\n'
                                    b'=== Move ===\n'
                                    b'DMs created 83, maxWait 0ms, bed compensation in use: none, comp offset 0.000\n'
                                    b'=== MainDDARing ===\n'
                                    b'Scheduled moves 0, completed moves 0, hiccups 0, stepErrors 0, LaErrors 0, Underruns [0, 0, 0], CDDA state -1\n'
                                    b'=== AuxDDARing ===\n'
                                    b'Scheduled moves 0, completed moves 0, hiccups 0, stepErrors 0, LaErrors 0, Underruns [0, 0, 0], CDDA state -1\n'
                                    b'=== Heat ===\n'
                                    b'Bed heaters = 0 -1, chamberHeaters = -1 -1\n'
                                    b'=== GCodes ===\n'
                                    b'Segments left: 0\n'
                                    b'Movement lock held by null\n'
                                    b'HTTP is idle in state(s) 0\n'
                                    b'Telnet is idle in state(s) 0\n'
                                    b'File is idle in state(s) 0\n'
                                    b'USB is ready with "M122" in state(s) 0\n'
                                    b'Aux is idle in state(s) 0\n'
                                    b'Trigger is idle in state(s) 0\n'
                                    b'Queue is idle in state(s) 0\n'
                                    b'LCD is idle in state(s) 0\n'
                                    b'SBC is idle in state(s) 0\n'
                                    b'Daemon is idle in state(s) 0\n'
                                    b'Aux2 is idle in state(s) 0\n'
                                    b'Autopause is idle in state(s) 0\n'
                                    b'Code queue is empty.\n'
                                    b'=== Network ===\n'
                                    b'Slowest loop: 9.56ms; fastest: 0.00ms\n'
                                    b'Responder states: HTTP(0) HTTP(0) HTTP(0) HTTP(0) FTP(0) Telnet(0), 0 sessions\n'
                                    b'HTTP sessions: 0 of 8\n'
                                    b'- WiFi -\n'
                                    b'Network state is active\n'
                                    b'WiFi module is connected to access point \n'
                                    b'Failed messages: pending 0, notready 0, noresp 0\n'
                                    b'WiFi firmware version 1.25\n'
                                    b'WiFi MAC address f0:08:d1:02:e9:d4\n'
                                    b'WiFi Vcc 3.35, reset reason Power up\n'
                                    b'WiFi flash size 2097152, free heap 27528\n'
                                    b'WiFi IP address 255.255.255.255\n'
                                    b'WiFi signal strength 31dBm, mode 802.11n, reconnections 0, sleep mode modem\n'
                                    b'Clock register 00002002\n'
                                    b'Socket states: 0 0 0 0 0 0 0 0\n'
                                    b'=== CAN ===\n'
                                    b'Messages queued 244, send timeouts 242, received 0, lost 0, longest wait 0ms for reply type 0, free buffers 15\n'
                                    b'ok\n'

                                    Falcounetundefined 1 Reply Last reply Reply Quote 0
                                    • Falcounetundefined
                                      Falcounet @shenouda13
                                      last edited by

                                      @marco13 Yes so that means it works to me.

                                      shenouda13undefined 1 Reply Last reply Reply Quote 1
                                      • shenouda13undefined
                                        shenouda13 @Falcounet
                                        last edited by shenouda13

                                        @Falcounet it gives me a wrong wi fi address ----> b'WiFi IP address 255.255.255.255\n' thou..

                                        Also, right now if I run :

                                        import serial
                                        ser = serial.Serial("/dev/ttyACM0", 115200)
                                        time.sleep(1)
                                        print('read')
                                        ser.write(b"G0 Y30 F50000\n")
                                        print('write')
                                        time.sleep(2)
                                        ser.close()

                                        the code it doesn't get stuck anymore but still cannot get the motor to rotate 😕

                                        also what does this line mean?

                                        b'Messages queued 244, send timeouts 242, received 0, lost 0, longest wait 0ms for reply type 0, free buffers 15\n'

                                        dc42undefined 1 Reply Last reply Reply Quote 0
                                        • dc42undefined
                                          dc42 administrators @Falcounet
                                          last edited by

                                          @Falcounet said in Sending GCode commands to duet3D Mini 5+ using python:

                                          The problem is the RTS control signal has to be raised after the serial connection is open.

                                          RRF on the Duet 3 Mini does not require the virtual RTS to be asserted for USB comms to work.

                                          Duet WiFi hardware designer and firmware engineer
                                          Please do not ask me for Duet support via PM or email, use the forum
                                          http://www.escher3d.com, https://miscsolutions.wordpress.com

                                          Falcounetundefined 2 Replies Last reply Reply Quote 0
                                          • Falcounetundefined
                                            Falcounet @dc42
                                            last edited by

                                            @marco13 If you do G0 Y30 F50000 in DWC console, does the motor moves ?

                                            The output displayed is the output of M122 command.
                                            Not sure why 255.255.255.255 is displayed as IP address but it is unrelated to python or serial connection problem.

                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post
                                            Unless otherwise noted, all forum content is licensed under CC-BY-SA