Wednesday, August 2, 2017

UMMD 3D Printer Electronics

Update: The smoothieboard has been replaced by a Duet Ethernet board.  The information below is the original stuff.

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.  Don't do this.  Mount the TCO on the heater using high temperature silicone.


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

Update:  This post explains, among other thing, how to set up a printer with the origin at one corner of the bed.  I have since decided that placing the origin at the center of the bed is a better idea.  I wrote another blog post on how to do that.  I suggest you read through both posts and decide for yourself which way you prefer.



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 its 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 bed'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.

Saturday, July 29, 2017

3 Point Print Bed Leveling vs 4 Point Bending

The word "leveling" applied to printer beds is a misnomer.  When you "level" the print bed you're not trying to level it to the earth the way you level a picture that you hang on the wall.  You're really "tramming" the bed, which means adjusting it so that it is parallel to the printer's XY plane, which is defined by the positions of the X and Y axis guide rails.  In case you missed it, let me state specifically: the bed surface is NOT the printer's XY plane.  When the bed is properly leveled, it is parallel to the printer's XY plane.  The guide rails, which in a properly built machine don't move, are the reference, not the bed plate.

CAD software uses right hand rule coordinate space, and each of the three axes are perpendicular to the other two, a condition called orthogonality.  Your printers axes should all be orthogonal, too, or prints will come out skewed.  Autoleveling serves one purpose only: to get the first layer of the print to stick to the print bed.  It assumes the guide rails/axes are orthogonal and does its job as if they were.  It can't compensate for axes that are not orthogonal.


Right hand rule coordinate space used in CAD software, slicing software, and in your printer's construction and configuration.


There are two common 3D printer configurations.  The most common, exemplified by the Prusa i3 and it's many clones, has a bed that moves in the Y axis.  The other most common type has the bed moving in the Z axis.  Less common types have fixed beds (most common among those are delta machines).

In printers with the bed moving in the Y axis, the X axis is lifted in Z, most commonly by two stepper motors turning screws.  If the screws don't stay synchronized (and there are many ways they can lose sync, including just powering the printer on), the X axis tilts, which means the XY plane tilts, and is no longer perpendicular to the Z axis.  As long as that condition persists, prints will be skewed, even if your printer has autoleveling.  Skewed prints won't fit together properly, gears won't mesh right, threaded parts may not work, etc.  IMHO, using two motors to lift the X axis is just plain bad design.  Maintaining orthogonality of axes is critical in a 3D printer or you can't print accurately.  In this type of printer, autoleveling contributes to the problem because it masks a tilted X axis until the X axis has tilted so far that either the operator notices the tilt or the Z axis mechanism fails.

That brings up another point.  Autoleveling systems all use some sort of bed sensor on the extruder carriage, which usually rides on the X axis.  The bed itself rides on the Y axis guide rails.  Therefore, autoleveling can compensate for nonideal X and Y axis characteristics, such as sagging guide rails which can be a big problem for large format or cheaply made smaller printers.

In printers with the bed moving in the Z axis, the bed is usually lifted in Z by one or more motors driving screws.  If the screws get out of sync, the bed tilts, but the printer's axes remain orthogonal to each other (assuming they were set up properly in the first place).  The first layer may not stick, but if you manage to print, the prints won't be skewed.  Autoleveling can work well in this type of printer, because it is being used to compensate for an unlevel bed, not to compensate for tilted axes and an unlevel bed.

Anyone who paid attention in the first week of high school geometry (do they teach geometry in high school any more?) knows that 2 points define a line and 3 points define a plane.  Quick quiz: what do 4 points define?

Most printers come with 4 "leveling" screws, one at each corner.  When you turn one of those screws clockwise, two things happen.  The corner of the bed plate goes down and the corner of the carriage plate goes up.  Nothing (or much less) happens at the other three corners which are held in position by their own leveling screws and springs, so the bed plate bends along a line between the adjacent corners.

4 point "leveling" is more accurately called 4 point bending.  Whose idea was this?



