Navigation

    Duet3D Logo

    Duet3D

    • Register
    • Login
    • Search
    • Categories
    • Tags
    • Documentation
    • Order
    1. Home
    2. oozeBot
    • Profile
    • Following
    • Followers
    • Topics
    • Posts
    • Best
    • Groups

    oozeBot

    @oozeBot

    77
    Reputation
    439
    Posts
    60
    Profile views
    1
    Followers
    0
    Following
    Joined Last Online
    Website oozebot.com Location United States

    oozeBot Follow

    Best posts made by oozeBot

    • RE: oozeBot ele^gant

      I wanted to post a few photos of a Halloween "torture test" we recently completed. This was printed in ABS, with no supports, using a 1.2mm nozzle. Extrusion width was 1.8mm and layer height was .4mm. It is 300mm deep x 264mm wide x 244mm high, was printed in ~17 hours, and weighs right at 3.5lbs.

      This was our first time using a 1.2mm nozzle and getting the retraction settings right to (mostly) control stringing was a challenge, but firmware retraction made the changes easy! There was some mid-air printing near the base, but that was in the design and it recovered beautifully..

      cthulhu1.jpg
      cthulhu2.jpg
      cthulhu3.jpg
      cthulhu4.jpg
      cthulhu5.jpg

      posted in My Duet controlled machine
      oozeBot
      oozeBot
    • Timelapse video through execonmcode!

      I'm pleased to give back to the community with the following script to add timelapse video when using a Duet3 and Raspberry Pi. I am unsure if this will work with a Duet2, but maybe..? if execonmcode works, then yes it will..

      example video:
      https://vimeo.com/468721949

      This one does take some setup, but the payoff is well worth it. Note that this expects the files to be in the following folders as the default:

      • timelapse.sh should be in a folder named /scripts located off of the root directory
      • a folder named pix must be located in the /scripts folder
      • a seed file named timelapse_counter, containing only a -1 must be located in the /scripts folder
      • a folder located in the root directory named /timelapse for the output video

      Also note that both mjpg_streamer and ffmpeg must be installed on your RPi.

      First, here is the service code. I chose M5575.

      [Unit]
      Description=Duet API listener for Timelapse Video by oozeBot
      After=duetcontrolserver.service
      Requires=duetcontrolserver.service
      
      [Service]
      ExecStart=/usr/local/bin/execonmcode -mCode 5575 -command "./scripts/timelapse.sh %%A %%F"
      Restart=always
      RestartSec=10
      
      [Install]
      WantedBy=multi-user.target
      

      Here is v1.0 of the bash script:

      #!/bin/bash
      # Timelapse Video by oozeBot (www.oozeBot.com) v1.0 - released 10/15/2020
      # Usage: ./timelapse.sh Action FPS
      # Example: ./timelapse.sh "Enable/Disable/Make/Remove" "1-30"
      # gCode: M5575 A"Enable"     ;Enables timelapse and cleans up the image folder
      # gCode: M5575 A"Capture"    ;if enabled, captures a snapshot from the video feed
      # gCode: M5575 A"Disable"    ;Disables timelapse
      # gCode: M5575 A"Make" F"12" ;Creates a video of the snapshots @ 12fps
      # gCode: M5575 A"Remove"     ;Removes all images in the image folder
      
      Action=`echo $1 | tr [a-z] [A-Z] | cut -c1-1`
      
      CounterFile="/scripts/timelapse_counter"
      ImageNum=`cat $CounterFile`
      
      if [ "$Action" = "E" ];then
       #Enables timelapse by setting the counter to 0 and removes all images in the image folder
       ImageNum=0
       rm -rf /scripts/pix/*
       echo $ImageNum > $CounterFile
      elif [ "$Action" = "D" ] && [ $ImageNum -gt 0 ];then
       #If enabled, disables timelapse by setting the counter to -1
       ImageNum=-1
       echo $ImageNum > $CounterFile
      elif [ "$Action" = "M" ] && [ $ImageNum -lt 0 ];then
       #Creates timelapse video at the specified FPS, else defaults to 24
       #This will return an error if no images exist and only works when disabled
       fps=$2
       if ! [[ $2 =~ ^[0-9]+$ ]];then
        fps="24"
       fi
       ffmpeg -framerate $fps -start_number 1 -i "/scripts/pix/%d.jpg" -s:v 1920x1080 -vcodec libx264 -qp 0 -preset veryslow /timelapse/$(date +"%Y_%m_%d_%I_%M_%S_%p").mp4
      elif [ "$Action" = "R" ] && [ $ImageNum -lt 0 ];then
       #If disabled, removes all images within the image folder (optional as all images will be removed after restart)
       rm -rf /scripts/pix/*
      elif [ "$Action" = "C" ] && [ $ImageNum -ge 0 ];then
       #Increments counter and captures snapshot
       ImageNum=$((ImageNum+1))
       wget http://localhost:8080/?action=snapshot -O '/scripts/pix/'$ImageNum'.jpg'
       echo $ImageNum > $CounterFile
      fi
      

      Note all M5575 commands should be preceded by an M400 if you want the extruder to stand still

      I put examples in the script of all usage through gCode. For the example video above, in the starting script of my slicer, I've added M5575 A"Enable" to enable timelapse. In my layer change script, I've added M5575 A"Capture". And finally, in the ending script, I've added M5575 A"Disable" to disable.

      Why did I do it this way? Because I wanted to process the video outside of the control of the job's gCode - however, you could include the following in the bottom of your ending script to both make the video and clean up the photos: M5575 A"Make" F"12" (whatever FPS you want) followed by M5575 A"Remove". Just be prepared to wait before the job actually completes as it holds in process until the video is done.

      I also did it this way so I could adjust the framerate by just running the command with various FPS from DWC..

      This was also designed to be added to your daemon.g file using M5575 A"Capture" followed by a G40 S10 (or whatever second delay you want) to make a different type of timelapse. It will only save photos while the timelapse has been enabled using M5575 A"Enable".. so it's safe to just leave in there if you so choose. However, it currently supports layer change or X seconds - not both at the same time. If there was demand, I could add that..

      And if there are an ffmpeg experts out there, please feel free to correct my usage of it. What I've used might be overkill or not perfect, but it's working well..

      posted in DSF Development
      oozeBot
      oozeBot
    • RE: oozeBot ele^gant

      Here's a quick pic of our latest prototype in the enclosure I just finished..

      IMG_5795.jpg

      posted in My Duet controlled machine
      oozeBot
      oozeBot
    • DIY Filament Drybox

      I've been working on building a large scale filament drybox. As a test before building anything purpose-built, I'm using an old chamber we had in storage. It is controlled by a RPi with a relay hat, a DHT22 sensor, and a 200w enclosure heater with a few fans to stir the air. The scripts that control it are all written in bash and are a bit 'raw', but if there is enough interest, I'll consider putting some more time into it and posting to github with instructions.

      That's 55lbs of ABS currently inside it - two 10kg mega-spools and two 2.5kg spools.

      So far, it's been dropping at a rate of about 2% humidity per day at 45c and I expect it will probably slow down and take some time before I can get it to stabilize between 10-15% humidity. Once it does, I'll begin testing what temp is necessary to maintain it - my hope is that "warmer than ambient" will suffice..

      filament.dryer.1.JPG

      Simple Web UI that can run as a pseudo-app on iOS:
      filament.dryer.2.JPG

      posted in 3D Printing General Chat
      oozeBot
      oozeBot
    • RE: oozeBot ele^gant

      Sneak peak at the enclosure I’ve been throwing together in my spare time for our latest prototype.. am getting excited to wrap this up!

      83C76842-C334-4152-BA97-700CA49DAA47.jpeg

      posted in My Duet controlled machine
      oozeBot
      oozeBot
    • RE: Duet 3/Rpi + toolboard on 3.2b3 - G29 fails

      @gloomyandy @chrishamm Here is the log. It also contains a bonus crash at line 362-364 where it lost connection and soft-rebooted itself. I hadn't seen that before..

      I'm going to be rolling back to 3.2b1 here soon. Please let me know if there is anything else I can assist with testing..

      log.txt

      posted in Beta Firmware
      oozeBot
      oozeBot
    • RE: PrusaSlicer Label Objects option pauses print?

      @Sindarius @dc42 - this was user error due to my lack of knowledge with PrusaSlicer. I swear.. I just resliced without this option enabled and it happened again when I reprinted it. So after scrutinizing the gCode, I had somehow managed to add a filament change (M600) right at this point, which paused the printer. On top of that, I incorrectly identified it happened at the end of the layer (where the object ends) instead of the beginning - which is what I reported.

      Sorry about that - I have no idea how I did that, but it's not an issue with Duet.

      posted in Duet Web Control
      oozeBot
      oozeBot
    • Script to control Wemos from gcode using DSF

      I spent some time on this earlier and thought I'd share my first success with it. This script is something we used with our printers prior to moving to Duet. It is a script I wrote (based off of a bit of info scraped off the internet of Wemo's undocumented API). It interfaces with local Wemo switches, plugs, and dimmers locally without the Cloud. The only caveat is that you have to know all the IPs for your wemos.. we just made dhcp reservations for all of ours.

      The script primarily turns Wemos on and off; toggles; and can set dimmer brightness. It can also return the current values as well. However, for this post, I'm going to focus on the gCode implementation I just completed.

      Note this service code originally gave me trouble as it turned out "%" had to be escaped as "%%". That may be beneficial for others wanting to implement similar scripts with parameter inputs.

      I chose M5555. It has 3 inputs - I, C, & B. I is the IP address of the Wemo (or potentially hostname). C is the command. B is the brightness value for setting a dimmer.

      Example usage

      M5555 I"192.168.0.123" C"ON"               ; turns on the Wemo
      M5555 I"192.168.0.123" C"OFF"              ; turns off the Wemo
      M5555 I"192.168.0.123" C"TOGGLE"           ; toggles the Wemo (if off, turn on | if on, turn off)
      M5555 I"192.168.0.123" C"SETDIMMER" B"50"  ; sets dimmer to 50%
      

      M5555.service code

      [Unit]
      Description=Duet API listener for Wemo control
      After=duetcontrolserver.service
      Requires=duetcontrolserver.service
      
      [Service]
      ExecStart=/usr/local/bin/execonmcode -mCode 5555 -command "./scripts/wemo.sh %%I %%C %%B"
      Restart=always
      RestartSec=10
      
      [Install]
      WantedBy=multi-user.target
      

      wemo.sh

      #!/bin/sh
      # Wemo Control
      # Usage: ./wemo_control IP Command
      # Example: ./wemo_control 192.168.0.1 ON
      # ON/OFF/STATE/PORT/SIGNAL/GETDIMMER/SETDIMMER
      
      IP=$1
      COMMAND=$2
      BRIGHT=$3
      PORT=49152
      
      if [ $IP = "" ];then
       echo "Invalid Command"
      else
       PORTTEST=$(curl -s $IP:$PORT | grep "404")
       if [ "$PORTTEST" = "" ];then
        PORT=49153
       fi
       if [ $PORT = 49153 ];then
        PORTTEST=$(curl -s $IP:$PORT | grep "404")
        if [ "$PORTTEST" = "" ];then
         PORT=49154
        fi
       fi
       if [ $PORT = 49154 ];then
        PORTTEST=$(curl -s $IP:$PORT | grep "404")
        if [ "$PORTTEST" = "" ];then
         PORT=49155
        fi
       fi
       if [ $PORT = 49155 ];then
        PORTTEST=$(curl -s $IP:$PORT | grep "404")
        if [ "$PORTTEST" = "" ];then
         PORT=0
        fi
       fi
       if [ $PORT = 0 ];then
        echo "Wemo Unavailable on IP $IP"
       else
        if [ "$COMMAND" = "STATE" ];then
         curl -0 -A '' -X POST -H 'Accept: ' -H 'Content-type: text/xml; charset="utf-8"' -H "SOAPACTION: \"urn:Belkin:service:basicevent:1#GetBinaryState\"" --data '<?xml version="1.0" encoding="utf-8"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:GetBinaryState xmlns:u="urn:Belkin:service:basicevent:1"><BinaryState>1</BinaryState></u:GetBinaryState></s:Body></s:Envelope>' -s http://$IP:$PORT/upnp/control/basicevent1 |
         grep "<BinaryState"  | cut -d ">" -f2 | cut -d "<" -f1 | sed 's/0/OFF/g' | sed 's/1/ON/g'
        elif [ "$COMMAND" = "ON" ];then
         curl -0 -A '' -X POST -H 'Accept: ' -H 'Content-type: text/xml; charset="utf-8"' -H "SOAPACTION: \"urn:Belkin:service:basicevent:1#GetBinaryState\"" --data '<?xml version="1.0" encoding="utf-8"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:GetBinaryState xmlns:u="urn:Belkin:service:basicevent:1"><BinaryState>1</BinaryState></u:GetBinaryState></s:Body></s:Envelope>' -s http://$IP:$PORT/upnp/control/basicevent1 |
         if [ "$( grep "<BinaryState"  | cut -d ">" -f2 | cut -d "<" -f1 )" = "0" ];then
          curl -0 -A '' -X POST -H 'Accept: ' -H 'Content-type: text/xml; charset="utf-8"' -H "SOAPACTION: \"urn:Belkin:service:basicevent:1#SetBinaryState\"" --data '<?xml version="1.0" encoding="utf-8"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:SetBinaryState xmlns:u="urn:Belkin:service:basicevent:1"><BinaryState>1</BinaryState></u:SetBinaryState></s:Body></s:Envelope>' -s http://$IP:$PORT/upnp/control/basicevent1 |
      	grep "<BinaryState" | cut -d ">" -f2 | cut -d "<" -f1 | sed 's/0/OFF/g' | sed 's/1/ON/g'
         else
          echo "ON" #Already On
         fi
        elif [ "$COMMAND" = "OFF" ];then
         curl -0 -A '' -X POST -H 'Accept: ' -H 'Content-type: text/xml; charset="utf-8"' -H "SOAPACTION: \"urn:Belkin:service:basicevent:1#GetBinaryState\"" --data '<?xml version="1.0" encoding="utf-8"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:GetBinaryState xmlns:u="urn:Belkin:service:basicevent:1"><BinaryState>1</BinaryState></u:GetBinaryState></s:Body></s:Envelope>' -s http://$IP:$PORT/upnp/control/basicevent1 |
         if [ "$( grep "<BinaryState"  | cut -d ">" -f2 | cut -d "<" -f1 )" = "1" ];then
          curl -0 -A '' -X POST -H 'Accept: ' -H 'Content-type: text/xml; charset="utf-8"' -H "SOAPACTION: \"urn:Belkin:service:basicevent:1#SetBinaryState\"" --data '<?xml version="1.0" encoding="utf-8"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:SetBinaryState xmlns:u="urn:Belkin:service:basicevent:1"><BinaryState>0</BinaryState></u:SetBinaryState></s:Body></s:Envelope>' -s http://$IP:$PORT/upnp/control/basicevent1 |
          grep "<BinaryState" | cut -d ">" -f2 | cut -d "<" -f1 | sed 's/0/OFF/g' | sed 's/1/ON/g'
         else
          echo "OFF" #Already Off
         fi
        elif [ "$COMMAND" = "SETDIMMER" ];then
         curl -0 -A '' -X POST -H 'Accept: ' -H 'Content-type: text/xml; charset="utf-8"' -H "SOAPACTION: \"urn:Belkin:service:basicevent:1#SetBinaryState\"" --data '<?xml version="1.0" encoding="utf-8"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:SetBinaryState xmlns:u="urn:Belkin:service:basicevent:1"><brightness>'$BRIGHT'</brightness></u:SetBinaryState></s:Body></s:Envelope>' -s http://$IP:$PORT/upnp/control/basicevent1 |
         grep "<brightness"  | cut -d ">" -f2 | cut -d "<" -f1 
        elif [ "$COMMAND" = "GETDIMMER" ];then
         curl -0 -A '' -X POST -H 'Accept: ' -H 'Content-type: text/xml; charset="utf-8"' -H "SOAPACTION: \"urn:Belkin:service:basicevent:1#GetBinaryState\"" --data '<?xml version="1.0" encoding="utf-8"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:GetBinaryState xmlns:u="urn:Belkin:service:basicevent:1"><BinaryState>1</BinaryState></u:GetBinaryState></s:Body></s:Envelope>' -s http://$IP:$PORT/upnp/control/basicevent1 |
         grep "<brightness"  | cut -d ">" -f2 | cut -d "<" -f1
        elif [ "$COMMAND" = "TOGGLE" ];then
         curl -0 -A '' -X POST -H 'Accept: ' -H 'Content-type: text/xml; charset="utf-8"' -H "SOAPACTION: \"urn:Belkin:service:basicevent:1#GetBinaryState\"" --data '<?xml version="1.0" encoding="utf-8"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:GetBinaryState xmlns:u="urn:Belkin:service:basicevent:1"><BinaryState>1</BinaryState></u:GetBinaryState></s:Body></s:Envelope>' -s http://$IP:$PORT/upnp/control/basicevent1 |
         if [ "$( grep "<BinaryState"  | cut -d ">" -f2 | cut -d "<" -f1 )" = "1" ];then
          curl -0 -A '' -X POST -H 'Accept: ' -H 'Content-type: text/xml; charset="utf-8"' -H "SOAPACTION: \"urn:Belkin:service:basicevent:1#SetBinaryState\"" --data '<?xml version="1.0" encoding="utf-8"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:SetBinaryState xmlns:u="urn:Belkin:service:basicevent:1"><BinaryState>0</BinaryState></u:SetBinaryState></s:Body></s:Envelope>' -s http://$IP:$PORT/upnp/control/basicevent1 |
          grep "<BinaryState" | cut -d ">" -f2 | cut -d "<" -f1 | sed 's/0/OFF/g' | sed 's/1/ON/g' | sed 's/Error/OFF/g'
         else
          curl -0 -A '' -X POST -H 'Accept: ' -H 'Content-type: text/xml; charset="utf-8"' -H "SOAPACTION: \"urn:Belkin:service:basicevent:1#SetBinaryState\"" --data '<?xml version="1.0" encoding="utf-8"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:SetBinaryState xmlns:u="urn:Belkin:service:basicevent:1"><BinaryState>1</BinaryState></u:SetBinaryState></s:Body></s:Envelope>' -s http://$IP:$PORT/upnp/control/basicevent1 |
          grep "<BinaryState" | cut -d ">" -f2 | cut -d "<" -f1 | sed 's/0/OFF/g' | sed 's/1/ON/g' | sed 's/Error/ON/g'
         fi
        elif [ "$COMMAND" = "SIGNAL" ];then
         curl -0 -A '' -X POST -H 'Accept: ' -H 'Content-type: text/xml; charset="utf-8"' -H "SOAPACTION: \"urn:Belkin:service:basicevent:1#GetSignalStrength\"" --data '<?xml version="1.0" encoding="utf-8"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:GetSignalStrength xmlns:u="urn:Belkin:service:basicevent:1"><GetSignalStrength>0</GetSignalStrength></u:GetSignalStrength></s:Body></s:Envelope>' -s http://$IP:$PORT/upnp/control/basicevent1 |
         grep "<SignalStrength" | cut -d ">" -f2 | cut -d "<" -f1
        elif [ "$COMMAND" = "PORT" ];then
         echo "$PORT"
        else
         echo $COMMAND
        fi
       fi
      fi
      
      posted in DSF Development
      oozeBot
      oozeBot
    • oozeBot prototype

      Hi all, we are excited to finally show off the near final design of our machine. It is powered by a Duet3 and a toolboard mounted to the extruder. A video of it running at 400mm/s in all axes is posted below at our Instagram.

      We have so much to learn about the Duet framework as our past experience has always been with Marlin, but we are ramping up fast..!

      https://www.instagram.com/p/B-klDdcD_ld/?igshid=96tmsc5zuvkp

      posted in My Duet controlled machine
      oozeBot
      oozeBot
    • RE: PrusaSlicer Label Objects option pauses print?

      @Sindarius Credit where credit is due- the 2.3 release candidate of PrusaSlicer is pretty great and finally ready (in our opinion) to replace Simplify3D in our workflow. But with that comes the learning curve with avoiding any of the “gotchas” , which is what caused this post.

      It’s amazing how fine of control it provides- this was printed yesterday in ABS at .5mm layer height. In Simplify3D, this same model printed with several artifacts that we could find no way to overcome.

      B9DF76B0-4FB7-4503-9EA2-25916E24F29B.jpeg

      posted in Duet Web Control
      oozeBot
      oozeBot

    Latest posts made by oozeBot

    • RE: [DSF Extension] Exec On MCode (was: Shutdown SBC)

      @wilriker Thanks. So the return is echo'ed in DWC, correct? Could the return value be evaluated within conditional gCode?

      posted in DSF Development
      oozeBot
      oozeBot
    • RE: [DSF Extension] Exec On MCode (was: Shutdown SBC)

      @wilriker Could you please provide a simple example of using the -returnOutput flag? Thanks

      posted in DSF Development
      oozeBot
      oozeBot
    • RE: M106 / M107 questions

      Got this sorted - it was actually just due to both the "tool fan" and "fan 0" showing in DWC. Those are the same fan.. so it was working correctly. Hiding "fan 0" from the interface cleared up the confusion.

      posted in Tuning and tweaking
      oozeBot
      oozeBot
    • RE: M106 / M107 questions

      Digging this back up as I just noticed M106 commands without "P0" is still modifying both my part cooling and hotend fan. This is after modifying my M563 to the following:

      M563 P0 D0 H1 F0 S"Extruder" ; Define tool 0
      

      Does anyone have any other ideas? This is 3.2 final running on a Duet 3 / RPi with attached toolboard.

      posted in Tuning and tweaking
      oozeBot
      oozeBot
    • RE: 3.2 final execonmcode warning issue

      @PCR it's odd that it only happens on M9999.. none of my other custom mCodes.

      posted in General Discussion
      oozeBot
      oozeBot
    • RE: 3.2 final execonmcode warning issue

      @Phaedrux it’s a custom mCode through execonmcode to safely shutdown the raspberry pi..

      posted in General Discussion
      oozeBot
      oozeBot
    • RE: PanelDueFirmware 3.2.8 released

      I’ve also seen my macros blank out like that this am after upgrading to 3.2.8 and the rapid blinking of temps like in your video.

      posted in PanelDue
      oozeBot
      oozeBot
    • RE: 3.2 final execonmcode warning issue

      Same result, but I tested a few other custom mCodes and it appears that this is only happening with M9999.. weird.

      M9999
      Warning: M9999: Command is not supported
      
      posted in General Discussion
      oozeBot
      oozeBot
    • 3.2 final execonmcode warning issue

      I am not sure which category this needs to go in, so please move it accordingly.

      With 3.2 final (on a Duet 3 / RPi) mcodes that have custom scripts associated through execonmcode now result in a warning. This was not happening previously.

      m9999
      Warning: M9999: Command is not supported
      
      posted in General Discussion
      oozeBot
      oozeBot
    • RE: oozeBot ele^gant

      @fcwilt We use 9mm fiberglass reinforced Gates 2GT belts and have not experienced any stretch or degraded performance throughout the gantry’s range of motion- and we have really been pushing our prototypes hard.

      posted in My Duet controlled machine
      oozeBot
      oozeBot