Friday, August 25, 2017

UMMD 3D Printer LED Lighting

Some people like to dress their printers up with 24 bit RGB variable color LED lighting that they can control from a phone.  Meh.  I just wanted plenty of light in UMMD so I could see what is happening and to make it easier to do maintenance and repairs, if they're ever needed, and to photograph prints.  To that end I installed two 8W cool white LED strips on either side of the lower front opening of the printer, and two smaller 3W strips on the underside of the top cover.  Together they provide plenty of light.

Plenty of white light!


I have taken Son of MegaMax to the Milwaukee Maker Faire for the last couple years and will be taking UMMD this year.  One of the more popular events at the Maker Faire is the Dark Room where we set up things that look impressive in the dark.  There are always lots of interesting displays done with projectors, LEDs, blacklights, etc.  Here's one that's very popular...

Knight in Armor vs Big Tesla Coil from Mark Rehorst on Vimeo.

This year I'm planning to have UMMD in the Dark Room for one day of the Faire, so I'm installing UV LEDs and will print something interesting with fluorescent filament.  I initially bought some UV LED strips via ebay that worked OK, but weren't as bright as I wanted.  So I did some more shopping.

SoM has a 400 nm UV light bar that does a pretty good job, but I always felt it produced too much visible, pale blue light along with the deeper purple that causes the fluorescence.  So I looked for shorter wavelength LEDs, hoping they would produce less of the pale blue light.  I bought a bunch of 1W 360 nm LEDs on 16 mm diameter aluminum circuit boards and wired some of them to test.  I found that 360 nm LEDs cost about 4-5X what 400 nm LEDs cost and both produce about the same pale blue light, and both cause the same fluorescence, so there's no point in buying the more expensive, shorter wavelength LEDs.  I also realized that it's a PITA to mount all those round PCBs and then wire them all together.

The UV light bar in SoM is mounted at the top, front of the printer's frame using printed snap-in brackets.

The UV light has a very nice effect when you use fluorescent filament.

1W LEDs usually use 350 mA.  UV LEDs typically drop 3.4-3.8V each at that current.  The easiest way to power LEDs is to connect them to the printer's 24V power supply.  24/3.4 = 7.06 and 24/3.8=6.3, so I needed to find a narrow circuit board that would allow me to connect 6 or 7 LEDs in series, and allow easy coupling to a heatsink.  I searched ebay and some of the Chinese sites and found some 300 x 10mm aluminum circuit boards designed to wire 6 LEDs in series.  I ordered a 5 pack for $6.

Next I looked for 1W UV LEDs without any circuit boards.  I found a pretty good deal on some 400 nm LEDs so I bought 30 of them for $15.

Finally, LEDs, like other semiconductors tend to drop more voltage as they heat up, which is another way to say that if you operate them from a constant voltage supply, they will take more current.  That leads to more heating, which leads to more current, and pretty soon you have a condition known as thermal runaway and your LEDs burn up.

The best way to avoid thermal runaway is to power LEDs with a constant current source.  You set the current to 350 mA for a string of 1W LEDs and they all get 350 mA and it doesn't matter if the LEDs heat up a little, the current source automatically adjusts its output voltage to maintain the set 350 mA.  They also maintain constant brightness when you use a constant current source.

This works great for a few LEDs, but if you're trying to run 30 UV LEDs at 350 mA, you need a current source that can deliver up to 30 x 3.8V = 114V.  That's a problem if you only have a 24V power supply.  You can probably find an expensive boost converter that will provide a constant current, high voltage output, but there are other ways.