In an i3 type printer, the carriage plate has bearings or bushings that ride on the Y axis guide rails.  Those bearing/bushing locations and orientations are critical to proper operation of the Y axis.  By turning that "leveling" screw, you just bent that carriage plate that holds those bearings/bushings in alignment.  That can't be good!  The guide rails are pretty rigid, so bending the bed carriage plate isn't going to move the rails much, so the carriage plate and the bed plate are going to move in some rather complex way.  So, turning one leveling screw throws off the level at the other three.  Now imagine what happens when you twist all four screws while you're trying to level the bed.

Of course, the bed plate or the carriage plate are going to flex different amounts, depending on which is more rigid.  The bed plate should be flat, so you really don't want it to bend at all or you'll have trouble getting prints to stick to it.  The  carriage plate holds those critical bearings/bushings, so you really don't want it to bend at all, either.  Yet printers that come with 4 leveling screws almost always have thin, flexible carriage plates and thin, flexible bed plates.  Hmmm.

In printers with the bed moving in the Z axis, the bed support is usually solidly built, so it isn't likely to flex when you tweak a leveling screw.  That means the bed is going to do most of the flexing.  How can a bent bed be made level?  Autoleveling that maps the bed surface can compensate for this.

Printers that have four leveling screws usually have "special" sequences of tweaking the screws to try to get the bed leveled.  They invariably end up bending the bed.  Then people clamp glass to it to try to provide a flatter surface that prints might stick to.  But then it isn't evenly heated, so they do stuff (thermal pads, glue, hairspray, etc.) to try to compensate for that.  What a mess!

Three Point Leveling


With 3 point leveling, there are three screws, reference, pitch adjust, and roll adjust.  The screws are normally arranged so that two of them, reference and pitch adjust, are along the printer's X or Y axes. The roll adjust screw is usually located along an edge of the bed, opposite the other two screws.  The reference screw is used to set the overall height of the bed above the carriage plate and not normally used for bed leveling.  After initial set-up, only the pitch and roll adjust screws are used to level the bed.

Look at the image, below.  Notice that when you turn any screw, the bed is free to pivot at the other two screws, so nothing is forced to bend.  The bearings mounted on the carriage plate are not affected.

3 point bed leveling.  Adjusting any screw causes the bed to pivot on the other two screws.  Nothing is forced to bend. Leveling is accomplished by adjusting the pitch first, then the roll.  


To level a bed on 3 points for the first time, you move the nozzle to the reference adjuster and adjust the screw to grab a piece of paper, then move to the pitch adjuster and adjust the screw to just catch a piece of paper.  Finally, move the nozzle to the roll adjuster and adjust the screw to just catch the paper.  The roll adjustment does not affect the pitch setting because when you adjust the roll, the bed pivots on the reference and pitch screws.  After the first time, if ever, you adjust the level by simply tweaking the pitch and roll adjusters.  Always adjust pitch first, then roll.

Example 1:


In the example below, the bed moves in the Y axis.  The reference screw is at the back of the bed (hard to reach, so best not used for leveling) and the pitch adjust screw is at the front of the bed.  The pitch adjust screw adjusts the bed plate's pitch in the Y axis.  The third screw, the roll adjuster, is located at the left side of the bed and adjusts the bed plate's roll around the Y axis.

Son of MegaMax (SoM) bed plate showing level adjustment screws.


The screws can be placed anywhere that is convenient, but the best place to put them is close to the bearings that support the bed, because that's where the most solid structure is located.  In this machine there are two guide rails for the Y axis, one at about the center of the bed and the other to the left, near the edge of the bed.

The printer shown above is Son of MegaMax.  The bed leveling screws have flat heads that sit in countersunk holes so there's nothing for the extruder nozzle to crash into.  Originally, strong springs pushed the bed plate up against the screw heads.  The leveling is so stable in this machine that once set, it doesn't have to be adjusted unless the machine is taken apart for mods or maintenance, so the springs were replaced with nuts (if you allow something to move, it will!).

