Last week I ordered the E3D toolchanger 3d printer kit and today I built it (almost completely).
The delivery went a bit awkward from England, because of the VAT and clearance fees you have to pay in NL.
Because my Voron 2.4 is fast, but could not print everything in one day, I have to assemble 3 more extruders.
Below you can see my shot with a Hemera direct drive extruder mounted on the right side.
To be able to follow everything on the video, I set all of the tool change speeds to 10x slower for a moment.
After the first day of test runs I swapped the original Duet2wifi board for a Chinese clone.
From the clone the wifi is impeccable, but the new updated wifi module on the original Duet2wifi is also with all the updates not working properly.
Every time I perform a remote reboot after a config change the wifi crashes and the board eventually connects fictitiously to IP address 255.255.255.255.
Searched all sites for help but found nothing.
Lack of experience can hardly be it, I have plenty of printers running fine on duet2wifi.
Just to be sure I have ordered an original Duet ethernet board, then I can convert the original board to duet2ethernet and I can at least still use it.
I ordered the version with 4 tools, the direct drive hemeras. I also want to work with soft filament.
The nice thing about this experimental printer is that everything works with Duet, and I have quite a bit of experience with that.
The E3D TC will be my first semi-pro multicolor printer.
I have an Ender3 pro with MMU2S, an A30M with Chimera dual nozzle and an I3BearV3 with dual magnetic carriages.
But out of these 3 systems there is no one that really makes perfect prints. They each have their specific qualities and features.
The Ender3/MMU2S can quickly print PLA and PETG with 5 colors but requires a filament spillage tower on the bed and is very cumbersome and slow to use.
TheA30M with Chimera is nice and fast and large (300x300x400mm) in build volume. But the print quality is reasonable at best. The dual nozzle Chimera with the nozzles at the same height hits with each movement just with the unused nozzle the tip of the filament deposited by the active extruder. This results in smudges and a less beautiful print. Yet I use this reasonably often, especially for quick test prints and at 0.2 0f even 0.3 mm layer height. That works fine.
First impressions:
Please note that the Duex5 and Duet2wifi are initially incorrectly mounted here! The Duet must be below the DUEX5!
Here the object fan duct of the original version is used, I will update this later to the new version with the surround air ducts.
I printed everything with orange ASA on the Voron 2.4 at 150mm/s and 0.2mm with the E3DV6 direct drive Voron extruder and a 0.4mm copper nozzle. Again, that went great!
By the way, there is something to note about this kit.
It is definitely not an ‘out of the box’ working system.
The hardware is outstanding, so are the manuals, better than anything I’ve ever seen.
The Duet and Duex combination is perfect and all the cables and screws, nuts, pins, gears and so on are nicely labeled and of fine quality.
The available config files, macro files and example print files are also great to start with.
And therein lies the problem for non-experts: All values are set to the best possible configuration.
And depending on your choices of extruder, bowden or no bowden and so on you have to make some adjustments here and there.
I had to recalibrate everything in terms of pickup Y values in the tool changer files before the tool was actually picked up and returned nicely.
In addition, it turned out that the tool pickup has to be adjusted very accurately to get the slot in and out of the extruder plates.
You have to understand how this is built, especially in the firmware.
Then you understand that the system has to reset to the start position every time at the start, and then the system makes that the reference point. Then you have to measure where 1) the open position is and 2) the locked position is. Those values must be entered as C values in the pickup and return macros.
What I also find difficult is that there are no sensors (yet) to check whether the tools are in use or parked.
That means that you can just give a command to do a homeall while there is still a tool hanging on the pickup.
I would like to know that because then you program around that.
And so there are some other things like no filament sensor on the tools, no LED lights on the pickup but I’ve already seen a handy bracket for that.
So a very nice and good system, worth its money and high quality material, design also beautiful and still much to tinker with. Thank goodness!
In any case I’m going to reuse my Z-homing files from the previously built mullti- extruder machines with Duet.
Because this E3D works with a pre-homing without the tools hanging from the pickup, you will have to calibrate a Tool at Z distance relative to the pickup value every now and then.
And also the mutual differences in X and Y of course, relative to Tool0.
I have some nice macro tinkering for that too!
Next week onwards!
hole and pipe placed to adjust the magnetic coupling with the socket screw
In the above video you see all required parts for the elctronics. An arduino Nano, a time module LS3231 with battery back-up and a 4-parts ring each with 15 WS2812 LED’s that provide a 160mm 60 LED units clock. You can build it as an open built unit as shown above with wire strings or in a 3d printable slim case that I developed. See the pictures below.
For building this nice precise clock, you can use my design files for the housing on any 3d printer that has a horizontal bed size of at least 165x165mm.
Grab both the print STL’s . HERE. from the Prusa shared site where I uploaded these designs. (If the link breaks, search on the prusa site for ws2812 circular arduino clock).
OR get the STL file for the clock’s FRONT from my website HERE
AND get the STL file for the clock’s REAR from my website HERE
One STL is for the rear and includes the Nano box, the other is for the front face of the clock. Position the rear STL 180 degrees (so up goes down) in your slicer, so both the box and the LED housing are at Z-0 level, i.e. facing down at the same horizontal level. The front can best be printed with the flat side down. ABS is not recommended since it has less stiffness, but will probably also work. For me PETG or PLA works best.
Use white filament for the front part, the rear can be any color you like.
In the circle the 4 WS2812 LED segments are positioned in 1 full circle of about 160mm.
Once you have the rear electronics connected, the front will slide snug over it. No glue required. But the LED ring can best be glued in 4 places with a drop of hotglue to the base of the rear housing. Best to do this after you are sure everything works OK.
The LED parts are available on a.o. banggood , aliexpress and so on, search for 60LED circle WS2812 that has the 160 mm outer diameter.
Each LED represents a dot either for seconds, minutes or as hour indicator.
The colors detemine the function. Blue is also used as Quarter indicator with less intensity, to have a feeling of positioning for the other LEDS when it is dark.
Please look at the video above of the ‘open’ demo model to understand how it works.
Below you can find the Arduino code for the used Nano3, as-is. it works for me, and in the code you will also find all required electrical connections and the used Time module’s spec.
When connected to your PC, you can program the Arduino and via the serial interface you can afterwards change special settings of the clock like brightness, special quarter dimlit indicators, et cetera. it’s all in the code below.
The controls can be sent via a serial interface with the usb input of the Arduino, via a terminalprogram like YAT or with the Arduino IDE program’s interface.
The commands are:
f; fader OFF
F; fader ON
m (number); dim the 4 blue marker LED’s with value (number)
S; sync to RTC time
s; sync to System time (computer)
t (time); change system time to:
b; brightness of all non-marker LEDs
Please donate $1 to my paypal account if you use (parts of) my developed materials so I can continue to share nice stuff for you to download
Hope you will have a good build!
Cheers,
jan
The Arduino code, to be used for programming the Arduino Nano3 is available at the bottom of this post as plain text to be imported in an empty arduino file (with copy and paste).
Take care to use only the libraries and time module that are specified in the code! The used time module is of the better generation that holds the time very well, also on standby.
When connecting the wires between the neopixel segments, the arduino and the time module, use a temperature-regulated soldering tool. Use a fan when you are soldering and don’t inhale the toxic gases while soldering.
The Arduino code is shown below, to be imported in Arduino in an .ino file. With Arduino, you must compile the code to get the Arduino flashed with the program. If you want to do this easier, you can make use of the binary file I already compiled for both Arduino nano versions (with full memory and with half memory). Both Arduino nano types will be OK to use for this build, but they each require specific firmware.
The last part of this post is the Arduino program for the clock:
/**
* NeoClock
*
* Clock using 60 WS2812B/Neopixel LEDs and DS3231 RTC
* Small changes and updates made by jan Griffioen, Amsterdam Europe 2018-2021
* Libraries needed:
* * Adafruit NeoPixel (Library Manager) – Phil Burgess / Paint Your Dragon for Adafruit Industries – LGPL3
* *
* * Arduino Timezone Library (https://github.com/JChristensen/Timezone) – Jack Christensen – CC-BY-SA
* * Time Library (https://github.com/PaulStoffregen/Time) – Paul Stoffregen, Michael Margolis – LGPL2.1
*/
/* for software wire use below
#include <SoftwareWire.h> // must be included here so that Arduino library object file references work
#include <RtcDS3231.h>
SoftwareWire myWire(SDA, SCL);
RtcDS3231<SoftwareWire> Rtc(myWire);
for software wire use above */
/* for normal hardware wire use below */
#include <Wire.h> // must be included here so that Arduino library object file references work
#include <RtcDS3231.h>
RtcDS3231<TwoWire> Rtc(Wire);
/* for normal hardware wire use above */
//Central European Time (Frankfurt, Paris)
TimeChangeRule CEST = {“CEST”, Last, Sun, Mar, 2, 120}; //Central European Summer Time
TimeChangeRule CET = {“CET “, Last, Sun, Oct, 3, 60}; //Central European Standard Time
Timezone CE(CEST, CET);
TimeChangeRule *tcr; //pointer to the time change rule, use to get the TZ abbrev
time_t utc;
// Some example procedures showing how to display to the pixels:
// colorWipe(strip.Color(255, 0, 0), 50); // Red
//colorWipe(strip.Color(0, 255, 0), 50); // Green
//colorWipe(strip.Color(0, 0, 255), 50); // Blue
//colorWipe(strip.Color(0, 0, 0, 255), 50); // White RGBW
// Send a theater pixel chase in…
//theaterChase(strip.Color(127, 127, 127), 50); // White
theaterChase(strip.Color(127, 0, 0), 50); // Red
//theaterChase(strip.Color(0, 0, 127), 50); // Blue
if (!Rtc.GetIsRunning())
{
Serial.println(“Rtc was not actively running, starting now”);
Rtc.SetIsRunning(true);
}
if (!Rtc.IsDateTimeValid())
{
// Common Cuases:
// 1) the battery on the device is low or even missing and the power line was disconnected
Serial.println(“Rtc lost confidence in the DateTime!”);
}
byte eechk = EEPROM.read(0);
if(eechk == 0xAA) { //Assume this is our config and not a fresh chip
dimmer = EEPROM.read(1);
hmark = EEPROM.read(2);
fader = EEPROM.read(3);
}
// Add blue low intensity dots for 12(0),3, 6 and 9 O’çlock to verify where the clock is positioned..
addPixelColor(15, 128, 10);
addPixelColor(30, 128, 10);
addPixelColor(45, 128, 10);
addPixelColor(0, 128, 40);
void chkSer(void) {
unsigned int iy;
byte im,id,iH,iM,iS;
if(!Serial.available()) return;
switch(Serial.read()) {
case ‘b’:
setBrightness(Serial.parseInt());
Serial.print(F(“Brightness changed to: “));
Serial.println(dimmer);
EEPROM.put(0, 0xAA);
EEPROM.put(1, dimmer);
break;
case ‘t’:
iy = Serial.parseInt();
im = Serial.parseInt();
id = Serial.parseInt();
iH = Serial.parseInt();
iM = Serial.parseInt();
iS = Serial.parseInt();
setTime(iH,iM,iS,id,im,iy);
Serial.println(F(“System time changed”));
break;
case ‘f’:
fader = false;
EEPROM.put(0, 0xAA);
EEPROM.put(3, 0);
Serial.println(F(“Fader off”));
break;
case ‘F’:
fader = true;
EEPROM.put(0, 0xAA);
EEPROM.put(3, 1);
Serial.println(F(“Fader on”));
break;
case ‘m’:
hmark = Serial.parseInt();
EEPROM.put(0, 0xAA);
EEPROM.put(2, hmark);
Serial.println(F(“HMark changed”));
break;
case ‘s’:
timeSync();
Serial.println(F(“Synced RTC to System”));
break;
case ‘S’:
timeSave();
Serial.println(F(“Synced System to RTC”));
break;
default:
Serial.println(‘?’);
}
}
// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
for(uint16_t i=0; i<strip.numPixels(); i++) {
strip.setPixelColor(i, c);
strip.show();
delay(wait);
}
}
//Theatre-style crawling lights.
void theaterChase(uint32_t c, uint8_t wait) {
for (int j=0; j<4; j++) { //do 4 cycles of chasing
for (int q=0; q < 3; q++) {
for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
strip.setPixelColor(i+q, c); //turn every third pixel on
}
strip.show();
delay(wait);
for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
strip.setPixelColor(i+q, 0); //turn every third pixel off
}
}
}
}
//Theatre-style crawling lights with rainbow effect
void theaterChaseRainbow(uint8_t wait) {
for (int j=0; j < 256; j++) { // cycle all 256 colors in the wheel
for (int q=0; q < 3; q++) {
for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
strip.setPixelColor(i+q, Wheel( (i+j) % 255)); //turn every third pixel on
}
strip.show();
delay(wait);
for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
strip.setPixelColor(i+q, 0); //turn every third pixel off
}
}
}
}
// Input a value 0 to 255 to get a color value.
// The colours are a transition r – g – b – back to r.
uint32_t Wheel(byte WheelPos) {
WheelPos = 255 – WheelPos;
if(WheelPos < 85) {
return strip.Color(255 – WheelPos * 3, 0, WheelPos * 3);
}
if(WheelPos < 170) {
WheelPos -= 85;
return strip.Color(0, WheelPos * 3, 255 – WheelPos * 3);
}
WheelPos -= 170;
return strip.Color(WheelPos * 3, 255 – WheelPos * 3, 0);
}
Today I opened the lid under my Monoprice Minidelta printer that I bought on Amazon end of last year (11-2021).
Unlike what I found on the net, I appear to have an upgraded motherboard that is joined with the TFT.
Both the MB and TFT have their own pocessor and -TFT update files, available from the Monoprice website and to be found on http://mpminideltav2.com/doku.php?id=octoprint:config.
The GD32F103 ARM processor is the 32-bits direct STM replacement and is a very capable processor. The board also looks very good, so I won’t be replacing any of it.
I am however trying to build my own firmware for the MB, based on Marlin and the STM32 lookalike. BUT- the LCD and the pin connections for the hardware ia all unknown to me, so it might take some more investigations..
For the short term, I will install a Pi Zero2 and adjecent PI IR camera in the printer, along with a top LED light. The original new printer’s firmware allows the use of Octoprint so I can add this printer easily to my managed stock of remotely managed 3d printers. Without modding the original firmware.
In the bottom of the printer, enough space is available to mount the RPI and I will switch the LED with the PI’s GPIO managed switches, and a MOSFET board. Preferably with a PWM driver, or just on/off if this works better.
Another required upgrade will be to get a PEI sheet on the hotbed and replace the plasticy extruder with a dual drive one..
I bought a couple of BIQU H2 extruders to experiment with them.
The first printer I chose to mount this extruder is my TT Saphire pro.
I own this printer for a couple of years, and it behaves quite well. But the original bowden setup is not my preferred setup, and the BIQUH2 seems very promising.
On the net, I found a 3d printable bracket with a seperate mount to re-use the 2 small 40mm side tool fans again as tool fans.
I ditched the 3d printed mount for the extruder and made me e steel one, from the old hotend mount. That is what the pictures in this article will show.
The 3d printed toolfan mount is a bit modded because I have reversed the entire setup, so I will keep within the original specs of 235x235x200 mm printeble size.
For the rest, please see the pictures. I re-used some of the old steel hotend mount, primarily the connecting plate with the XY carriage and the cornered horizontal plate.
In the old big bowden tube hole I welded a 6mm inner- and 12mm outer dia ring in.
And I extended the horizontal base with a little piece of plate to use the 2 pieces 3mm threaded holes of the extruder’s upper side to bolt it all together.
The filament input of the extruder has a screw-in nut with a 4mm clamp for the ingoing 4mm tube, and this is the other mounting bolt to hold the extruder to the mount.
The original TT S pro hotend mount, freed from the parts I re-used to build the BIQU H2 mount.Cut the re-used pice to size, took some material out for the lever and fitted the ring in the 12 mm hole, to be welded.New mounting plate with welded ring at the right, and left an add-on welded little piece with the 2 holes for the mounting M3 screws.Extruder mount readyThe first fit. My goal was to get the nozzle tip at exactly the same XY position as original. And that worked perfect!Mounted the toolfan holder. I modded this to be put INSIDE the carriage instead of on the outside. I used 2 threaded M3 weld-in inserts in the toolfan holder.Ready. The rear fan is reversed as intended. I took some material out of the holder to let the rear fan rotate freely, since it was not capable of this in the original setup.
And the inductive 8mm probe, at the rear of the extruder setup. Works perfect!
An upgrade to Python 3 is neccessary since Octoprint keeps mentioning at startup that future updates after 1.72 will no longer be supported when running a Python2 environment.
Since I made my Voron2.4 printer in 2018, this is still based on Python2.
I first followed the advice on the Octoprint website: Make a full backup from the RPI with the backup/restore plugin of Octoprint, save it to your local HDD.
Then, make a new image from Raspberry PI imager, selecting te most current Octopi image from the RPI imager’s menu. Then, burn it on a micro SD card, take SD out and in again, change the wifi settings to whatever you have at home. And, put it in your Raspberry PI. Put the power on and wait some minutes. Search for your RPI with either bonjour os just use angry IP Scanner and find the local IP address. Start PuTTY and login to the RPI with ‘pi’ username and ‘raspberry’ password. Type ‘ ‘ and Enter. In the menu: Change the RPI’s login password to the one you used before and save it. Logout of PuTTY.
Now, login to octoprint with your browser at the identified local IP address and restore the locally saved backup. This shoud take a long time to install. After this, reboot and it should all work again.
BUT- it did not work at all. Somehow either not all files are backupped and restored or I am missing some config settings. Octoprint could not connect to the SKR4 boards, hence the LCD display did not work and without communnication to the boards, nothing could be done. I tried to remedy the problem but after an hour or so I decided to go for a fresh re-install.
I did save the config file previously so with this and a fresh install I should be fine.
The rest of this post describes my search- and find- and is a HOW TO to help you do it right without any searching. Most of it is gathered from all these good sites where parts of the solution for ths specific configuration can be found and I just tied them together for the Voron2.4 with a Raspbery PI 4B and 4GB memory, with 2 x BTT SKR1.4T and a standard RGB LCD display connected with 2 block cabled wire connectors , the LCD also has a lit turning knob (see the pictures at the end of this post):
These instructions assume the software will run on a Raspberry Pi computer in conjunction with OctoPrint. It is recommended that a Raspberry Pi 2, 3, or 4 computer be used as the host machine (see the FAQ for other machines).
Start by installing OctoPi on the Raspberry Pi computer. Use OctoPi v0.17.0 or later – see the OctoPi releases for release information. One should verify that OctoPi boots and that the OctoPrint web server works. After connecting to the OctoPrint web page, follow the prompt to upgrade OctoPrint to v1.4.2 or later.
After installing OctoPi and upgrading OctoPrint, it will be necessary to ssh into the target machine to run a handful of system commands. If using a Linux or MacOS desktop, then the “ssh” software should already be installed on the desktop. There are free ssh clients available for other desktops (eg, PuTTY). Use the ssh utility to connect to the Raspberry Pi (ssh pi@octopi — password is “raspberry”) and run the following commands:
git clone https://github.com/Klipper3d/klipper
./klipper/scripts/install-octopi.sh
E: Repository ‘http://archive.raspberrypi.org/debian buster InRelease’ changed its ‘Suite’ value from ‘testing’ to ‘oldstable’
N: This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details.
Omdat de repository veranderd is van “testing ” naar “stable” moet je eenmalig toestemming geven om deze verandering in de repository te accepteren. Dit doe je met het volgende commando,
sudo apt-get update –allow-releaseinfo-change
Hierna kan je gewoon weer updaten met,
sudo apt-get update
git clone https://github.com/Klipper3d/klipper
./klipper/scripts/install-octopi.sh
The above will download Klipper, install some system dependencies, setup Klipper to run at system startup, and start the Klipper host software. It will require an internet connection and it may take a few minutes to complete.
It’s common for each printer to have its own unique serial port name. This unique name will be used when flashing the micro-controller. It’s possible there may be multiple lines in the above output – if so, choose the line corresponding to the micro-controller (see the FAQ for more information).
For common micro-controllers, the code can be flashed with something similar to:
sudo service klipper stop
make flash FLASH_DEVICE=/dev/serial/by-id/usb-1a86_USB2.0-Serial-if00-port0
sudo service klipper start
Be sure to update the FLASH_DEVICE with the printer’s unique serial port name.
When flashing for the first time, make sure that OctoPrint is not connected directly to the printer (from the OctoPrint web page, under the “Connection” section, click “Disconnect”).
The OctoPrint web server needs to be configured to communicate with the Klipper host software. Using a web browser, login to the OctoPrint web page and then configure the following items:
Navigate to the Settings tab (the wrench icon at the top of the page). Under “Serial Connection” in “Additional serial ports” add “/tmp/printer”. Then click “Save”.
Enter the Settings tab again and under “Serial Connection” change the “Serial Port” setting to “/tmp/printer”.
In the Settings tab, navigate to the “Behavior” sub-tab and select the “Cancel any ongoing prints but stay connected to the printer” option. Click “Save”.
From the main page, under the “Connection” section (at the top left of the page) make sure the “Serial Port” is set to “/tmp/printer” and click “Connect”. (If “/tmp/printer” is not an available selection then try reloading the page.)
Once connected, navigate to the “Terminal” tab and type “status” (without the quotes) into the command entry box and click “Send”. The terminal window will likely report there is an error opening the config file – that means OctoPrint is successfully communicating with Klipper. Proceed to the next section.
The Klipper configuration is stored in a text file on the Raspberry Pi. Take a look at the example config files in the config directory. The Config Reference contains documentation on config parameters.
Arguably the easiest way to update the Klipper configuration file is to use a desktop editor that supports editing files over the “scp” and/or “sftp” protocols. There are freely available tools that support this (eg, Notepad++, WinSCP, and Cyberduck). Use one of the example config files as a starting point and save it as a file named “printer.cfg” in the home directory of the pi user (ie, /home/pi/printer.cfg).
Alternatively, one can also copy and edit the file directly on the Raspberry Pi via ssh – for example:
Make sure to review and update each setting that is appropriate for the hardware.
It’s common for each printer to have its own unique name for the micro-controller. The name may change after flashing Klipper, so rerun the ls /dev/serial/by-id/* command and then update the config file with the unique name. For example, update the [mcu] section to look something similar to:
After creating and editing the file it will be necessary to issue a “restart” command in the OctoPrint web terminal to load the config. A “status” command will report the printer is ready if the Klipper config file is successfully read and the micro-controller is successfully found and configured. It is not unusual to have configuration errors during the initial setup – update the printer config file and issue “restart” until “status” reports the printer is ready.
Klipper reports error messages via the OctoPrint terminal tab. The “status” command can be used to re-report error messages. The default Klipper startup script also places a log in /tmp/klippy.log which provides more detailed information.
In addition to common g-code commands, Klipper supports a few extended commands – “status” and “restart” are examples of these commands. Use the “help” command to get a list of other extended commands.
After Klipper reports that the printer is ready go on to the config check document to perform some basic checks on the pin definitions in the config file.
NEW:Rotation distance
Stepper motor drivers on Klipper require a rotation_distance parameter in each stepper config section. The rotation_distance is the amount of distance that the axis moves with one full revolution of the stepper motor. This document describes how one can configure this value.
Obtaining rotation_distance from steps_per_mm (or step_distance)
The designers of your 3d printer originally calculated steps_per_mm from a rotation distance. If you know the steps_per_mm then it is possible to use this general formula to obtain that original rotation distance:
The <full_steps_per_rotation> setting is determined from the type of stepper motor. Most stepper motors are “1.8 degree steppers” and therefore have 200 full steps per rotation (360 divided by 1.8 is 200). Some stepper motors are “0.9 degree steppers” and thus have 400 full steps per rotation. Other stepper motors are rare. If unsure, do not set full_steps_per_rotation in the config file and use 200 in the formula above.
The <microsteps> setting is determined by the stepper motor driver. Most drivers use 16 microsteps. If unsure, set microsteps: 16 in the config and use 16 in the formula above.
Almost all printers should have a whole number for rotation_distance on x, y, and z type axes. If the above formula results in a rotation_distance that is within .01 of a whole number then round the final value to that whole_number.
Calibrating rotation_distance on extruders
On an extruder, the rotation_distance is the amount of distance the filament travels for one full rotation of the stepper motor. The best way to get an accurate value for this setting is to use a “measure and trim” procedure.
Then use the following procedure to “measure and trim”:
Make sure the extruder has filament in it, the hotend is heated to an appropriate temperature, and the printer is ready to extrude.
Use a marker to place a mark on the filament around 70mm from the intake of the extruder body. Then use a digital calipers to measure the actual distance of that mark as precisely as one can. Note this as <initial_mark_distance>.
Extrude 50mm of filament with the following command sequence: G91 followed by G1 E50 F60. Note 50mm as <requested_extrude_distance>. Wait for the extruder to finish the move (it will take about 50 seconds). It is important to use the slow extrusion rate for this test as a faster rate can cause high pressure in the extruder which will skew the results. (Do not use the “extrude button” on graphical front-ends for this test as they extrude at a fast rate.)
Use the digital calipers to measure the new distance between the extruder body and the mark on the filament. Note this as <subsequent_mark_distance>. Then calculate: actual_extrude_distance = <initial_mark_distance> – <subsequent_mark_distance>
Calculate rotation_distance as: rotation_distance = <previous_rotation_distance> * <actual_extrude_distance> / <requested_extrude_distance> Round the new rotation_distance to three decimal places.
If the actual_extrude_distance differs from requested_extrude_distance by more than about 2mm then it is a good idea to perform the steps above a second time.
Note: Do not use a “measure and trim” type of method to calibrate x, y, or z type axes. The “measure and trim” method is not accurate enough for those axes and will likely lead to a worse configuration. Instead, if needed, those axes can be determined by measuring the belts, pulleys, and lead screw hardware.
Obtaining rotation_distance by inspecting the hardware
It’s possible to calculate rotation_distance with knowledge of the stepper motors and printer kinematics. This may be useful if the steps_per_mm is not known or if designing a new printer.
Belt driven axes
It is easy to calculate rotation_distance for a linear axis that uses a belt and pulley.
First determine the type of belt. Most printers use a 2mm belt pitch (that is, each tooth on the belt is 2mm apart). Then count the number of teeth on the stepper motor pulley. The rotation_distance is then calculated as:
For example, the common “T8 leadscrew” has a rotation distance of 8 (it has a pitch of 2mm and has 4 separate threads).
Older printers with “threaded rods” have only one “thread” on the lead screw and thus the rotation distance is the pitch of the screw. (The screw pitch is the distance between each groove on the screw.) So, for example, an M6 metric rod has a rotation distance of 1 and an M8 rod has a rotation distance of 1.25.
Extruder
It’s possible to obtain an initial rotation distance for extruders by measuring the diameter of the “hobbed bolt” that pushes the filament and using the following formula: rotation_distance = <diameter> * 3.14
The actual rotation distance on an extruder will vary from printer to printer, because the grip of the “hobbed bolt” that engages the filament can vary. It can even vary between filament spools. After obtaining an initial rotation_distance, use the measure and trim procedure to obtain a more accurate setting.
Using a gear_ratio
Setting a gear_ratio can make it easier to configure the rotation_distance on steppers that have a gear box (or similar) attached to it. Most steppers do not have a gear box – if unsure then do not set gear_ratio in the config.
When gear_ratio is set, the rotation_distance represents the distance the axis moves with one full rotation of the final gear on the gear box. If, for example, one is using a gearbox with a “5:1” ratio, then one could calculate the rotation_distance with knowledge of the hardware and then add gear_ratio: 5:1 to the config.
For gearing implemented with belts and pulleys, it is possible to determine the gear_ratio by counting the teeth on the pulleys. For example, if a stepper with a 16 toothed pulley drives the next pulley with 80 teeth then one would use gear_ratio: 80:16. Indeed, one could open a common off the shelf “gear box” and count the teeth in it to confirm its gear ratio.
Note that sometimes a gearbox will have a slightly different gear ratio than what it is advertised as. The common BMG extruder motor gears are an example of this – they are advertised as “3:1” but actually use “50:17” gearing. (Using teeth numbers without a common denominator may improve overall gear wear as the teeth don’t always mesh the same way with each revolution.) The common “5.18:1 planetary gearbox”, is more accurately configured with gear_ratio: 57:11.
If several gears are used on an axis then it is possible to provide a comma separated list to gear_ratio. For example, a “5:1” gear box driving a 16 toothed to 80 toothed pulley could use gear_ratio: 5:1, 80:16.
In most cases, gear_ratio should be defined with whole numbers as common gears and pulleys have a whole number of teeth on them. However, in cases where a belt drives a pulley using friction instead of teeth, it may make sense to use a floating point number in the gear ratio (eg, gear_ratio: 107.237:16).
For a Voron 2.4 (300x300x300) setup, start settings are pre-defined:
To add in the config file:
NOT in the TMC settings, just in the stepper_x, and so on
And delete the old commands: step_distance: 0.0125 or just comment them out as I did initially..
Add for steppers X,Y
rotation_distance: 40
## gear_ratio: 1:1
microsteps: 16
and for Z-Z3:
rotation_distance: 40
gear_ratio: 80:16
microsteps: 16
Add for extruder stepper:
## Update value below when you perform extruder calibration
## If you ask for 100mm of filament, but in reality it is 98mm:
## Update Gear Ratio depending on your Extruder Type
## Use 50:17 for Afterburner/Clockwork (BMG Gear Ratio)
## Use 80:20 for M4, M3.1
gear_ratio: 50:17 #BMG Gear Ratio
microsteps: 16
full_steps_per_rotation: 200 #200 for 1.8 degree, 400 for 0.9 degree
nozzle_diameter: 0.400 # or 0.6 like I have
filament_diameter: 1.75
Send: M876 P1
Recv: // mcu ‘mcu’: Command format mismatch: config is_config=%c crc=%u is_shutdown=%c move_count=%hu vs config is_config=%c crc=%u move_count=%hu is_shutdown=%c
Recv: //
Recv: // This type of error is frequently caused by running an older
Recv: // version of the firmware on the micro-controller (fix by
Recv: // recompiling and flashing the firmware).
Recv: //
Recv: // Known versions: host=v0.10.0-184-gdd714fc7, mcu=v0.9.1-319-g3233ec08-20210315_134213-octopi, z=v0.9.1-319-g3233ec08-20210315_134213-octopi
Recv: //
Recv: // Once the underlying issue is corrected, use the “RESTART”
Recv: // command to reload the config and restart the host software.
Recv: // Protocol error connecting to printer
Recv: !! mcu ‘mcu’: Command format mismatch: config is_config=%c crc=%u is_shutdown=%c move_count=%hu vs config is_config=%c crc=%u move_count=%hu is_shutdown=%c
So, flash both SKR1.4 T’s with the new firmware (download this from the PI4) and start trhem first without USB connection to the RPI. Then, shutdown (=POWER OFF) and connect the USB cables and start up again.
Now, Octopi will fire up and the LCD runs again, and all is connected.
Do the checks as described further on.
My printer.cfg working Voron2.4 config file AFTER the Python 3 upgrade:
##
## Voron Design VORON2.4 310mm SKR 1.4turbo x 2 with TMC2209 UART config
# March 15th, 2021 Jantec.nl
# To solve the issue of varying Z height after G32: Add this: relative_reference_index: (add a point number of bed_mesh here)
# must be added to get a coupling between the initial G28’s Z probe position
# and bed mesh level’s Z probe value at a specified mesh bed level point. I will try to use the point that is exactly at the switch position,
# so I can also get a predefined measured Z value for the Z position’s offset in G28.
# When capture/restore is enabled, the speed at which to return to
# the captured position (in mm/s). Default is 50.0 mm/s.
#[gcode_macro G29]
#gcode:
#G0 Z5 F1200
#G28
#BED_MESH_CALIBRATE
#SAVE_CONFIG
[gcode_macro G32]
gcode:
BED_MESH_CLEAR # This command clears the mesh and removes all z adjustment. It is recommended to put this in your end-gcode.
G90 # use absolute coordinates
M140 S75 # set bed temp
M104 S220 # hotend on for better G28 effectiveness
M109 S220 # wait for hotend temp
M117 Homing… # print homing on LCD
G28 # home all axes home all without mesh bed level
M117 wait for temps # display message
M140 S75 # set bed temp
M104 S75 # hotend off, switching temp at hotend causes jitter on the Z-probe
M106 S1 # This command sets the speed of the print fan. must be between 0.0 and 1.0.
#SET_FAN_SPEED FAN=fan SPEED=1 # This command sets the speed of a fan. must be between 0.0 and 1.0.
M190 S75 # wait for bed temp
# M109 S75 # wait for hotend temp to 75 max because it will get too hot to be accurate **** changed this to off but no need to wait for it to cool down ****
M117 Gantry leveling.. # display message
QUAD_GANTRY_LEVEL # make sure to level at the outer points of the bed mesh
M117 Mesh level bed.. # display message
BED_MESH_CALIBRATE
G90 # use absolute coordinates
G1 X150 Y150 Z15 F6000 # Park at center after leveling G32
SAVE_CONFIG # Save and reset/restart. This will also set all temps and fans off
[gcode_macro PRINT_START]
## Use PRINT_START for the slicer starting script – please customise for your slicer of choice
gcode:
G90 # use absolute coordinates
M117 Homing… # print homing on LCD
G28 # home all axes home
M117 Leveling gantry.. # display message
QUAD_GANTRY_LEVEL #
M117 Mesh level bed.. # display message
BED_MESH_CALIBRATE
M117 Print@Jantec.nl # print on LCD
## print intro line
G28 # home all axes home
# Do not do this G29 S1 after mesh bed leveling because it will activate your OLD mesh values instead of your just made mesh!!
# or do a Save-config FIRSt but this will retart the printer… maybe in the PRINT_END?
#G29 S1 # enable bed mesh compensation
G92 E0 # Reset E
G90 # use absolute coordinates
G1 X270 Y0 F6000 #
G1 Z0.2 F720 #
G1 X40 E28 F1000 #
G92 E0 # Reset E
G1 Z2 F3000 # move nozzle away from bed
[gcode_macro PRINT_END]
# Use PRINT_END for the slicer ending script – please customise for your slicer of choice
BED_MESH_CLEAR # This command clears the mesh and removes all z adjustment. It is recommended to put this in your end-gcode.
# use BED_MESH_CALIBRATE to run a bed mesh.
# this is for uneven beds. min_point and max_point have been renamed to mesh_min and mesh_max respectively
[bed_mesh]
speed: 100 # was 150 mm/sec
horizontal_move_z:10 # was 20
mesh_min: 25,50 # X,Y min and add the 25 mm for the Z probe here as add to Z value!
mesh_max: 275,250 # X,Y max and add the 25 mm for the Z probe here as add to Z value!
probe_count: 5,5 # was 5,5
relative_reference_index: 12 # at this specific probe point center bed, Z=0 is made so the reference for the z switch has a fixed relation to this bed point.
# it is the probe point, closest to the probe switch ( 5,5 probe points used) but that is not required. it can be any probed point on the bed…
# probe at 150.000,245.000 is z=0 in Gcode report (for this point 22 see the exact value at end of this file, remember the points start with number 0 up until 24)
# no longer needed???? this since the Z switch is obselete when we home Z with Z probe only or do we still need to set a reference although we have probed at center bed for Z=0?
#fade_start: 1.0
#fade_end: 10.0
#split_delta_z: .025
#move_check_distance: 5.0
#mesh_pps: 5,5
#algorithm: lagrange
# The interpolation algorthm to use. May be either “langrange”
# or “bicubic”. This option will not affect 3×3 grids, which
# are forced to use lagrange sampling. Default is lagrange.
#bicubic_tension: .2
# When using the bicubic algoritm the tension parameter above
# may be applied to change the amount of slope interpolated.
# Larger numbers will increase the amount of slope, which
# results in more curvature in the mesh. Default is .2.
This document provides a list of steps to help confirm the pin settings in the Klipper printer.cfg file. It is a good idea to run through these steps after following the steps in the installation document.
During this guide, it may be necessary to make changes to the Klipper config file. Be sure to issue a RESTART command after every change to the config file to ensure that the change takes effect (type “restart” in the Octoprint terminal tab and then click “Send”). It’s also a good idea to issue a STATUS command after every RESTART to verify that the config file is successfully loaded.
Start by verifying that temperatures are being properly reported. Navigate to the Octoprint temperature tab.
Verify that the temperature of the nozzle and bed (if applicable) are present and not increasing. If it is increasing, remove power from the printer. If the temperatures are not accurate, review the “sensor_type” and “sensor_pin” settings for the nozzle and/or bed.
Navigate to the Octoprint terminal tab and issue an M112 command in the terminal box. This command requests Klipper to go into a “shutdown” state. It will cause Octoprint to disconnect from Klipper – navigate to the Connection area and click on “Connect” to cause Octoprint to reconnect. Then navigate to the Octoprint temperature tab and verify that temperatures continue to update and the temperatures are not increasing. If temperatures are increasing, remove power from the printer.
The M112 command causes Klipper to go into a “shutdown” state. To clear this state, issue a FIRMWARE_RESTART command in the Octoprint terminal tab.
Navigate to the Octoprint temperature tab and type in 50 followed by enter in the “Tool” temperature box. The extruder temperature in the graph should start to increase (within about 30 seconds or so). Then go to the “Tool” temperature drop-down box and select “Off”. After several minutes the temperature should start to return to its initial room temperature value. If the temperature does not increase then verify the “heater_pin” setting in the config.
If the printer has a heated bed then perform the above test again with the bed.
Verify that all of the printer axes can manually move freely (the stepper motors are disabled). If not, issue an M84 command to disable the motors. If any of the axes still can not move freely, then verify the stepper “enable_pin” configuration for the given axis. On most commodity stepper motor drivers, the motor enable pin is “active low” and therefore the enable pin should have a “!” before the pin (for example, “enable_pin: !ar38”).
Manually move all the printer axes so that none of them are in contact with an endstop. Send a QUERY_ENDSTOPS command via the Octoprint terminal tab. It should respond with the current state of all of the configured endstops and they should all report a state of “open”. For each of the endstops, rerun the QUERY_ENDSTOPS command while manually triggering the endstop. The QUERY_ENDSTOPS command should report the endstop as “TRIGGERED”.
If the endstop appears inverted (it reports “open” when triggered and vice-versa) then add a “!” to the pin definition (for example, “endstop_pin: ^!ar3”), or remove the “!” if there is already one present.
If the endstop does not change at all then it generally indicates that the endstop is connected to a different pin. However, it may also require a change to the pullup setting of the pin (the ‘^’ at the start of the endstop_pin name – most printers will use a pullup resistor and the ‘^’ should be present).
Use the STEPPER_BUZZ command to verify the connectivity of each stepper motor. Start by manually positioning the given axis to a midway point and then run STEPPER_BUZZ STEPPER=stepper_x. The STEPPER_BUZZ command will cause the given stepper to move one millimeter in a positive direction and then it will return to its starting position. (If the endstop is defined at position_endstop=0 then at the start of each movement the stepper will move away from the endstop.) It will perform this oscillation ten times.
If the stepper does not move at all, then verify the “enable_pin” and “step_pin” settings for the stepper. If the stepper motor moves but does not return to its original position then verify the “dir_pin” setting. If the stepper motor oscillates in an incorrect direction, then it generally indicates that the “dir_pin” for the axis needs to be inverted. This is done by adding a ‘!’ to the “dir_pin” in the printer config file (or removing it if one is already there). If the motor moves significantly more or significantly less than one millimeter then verify the “rotation_distance” setting.
Run the above test for each stepper motor defined in the config file. (Set the STEPPER parameter of the STEPPER_BUZZ command to the name of the config section that is to be tested.) If there is no filament in the extruder then one can use STEPPER_BUZZ to verify the extruder motor connectivity (use STEPPER=extruder). Otherwise, it’s best to test the extruder motor separately (see the next section).
After verifying all endstops and verifying all stepper motors the homing mechanism should be tested. Issue a G28 command to home all axes. Remove power from the printer if it does not home properly. Rerun the endstop and stepper motor verification steps if necessary.
To test the extruder motor it will be necessary to heat the extruder to a printing temperature. Navigate to the Octoprint temperature tab and select a target temperature from the temperature drop-down box (or manually enter an appropriate temperature). Wait for the printer to reach the desired temperature. Then navigate to the Octoprint control tab and click the “Extrude” button. Verify that the extruder motor turns in the correct direction. If it does not, see the troubleshooting tips in the previous section to confirm the “enable_pin”, “step_pin”, and “dir_pin” settings for the extruder.
Klipper supports PID control for the extruder and bed heaters. In order to use this control mechanism it is necessary to calibrate the PID settings on each printer. (PID settings found in other firmwares or in the example configuration files often work poorly.)
To calibrate the extruder, navigate to the OctoPrint terminal tab and run the PID_CALIBRATE command. For example: PID_CALIBRATE HEATER=extruder TARGET=170
At the completion of the tuning test run SAVE_CONFIG to update the printer.cfg file the new PID settings.
If the printer has a heated bed and it supports being driven by PWM (Pulse Width Modulation) then it is recommended to use PID control for the bed. (When the bed heater is controlled using the PID algorithm it may turn on and off ten times a second, which may not be suitable for heaters using a mechanical switch.) A typical bed PID calibration command is: PID_CALIBRATE HEATER=heater_bed TARGET=60
This guide is intended to help with basic verification of pin settings in the Klipper configuration file. Be sure to read the bed leveling guide. Also see the Slicers document for information on configuring a slicer with Klipper.
After one has verified that basic printing works, it is a good idea to consider calibrating pressure advance.
It may be necessary to perform other types of detailed printer calibration – a number of guides are available online to help with this (for example, do a web search for “3d printer calibration”). As an example, if you experience the effect called ringing, you may try following resonance compensation tuning guide.
Looking at all the different IDEX designs that are based on either a coreXY setup, a Prusa3, Bear or not-, or on an Ender3/10 setup, I chose to do it from scratch.
An IDEX printer has independantly extruders, but nowhere is mentioned in what sense or -way the indepentand extruders are defined.
Since I have much experience with my dual Bear setup, where I park the hotend carriages and use 1 moving centerpiece with electromagnets to catch either the left carriage with hotend or the right carriage and hotend, I think that making a new printer for IDEX from scratch will be a good idea.
I did get my I3bear with IDEX on a single X-axis with magnetic carriages on the same axis running very well in the end.
Contrary to my A30M with a Chimera fixes dual hotend/extruder. That works very well, but also has its limitations. Limitations like low speed and the fact that you will always have some dripping on your object from the other nozzle, that is fixed at about 22mm to the right or left of the active nozzle. But- it is a really good solution for an 0.6mm nozzle, if you push the layer height to 0. 3 mm.
For my IDEX setup I will to use a standard Bear frame, made from 2040 aluminium, and all axes are based on standard I3 dual rods. Then, add a frond and a rear X-axis to the frame with each having its own Z-drives. Then, it looks like this:
The only additional printed parts needed are the X-axis motor holder for the rear and 2 top Z-holders:
The rest is all standard I3bear stuff.
For this printer I need a motherboard with 7 drivers, being 2*X, 1*Y, 2*Z and 2*E.
Since I have a Fly407 MB with 9! driver positions in stock, already programmed for RRF3, wifi and with an LCD unit attached, I will use this to get a Duet setup with Duet Web Controller along. easy to reprogram, and I can finally check the board’s capabilities.
I just need to get me a casing for the board, but that’ll not prevent me from using it!
Yesterday I exchanged the dual nozzle printerhead (Chimera) that I have been using for dual printing all kinds of goodies like my name tag and several dual color prints, with the original single nozzle-dual extruder head.
I needed to print a LED lights circular holder that is 328mm wide, and the setrup with the Chimera just does net get that wide on the X-axis.
The result is below: It took some tweaking in the bed size settings but I have exactly 330×330 X*Y available, awesome!
Last week (2021-Nov-04) I ordered me a Prusa mini clone from Aliexpress.
I already have an original Prusa Mini from the moment it was offered by Prusa. I waited for over 1/2 a year to get it delivered as I was one of the (almost) first to order it. And- I value the machine very positive.
I use it for professional prints, mostly with white, orange and black PETG.
I hope that my additional Prusa Mini will be just as perfect as my original one.
On Ali, everything was offered except the printed parts. It includes a buddyboard 32 bits with 2209 drivers, LCD 2.6 inch, 3 motors, nuts and bolts, cables, hoses, bearings, clamps, hotbed, pei sheet, rods, extruder, fans, extrusion, you name it, really everything is included for 105 Euro’s . But- you guessed it- I never got anything delivered. I have a dispute running now, hopefully I wiull get the money back. And- I ordered a new one, now the costs are more than double, as is to be expected.
As add-on I ordered 2 renewed Z-sensors (including temp sensor) from Prusa for Eur 50 incl. Tax and shipment. With this, both mini’s can be upgraded to Mini+ 3d printers. Except the longer bed of course. Also, both the buddyboards will get the Mini+ firmware.
Since I also own an original Prusa mini, printing the parts was easy, as you can see in the attached pictures.:
Still, also a Prusa mini can have stringing wth PetG. OR, i think this was caused because I purposely set the temp very high to get extremely solid prints. Whatever, I cleaned the printed parts afterwards with a knife and that turned out to be easy enough.
The black PETG parts got printed on my Ender 3 pro+.
Built after receival of the non-printed parts on 2021-12-22 JMWG.NL
I upgraded the Buddyboard V1.0.0 straight away to the latest Prusa Mini firmware and compared the prints against my Original Prusa Mini.
I honestly could not see any difference between the two of them.
The stuff I ordered on Ali:
Https://github.com/FYSETC/FYSETC-Prusa-mini-clone
3.2/2.8 MW power is momenteel in voldoende voorraad, bent u welkom om een bestelling plaatst, de voorraad is in de Spaanse magazijn, dank u voor uw steun,
Video tutorial:
Pakket:
Schroef kit 1
Tool kit 1
USB disk 1
Gladde staven kit 1
3030 extrusie kit 1
625 lager 3
12.5mm, 3mm OD as 1
4.9*12mm as 1
16T GT2 Katrol (als MK3) 2
Platte Katrol (als MK3) 2
X/Y riem 2
LM8UU 5
LM10LUU 2
Dit product omvat niet prints. Als u of kopen het zelf, het bestand afdrukken link: https://www.thingiverse.com/thing:4338197
3.2 inch scherm case STL Link:https://www.thingiverse.com/thing:4307001
While I was making my CNC adapter plates with teethed wheels and belts, I discovered that not much exists that is ready to use for these conversions.
I am therefore also making direct drive adapter parts, to try this out.
This is the third piece I make for direct drive, for the Z-axis.
This pice is fairly simple: First a good fit is needed to mount the adapter to the top of the Z-column, and the holes for the 4 bolts need to be acactly correct. Also, the same for the leadscrew hole of the bearing holder.
Then, on top of this, the Nema23 holder/mounting is projected. Including all needed boltholes, nutholes and a side hole for tightening the coupler.
The leadscrew has an outside part for the handwheel we will use for CNC that is 10mm, and some thread 10mm for Z. The thread is needed to be bolting the angular bearings (not meant for side torque) with some torque to the bearing holder.
If you do direct drive, you need a special coupler that can be split in 2. Then, you first mount one part on the leadscrew with some rings between the mill and the coupler part so that the nut can be placed in the coupler. If the thread is too long, grind some off.
Then, put the rubber (with centerhole) back in the coupler’s mounted part and push the other part in the rubber, so the coupler is complete.
Then, mount the printed adapter with already mounted Nema23 motor on the Y-axis and push the Nema shaft in the coupler. Use the adapter’s right hand side working window to torque the connector on the Nema shaft and you’re done!
Should you want to have a handwheel as well, this is possible but you will have to buy a stepper with an axis that is both at the front as the rear. (this is called ‘double shaft’ but is actually a longer shaft, obviously.]
While I was making my CNC adapter plates with teethed wheels and belts, I discovered that not much exists that is ready to use for these conversions.
I am therefore also making direct drive adapter parts, to try this out.
This is the second piece I make for direct drive, for the X-axis.
The leadscrew has an outside part for the handwheel we will use for CNC that is 10mm, and some thread 8mm. The thread is needed to be bolting the angular bearings (not meant for side torque) with some torque to the bearing holder.
If you do direct drive, you need a special coupler that can be split in 2. Then, you first mount one part on the leadscrew with some rings between the mill and the coupler part so that the nut can be placed in the coupler. If the thread is too long, grind some off.
Then, put the rubber (with centerhole) back in the coupler’s mounted part and push the other part in the rubber, so the coupler is complete.
Then, mount the printed adapter with already mounted Nema23 motor on the Y-axis and push the Nema shaft in the coupler. Use the adapter’s right hand side working window to torque the connector on the Nema shaft and you’re done!
Should you want to have a handwheel as well, this is possible but you will have to buy a stepper with an axis that is both at the front as the rear. (this is called ‘double shaft’ but is actually a longer shaft, obviously.