Since UMMD has 24V available (I'd prefer not to run another 117 VAC supply), I can drive up to 6 LEDs in series (6 x 3.4V = 20.4V).  I have 5 circuit boards with 6 LEDs in series on each, so all I have to do is wire the circuit boards in parallel.  Since each board needs 350 mA, I could use a constant current supply that delivers 350 mA x 5 =1750 mA.  But what happens if an LED dies?  Now there are 4 boards sharing 1750 mA- they all get brighter for a while, then they probably burn up.  So constant current isn't the best way to power LEDs wired in series-parallel.

Powering LEDs from a constant voltage isn't ideal, but it is easy/cheap when you're using a low voltage power supply.  I found a 35W buck converter that will take the 24V input and convert it to a voltage/current limited output for $8.  This device can be operated as a constant current source by setting the voltage output to maximum and then adjusting the current limit pot for whatever current you want up to 3A.  Or, it can operate as a constant voltage source by turning the current limit all the way up and setting the output voltage you want up to about 22V.  Or you can operate it in between, and set both voltage and current limits.

I had my LEDs, and my power source, now I just had to mount them.  I used some 3/4" x 3/4" aluminum L stock.  It was rigid and could be mounted easily, and serves as a light guide that blocks the direct view of the LEDs when looking at the printer from the front.  I mounted the PCBs on the aluminum L using some printed ABS clips.  They snap on and hold the aluminum PCB in tight contact with the L stock, transferring heat away from the LEDs.

Aluminum LED PCB mounted on 3/4" x 3/4" aluminum L as a heatsink/mounting bracket/light guide, using printed ABS clips.  The clips hold the PCB tightly against the L to ensure efficient heat transfer.

One of the printed ABS PCB clips.  It snaps on tightly, ensuring heat transfer from the PCB to the L heatsink.




One of two 12 x 1W UV LED light bars that will be mounted vertically on the front of the printer.  The bright green objects are the brackets that snap into the t-slot frame of the printer.  The white LED bars will be mounted alongside the UV strips.

I found that the heatsink got pretty warm if I operated the LEDs at full power, so I dropped the voltage a bit and gave up just a little of the brightness in exchange for much cooler operation.  I set the buck converter for about 19.6V output and limited the current to 1.3A.  The voltage setting limits the current through the LEDs initially to just over 1A.  If the LEDs heat up because they are inside a warm printer enclosure, they'll try to suck more current from the buck converter, and when it reaches the set limit, the converter will operate in constant current mode and that will prevent thermal runaway.

Here's a short video of the printer putting down some fluorescent yellow filament with the lighting switched between the white and UV LEDs.

UMMD 3D Printer White and UV Lighting from Mark Rehorst on Vimeo.


Here's a still photo in which I tried to tweak the exposure to match what the eye sees when the UV lights are lighting up a fluorescent yellow print.  The photo just doesn't do it justice- in real life it's almost painful to look at the print because it glows so brightly.



Tuesday, August 15, 2017

Thermal Performance of UMMD's Print Bed

UMMD, my recently built coreXY 3D printer, has been at the Milwaukee MakerSpace for the last week while I put the finishing touches on it before it's public debut at the Milwaukee Maker Faire at the end of September.  One of the members, John Olson, brought his FLIR camera to the makerspace meeting tonight and we were able to make a couple images of the bed with it.

In case you haven't seen UMMD's bed design, you can read all about it here.  The bed is a piece of 300 x 300 x 8mm, MIC6 cast aluminum tooling plate with a 0.7 mm layer of PEI on top and a 750W line powered heater on the bottom.

In the images below, I set the bed temperature in the controller and left it for a few minutes to stabilize.  The controller uses PID temperature regulation and drives an SSR that switches power through the bed heater.

In the first image, the controller was set to 70C, typical for printing PLA.  You can see there is some offset between the controller reading and the FLIR temperature reading.  But more important than absolute temperature, you can see that there is only about 3C variation in temperature across the bed surface, with some droop at the corners and edges, as expected.  There appears to be a hot spot at the front edge of the bed- that's actually just a reflection of the hot-end.


In the next image, the controller was set to 105C, a temperature typical for printing ABS.  Again, the bed temperature is a few degrees lower than the controller thinks.  This time there's about 5C  variation in temperature across the bed surface, expected because the higher temperature will cause more convection that cools the edges and corners of the bed.  


It's hard to beat cast aluminum plate for even heat distribution.  Between the flatness,  even heating, and PEI print surface, I have very few problems with prints releasing from the bed before they are finished.

Saturday, August 5, 2017

Setting Up a CoreXY Printer's Origin and EndStops

In this explanation, I'm going to use SmoothieWare as an example for the config file entries, but there are similar entries for whatever firmware you are using.  Look them up!

If your printer is not a coreXY type, please refer to this post for setting up its origin and end stops.

I will refer to the motor that connects to the X or alpha output on the controller as the alpha motor, and the motor connecting to the Y or beta output as the beta motor.  The Z axis motor connects to the Z or gamma output.  I will largely ignore the Z axis because it's pretty straightforward- you're going to have an endstop at the Z=0 position at the top of the Z axis.

CoreXY motion can be a little confusing when trying to set up endstops and motor direction in firmware.  The printer's firmware needs to know:
  1. That a corexy mechanism is being used
  2. The locations of the printer's endstop switches and origin
  3. The length of each axis
  4. The direction to spin each motor


Step by step CoreXY firmware setup

  1. Build your printer, and mount the motors and limit switches.
  2. Choose origin location, either left-front or right-rear
  3. Set home_to direction for each axis, plug in the endstops
  4. Assign appropriate ordinate values for each axis
  5. Set motor rotation directions for all three motors.

Mounting Motors and Switches

You can mount the motors either pulley-up or pulley-down or one up and one down - it doesn't matter.  You can put limit switches at either end of either axis, but you have to make appropriate assignments in the firmware and plug the switches into the appropriate inputs on the controller board.  We'll get to that in a minute.

Example corexy layout , viewed from the top of the printer, that will be used to illustrate firmware configuration.  Motors are at the front of the machine, origin is at the left-front (L-F) corner, X axis endstop is at the right (bright green box), Y axis endstop is at the rear (red box).


First things first: you have to tell the controller that your printer uses a corexy mechanism.  You do that in SmoothieWare by using this line in the config file:

arm_solution corexy

Origin Location


The printer's origin (0,0,0) has to be located at the left-front (L-F) corner or the right-rear (R-R) corner in order to match the right-hand-rule coordinate space used in CAD and slicing software, otherwise your prints will come out mirrored.  Slicers commonly default to showing the origin at the left-front, and the jog controls in Pronterface assume a left-front origin, so you can save yourself some mental gymnastics by doing the same.  There is no explicit statement in the config file that tells the controller where the origin is.  Its location is implied by the homing directions and endstops used.

The Z=0 position is at the level of the extruder nozzle.

Setting "home_to" Direction for Each Axis


If the switch is at the origin end of its axis, you'll set that axis for home_to_min.  If it's at the far end, set that axis for home_to_max.  

Printer
Origin
X axis
Y axis
endstop location
alpha home-to
endstop location
beta home-to
L-F
left
min
front
min
L-F
right
max
front
min
L-F
left
min
rear
max
L-F
right
max
rear
max
R-R
left
max
front
max
R-R
right
min
front
max
R-R
left
max
rear
min
R-R
right
min
rear
min

Let's say that the origin is at the L-F and the switches are located at the right and rear.  In SmoothieWare, you'll have entries like this:

corexy_homing true
alpha_homing_direction home_to_max
beta_homing_direction home_to_max
gamma_homing_direction home_to_min
In the example above, the alpha and beta endstop switches are both located at the maximum ends of the X and Y axes, so you have to plug the endstop switches into the Xmax and Ymax endstop inputs on the controller board.  The Z endstop should plug into the Zmin endstop input, assuming you have positioned the Z limit switch at the physical top of the Z axis, at the level of the extruder nozzle.

Set Ordinate Values for Each Axis


Measure the length of the X axis by manually moving the extruder carriage from the far left to the far right.  Do the same for the Y axis by measuring the distance the extruder nozzle moves from the front to the back of the machine.  And, of course, measure the usable Z range of motion.

Let's say the X axis range of motion is 380 mm, the Y axis is 340 mm, and the Z axis is 400 mm.  In SmoothieWare you'll have entries like this:

alpha_min 0
alpha_max 380
beta_min 0
beta_max 340
gamma_min 0
gamma_max 400

Setting Direction of Rotation


Setting direction of rotation is done either by reversing the connectors at the motors or controller board (only with power off or you may destroy the motor driver chip!), or by inverting the direction logic via the firmware.  

Here is how the mechanism works, ignoring any of the electrical stuff (rotation of the drive pulleys, viewed from above, motors at the front of the mechanism):

Left Motor
(alpha)
Right Motor
(beta)
Extruder Motion
Toward:
CW
CW
left
CW
CCW
front
CCW
CW
rear
CCW
CCW
right
CW
off
left-front
CCW
off
right-rear
off
CW
left-rear
off
CCW
right-front

Remember, when homing the mechanism, the location of the switches are important, not the location of the origin.  Homing should always send the extruder carriage toward the switches.  Using the table above, just the top four entries, notice that, when homing, if the switches are at the
  • left and front, the alpha motor must turn CW.  
  • left and rear, the beta motor must turn CW.
  • right and front, the beta motor turns CCW
  • right and rear, the alpha motor turns CCW
In Smoothieware, the motor rotation direction is set by these lines in the config file:

alpha_dir_pin 0.5 
beta_dir_pin 0.11
gamma_dir_pin 0.20
We can use the table to easily set the motor rotation directions.  For example, if the switches are located at the right and rear, manually push the extruder carriage to the center of the build area, tell the controller to home all axes (G28), and watch the rotation of the alpha motor.  It should turn CCW.  If it doesn't, reverse its direction either by shutting off power and reversing the cable connection to the motor, or by appending a "!" in the config file, like this:

alpha_dir_pin 0.5!

Once the alpha motor is turning the right way, push the extruder carriage to the center of the XY space, send another home-all-axes command (G28), and watch the mechanism.  If it moves toward both switches, both motors are turning in the right directions.  If not, reverse the beta motor direction like this:
beta_dir_pin 0.11!
The Z motor should likewise move the bed toward the limit switch, normally at the level of the extruder nozzle.  If you have positioned the switch at that location, Z is homing to minimum (Z=0) and the G28 command should drive the bed upward, toward the switch.

Endstop wiring


If you are using simple, reliable, snap-action switches for the endstops, they can be wired either normally open (NO) or normally closed (NC).  For safety, it is best to wire them NC.  That way, if a wire breaks or becomes disconnected the controller will interpret that as a switch closure and it will quickly become apparent that something is wrong.

The smoothieboard config file defaults to NC.  If you wire any of the switch(es) NO, you have to invert their inputs in the config file.  Refer to the SmoothieWare endstop configuration documentation here.

If you don't have a smoothieboard, look up the endstop wiring in your controller's documentation.

Wednesday, August 2, 2017

UMMD 3D Printer Electronics

Major components of the electronics in UMMD are:

In a 3D printer, the extruder requires the most operator input for maintenance and repairs.  The electronics comes in a close second.  Most people building coreXY printers put the electronics in the bottom of the printer, utilizing some of the "dead space" under the bed.  That can be convenient if the printer sits on a table, but UMMD is tall and stands on the floor, just like me.  Putting electronics in the bottom would mean getting down on the floor every time I had to access the electronics.  I also intended to use an LCD control panel to print from SD cards, and LCD panels generally don't work with long cable runs, so the LCD panel has to be kept close to the electronics.

I wanted to keep the electronics easily accessible, and outside of the heated enclosure, and I hate bending over, so I planned to put the electronics on top of the printer from the start.  Most of the electrical connections to the printer have to be made on the XY stage, so keeping the electronics close by keeps cable runs shorter.  The electronics are mounted on the left side of the top of the printer, under a plastic basket used as a protective cover (it's ugly- I'm working on it!).

There are two buck converters in the system.  One provides a source of 12V to power some fans and some of the white LEDs used to light up the printer.  The other is used strictly for powering the UV LEDs.  It would have been less complicated if I didn't have the 12V parts in the system, but it is easier to find 12V LED light bars, and I already had a couple 12V fans, so I used a buck converter.

The other buck converter is used to power the UV LEDs, something not absolutely necessary but aesthetically pleasing when printing fluorescent filament.

You can see more details about the LED lighting in UMMD here.

UMMD has three electrical fuses, one for the main power supply (which probably has its own internal fuse), one for the bed heater circuit, and a spare that is going to be used for an enclosure heater circuit, not yet installed.  Electrical fuses protect against fires caused by wiring or electronic failures.

The bed heater is powered via an SSR that is driven by the controller board.  When SSRs fail, they fail shorted - i.e. on.  The controller normally keeps the bed temperature regulated, but if the controller fails, or the SSR fails, the bed heater could get dangerously hot, and possibly cause a fire.  I added a thermal cutoff (TCO) to the bed plate to protect against that possibility.  It would actually be better to have the TCO mounted on the heater because the heater is attached to the bed plate with adhesive which could let go.  I will probably move the TCO to the heater itself by cementing it with high temperature silicone.  That way if the heater comes off the bed plate, the TCO can still do its job.  Details of the bed and support here.

TCO clamped to the rear edge of the bed plate.


I used a TCO with a operating temperature of 184°C.  That allows the bed to operate normally up to about 160°C (for printing high temperature materials) without opening the TCO.

The rest of the wiring to motors, etc., is standard stuff you can see in the Smoothieboard documentation.



Tuesday, August 1, 2017

Setting Up a 3D Printer's Origins in Firmware and Slicers

If you build your own 3D printer design, one of the confusing things about configuring its firmware is the limit switches on each axis, homing the printer, and setting up the printer description in slicing software.

One of the first things you need to do when you finish building your printer is measure it limits of motion.  Move each axis as far as it can go and physically measure how far it went.  Write down the numbers.

Three main considerations for homing and slicing:
  1. The printer's origin and limits
  2. The bed's dimensions
  3. The bed's origin

Note: if your printer is a coreXY type, I wrote a separate blog post on setting up its origin and endstops, here.

The Printer's Origin:

First principle: the home position - i.e. the place the extruder ends up when you (or the gcode) issues a home-all-axes command - is not necessarily the printer's origin.  If you read through the material below this will make sense.

Simplifying assumptions:

  • CAD software and slicing software use right-hand-rule coordinate space.  Your printer should, too, or your prints will come out mirrored. For FDM printers, that means that the printer's origin, the (0,0,0) point, must be located at the left-front or right-rear corner of the printer with the extruder nozzle at bed level.
  • The Z axis limit switch is almost always placed at the Z=0 position at the bottom of the Z axis if the extruder moves up, like in a Prusa i3, or at the top of the Z axis if the bed moves down.  For the discussion below I'll assume that the Z axis switch is located at Z=0 and we'll simply ignore the Z axis.
Right hand rule says origin must be at left-front or right-rear corner of printer.  Note- they are equivalent- one is just a rotation of the other.
Slicer's and host software have default views of the print bed that they present to the user.  Slic3r, Cura, and Pronterface all default to show the printer's origin at the left-front corner of the bed.  If you set your printer up that way, the view presented in the slicer and host will match what you see when you look at your printer.  If the printer's origin is at the right-rear of the printer, the slicer view will show the view of the bed from the back of the printer.

Setting up the printer's origin involves multiple settings in the controller's firmware.  You can control the motor rotation direction for each axis, whether the motor is to move toward maximum or minimum when executing a home instruction, and finally, the ordinate value to set for each axis after a home instruction has been executed.

3D printers typically have one limit switch on each of the 3 axes, though you can have two on each, one for minimum and one for maximum.  The Z axis limit switch is almost always set at Z=0, so we'll ignore it for now.  Everything that applies to the X and Y axes also applies to the Z axis.  For simplicity, we'll assume there's one limit switch for each axis.

Basic rules and sequence for establishing printer origin in the controller's firmware:
  1. Mount your limit switches at whichever end of each axis is most convenient
  2. Set the motor rotation direction to drive the mechanism toward the limit switches when a home command is executed.
  3. Set home to min or max depending on where you put the switches and where you want the printer's origin to be (see the table)
  4. Assign the ordinate values for X and Y after a homing instruction depending on where you want the printer's origin to be.
  5. Make sure you plug the limit switches into the appropriate inputs on the controller board. 

When the printer is ordered to home the extruder via the gcode or via a command from a host computer, the motors should drive the mechanism toward the limit switches in each axis.  If the mechanism moves away from the switches in any axis, you have to reverse that motor's direction of rotation either by changing a firmware definition or by powering down the printer and physically reversing the connector on the motor or the controller board.

Once the motors are all turning in the right directions, you can assign ordinate values.  Assuming the most common configuration in which there is one limit switch per axis, you may put the switches at either end of each axis, depending on where it is most convenient.  You might want to keep cables short, or have other specific reasons for placing switches at one end or the other.  It doesn't matter.  The Z axis limit switch is normally put at the Z=0 position and we'll assume that for the examples, below.

Here are a few examples of different set-ups to illustrate how to configure the firmware.  In all examples, we'll assume that the printer's limits of motion are 310 mm x 248 mm x 215 mm measured by jogging or manually pushing the extruder carriage, Y, and Z axis as far as they will go and measuring the distances traveled.

Consult your firmware documentation for the exact syntax required to set motor rotation direction, home to min/max, and ordinate values.

Example:  bed moves in Y, origin is at left-front of printer

If you put a limit switch at the left end of the X axis, you must plug the limit switch into the Xmin limit switch input, set the motor to move the extruder carriage toward the switch, and specify that the X axis homes to minimum in the firmware configuration, and assign an ordinate value of 0 to X after homing.

If you put a limit switch at the right end of the X axis, you must plug the switch into the Xmax limit switch input, tell the firmware to rotate the motor in the right direction- i.e. the extruder carriage should move toward the switch, and tell it to "home to max" in X, then once it has done so, assign an ordinate value of 310 mm to X.



If you put the Y axis limit switch at the back of the printer, you plug the limit switch into the Ymin input, tell the firmware to spin the motor to move the bed toward the switch, and set the Y axis as "home to min" in the configuration file, (because the switch will be activated when the extruder is near the front edge of the bed), and set Y=0 when the bed bumps the limit switch.



Example 2: bed moves in Z (extruder moves in X and Y), origin is at left-front of printer

Using the same limits of motion for the printer, and the left-front of the printer as the origin, placing the switches at the left end of the X axis and at the back of the machine for Y, will require setting firmware to "home to min" in X and "home to max" in Y, then assign ordinate values of 0 for X and 248 for Y.  The limit switches will plug into the Xmin and Ymax inputs on the controller board.

Example 3: bed moves in Z, origin is at right-rear of printer

Placing the X axis limit switch on the left side of the X axis and the Y limit switch at the front of the printer will require that both axes "home to max" and you'll assign ordinate values of 310 to X and 248 to Y.  You will plug the switches into the Xmax and Y max inputs on the controller board.

This table summarizes all the possibilities for FDM printers (using the 310 x 248 mm limits from the examples, above):

Bed
Homing Switch

Controller
Motion Printer’s Switch Location Home Ordinate Limit Switch
Axis Origin Axis on Axis to: Value Input







Y Left-Front X Left min 0 Xmin
Y Left-Front X Right max 310 Xmax
Y Left-Front Y Front max 248 Ymax
Y Left-Front Y Rear min 0 Ymin







Y Right-Rear X Left max 310 Xmax
Y Right-Rear X Right min 0 Xmin
Y Right-Rear Y Front min 0 Ymin
Y Right-Rear Y Rear max 248 Ymax







Z Left-Front X Left min 0 Xmin
Z Left-Front X Right max 310 Xmax
Z Left-Front Y Front min 0 Ymin
Z Left-Front Y Rear max 248 Ymax







Z Right-Rear X Left max 310 Xmax
Z Right-Rear X Right min 0 Xmin
Z Right-Rear Y Front max 248 Ymax
Z Right-Rear Y Rear min 0 Ymin

Slicer setup - the print bed's dimensions


Your printer's bed is all that matters to the slicer.  It doesn't know or care about the limits of the printer's motion, except as they may limit the printable area of the bed.  The slicer needs to know two things: the printable size of the bed and the bed's offset from the printer's origin.

When you enter the print bed size in the slicer, you want to enter the printable dimensions which are not necessarily the same as the physical dimensions of the bed.  If the nozzle can't go there, it can't print there, so you don't want to tell the slicer it can.  By entering the printable dimensions and the offset from the printer's origin, the slicer will be able to set prints at the center of the printable area.

In the examples below, we'll use the X and Y travel limits above (310 x 248 mm) with a bed plate that is 200 x 200 mm and is shown with the printer in the home position.


Just 4 of infinite possible variations, example A being the most common.
Example A is the most common situation where the entire bed surface is within the printer's limits of motion.  In this example, you would tell the slicer that the bed size is 200 x 200 mm.

Example B would only be printable over 180 x 175 mm, so those are the dimensions you set in the slicer.

Example C is printable over 165 x 170 mm, so those are the dimensions you set in the slicer.

Example D is printable over 200 x 180 mm, so those are the dimensions you set in the slicer.

If the bed is larger than the printer's limits of motion, you simply tell the slicer the bed dimensions are the same as the printer's limits.

Slicer setup - the print bed's origin


Slicers default to dropping the your print at the center of the print bed.  This is a good thing for several reasons.  Even if you have an unflat, unlevel, unevenly heated bed, the center is where prints are most likely to stick.  If you're printing multiple parts that are going to use a large portion of the printer's bed, having them centered makes it less likely that any of them are going to end up outside the printable area.

The slicer uses XY coordinates on the bed, and the bed's origin is normally the closest point on the bed to the printer's origin.  The bed occupies the first quadrant of the coordinate space, so the printer's origin is in the 3rd quadrant of the bed's coordinate space and the offsets are 0 or negative.  So when you enter the offset in the slicer, the values entered are normally zero or negative.

The slicer's view of the bed's origin.  The origin is left-front, but it could just as well be right-rear.

In example A, above, the printer's origin is at bed coordinates (-50, -30), so that's the offset you enter in the slicer.

Example B shows a situation with no offset, so you enter (0,0).

Example C shows an offset of (-145,-78).

Example D shows an offset in only the X axis, so the offset is (-50,0).

If you are trying to use the center of the bed for the origin, just use the appropriate offsets, and be sure to tell the slicer that the origin is at the center of the bed.  Of course, you want to specify the center of the printable area, which may not be the same as the dimensions of the bed plate.

What about Cura?


Cura is a little different.  It assumes that the home position puts the nozzle on the bed.  If that isn't true in your printer you have to play some tricks with custom gcode when you set up the printer in Cura.

When you set up the custom printer description in Cura, you tell it the size of the printable area of the bed.  In my printer, UMMD, I tell Cura that the bed is 298 x 300 x 695 mm.  The machine homes to max in both X and Y, landing at extruder nozzle at coordinates (300,330,0) as set by the controller's firmware.  The printer's origin is at (2, -27, 0).  I get Cura to place prints on the center of the bed by using custom gcode.  After homing the printer, which takes it to (300, 330, 0), I drop the bed 15 mm, then use a G92 command to set the coordinates at (300,330,15), then send the extruder to (2,27,15), then use the G92 command to reset the printer's coordinate system to (0,0,15) at that point.  Now the print will be placed in the same position that Cura set it when it was sliced.  The first G92 command ensures that the printer coordinates are correct if I run a second print after the first without resetting the controller.

Here's the start gcode for UMMD:
G28    ;Home
G0 Z15 F1200   ; drop bed 15 mm
G92 X300 Y330 Z15  ; set printer's coordinates to (300, 330, 15)
G0 X2 Y27 F12000; go to left-front corner of bed
G92 X0 Y0 Z15 ; set printer's coordinates to (0,0,15)
G92 E0   ; set extruder to 0

Summary

  • The home position is not necessarily the printer's origin.
  • Limit switches can be placed at either end of the X and Y axes.
  • The firmware needs to turn the motors to move the mechanism toward the limit switch in each axis.
  • The firmware needs to know where the origin of the printer is (left-front or right-rear corner).
  • The firmware needs to know the machine's limits of motion in each axis.
  • The slicer needs to know the printable dimensions of the bed, which are not necessarily the physical dimensions of the bed plate.
  • The slicer needs to know the offset of the printer's origin from the bed plate's origin.
  • With proper setup, the slicer will arrange prints around the center of the printable area of the bed plate.