The bed plate itself is a piece of 1/4" thick MIC6 cast aluminum tooling plate.  That plate comes milled flat on both sides with plastic film to protect it until you use it.  It is flat enough to print on edge to edge and stays that way when heated.  The brown print surface is kapton tape but that has since been replaced with PEI.

85 wheels printed almost edge to edge on the plate.



Example 2:


We have a Taz 3 printer at the makerspace.  It originally came with a glass bed with 4 point leveling that didn't work well for reasons explained above.  Between the uneven heating of the glass and the leveling problems, we could only print near the center of the bed.  After the bed broke I decided to upgrade to a piece of cast aluminum tooling plate on a 3 screw leveling system.

Taz 3 printer modified undercarriage showing leveling screw blocks (white) and location of bushings for the Y axis guide rails.  4 bushings on the guide rails make about as much sense and 4 leveling screws!  The plate is quite flexible and I wasn't able to put the new leveling screws closer to the bearings, so this one is a little less stable than SoM, but still a huge improvement over the original design.

In this printer the reference and pitch screws are aligned parallel to the X axis.  The roll adjuster is at the back of the bed.  While it has been a great improvement, it is not as stable as the system in SoM because the rest of the printer isn't very solidly built.  As long as we don't move the machine, the bed stays level and doesn't require any releveling, but as soon as we move it, it has to be releveled.  The thermal performance improved drastically.

Taz 3 with the cast tooling plate bed installed.  The roll adjuster is behind the extruder.  We originally put PET tape on the top surface but recently replaced it with a layer of PEI because it works better.


Example 3:


My most recent printer design, Ultra MegaMax Dominator, uses a unique 3 point leveling scheme called a kinematic mount.  The idea was taken from an optical table lens mount. It still uses reference, pitch, and roll adjusters, but since the bed moves in the Z axis, I didn't have to put the leveling screws through the bed plate. The plate rests on top of the screws (held down by springs) which allows the plate to expand freely when heated without pushing laterally against the leveling screws.  More details can be found here.

UMMD's bed leveling scheme (and the rest of the construction) is so stable I can transport the printer laying on its back in my car and take it out and stand it up and start printing without any adjustments.

Here are flatness scans of UMMD's bed that was made by mounting a digital dial gauge on the extruder carriage and then slowly sweeping it over the surface of the bed.  The first is at room temperature, 19C, and the second is at 100C.  This type of scan measures several things at once- variation in thickness of the PEI print surface, the thickness of the adhesive tape that holds the PEI on the bed, the flatness (and level) of the bed plate, the sag in the X axis linear guide, and the sag in the printer's frame, rigidity of the Z axis mechanism, all of which will contribute to the "stickiness" of a print's first layer.


And a print that runs almost from the left edge to the right edge of the bed:

Base of a filament spool holder printed in PLA in 290 um layers using a 0.6mm nozzle.

All three printer examples above have 300 mm x 300mm bed plates.  The first two are 1/4" thick, the third one is 8mm thick.  All are flat enough for edge to edge printing in 200 um layers.  I can't say how big the bed can get and still be rigid enough to stay flat enough to print on with only 3 screws supporting it.  That will depend on the thicknesses of the bed plate and the first print layer.  Larger printers are typically used to print larger objects in thicker layers, and thicker layers are more tolerant of variations in flatness, so I suspect that 3 point leveling can be used to go quite a bit larger than 300 mm square, unless you're trying to print a 50 um first layer.  Guide rail sag is likely to be more of a problem than bed flatness.

In summary, 4 point leveling bends either the bed plate or support plate or both, which can be very hard to print on.  Autoleveling can compensate for that and get the prints to stick.  3 point leveling and solid construction eliminates the need for autoleveling or even releveling.  The only fix for tilted axes is to prevent them from tilting through good design (one motor driving both screws) or check and realign them frequently.  Autoleveling does not and cannot compensate for tilted axes.