Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
MULTI-AXIS HYBRID RAPID PROTOTYPING USING FUSION DEPOSITION MODELING
by
Andrew Mason
Bachelor of Engineering, Ryerson 2004
A thesis
presented to Ryerson University
in partial fulfillment of the
requirements for the degree of
Master of Applied Science
in the Program of
Mechanical Engineering
Toronto, Ontario, Canada, 2006
© Andrew Mason, 2006
Library and Archives Canada
Bibliothèque et Archives Canada
Published Heritage Branch
Direction du Patrimoine de l’édition
395 Wellington Street Ottawa ON K1A 0N4 Canada
395, rue Wellington Ottawa ON K1A 0N4 Canada
Your file Votre référence ISBN: 978-0-494-18120-1 Our file Notre référence ISBN: 978-0-494-18120-1
NOTICE: The author has granted a non-exclusive license allowing Library and Archives Canada to reproduce, publish, archive, preserve, conserve, communicate to the public by telecommunication or on the Internet, loan, distribute and sell theses worldwide, for commercial or non-commercial purposes, in microform, paper, electronic and/or any other formats. .
AVIS: L’auteur a accordé une licence non exclusive permettant à la Bibliothèque et Archives Canada de reproduire, publier, archiver, sauvegarder, conserver, transmettre au public par télécommunication ou par l’Internet, prêter, distribuer et vendre des thèses partout dans le monde, à des fins commerciales ou autres, sur support microforme, papier, électronique et/ou autres formats.
The author retains copyright ownership and moral rights in this thesis. Neither the thesis nor substantial extracts from it may be printed or otherwise reproduced without the author’s permission.
L’auteur conserve la propriété du droit d’auteur et des droits moraux qui protège cette thèse. Ni la thèse ni des extraits substantiels de celle-ci ne doivent être imprimés ou autrement reproduits sans son autorisation.
In compliance with the Canadian Privacy Act some supporting forms may have been removed from this thesis. While these forms may be included in the document page count, their removal does not represent any loss of content from the thesis.
Conformément à la loi canadienne sur la protection de la vie privée, quelques formulaires secondaires ont été enlevés de cette thèse. Bien que ces formulaires aient inclus dans la pagination, il n’y aura aucun contenu manquant.
Author’s Declaration I hereby declare that I am the sole author of this thesis. I authorize Ryerson University to lend this thesis to other institutions or individuals for the purpose of scholarly research. ________________________ I further authorize Ryerson University to reproduce this thesis by photocopying or by other means, in total or in part, at the request of other institutions or individuals for the purpose of scholarly research. ________________________
ii
Abstract
Multi-Axis Hybrid Rapid Prototyping using Fusion Deposition Modeling
Masters of Applied Science of Mechanical Engineering Ryerson University, Toronto, 2006
Andrew Mason
The objective of this study is to improve prototypes produced by fusion deposition
modeling (FDM). FDM, a method of rapid prototyping, produces parts with desirable
engineering properties. A new drive and extrusion method for continuous and indefinite
deposition of ABS is developed. Process improvements include adding a machining station to
tighten tolerances. Research is initiated into 5-axis deposition, which aims to reduce stair-
stepping errors associated with standard 3-axis deposition. Metrology comparisons to current
industry FDM machines are made showing the improvements implemented tighten tolerance
ranges, while using a larger nozzle orifice diameter to reduce build times.
iii
Acknowledgements
I would like to thank Dr. Vincent Chan for his guidance, encouragement and support
throughout the duration of this project. Special thanks also go out to Joseph Amankrah for his
supervision and machining advice, and to Devin Ostrom for his electrical and related CNC
support. The Mechanical Engineering Department and the Office of Graduate Studies have also
been supportive throughout my time at Ryerson. I would also like to thank NSERC for funding
this research.
iv
Table of Contents Author’s Declaration .....................................................................................................................ii
Abstract ....................................................................................................................................... iii
Acknowledgements ......................................................................................................................iv
Table of Contents ..........................................................................................................................v
List of Figures .............................................................................................................................vii
List of Tables................................................................................................................................ix
Nomenclature ................................................................................................................................x
Chapter 1 .......................................................................................................................................1
1.1 Introduction and Industry Needs ...................................................................................1 1.2 Literature Review..........................................................................................................2
1.2.1 Solidifying a Liquid Polymer ................................................................................2 1.2.2 Solidifying a Molten Material ...............................................................................4 1.2.3 Fusing Particles by Laser ......................................................................................6 1.2.4 Joining Particles or Layers with a Binder .............................................................7
1.3 Stair Stepping Error.......................................................................................................8 1.4 Current State of the FDM Industry and Past Research Work .....................................10 1.5 Proposed Research Goals ............................................................................................12
Chapter 2 .....................................................................................................................................14
2.1 Drive System Design...................................................................................................14 2.2 Tangential Drive System.............................................................................................15 2.3 Internally Threaded Pulley and Belt Drive System.....................................................16 2.4 Extrusion Diameter Reduction and Modular Nozzle ..................................................18 2.5 Temperature Control and Insulation............................................................................20 2.6 Drive Notches..............................................................................................................23
Chapter 3 .....................................................................................................................................25
3.1 Geared Drive System...................................................................................................25 3.2 Thread Forces and Stresses .........................................................................................28
Chapter 4 .....................................................................................................................................33
4.1 Extrusion Parameter Calibration .................................................................................33 4.2 3-axis Machine Calibration .........................................................................................34 4.3 Feed Rate Calculations................................................................................................36
Chapter 5 .....................................................................................................................................38
5.1 Prototype part G-code Generation...............................................................................38 5.2 Machining, G-code, and Router Tool Offset Calibration............................................41 5.3 Prototype Parts Produced ............................................................................................44
Chapter 6 .....................................................................................................................................53
6.1 Prototype Metrology ...................................................................................................53 6.2 Topless Pyramid Results with Machining...................................................................55 6.3 Topless Pyramid Results without Machining..............................................................60
v
Chapter 7 .....................................................................................................................................64
7.1 Hexapod Introduction..................................................................................................64 7.2 Electrical Work Done..................................................................................................67 7.3 Mechanical Work Done...............................................................................................75 7.4 5-axis G-Code and MasterCAM Post Processor Modifications..................................77
Chapter 8 .....................................................................................................................................81
8.1 Discussion ...................................................................................................................81 8.2 Results and Conclusions..............................................................................................82 8.3 Future Recommendations............................................................................................84
Appendix A – Technical Drawings .............................................................................................86
Appendix B – Source Code .......................................................................................................104
References .................................................................................................................................133
vi
List of Figures
Figure 1 Stair Stepping Geometry................................................................................................9
Figure 2 Surface Roughness Geometry........................................................................................9
Figure 3 Custom Hexapod..........................................................................................................13
Figure 4 Tangential Drive System..............................................................................................15
Figure 5 Belt Drive.....................................................................................................................17
Figure 6 Modular Nozzle, and Reduction ..................................................................................19
Figure 7 Die Extrusion [13]........................................................................................................20
Figure 8 Heating bands...............................................................................................................21
Figure 9 Ventilation Fume Extractor..........................................................................................22
Figure 10 Cutting Rack Jig.........................................................................................................23
Figure 11 Threaded ABS Geared Drive System ........................................................................26
Figure 12 FDM Extrusion Module..............................................................................................27
Figure 13 FDM Extrusion Module PAS......................................................................................28
Figure 14 Thread Forces [15]......................................................................................................29
Figure 15 Topless Pyramid (15º, 30º, 45º, 60º)...........................................................................38
Figure 16 Pyramid Cross Section Path Deposition Methods .....................................................40
Figure 17 Pyramid Cross Section Path.......................................................................................41
Figure 18 Machining Path ...........................................................................................................44
Figure 19 ABS Burning...............................................................................................................45
Figure 20 3-axis Machine and Computer Setup..........................................................................47
Figure 21 DeskNC Screen Layout...............................................................................................47
Figure 22 Multimeter Temperature Monitoring..........................................................................48
Figure 23 Early Prototype Sample ..............................................................................................49
Figure 24 Deposition ...................................................................................................................50
vii
Figure 25 Multi-layer Deposition................................................................................................50
Figure 26 Underside of Topless Pyramid....................................................................................51
Figure 27 Router Bit Machining .................................................................................................51
Figure 28 Router Bit Machining and Liquefier...........................................................................52
Figure 29 Machined Topless Pyramid Prototype ........................................................................52
Figure 30 Topless Pyramid Touch data.......................................................................................54
Figure 31 45º Error Distances .....................................................................................................55
Figure 32 Initial Hexapod Condition...........................................................................................65
Figure 33 Hexapod Base .............................................................................................................65
Figure 34 Extruder Mounted on Hexapod...................................................................................66
Figure 35 Mounted Extruder Nozzle from Underneath ..............................................................67
Figure 36 Fused Power Supply ...................................................................................................68
Figure 37 Motor Wiring ..............................................................................................................69
Figure 38 Gecko Servo Drive Controller ....................................................................................70
Figure 39 PIC Chip Board...........................................................................................................72
Figure 40 Master PIC Chip Board...............................................................................................73
Figure 41 Communication Board................................................................................................74
Figure 42 Wiring Routed Neatly .................................................................................................75
Figure 43 Motor Clearance Modification....................................................................................76
Figure 44 Replacement Universal Joint ......................................................................................77
Figure 45 MasterCAM 5-axis Tool Path.....................................................................................79
viii
List of Tables Table 1 Commercial FDM Machine Experimental Accuracies ..................................................11
Table 2 3-axis Machine Motion Range .......................................................................................34
Table 3 3-axis Machine DeskNC Settings ..................................................................................35
Table 4 Gear Drive Stepping Motor Controller Settings ............................................................37
Table 5 MATLAB Code Input Parameters .................................................................................41
Table 6 Machining Offset Calibration Trials ..............................................................................43
Table 7 Linear Dimensional Results with Machining.................................................................56
Table 8 Linear Dimensional Results with Machining Summary ................................................56
Table 9 Angular Dimensional Results with Machining ..............................................................57
Table 10 Angular Dimensional Results with Machining Summary............................................58
Table 11 Average Surface Roughness Results with Machining .................................................59
Table 12 Average Surface Roughness Results with Machining Summary.................................59
Table 13 Linear Dimensional Results without Machining..........................................................61
Table 14 Linear Dimensional Results without Machining Summary .........................................61
Table 15 Angular Dimensional Results without Machining .......................................................62
Table 16 Angular Dimensional Results without Machining Summary ......................................62
Table 17 Average Surface Roughness Results without Machining ............................................63
Table 18 Average Surface Roughness Results without Machining Summary............................63
Table 19 Gecko Wiring Inputs and Outputs................................................................................71
Table 20 FDM Machine Experimental Linear Accuracies .........................................................84
ix
Nomenclature 2D Two Dimensional 3D Three Dimensional 3DP Three Dimensional Printing 3DW Three Dimension Welding ABS Acrylonitrile Butadiene Styrene BIS Beam Interference Solidification BMP Ballistic Particle Manufacturing c Circumference CAD Computer Aided Design CAM Computer Aided Manufacturing CNC Computer Numerical Control dm Pitch Diameter dmin Thread Root Diameter dpitch Gear Pitch Diameter EDM Electron Discharge Machining EMF Electro Magnetic Force f Dynamic Coefficient of Friction
Fa Axial Force FDM Fusion Deposition Modeling Ft Tangential Force GPD Gas Phase Deposition hp Horse Power HRP Hybrid Rapid Prototyping I Current LOM Laminated Object Manufacturing LM Layered Manufacturing n Thread Normal Reaction Force N Number of Population Data Points p Thread Pitch P Power PAS Product Architecture Schematic PIC Peripheral Interface Controller Pshaft Power per Shaft q Thread Twisting Force R Liquefier Head Main Internal Diameter r Pitch Radius rs Die Swell Ratio Rq Actual RMS Surface Roughness Ra,t Theoretical Average Surface Roughness RMS Root Mean Square rnozzle Nozzle Orifice Internal Diameter RP Rapid Prototyping RPM Revolutions per Minute SDM Shape Deposition Manufacturing
x
SI Statistically Independent SL Stereolithography SLS Selective Laser Sintering t Layer Thickness T Torque Tshaft Torque per Shaft UNC United National Coarse UNF United National Fine UV Ultra Violet v Threaded Rod Velocity V Voltage VAC Volts Alternating Current VDC Volts Direct Current Ve Extrudate Velocity Vr Liquefier Head Velocity w Vertical Thread Force _
x Population Mean xi Data Point Value Greek Letters αdie Die Half-Angle αn Angle of the Thread Normal Reaction Force λ Thread Lead Angle ƞ Efficiency Ø Diameter π Pie σ Standard Deviation ∑ Sum τ Shear Stress θN Normal Build Angle θT Tangential Build Angle
xi
Chapter 1
1.1 Introduction and Industry Needs The increasing need to accelerate the design process in industry has led to faster
prototypes at less cost. Depending on the complexity of the prototype, weeks or even months are
required to produce each design iteration by conventional manufacturing methods. There are
many conventional methods of material removal such as: milling, lathe work, drilling, grinding,
electron discharge machining (EDM), and sawing. Each conventional manufacturing process has
inherent restrictions on the geometry of the removal due to the tool geometry. This makes some
part features difficult or impossible to produce.
Processes such as injection molding and casting are also widespread in industry. These
create parts by material addition techniques. Although injection molding is a material addition
process at the final stage, the creation of the mold is typically accomplished by material removal
at high costs. The injection molding process is capable of creating complex and intricate parts.
However, high volume production is often necessary to justify the cost of the mold and tooling,
which makes prototype production very costly. The faster production of prototypes permits an
increase in the number of iterations, allowing for fine tuning of the design. This has potential to
save costly changes needed later in the manufacturing process. Out of these needs, rapid
prototyping (RP) was developed. RP is still in its early stages of development, but is growing
rapidly.
RP is classified as a material addition technique, as opposed to the more common
material removal processes. The part(s), or even assembly/assemblies, are produced in one stage,
in one point, line, or layer at a time. This also classifies RP as a layered manufacturing (LM)
technique. The part(s) are produced directly from the computer aided design (CAD) model after
1
being optimally oriented and sliced by RP software either in the CAD package, or internally in
the RP machine. This saves the designer from producing technical drawings to communicate
with a toolmaker or machinist. The elimination of skilled workers at this stage of the
manufacturing process also reduces costs. Once the RP machine begins creating the part, little to
no human interaction is required until the part(s) is (are) complete. This can save up to 30%-50%
of the entire manufacturing process time, plus substantial cost savings [1]. RP machines also
give the designer the option of creating complex shapes, even internal geometries, that may not
have been possible with conventional manufacturing processes [2][3].
1.2 Literature Review
The main RP methods can be divided into four major categories. These categories
include: solidifying a liquid polymer, solidifying a molten material, fusing particles by laser, and
joining particles or layers with a binder. Each of these techniques has its own advantages and
disadvantages. Hybrid rapid prototyping, HRP, is a new technology where machining is
performed after deposition. A search of literature did not yield any systems that perform both
deposition and machining in one station, or use more than 3-axis for deposition.
1.2.1 Solidifying a Liquid Polymer
Stereolithography (SL) was the first commercially available RP technology. SL has been
the widest area of research and development in RP. SL is a technique of prototype production
that utilizes an ultra violet (UV) laser to photo-cure a thermoset acrylate polymer resin. The
polymer resin sits in a vat and is maintained at a temperature just below the polymerization
2
temperature. A movable platform sits within the resin initially just below the surface. The
platform is controllably moved in the vertical direction. This incremental motion controls the
thickness of the layers of the prototype. As the platform is lowered to the depth required, a blade
passes over it, depositing a precision layer of the resin [4].
The laser in SL is used to slightly increase the temperature of the resin at the localized
point where the laser beam contacts the resin surface. The increase in temperature at that
location elevates it above the polymerization temperature of the resin and initiates curing. The
depth into the resin at which the laser penetrates is dictated by the light absorption limit [4].
Typically, the supports are added by the RP software. This allows the laser to create the
custom supports required as it builds the part. Once the prototype is complete, the resin is
approximately 95% cured. The prototype, however, is still very fragile. For this reason, it must
be handled very delicately and placed in a fluorescent oven where it is saturated with UV light
until it is fully cured [2].
After the prototype has completed the curing process, the support material must be
removed manually. Once the supports are removed, there are typically markings left in that
location which may negatively impact the appearance or functionality of the surface. Acceptable
surface finish is attainable in SL by reducing the layer thickness. On each layer, it can take over
a minute to cure a 1.969 in by 1.969 in [50 mm by 50 mm] area with the laser. The resins used in
SL are expensive and are not reusable since they are thermoset polymers. The resins are also
toxic before they are fully cured, which makes handling the fragile prototype more difficult and
dangerous [3].
Beam interference solidification (BIS), which is also still under development, is also
similar to SL, but two interfering lasers are used to cure the resin. There is no elevator platform
required in BIS. The part is created in a vat, below the resin surface. Each laser beam, which
3
operates at different frequencies, passes through the entire vat, and slightly elevates the
temperature of the resin in contact. A single laser beam does not increase the temperature
significantly enough to reach the polymerization temperature. Only when both lasers intersect,
polymerization occurs. The difficulties are that the laser intensity decreases with depth into the
resin, diffraction occurs because of temperature gradients in the resin, and the previously cured
regions cast shadows that affect the laser [3].
1.2.2 Solidifying a Molten Material
The following RP technologies can all be classified as solidifying a molten material. One
of the emerging methods of RP is Fusion Deposition Modeling (FDM). The material used in
FDM is typically a thermoplastic polymer. The material commercially used for FDM is typically
Acrylonitrile Butadiene Styrene (ABS). The ABS polymer is initially in a solid state, such as a
filament wrapped around a large spool, or in the form of a rod. The material is fed into a
liquefier head that is heated by resistance heaters. These heaters are controlled to elevate the
material above its melting temperature. The solid portion of the material is used as a ram to force
the molten material through a fine nozzle at the end of the liquefier head. The head uses
Computer Numerical Control (CNC) in the X and Y directions. The build table is CNC
controlled in the Z direction. From the cross section data from the RP software, the head is
controlled to deposit the first cross section of the prototype on the build table. The head is then
moved away from the table by one layer thickness, and deposits the next layer. The reason that
FDM technology has so much potential is because an FDM machine can be placed in an office
space with the designers that need it. This allows the designers to produce prototypes whenever
4
they need to verify part of a design, or communicate and idea to another designer, management,
or a client.
There are several other methods available to form a prototype from a molten material.
Ballistic particle manufacturing (BMP) is another nozzle based system, where tiny molten
droplets 2-3 µin [50-100 µm] are ejected in either a continuous stream or one droplet at a time.
BMP prototypes can be created from several types of materials such as: aluminium, copper, zinc,
lead, tin, and even thermoplastics. As the particles are very small, densities similar to casting are
possible. BMP has three sub-technologies. The first is called BMP1 where which uses “drop on
demand” to deposit spheres of molten material [2]. After each layer is deposited, a milling head
cuts the layer to the required thickness to maintain accuracy in the Z direction. BMP2 is a
similar technology, but the nozzle is controlled by a 5-axis CNC head, so the droplets are always
deposited perpendicular to the tangent of the surfaces to eliminate stair-stepping. A third BMP
technology is called multi jet modeling (MJM), which uses inkjet technology to deposit the
droplets [3].
Three dimension welding (3DW) is a new technology under development that uses arc
welding to build up prototypes. Issues with excessive heat build-up limit the accuracy of this
technology, but thermocouple and water jet cooling implementation helps control heat build-up.
Work is being done to control the size of the weld pool [5]. Shape deposition manufacturing
(SDM) is another layer based method that uses both material addition, and removal. Initially a
molten material is sprayed to produce the rough cross sections of the prototype. Then, a CNC
milling centre is used to remove unwanted material, and each layer is shot-peened to remove
residual stresses. With this technology, it is possible to create prototypes out of stainless steel
with similar to cast material properties.
5
1.2.3 Fusing Particles by Laser
Another method of producing rapid prototypes is to fuse individual particles together
with a laser. The main method under this category is Selective laser sintering (SLS). SLS
machines work in a similar manner to that of SL machines. The vat in a SLS machine contains a
material in particulate form such as: sand, metals, ceramic powders, wax, nylon, and other non
toxic polymers such as polycarbonates and even ABS [3]. Instead of using a blade as in SL, SLS
machines use a counter rotating roller to spread a precision layer of particles. A low powered
CO2 laser, approximately 20-50 W, then fuses the particles together in the pattern of the
prototypes cross section. For proper fusion, the entire vat is enclosed in an inert environment
such as a Nitrogen atmosphere. Supports are not required in SLS as the un-fused particles act to
support the entire layer built on top of it. When the prototype is complete, the support material
simply falls off the prototype, passed through a sieve, then reused. The vat is maintained just
below the material melting point to reduce excessive thermal distortions from a high powered
laser. The main disadvantages of SLS are thermal distortion and stair-stepping [6]. Thermal
distortion occurs as a result of the fusing process, then cooling. As soon as the prototype is
complete, it is also in a “green state”, similar to SL, because it is just below the melting
temperature. To minimize distortion, the prototype is kept in the SLS machine until it cools,
which can take many hours. A wax part can take 12 h to cool [3]. This makes the build time very
long per prototype as the machine can not be used until the previous prototype is cooled down
and removed. Once the part is sufficiently cooled to transport, it must be post-sintered for full
strength [6].
Gas phase deposition (GPD) produces prototypes by solidifying a material in a gaseous
state. The entire build area is enclosed in an environment of reactive gas. When a laser passes
6
through the gas, the gas decomposes and a solid is left on the surface of the prototype to build it
to the correct form one layer at a time. Materials such as carbon, silicon, carbides, and silicon
nitrides are the materials that can be solidified to form the prototype directly from a gaseous
state. Other methods of GPD include covering the prototype in a powder for each layer that
reacts with the gas with aid of the laser, to solidify into silicon carbide or silicon nitride [3].
1.2.4 Joining Particles or Layers with a Binder
Producing a prototype where no phase change occurs has a great advantage because of
the lack of thermal distortions. Three dimensional printing (3DP) is a derivative of inkjet
printing technology. The inkjets prints a liquid binding agent to bond a powder. The powder
distribution method is identical to that in SLS to deposit the next layer. Also, in a similar fashion
to SLS, the un-bonded powder acts as support material that can be reused once sieved. When the
print-head deposits the binder onto the powder, it bonds several powder grains together into a
sphere due to surface tension forces. As the powders are very fine, capillary action acts to
distribute the binder to neighbouring grains. This can adversely affect accuracy because of the
randomness of the distribution of the binder. For this reason, each layer is sprayed with a mist of
water droplets. Parts created by 3DP can be very brittle and fragile, depending on the powder
and bonding agent used. Some parts may required firing, once the support powder is removed, to
strengthen the bonds by sintering together the powder. Another option is epoxy coating the
prototype to add strength. It is possible, with the correct powder and bonding agent, to produce
flexible rubber prototypes [3].
7
Another bonding RP process is laminated object manufacturing (LOM) which bonds
entire layers together. Typical materials of LOM are paper and cellulose foils, but any foil
material can be used to create prototypes. Typically a laser is used to cut out each cross section,
and then each layer is bonded together with an adhesive. Stair-stepping in LOM is a function of
the paper thickness. Although the layers are as thin as foils, stair-stepping is very prevalent in
the prototypes. Since the paper layers are cut with a laser, a fire hazard exists which requires
appropriate fire extinguishing safety precautions. Internal cavities are difficult to produce on
LOM machines because of the difficulty of removing the supports. Distortion is a major problem
in LOM prototypes because of water absorption. For this reason, the prototypes must be sealed
once they are complete [7].
1.3 Stair Stepping Error The primary issue with layer based RP is stair-stepping, which is governed by layer
thickness and build angles. Figure 1 and Figure 2 illustrate the geometry associated with 3-axis
deposition and 3-axis machining. The resultant of this geometry imposes an inherent average
surface roughness, Ra,t, even under ideal conditions.
8
Figure 1 Stair Stepping Geometry
Figure 2 Surface Roughness Geometry
From the above geometry, the average theoretical roughness is given by:
,2 stana t N
N
tR inθθ
⎛ ⎞= ⎜ ⎟⎝ ⎠
(1)
,sin
2 tanN
a tN
tR θθ
⎛ ⎞= ⎜⎝ ⎠
⎟ (2)
, cos2a t NtR θ⎛ ⎞= ⎜ ⎟
⎝ ⎠ (3)
where t is layer thickness, and θN is the normal build angle.
9
A reduction in nozzle size improves surface finish by reducing layer thickness. As layer
thickness decreases, the build time increases because of the increase in number of layers
required for the prototype. Also with smaller nozzles, there are also an increased number of
passes required to fill in each cross section. As the normal build angle, θN, increases, the surface
roughness decreases giving it an inversely proportional relationship.
1.4 Current State of the FDM Industry and Past Research Work
The leading commercially available FDM machines are Dimension 3D by Stratasys,
Invision by 3D Systems, and Zprinter by Z-Corp. The new FDM machines have two nozzles,
one for the prototype material, and the other for the support material which is usually a water
based wax. The support material nozzle (secondary nozzle) works on the same principle as the
prototype material nozzle (primary nozzle) with respect with material deposition. Both nozzles
are attached to the same liquefier head. This allows the same motion controllers to operate the
deposition of both materials during the build process. The entire operation is completed without
human interaction until the removal of the support material.
Small nozzle diameters, producing low layer thickness, can produce problems with
delamination, since the low volume of extruded material solidifies quickly. If sufficient time
isn’t allowed for proper welding to the previous layer, delaminated of the layer may occur from
the liquefier pulling away the extrudate as it deposits [8]. The ABS is deposited at such a low
rate that it re-solidifies in approximately 0.1 sec. The commercial build area environments are
maintained at an elevated temperature between 50 ºC – 80 ºC which improves layer adhesion. [1,
10
2] For the solid ABS to extrude the molten ABS through the nozzle, the spooled filament is
approximately 0.071 in [1.8 mm] to avoid buckling prior to entering the liquefier head [9].
In the journal “prototype” August 2004 edition [10], Stratasys claim part accuracy ±
0.005 in [± 0.125 mm]. The metrology data within plus/minus one standard deviation will lie
within this tolerance, but will be exceeded by local minimum and maximum errors. The build
volume where the prototypes are built is 8 in x 8 in x 12 in [203 mm x 203 mm x 305 mm].
Depending on the accuracy required, the layer thickness can be toggled between 0.0096 in or
0.0130 in [0.245mm or 0.33mm]. Road widths are approximately 0.0197 in [0.5 mm] wide, with
the smallest features that can be built just under 0.040 in [1 mm]. In September/October 2005,
Time-Compression Technologies presented an article, where the top three FDM machines in
industry were compared by each producing the same four prototypes. The prototypes were each
approximately 2.5 in x 2 in x 1 in. Once complete, the metrology data was captured with a laser
scanner [10]. The overall maximum and minimum tolerances from all four parts are summarized
for each machine in Table 1. The results have been rounded to three decimal places to conform
to results found later in this paper.
Table 1 Commercial FDM Machine Experimental Accuracies
Machine Min. Tol.
(in) Max. Tol.
(in) Dimension -0.030 +0.020 InVision -0.037 +0.045 ZPrinter -0.024 +0.035
In research performed by Madahian [11], a 3-axis paraffin wax RP machine with a milling
station was developed. The goal of the research was to improve surface quality with the addition
of a machining station. Parts produced included: cubic and rectangular prisms, single and multi-
11
layered cylinders, solid and hollow stepped pyramids. All parts featured vertical sides, so linear
dimensions and tolerances determined quality. The reported averaged tolerances for cubical and
cylindrical shapes were +0.018 in and +0.022 in respectively with machining. Without
machining, tolerances were reported as +0.250 in which exemplifies the difficulty of wax
extrusion through a nozzle. The resultant parts produced were fragile, because they are created
from wax. The wax also requires additional heat to keep the previously deposited material at a
sufficient temperature for interlayer cohesion. An adhesive spray was also required so the wax
parts could adhere to the build base during machining.
1.5 Proposed Research Goals
Eliminating stair stepping completely is not possible with 3-axis deposition, which is
currently the industry standard. Current commercially available machines are capable of keeping
tight tolerances, but with such fine nozzles, build times are measured in hours or days, even to
deposit small volumes of material. By including a machining station, larger nozzles can be used,
as the accuracy is achieved through machining. This also helps reduce build times for both 3-
axis and 5-axis deposition.
The proposed research goal is to prove that it is possible to eliminate stair-stepping, by
increasing degrees of freedom to 5-axis deposition. The 5-axis control will be provided by a
custom built hexapod, as depicted in Figure 3. To obtain comparable results, a proposed FDM
module will be built and mounted to a 3-axis table. After building prototypes this module will
then be transferred to the 5-axis hexapod to produce the same parts. The prototypes will be
compared based on linear and angular dimensions compared to the CAD model. The prototypes
12
will also be compared to theoretical surface roughness values obtained from Equation (3). To
align with current FDM machines, ABS will be used as the extrudate.
Figure 3 Custom Hexapod
13
Chapter 2
2.1 Drive System Design
In order to produce much stronger prototypes with natural cohesive properties, ABS has
been selected as the build material. The previous researcher’s [11] method of material extrusion,
a lead screw driven piston, did not lend itself to extruding ABS. The piston extruder only held a
small amount of wax material, thus it constantly had to be disassembled and refilled. A new
design was required that would allow for continuous ABS material supply. To calibrate the
extrusion parameters, the feeding and heating systems were mounted on a stationary platform.
Mounting of the extruder on the 3-axis machine was delayed until the extrusion parameters were
controllable on the stationary platform.
The “Black Box” system design approach, as laid out by Salustri [12], organizes the RP
module’s functional requirements. The system and all subsystems are recursively considered as
black boxes with only inputs and outputs. The scope of the module under consideration is the
stationary extruder that will mount onto the 3-axis and 5-axis machines. In the top level black
box, the module must input ABS material, and output extrudate at a smaller diameter.
Determining the module’s sub-systems involves defining the sub-functions needed to
accomplish the overall functional requirements. In order to create extrudate, the ABS must be
heated, and reduced in diameter (for round input) which requires an imposed extrusion force.
The black box for the heating system has input of a controlled amount of electrical
energy, and an output of heat. The diameter reduction black box consists of an input of stock
ABS, with an output of reduced diameter ABS. Motion of the ABS is the only output of the
extrusion force black box, which requires an input of a force generated by a stepping motor.
14
“Opening up” the extrusion force black box reveals the need for mechanical design to
controllably and reliably exert a force onto the ABS [12]. The following design iterations were
carried out to meet this sub-system’s functional requirements.
2.2 Tangential Drive System
ABS is readily available and inexpensive in rod form. The initial design built utilised a
stepping motor driven lead screw as illustrated in Figure 4. Although the lead screw teeth were
sharp, it failed to dig into the tough ABS enough to create positive traction. As a result, the lead
screw just shaved material off the rod, instead of using the tangential component of force to
drive the rod down into the liquefier.
Figure 4 Tangential Drive System
15
2.3 Internally Threaded Pulley and Belt Drive System
Since the previous method was unsuccessful, positive drive ridges were concluded to be
required on the stock ABS rod, to avoid slippage. To produce equally spaced ridges, the ABS
rod was threaded. As the rod would always be driven down, there was no backlash issue.
Unfortunately, threaded ABS was found not to be commercially available in sufficient lengths. It
would be expensive to have custom made externally, so it was decided to thread rods in house to
save money. Commercial FDM machines use expensive replacement cartridges that contain a 50
in3 spool of ABS filament. The cost of using the threaded rod is approximately 70% cheaper
than the commercial cartridges.
The two smallest, readily available, ABS rods were Ø1/4” and Ø3/8”. Both sizes were
purchased and threaded with UNF (United National Fine) and UNC (United National Coarse)
threads (1/4”-28, 1/4”-20 and 3/8”-24, 3/8”-16 respectively). The UNF threads did not turn out
very well in the ABS. The addendum heights were not consistent for either size. For the UNC
threads, the 3/8”-16 produced the better results. As the stock rod was larger, it was easier to
manually thread with a hand die on the lathe. The 1/4” rod deflected too much while threading,
and therefore only short sections of about 6 in could be threaded at a time. With the 3/8” rod, 20
in sections could easily be produced with visually flawless threads.
In order to drive the threaded rod, an internally threaded pulley was made that would be
driven by a belt. Figure 5 illustrates the internally threaded pulley belt drive configuration used.
The guide used to keep the ABS vertical was made of brass to bear the belt loads. The belt sat on
a Teflon bushing in the guide to allow free slippage while being retained on the pulley. To allow
belt tension adjustability, the motor was allowed to pivot, and then be bolted down to the base.
16
The motor pulley was wider than the drive pulley to allow the belt to find its own natural height
level.
This system worked very well until full extrusion force was required. During extrusion,
occasionally the belt would jump on the drive pulley. This would occur very infrequently, and
was difficult to find the cause. The ABS threads did not have any visual defects, and extrusion
force was theoretically constant. Several belt tensioned were tried, with similar unsuccessful
results.
Figure 5 Belt Drive
17
2.4 Extrusion Diameter Reduction and Modular Nozzle
Although the belt drive did not work sufficiently for producing test pieces, it did allow
for the determining of extrusion temperature parameters, and to find the major issues that would
be associated with extrusion. Initially, extrusion force was high, and the ABS would not exit the
nozzle. In order to reduce the diameter of the threaded ABS during extrusion more gradually, an
internal dual stage reducer was implemented which is illustrated in Figure 6. Figure 6 also shows
the modular nozzle in the steel liquefying head. A brass nozzle is threaded to allow for the easy
changing of nozzle diameter. The nozzle has an internal orifice diameter of 5/64”. The following
equation applies when changing the nozzle diameter. In order to maintain a constant feed rate,
the stepping motor providing the drive for the threaded rod must be altered by the following
volumetric deposition relationship in Equation (4) [9].
2
rV = nozzlee
r VR
⎛ ⎞⎜ ⎟⎝ ⎠
(4)
Where Vr and R are the velocity and the main internal diameter of the liquefier head respectively,
and Ve and rnozzle are the velocity and nozzle orifice radius of the extrudate respectively.
18
Figure 6 Modular Nozzle, and Reduction
Both reduction stages have die half-angles, αdie, of 41°. These were cut with a standard
82° countersink. High (shallow) die angles create turbulence in the material flow, and require a
higher extrusion force. With low (gradual) die angles, the surface area of the reducer increases,
which adds additional friction surface area that also increases the extrusion force. To optimize
die half-angle, a parabolic plot, as seen in Figure 7(b), can be produced for extrusion force
versus die angles for the specific extruder [13]. Since disassembly of the liquefier is very
difficult after ABS is liquefied and extruded, the 41° reducers were used. Testing proved that
these modifications helped make extrusion possible, and very consistent. In the previous wax
extruder, leaking, and excessive back flow of molten wax compromised controlled extrusion
rates. With the current extruder design, there are no leaks or back flow. All molten material exits
from the nozzle only.
19
Figure 7 Die Extrusion [13]
2.5 Temperature Control and Insulation
To provide heat to the liquefier head, electrical resistance band heaters are used. Figure 8
illustrates the location of the resistance band heater on the liquefier head just above the nozzle.
The band heaters are wrapped in a silicon insulation fabric to keep the heat transferring into the
liquefier head, and not into the room.
20
Figure 8 Heating bands
During temperature testing, an enclosure was built to house the stationary extruder. The
enclosure was fitted with a duct that was attached to an extraction fan. Fume extraction was
crucial as ABS smokes when it begins to burn. Figure 9 illustrates the setup used.
21
Figure 9 Ventilation Fume Extractor
An open loop manually adjustable temperature controller powers these heaters. The
temperature probe is located in the liquefier head by the nozzle. A digital multi-meter reads the
probe’s temperature of the ABS in Celsius, as it is just about to exit the nozzle. The dial position
on the temperature controller is manually adjusted to maintain 280ºC. ABS begins to soften at
about 100 ºC, starts to flow around 200 ºC, and begins to decompose at 250ºC [14]. Above
270ºC, the ABS extrudes from the nozzle consistently, but begins to burn above 290ºC. Beige,
or naturally colored, ABS is used to visually test for burning. In order to reach these
temperatures, 500W of resistance heaters are required. A 300W band is wrapped around two
inner 100W heaters. With this band heater setup, the analog temperature controller is set to
around setting level 7 of 10. The controller has continuous adjustment, so fine-tuning is possible.
The high temperatures during testing proved to warm up the ABS near the drive location.
The stock material guide that was previously made of brass was replaced with one made of
22
Teflon. This was done to insulate heat from transferring to the drive gears through the guide that
could soften the ABS threads. For this same reason, heat sink fins were machined into the upper
portion of the steel liquefier to promote heat transfer prior to the drive location.
2.6 Drive Notches
The Tangential Drive and Belt Drive systems did not sufficiently provide the required
function of extrusion. One method with promise would be to use a drive gear system that would
engage into notches milled on the ABS. Figure 10 shows the jig made to hold the ABS during
CNC machining of the notches.
Figure 10 Cutting Rack Jig
The jig held four rods, and had a hole/pin system to flip the rods over to ensure 180° of
rotation in the jig. A 60° chamfer end mill was used to cut the ledges. This production method
did not work out well as it took too much time to machine the rods because of the number of
passes required. For each side of the rod, 132 passes were required at a pitch of 0.091 in to
23
match the drive gear teeth. When including the time for set-up, flipping the rods over, and
afterwards removing the ends of the rods with the location holes, it took over an hour to make
the first four 12 in rods. The resulting machining cuts were also of fairly poor quality and
inconsistent. As a result of the amount of work that would be required to make a sufficient
amount of racked rods for machine calibration and testing, this method was abandoned.
24
Chapter 3
3.1 Geared Drive System
Another way to put equally spaced ledges into the rods was to go back to using
conventionally threaded rods. For the thread to match the positive drive gears, new gears with a
smaller pitch and diameter to match the standard 3/8”-16 thread were purchased. These were
spur gears with a Diametral Pitch of 48 teeth per inch, with 44 teeth. This diametral pitch
converts to a linear tangential pitch of 15.95 teeth per inch at the teeth tips, which is only an
error of -0.3%. The number of teeth provides an appropriate Pitch Diameter that allows for
adjustability of engagement to the ABS. The UNC thread was required, opposed to selecting
UNF, to allow for large and strong threads to avoid stripping by the steel drive gears.
Two drive gears engage into the thread of 3/8”-16 UNC ABS rods. Initially only one of
the drive gears was driven, and the other was a follower only. With this arrangement, the single
drive gear would strip the teeth off the ABS. This was because the drive gear would push the
ABS away while driving it down, reducing the amount of engagement. A second set of gears
was added, to distribute the drive to both drive gears, which completely eliminated the stripping
issue since the lateral force components are cancelled.
Gears with a Diametral Pitch of 20 teeth per inch, with 24 teeth were selected. The
secondary drive gears’ teeth are larger than the drive gears, so at any amount of engagement of
the drive gears on the threaded ABS will still provide drive to both drive gears. All gears are on
shafts that are supported by ball bearings for smooth rotation and load bearing capacity. The
exception is where the stepping motor output shaft is connected. Figure 11 illustrates the final
extrusion geared drive system.
25
Figure 11 Threaded ABS Geared Drive System
The threaded ABS is fed through from the top in the machine that has no roof. This
allows for long rods of 20 in to be used. When the end of the rod gets near the drive gears, a new
rod is inserted into the guide. The new rod automatically gets fed into the drive gears via gravity
feed. The teeth automatically engage which allows for indefinite uninterrupted deposition.
Figure 12 illustrates the entire extrusion module including the liquefier head, band
heaters, gear drive stepping motor, drive gears, ABS threaded rod, and the adjustable drive gear
shafts support block. The distance between the shafts is adjustable to obtain the required
26
engagement between the drive gears and the ABS threaded rod. Teflon spacers were place under
the bearing support structure to insulate the geared drive system from the liquefier. This reduced
the temperatures in the surrounding structure. Figure 12 also includes the L-bracket used to
attach the module to the 3-axis CNC machine. Figure 13 illustrates the module’s overall Product
Architecture Schematic (PAS) for mass, energy, and information exchange in the system [12].
Figure 12 FDM Extrusion Module
27
Figure 13 FDM Extrusion Module PAS
3.2 Thread Forces and Stresses
Due to the helical thread geometry, several forces are produced as resultants from the
force applied from the drive gears. A resultant torque is produced from the lead angle of the
threads that is imposed on the stock ABS. The torque is produced from the tangential angle
component of the extrusion force, at one radius distance on either side (3/16”) of the threaded
ABS rod. The following figure from Juvinall [15] shows a free body diagram of an element on a
thread as an external vertical load, w, is applied on the thread.
28
Figure 14 Thread Forces [15]
From Figure 14, Juvinall [15] presents the sums of the tangential and axial forces as shown
in the following two equations respectively. For the purposes of the following analysis, the Free
Body Diagram (FBD) is taken in as static, constant velocity state in the maximum load condition.
Fatigue is not a factor as each tooth only ever sees one load cycle on its way into the liquefier.
The horizontal component of forces in Section A-A of Figure 14 cancel each other as the same
forces are generated on either side of the threaded ABS, by each drive gear. There is no imposed
load on the inside of the Teflon guide. Thus the only net external forces are produced, creating a
torque about the centreline of the threaded ABS rod. From Juvinal [15],
(5) t nF = 0: q - n( cos + cos sin ) = 0 f λ α λ∑
(6) a nF = 0: w - n( sin + cos cos ) = 0 f λ α λ∑
where q is the twisting force imposed on the threads, and n is the normal reaction force. The
angle of the normal force, αn, for a standard thread is 30°, which is half of the thread angle
which is 60°. The dynamic coefficient of friction between ABS and mild steel, f, is 0.35, and the
lead angle, λ, is calculated from Equation (7) [15],
m
p = arctan * d
λπ⎛⎜⎝ ⎠
⎞⎟ (7)
29
Where dm is the Pitch Diameter of the 3/8”-16 ABS threaded rod, which is equal to 0.3367 in.
The pitch of the threads, p, is 0.0625 in, which is the inverse of 16 threads per inch. Equation (7)
results in a lead angle of 3.38°.
From equations (5) and (6) [15],
n
n
cos + cos sin = w cos cos sinfq
fλ α λ
α λ λ⎛ ⎞⎜ −⎝ ⎠
⎟ (8)
In order to find the vertical load on the ABS threads by the drive gears, the following
stepping motor specification data are used. Based on a programmed table speed of 6 in/min, the
threaded ABS rod travels at a velocity, v, of 0.3740 in/min. These values come from calibrations
in Chapter 4. The circumference of the drive gears, C, is 2.880 in. Therefore the drive shafts
each spin at,
vRPMC
= (9)
which equals 0.1299 rpm. The 6 V stepping motor draws 11.6 mA of current from controller.
This value was determined experimentally. The controller unit draws 1.9 mA to operate the
control board and fan, and there is a total of 13.5 mA drawn during motor operation. The
difference between these values is the amount of current drawn by the motor. Assuming a
stepping motor transmission efficiency, ƞ, of 80%, the power, P, and torque, T, produced by the
stepping motor is governed by the equation,
( ) -5T * RPMP = = * I * V = 0.8 * 0.0116 amps * 6 V = 0.05568 W = 7.46x10 hp
5252η (10)
This power is divided equally to each drive gear through the secondary gear set. Assuming the
secondary drive gears also have 80% efficiency, the power going to each drive gear is,
30
( )
shaft
*PP =
2η
(11)
which equals 2.99x10-5 hp. Using a rearrangement of Equation 10 to solve for the torque
produced at each shaft, Tshaft, is calculated as,
( ) ( )shaft
shaft
5252*P 5252*0.00514 hpT = = = 1.207441 ft.lb = 14.48929 in.lb
RPM 0.1299 rpm (12)
To find the force exerted on the threaded ABS rod by each drive gear, w, the Pitch Radius, r, of
the drive gear is used as the moment arm, and is found from the Gear Pitch Diameter, dpitch, of a
3/8”-16 thread which is 0.9170 in.
pitchd 0.9170 inr = = = 0.4585 in 2 2
(13)
Thus the force, w, produced at each drive gear tooth is,
shaftT 14.48929 in.lbw = = = 31.602 lb r 0.4585 in
(14)
Plugging this vertical load into Equation (8), the resulting value for q is 14.996 lb. Since there
are two drive gears, each applying a counter clockwise tangential torque as looking from above,
the total torque imposed on the treaded rod is,
mdT = 2q2
⎛⎜⎝ ⎠
⎞⎟ (15)
Using Equation (15), the total resultant twisting torque on the ABS threaded rod is 5.049 in.lb.
This torque acts in a counter clockwise direction about the centreline of the threaded rod, when
looking from above.
This applied torque imposes shear stress, τ, on the threaded ABS rod. Juvinall [15]
presents an equation to calculate this shear stress for external threads as,
31
( )( )( )3
min
16T =
dτ
π (16)
where dmin is the root diameter of the threaded ABS rod, which is 0.2983 in for a 3/8”-16 UNC
thread. From Equation (16), the shear stress in the threaded ABS rod is 0.969 ksi. To avoid the
ABS teeth striping, this stress must be less than the Flexural Modulus of the material. For ABS,
the Flexural Modulus is given as a range, between 5-15 ksi [16]. As the stress in the ABS is less
than five times less than the minimum of this range, the teeth are not in danger of stripping.
The criterion that dictates whether the threaded ABS rod will spin under the applied
vertical loads is the overhauling and self-locking criteria. If a thread is self-locking, this means
that the friction is high enough, between the load and the load bearing surface, that a linear force
is insufficient to produce rotation without an added torque. An overhauling thread will create
rotation from the linear force. Juvinall [15] also presents a self-locking friction criteria
relationship as follows.
n
m
p * cos * d
f απ
⎛ ⎞≥ ⎜
⎝ ⎠⎟ (17)
For the current parameters, this criteria produces, 0.5 ≥ 0.051 which is satisfies the self-locking
criteria. This means that the threaded ABS rod will not spin under the applied linear vertical load.
This was observed and confirmed during extrusion testing. Although there were no sensors
monitoring forces, it was apparent that the only major forces being applied by the drive gears
were driving the threaded ABS rod down into the liquefier.
32
Chapter 4
4.1 Extrusion Parameter Calibration
As was mentioned previously, prior to mounting the extruder on the 3-axis machine,
extrusion parameters were controllable. A custom stepping motor driver control box was
previously built by the author’s thesis advisor of this thesis, Dr. Vincent Chan, to work with the
high torque stepping motor used in the current extruder design. The stepping motor and the
controller were both used in Madahian’s [11] wax extruder. The controller uses a loop delay
between pulses to control the time between pulses sent to the motor. There are six settings on the
controller to control speed. Each setting is associated with the number of loops in the software
between pulses.
The number of loops between pulses for settings one to six are: 200, 150, 100, 50, 24, and
3 respectively. Setting 6 is the fastest stepping motor speed and is used only rapidly feed the
ABS in and out of the liquefier when it is empty. Setting 6 is otherwise too fast for extrusion.
While the extrusion system was on the stationary platform, settings 1-5 were used to extrude
ABS to test extrusion parameters. As gravity is the only force acting on the ABS after extrusion,
the diameter of the extrudate is only dependent on the nozzle orifice diameter and the re-
expansion of the ABS after leaving the nozzle. For settings 1-5, approximately 8 in of extrudate
were produced at 280ºC ± 5°C at the nozzle tip. In all cases, the extrudate was very consistently
extruded.
Many measurements were randomly taken from all samples with vernier callipers that
have a resolution of 0.0005 in. For all 5 samples, the extrudate was measured as 0.080 in ±
0.0005 in. Compared to the theoretical nozzle orifice diameter, the die swell ratio, rs, is 1.024.
33
The value of 0.080 in was taken as the nominal extrudate diameter for the purposes of road
width and layer thickness calculations. Because of the consistent results over a range of
extrusion speeds, statistical analysis was not performed to validate this average.
4.2 3-axis Machine Calibration
The next step was mounting the extruder onto the 3-axis machine. This was done with a
simple steel bracket that bolted to the machine, and to the extruder base. With the extruder
mounted the usable range of motion for each machine axis is summarized in Table 2.
Table 2 3-axis Machine Motion Range Axis Range (in)
X 5
Y 3.5
Z 2.5
Before determining the appropriate feed rate that corresponds to the extrudate velocity, the
axis of the machine must first be calibrated. The 3-axis CNC machine is controlled by a
computer, running DeskNC, which reads G-code data. DeskNC then sends the path to the 3-axis
machines controller board that drives the stepping motors. DeskNC requires calibration for the
3-axis machine to ensure the correct number of pulses be sent to match the physical motion of
each axis on the machine. Madahian [11] previously calibrated DeskNC for his 3-axis wax
extruder. To confirm that this calibration was performed correctly, vernier calipers were used to
confirm the actual distances traversed by the machine in all 3-axis.
34
G-code was manually written to individually move each axis 2 in to measure the actual
distances traveled for each axis. The reason 2 in was used, was because that is approximately the
range of motion of the z-axis that will be used during prototype production. The calibration was
confirmed with the vernier calipers to have been done correctly. DeskNC settings use values
with the units of pulses per inch to control the machine. Table 3 includes all of the parameters
required in DeskNC using the Step/Direction Driver setting.
Table 3 3-axis Machine DeskNC Settings Default Output Bits Axis Steps Per Unit
(Steps/in)
Max Speed
(Steps/Sec)
Direction
Signals Step Direction
X 402 101 Neg 0 3
Y 805 101 Pos 1 4
Z 4015 1000 Pos 2 5
The Max Speed settings are intended to keep DeskNC from the exceeding the maximum
speed of the stepping motor encoders. If signals are sent faster than the motors can handle, signal
pulses sent by DeskNC will be missed, and registration will be lost. For this machine, this
maximum is roughly 8 in/min for the X and Y axis according to Technical Officer Devin Ostrom
at Ryerson University, whom has experience with the machine. The X and Y axis motors are
limited to 7.5 in/min by the Y axis with these default values. In the g-code the Z-axis limit is
approximately 2 in/min, so the limit is set to 1000 steps/sec, which is just over 1.5 in/min. The
X-axis Max Speed limit could be set to 51 steps/sec to also limit its motion but is not necessary
as both X and Y axis use the same feed rate. In all G-code, feed rates are limited to 7.5 in/min
for the X and Y axis, and 1.5 in/min for the Z-axis, so the internal DeskNC limits are never
35
exceeded. The Direction Signals are set so that positive X, Y, and Z are set positive right,
forward, and up respectively.
The reason that the Z-axis is not as quick as the other axis is because it uses a different
stepping motor that requires many more pulses per revolution as indicated in Table 3. The
inherent design of the Z-axis table is poor. It uses a single threaded rod to lift/lower the table,
with only two linear bearings on either side of the screw. The rest of the table is cantilevered on
these linear bearings. The threads would occasionally stick under the cantilever bending moment
which would cause the Z-axis table to momentarily pause during traversal, then jump as the
threads unstuck. The project timeline did not allow for a total re-design of the Z-axis table, so a
quick fix solution was implemented. An additional linear guide was mounted on the far end of
the Z-axis table to eliminate the cantilever load placed on the drive screw. This helped alleviate
thread sticking during vertical translation of the Z-axis table.
4.3 Feed Rate Calculations
In order to controllably deposit material onto the build table, the extrudate velocity must
match the traversing speed of the machine in the X and Y directions. The methodology behind
this calibration was to independently calibrate for 2 settings on the stepping motor controller box
with multiples as delays. For example, settings 3 and 4 on the controller correspond to 100 and
50 delay loops per pulse respectively. This way, if the two feed rates found differ by a factor of 2,
the calibration is successful. The method used to determine whether the feed rate matched the
extrudate velocity was by measuring the extrudate after deposition. If the height of the extrudate
was lower than 0.080 in, then the feed rate was too high. Conversely, if the extrudate height was
36
above 0.080 in, the feed rate was too low. For settings 3 and 4 respectively, feed rates of 3
in/min and 6 in/min produced road widths 0.080 in high.
An Excel spread sheet was used to track the theoretical speed relationship at each
controller setting via the volume relationship between the threaded rod and the extrudate cross
sections. Table 4 lists the number of loops per pulse, the linear speed of the threaded rod, and the
corresponding feed rate for each controller speed setting. For all prototypes produced in the
results section of this report, speed setting 4 on the stepping motor controller was used
corresponding to a feed rate of 6 in/min.
Table 4 Gear Drive Stepping Motor Controller Settings Slowest Fastest 1 2 3 4 5 6
Loops per Pulse 200 150 100 50 24 3 Linear Rod Speed 0.0935 0.1247 0.1870 0.3740 0.7792 6.2333 in/min
Programmed X/Y Feed Rate = 1.5 2.0 3.0 6.0 12.5 100.0 in/min
37
Chapter 5
5.1 Prototype part G-code Generation
One of the shapes used to test the accuracy and surface quality of the extruder and 3-axis
machine, is the topless pyramid [17]. A custom configuration of this shape is illustrated in
Figure 15. The topless pyramid has sides with various angles to test the machine’s stair stepping
error as compared to the theoretical error. For this study, the topless pyramid has side angles of
15º, 30º, 45º, and 60º measured from vertical. The hexapod will have approximately 45º of
motion in both pitch and roll. The 15º and 30º surfaces will allow for surface roughness analysis
in the future when the nozzle is not perpendicular to the part surface. The base dimensions in
this study are set to 1.44 in by 2 in, which gives a square top surface. A rectangular base of one
deposition layer thickness is also included to better capture overall linear dimensions of the
prototypes produced.
Figure 15 Topless Pyramid (15º, 30º, 45º, 60º)
Custom software was developed in MATLAB that generates the G-code for this shape.
The G-code output by the program is formatted to be compatible with DeskNC. Currently, the
software can not generate G-code from any .STL or STEP files, which are the standard RP file
38
formats [18]. The MATLAB program is capable of generating G-code for any size topless
pyramid, with sides at any inclination angle. Instructions for the specific format of the input file
are documented at the beginning of the program.
Three strategies were considered for depositing each layer of the topless pyramids as
illustrated in Figure 16. Method 1) is called zigzag deposition, and ensures that the internal
portion of the cross section is fully deposited. The disadvantages are the poor surface finishes on
both turn-around edges and the inability to hold tight linear tolerances in the traversing direction.
Method 2) is called perimeter zigzag, and can hold tighter external linear tolerances than zigzag
depositing since the perimeter is traversed first. The disadvantage is that variable deposition
speed is required to ensure the inner area is fully deposited. For the final pass, a resultant road
width is needed that is larger than the standard road width. Method 3), called spiral deposition,
first traverses the perimeter and then spirals inward. This results in a stronger structure near the
external edges of each cross section, but the disadvantage is that the nozzle ends up in the centre
of the part, which requires deposition to stop before retracting to deposit the next layer.
39
Figure 16 Pyramid Cross Section Path Deposition Methods
Since the current extruder does not have the ability to instantly stop deposition, the
Perimeter Zigzag deposition method is adopted in the code to produce the deposition paths. The
path illustrated in Figure 17 can be used to deposit each cross-section of any topless pyramid.
The outer perimeter deposition helps hold overall dimensional tolerances, and produces
smoother outer surfaces. The internal zigzag pattern ensures complete, but possibly over,
internal filling on the final pass of each cross section.
40
Figure 17 Pyramid Cross Section Path
For the G-code generation, the physical parameters in Table 5, are used in the code to
calculate the required deposition paths for each layer of the prototype. The full code can be
found in Appendix B. To ensure that the nozzle does not contact the previously deposited layer,
a “Nozzle Offset” is required. The offset used for all parts is 1.25 times the layer thickness.
Table 5 MATLAB Code Input Parameters Road Width 0.080 in
Layer Thickness 0.080 in Feed Rate 6.0 in/min
Nozzle Offset 1.25 times layer thickness
5.2 Machining, G-code, and Router Tool Offset Calibration
The custom MATLAB program also generates the G-code for the machining path. The
purpose of the machining is to remove excess deposited material, and to reduce the ABS to the
final shape in the CAD model. This allows for a larger nozzle diameter because excess material
can be deposited, and then machined off later. For the case when machining will be used for
making the prototype, a slightly different deposition strategy is used. An additional half road
41
width is added to each side of the part. Instead of depositing around the perimeter a half road
width inside the desired part edge, the centre line of the road width is deposited along the
theoretical perimeter of the part. The router then machines away the excess material to reduce
the prototype to the desired dimensions. The router bit is a two edged straight cutter, with a
cutting diameter of 0.250 in.
The relative position of the router bit with respect to the deposition nozzle is fixed.
Calibration was required to determine the offsets in each axis. The Z-axis offset was initially
measured directly with vernier callipers between the tip of the router and the build table base.
This measurement was 0.727 in. In order to get initial offset values for the X and Y axis the
nozzle was lowered to touch a random point on the build table. This location was then manually
marked on the table. DeskNC was then used to manually move the router bit over and down so
that it was visually over the mark. To move the router bit down to the table, the nozzle must be
moved over at least 2.5 in to avoid hitting the extruder resistance heaters and insulation on the
build table.
From the display screen on DeskNC, the X-axis offset was 3.316 in, and the Y-axis offset
was initially taken as zero. To confirm the accuracy of these offsets, several calibration cubes
were deposited and machined. A modified version of the custom G-code software was made to
generate the G-code for these cubes. The theoretical dimensions of the cubes were 1 in by 1in by
0.160 in, which is equal to two times the layer thickness. Table 6 contains the calibration trials
including the offsets for each axis, the G-code file names, and the bilateral part tolerances used
to calculate the required adjustments to the next iteration. Adjustments to the offsets were made
by the midpoint of the bilateral part tolerance. The iteration termination criterion, was met when
each axis was repeatable and symmetric for two iterations, with all dimensions within ±0.005 in.
42
Table 6 Machining Offset Calibration Trials
Iteration Number
G-code File Name Axis Offset Used
(in)
Part Bilateral Tolerance
(in) Z -0.727 +0.045”
+0.029” X -3.316 ±0.005”
1 Initial Offsets
Y 0 n/a Router missed the part in the +Y axis by approximately 1/16 in.
Z Z-axis table sticking X -3.318 ±0.004” 2 "Sept7 Machining
Testing.txt" Y -0.125 -0.010” -0.030”
Z Z-axis table sticking X -3.318 ±0.002” 3 updated "Sept7
Machining Testing.txt" Y -0.105 -0.020”
-0.034”
Table sticking affecting Y and Z axis. Z-axis table linear guide added to prevent sticking. Calibration Continued from previous values.
Z -0.764 ±0.005” X -3.318 ±0.002” 4 updated "Sept7
Machining Testing.txt" Y -0.078 +0.005”
-0.001” Z -0.764 ±0.005” X -3.318 ±0.002” 5 updated "Sept15
Machining Testing.txt" Y -0.082 ±0.002”
Z -0.764 ±0.002” X -3.318 ±0.001” 6 updated "Sept15
Machining Testing.txt" Y -0.082 ±0.004”
Z -0.764 Calibrated X -3.318 Calibrated 7 Converged.
Actual Offsets used in code. Y -0.082 Calibrated
*Note: these values should not be considered as overall machine tolerances, as the parts made were fairly simple. If the machine runs for longer, it is possible that error accumulations will cause more complicated prototypes to have errors that exceed these tolerances.
43
Figure 18 depicts the generated path for machining the perimeter of a topless pyramid.
Although not shown in Figure 18, machining also occurs after each layer is deposited. This helps
hold the Z-axis tolerances, as each layer is machined flat at 0.080 in thick. This removes any
imperfections and reduces error stack-up between layers. After all layers are deposited, the top is
machined to the correct height then the router bit mills around the perimeter in vertical steps of
0.010 in [19]. Time did not permit a sensitivity analysis of the machining pitch. Machining starts
off by machining the part down to the correct height, then the perimeters are machined one level
at a time. The router spins clockwise, and travels counter clockwise around the part, using
conventional milling. Conventional milling helps eject the chips away from the part to avoid re-
welding back onto the part. All code associated with machining can also be found in Appendix B.
Figure 18 Machining Path
5.3 Prototype Parts Produced
The following is a chronology of deposition trials, and prototype production. Initially, the
ABS would not adhere to the aluminum Z-axis table, so an ABS sheet was used for a deposition
44
base because of the excellent cohesive properties of ABS. During initial prototype production, it
was difficult to manually control the extrudate temperature, while making sure that all systems
were working properly. Unfortunately, the project budget did not allow for a closed loop
temperature controller, so initially the parts ended up very crude. The temperature would ramp
up and exceed 290 °C because the temperature controller does not instantly reduce the
temperature at the nozzle. As a result, the ABS would burn and discolor. The discoloration can
be seen as blackening of the naturally colored ABS in Figure 19. Originally black ABS was used,
but it made it difficult to see when it was burning. Beige ABS was also readily available, and
provided additional visual feedback of burning.
Figure 19 ABS Burning
After building several sample depositions, the temperature became easier to control, and
the prototypes no longer contained discoloration from burning. Although the temperature
constantly fluctuates, it was possible to maintain the temperature to 280 °C ± 5 °C by
anticipating when, and how much, to modulate the temperature controller.
45
While building initial calibration parts, the molten extrudate ABS cohered to the build
table base ABS very well. After deposition, these parts were very difficult to remove from the
base once they were complete. To over come this, several attempts were made to modify the
deposition base. The final solution was to make a base with many hinge points that could be
used to break away from the part. The ABS sheet was cut into strips that were then held together
with Duct Tape on the underside. This allowed the strips to be held tight together during
deposition, then the Duct Tape would act as a hinges to break the base away from the part. The
same breakaway base was reused for all depositions and prototypes built subsequently.
Many practice prototypes were made to ensure machine consistency before collecting
metrology data. Topless Pyramids were made to test the machine, and work out bugs in the
custom program that generates the G-code. Figures 20 and 21 respectively show the 3-axis
machine and computer setup, and the screen layout of DeskNC. DeskNC displayed a graphic of
the machine path, the current lines of G-code, the current X, Y, and Z coordinates, and the
current machining parameters. Figure 22 shows the 3-axis machine in operation, with the Multi-
meter outputting the temperature at the deposition nozzle in degrees Celsius.
46
Figure 20 3-axis Machine and Computer Setup
Figure 21 DeskNC Screen Layout
47
Figure 22 Multimeter Temperature Monitoring
Figure 23 is a picture of one of the first multi-layered prototypes created. Several
prototypes like this one were created during initial testing. Many of these contained flaws that
were later attributed to problems in the custom G-code generation software. They are indicative
of some of the initial difficulties producing consistent prototypes on a custom built machine with
a limited budget. These parts were not included in the following dimensional and surface
roughness analysis assessing the machines quality assessment.
Figures 24 and 25 show the extruder consistently depositing layers of a Topless Pyramid
prototype. Figure 26 shows the bottom side of a typical Topless Pyramid after it has been
removed from the build table base. The road widths and Perimeter Zigzag deposition strategy are
48
clearly visible. Figures 27 and 28 both show the router machining the perimeter of prototypes.
As can be seen, the chips produced do not re-weld to the part. They only rest on the part, and fall
off when blown or brushed off. Figure 29 shows one of the completed machined Topless
Pyramid prototypes used for geometric analysis in the following chapter.
Figure 23 Early Prototype Sample
49
Figure 24 Deposition
Figure 25 Multi-layer Deposition
50
Figure 26 Underside of Topless Pyramid
Figure 27 Router Bit Machining
51
Figure 28 Router Bit Machining and Liquefier
Figure 29 Machined Topless Pyramid Prototype
52
Chapter 6
6.1 Prototype Metrology
To determine accuracy and surface quality, twelve consecutive topless pyramid
prototypes were produced. Six prototypes were made with, and six without, machining. In order
to analyze the accuracy of the prototypes produced with respect to the theoretical CAD model,
several metrology methods were used. Surface roughness average, linear, and also angular
measurements were recorded for each prototype produced. To obtain the linear dimensions from
the prototype, vernier callipers were used. The base of the pyramid is used to assess the X and Y
dimensions of the part. The Z dimensions were also measured directly with a vernier. In order to
determine the surface roughness, and actual angle of each face, the parts were scanned with a
touch probe scanner. A Roland PIX-30 3D scanner was used to capture the surface data of each
prototype. The scanner is capable of achieving accuracy of +/- 0.0004 in. The probe used is a
high aspect ratio needle mounted on a piezo-electric sensor [11].
For all prototypes made, the scanning pitch in the X and Y axis was set to 0.008 in. Z-axis
measurements are taken every X-Y location as defined by the scanning pitch. The pitch is
adjustable by increments of 0.002 in. Scans for each part took approximately 15 hours when the
scanning area was manually set as small as possible based on approximate dimensions and
location of the part on the scanning table. For each part, approximately 45,000 data points were
collected by the scanner. Having the scanner perform an automatic preview to locate the part
increases the scan time by approximately 2-3 hours. When the pitch was reduced to 0.006 in,
part scans approached 2 days each, which was not practical when scanning twelve parts.
Increasing the pitch above 0.008 in would save time, but imperfections in each machining step
would be missed.
53
Figure 30 shows the 3D cloud data, captured by the touch probe scanner, of a machined
topless pyramid produced on the 3-axis machine. A flaw with this style of touch probe scanner is
that it is unable to capture data points on vertical surfaces. As linear dimensions were measured
with vernier callipers, the vertical side data was not required from the parts.
Figure 30 Topless Pyramid Touch data
Imageware Surfacer software was used to isolate each surface from the data cloud. A
plane surface was fit to each side that passed through an average of the data points. Surfacer then
output the distance from each data point to the average plane. These distances were then used to
calculate the root mean square, RMS, actual surface roughness values, Rq, for each of the five
surfaces. The five surfaces include the four angled surfaces, and the top surface, which is
denoted as the 90º surface. Surfacer was also used to measure the best-fit slope angles of each
54
side for slope analysis. The results of the twelve scans are presented in the following sections of
this report.
6.2 Topless Pyramid Results with Machining
Figure 31 illustrates an example of the error distances of a topless pyramid with machining,
displayed graphically with a rainbow plot for a 45º surface. For the error distances, red
represents +0.010 in, green represents 0.000 in, and dark blue represents -0.019 in perpendicular
from the theoretical best fit plane, on a linear scale. Similar graphics were captured for all
surfaces of all parts produced, including the un-machined prototypes analysed in next section.
Figure 31 45º Error Distances
55
Surfacer outputs all of the error distances in a text file. Microsoft Excel was then used to
calculate the surface roughness average for each surface. All of the following results for the
topless pyramids include 3-axis machining at a vertical pitch of 0.010 in. The linear dimensional
results and tolerances for the six prototypes are available in Table 7.
Table 7 Linear Dimensional Results with Machining
Part # Direction
Nominal Dim (in)
Actual Dim (in)
Tolerance (in)
Error (%)
#1 X 1.440 1.448 +0.008 +0.56 Y 2.000 2.006 +0.006 +0.30 Z 0.560 0.582 +0.022 +3.93
#2 X 1.440 1.448 +0.008 +0.56 Y 2.000 2.009 +0.009 +0.45 Z 0.560 0.576 +0.016 +2.86
#3 X 1.440 1.444 +0.004 +0.28 Y 2.000 2.008 +0.008 +0.40 Z 0.560 0.552 -0.008 -1.43
#4 X 1.440 1.448 +0.008 +0.56 Y 2.000 2.012 +0.012 +0.60 Z 0.560 0.575 +0.015 +2.68
#5 X 1.440 1.446 +0.006 +0.42 Y 2.000 2.016 +0.016 +0.80 Z 0.560 0.546 -0.014 -2.50
#6 X 1.440 1.449 +0.009 +0.63 Y 2.000 2.017 +0.017 +0.85 Z 0.560 0.557 -0.003 -0.46
Included in Table 8 are the linear tolerances and errors averaged from all six prototypes in Table
7, as well as the linear bilateral tolerances for the six prototypes.
Table 8 Linear Dimensional Results with Machining Summary
Direction Avg. Tol.
(in) Min. Tol.
(in) Max. Tol.
(in) Avg. Error
(%) X +0.007 +0.004 +0.009 +0.50 Y +0.011 +0.006 +0.017 +0.57 Z +0.005 -0.014 +0.022 +0.85
56
Table 9 contains the angular dimensional results and tolerances for the six prototypes. Each
angular dimension was obtained in Surfacer by taking average angles from each side face to the
top surface.
Table 9 Angular Dimensional Results with Machining Part
# Plane (deg)
Actual Inclination (deg)
Error (%)
#1 60 61.0 +1.67 45 49.2 +9.33 30 38.8 +29.33 15 15.5 +3.33
#2 60 59.0 -1.67 45 46.0 +2.22 30 34.0 +13.33 15 14.7 -2.00
#3 60 60.0 0.00 45 44.3 -1.56 30 33.0 +10.00 15 14.7 -2.00
#4 60 63.0 +5.00 45 41.0 -8.89 30 37.0 +23.33 15 14.1 -6.00
#5 60 62.0 +3.33 45 42.3 -6.00 30 33.0 +10.00 15 16.7 +11.33
#6 60 61.0 +1.67 45 45.3 +0.67 30 34.0 +13.33 15 14.8 -1.33
Table 10 includes the average angular inclinations and errors from Table 9, as well as the
angular bilateral tolerances for the prototypes.
57
Table 10 Angular Dimensional Results with Machining Summary Plane (deg)
Avg. Inclination (deg)
Min. Tol. (deg)
Max. Tol. (deg)
Avg. Error (%)
60 61.0 59.0 63.0 +1.67 45 44.7 41.0 49.2 -0.70 30 35.0 33.0 38.8 +16.56 15 15.1 14.1 16.7 +0.56
In order to analyse the surface roughness values for each build angle on the 3-axis machine,
the same six prototypes were analysed. Figure 31 illustrated the error distances used to calculate
the RMS surface roughness values, which are calculated from Equation (18). Table 11 includes
the RMS surface roughness, Rq, results for the six prototypes. Table 12 lists the RMS surface
roughness values calculated, compared to the theoretical roughness values calculated from
Equation (3). The plane angles in the table are given as the tangential build angles. The relation
between the normal, θN, and tangential, θT, build angles is described in Equation (19). Equation
(20) is used to find the population standard deviation, σ, for each side of each prototype. The
number of data points in the population is N, xi represents each data point value, and _
x is the
mean of the corresponding population.
2
1
1 N
q ii
R xN =
= ∑ (18)
90N Tθ θ= − (19)
2_
1
1 N
ii
x xN
σ=
⎛ ⎞= −⎜ ⎟⎝ ⎠
∑ (20)
58
Table 11 Average Surface Roughness Results with Machining Part
# Plane (deg)
Theoretical Ra,t(microns)
Rq (microns)
Error(%)
σ (microns)
data ± 1σ (%)
data ± 2σ(%)
#1 90 0 5055 na 5055 62.6 97.1 60 4330 5629 +30.00 5629 65.6 96.8 45 3536 4131 +16.84 4131 67.5 95.6 30 2500 2833 +13.32 2133 69.2 96.0 15 1294 2459 +90.02 2459 59.4 98.4
#2 90 0 3842 na 3840 65.8 97.0 60 4330 4359 +0.67 4359 69.2 95.2 45 3536 3082 -12.83 3082 68.5 95.4 30 2500 4596 +83.84 4596 65.3 96.5 15 1294 1311 +1.31 1311 76.5 96.8
#3 90 0 3226 na 3226 69.0 95.1 60 4330 4923 +13.69 4923 72.9 95.9 45 3536 3650 +3.24 3650 70.3 94.9 30 2500 3257 +30.28 3257 69.6 96.1 15 1294 1289 -0.39 1289 69.3 95.5
#4 90 0 4607 na 4607 65.9 95.8 60 4330 4165 -3.81 4165 72.7 96.4 45 3536 3423 -3.18 3423 74.4 95.6 30 2500 2381 -4.76 2381 70.6 95.5 15 1294 1529 +18.15 1529 85.9 96.1
#5 90 0 4125 na 4125 67.4 95.6 60 4330 3950 -8.78 3949 66.4 95.6 45 3536 3734 +5.61 3734 67.8 95.7 30 2500 2639 +5.56 2639 68.7 96.7 15 1294 1658 +28.12 1658 77.5 96.2
#6 90 0 6866 na 6866 62.6 98.9 60 4330 4957 +14.48 4957 67.2 95.7 45 3536 4445 +25.72 4445 65.7 96.5 30 2500 2320 -7.20 2320 68.0 96.0 15 1294 2219 +71.47 2219 67.7 96.6
Table 12 Average Surface Roughness Results with Machining Summary
Plane (deg)
Theoretical Ra,t
(microns)
Average Rq
(microns) Error (%)
90 0 4620 n/a 60 4330 4664 +7.71 45 3536 3744 +5.90 30 2500 3004 +20.17 15 1294 1744 +34.78
59
Most of the standard deviation values are equal to the corresponding average surface
roughness values because population means, _
x , are all near zero. This is because the raw data
for each plane are distances measured from the best fit plane. For Gaussian distributions, 68.27%
of the data falls within ±1σ, and 95.45% of the data falls within ±2σ.
6.3 Topless Pyramid Results without Machining
After the machined prototypes were produced, six more consecutive prototypes were made
without machining. These parts were made for future comparisons to parts made on the 5-axis
hexapod to determine whether stair stepping can be eliminated. The same procedure was used to
capture the linear, angular, and surface accuracy of the un-machined prototypes, as the machined
prototypes. As previously mentioned, the only difference in the software that generated the G-
code is that the extrudate is deposited to directly achieve the final part dimensions. Table 13
contains the linear results, and Table 14 includes the summaries in the same format as the results
with machining. The angular dimensional results are listed in Table 15, with the summaries in
Table 16. The average surface roughness results are included in Table 17, with the summaries in
Table 18.
60
Table 13 Linear Dimensional Results without Machining Part
# Direction Nominal Dim
(in) Actual Dim
(in) Tolerance
(in) Error (%)
#7 X 1.440 1.448 0.008 +0.56 Y 2.000 2.004 0.004 +0.20 Z 0.560 0.543 -0.017 -3.04
#8 X 1.440 1.438 -0.002 -0.14 Y 2.000 2.004 0.004 +0.20 Z 0.560 0.549 -0.011 -1.96
#9 X 1.440 1.430 -0.010 -0.69 Y 2.000 1.993 -0.007 -0.35 Z 0.560 0.564 0.004 +0.71
#10 X 1.440 1.447 0.007 +0.49 Y 2.000 2.009 0.009 +0.45 Z 0.560 0.550 -0.010 -1.79
#11 X 1.440 1.443 0.003 +0.21 Y 2.000 2.006 0.006 +0.30 Z 0.560 0.566 0.006 +1.07
#12 X 1.440 1.430 -0.010 -0.69 Y 2.000 1.988 -0.012 -0.60 Z 0.560 0.563 0.003 +0.54
Table 14 Linear Dimensional Results without Machining Summary
Direction Avg. Error
(in) Min. Tol.
(in) Max. Tol.
(in) Avg. Error
(%) X -0.001 -0.010 +0.008 -0.05 Y +0.002 -0.012 +0.009 +0.03 Z -0.004 -0.017 +0.006 -0.74
61
Table 15 Angular Dimensional Results without Machining Part
# Plane (deg)
Actual Inclination (deg)
Error (%)
#7 60 62.0 +3.33 45 45.0 0.00 30 30.0 0.00 15 16.3 +8.67
#8 60 61.0 +1.67 45 47.0 +4.44 30 36.0 +20.00 15 15.3 +2.00
#9 60 62.0 +3.33 45 43.0 -4.44 30 31.0 +3.33 15 15.7 +4.67
#10 60 63.0 +5.00 45 44.0 -2.22 30 31.0 +3.33 15 16.5 +10.00
#11 60 63.0 +5.00 45 42.0 -6.67 30 30.0 0.00 15 18.5 +23.33
#12 60 63.0 +5.00 45 41.0 -8.89 30 31.0 +3.33 15 16.6 +10.67
Table 16 Angular Dimensional Results without Machining Summary Plane (deg)
Average Inclination (deg)
Min. Tol. (deg)
Max. Tol. (deg)
Avg. Error (%)
60 62.3 61.0 63.0 +3.89 45 43.7 41.0 47.0 -2.96 30 31.5 30.0 36.0 +5.00 15 16.5 15.3 18.5 +9.89
62
Table 17 Average Surface Roughness Results without Machining Part
# Plane (deg)
Theoretical Ra,t (microns)
Rq (microns)
Error (%)
σ (microns)
data ± 1σ (%)
data ± 2σ(%)
#7 90 0 8155 na 8152 67.9 96.4 60 4330 13652 -60.59 13652 72.0 94.3 45 3536 15273 -46.00 15271 67.0 96.4 30 2500 7969 -60.16 7969 69.8 95.5 15 1294 7088 -31.54 7088 74.2 95.0
#8 90 0 6855 na 6855 73.4 94.7 60 4330 18550 -46.45 18550 78.9 96.6 45 3536 14410 -49.05 14410 66.9 96.0 30 2500 8601 -57.00 8601 72.6 96.3 15 1294 8199 -20.80 8199 76.9 96.0
#9 90 0 8881 na 8881 74.3 94.4 60 4330 11598 -66.52 11598 69.2 95.5 45 3536 13998 -50.51 13998 64.9 96.9 30 2500 7890 -60.55 7890 65.6 96.6 15 1294 6577 -36.47 6577 75.9 94.9
#10 90 0 10978 na 10978 79.1 96.9 60 4330 11698 -66.23 11697 69.4 95.4 45 3536 13886 -50.91 13886 65.1 96.2 30 2500 9018 -54.91 9018 69.5 96.5 15 1294 6870 -33.64 6870 75.4 95.6
#11 90 0 10268 na 10268 69.3 96.2 60 4330 13119 -62.13 13119 71.0 94.4 45 3536 16112 -43.04 16111 65.1 96.7 30 2500 8768 -56.16 8768 65.0 96.6 15 1294 8729 -15.68 8729 71.3 95.4
#12 90 0 8009 na 8009 73.4 95.4 60 4330 11785 -65.98 11785 73.1 94.7 45 3536 13671 -51.67 13671 67.4 95.2 30 2500 8853 -55.74 8853 64.3 97.3 15 1294 7202 -30.43 7202 72.1 94.8
Table 18 Average Surface Roughness Results without Machining Summary Plane (deg)
Theoretical Ra,t (microns)
Average Rq (microns)
Error (%)
90 0 8717 n/a 60 34641 13400 -61.32 45 28284 14558 -48.53 30 20000 8517 -57.42 15 10353 7444 -28.09
63
Chapter 7
7.1 Hexapod Introduction
In order to create prototypes with 5-axis control, a custom hexapod machine will provide
the motion of the extruder. This machine was designed and built by Dr. Chan of the Mechanical
Engineering Department at Ryerson University. The initial intention for the hexapod was to
mount a laser for 3D laser scanning parts for reverse engineering purposes. The hexapod consists
of a triangular base that is controlled by six linear actuators. The linear actuators are extended
and retracted with the rotational motion of a threaded rod. The threaded rods are rotated by servo
motors that are actuated by a complex control system.
The servo motor controllers are driven by custom software developed by Dr. Chan written
in Visual Basic. The software inputs 5-axis G-code with X, Y, Z, U, and V coordinates and a
desired feed rate. The X, Y, and Z coordinates are Cartesian 3-axis coordinates, and the U and V
coordinates indicate the pitch and roll angles. The geometric calculations used in the software to
convert the G-code to linear actuator arm lengths were derived by Dr. Chan, and are beyond the
scope of this report.
To allow the triangular base to move, the linear actuators are mounted on basic sheet metal
universal joints at each end. These universal joints were anticipated to rigid enough since all the
loads in the linear actuators are in tension. Figure 32 illustrates the basic layout of the hexapod
machine. This picture was taken while the machine was still in the condition it was at the outset
of the current FDM extrusion research. Figure 33 shows a close-up view of the lower universal
joints.
64
Figure 32 Initial Hexapod Condition
Figure 33 Hexapod Base
65
The research schedule was made with the assumption that the hexapod would be running
and calibrated by January 2006. As a result, all previous 3-axis testing was concluded in
December 2005. Figures 34 and 35 were taken when the extruder was mounted the first week of
January. Mounts were designed and manufactured that allowed adjustable positional control, so
the deposition nozzle could be centred on the triangular hexapod base. Instead of producing 5-
axis prototypes, effort was put forward to getting the hexapod machine operational.
Mounts
Figure 34 Extruder Mounted on Hexapod
66
Figure 35 Mounted Extruder Nozzle from Underneath
7.2 Electrical Work Done
Before calibration of the machine could be done, the electrical system had to be installed.
Dr. Chan manufactured the electronic control boards, but they still needed to be wired together,
and wired to the motors. The motors and control boards also required a power supply. A power
supply was obtained that had 5 VDC up to 3 amps, and 24 VDC up to 8 amps output, from a 120
VAC input. The stock input to the power supply was a female three-pronged connector, to which
a male connector was not available. The power supply was taken apart, the stock female
67
connector removed, and a three standard tree prong plug was cut and hardwired into the power
supply.
The 5 VDC was required for the control logic and to power the controllers, and the 24
VDC was required to power each servo drive, and the servo motors for the linear actuators.
Fuses were placed in the 24 VDC output lines of the power supply as illustrated in Figure 36.
These fuses were installed to protect the power supply from potential back electro magnetic
force (EMF) power spikes. The fuse for the 5 VDC outputs was placed near the control boards
as can be seen later in Figure 41 in a white plastic fuse holder.
Figure 36 Fused Power Supply
68
Each stepping motor is equipped with an optically isolated encoder. Each motor has six
wires in total required for motion. The red and black wires in Figure 37 are the positive and
negative 24 VDC wires respectively that supply power the motor armatures. These wires come
from the control boards. The other four wires on the motor are for the operation of the optical
encoder. The blue and green wires are the 5 VDC positive and ground wires that power the
encoder. The white and yellow are Phase A and Phase B encoder wires respectively.
Green
Blue
Black
Red
Yellow
White
Figure 37 Motor Wiring
Gecko drive DC servo drivers “Geckos” were selected to control the linear actuator
stepping motors for their robustness, simplicity, and affordability. The Geckos have three
69
externally adjustable pots for Limit, Damping, and Gain for system response control stability.
These values are all initially set to the midpoints of the pots, but can be adjusted to optimise
system response. There are twelve screw clamp connectors on the end for input and output wires.
These are numbered from one to twelve numbered from left to right respectively in Figure 38.
Table 19 consists of a summary of the current Gecko wiring, including the screw connector
numbers and labels on the Gecko, and the colour and location of the corresponding wires.
Figure 38 Gecko Servo Drive Controller
70
Table 19 Gecko Wiring Inputs and Outputs # Label Wire to/from Wire Color1 Power Ground - 24 VDC ground from power supply Black 2 +18 to 80 VDC + 24 VDC from power supply Red 3 Arm - - 24 VDC ground to stepping motor Black 4 Arm + + 24 VDC to stepping motor Y/G/Red 5 Err/Res Jumpered to Enc + Brown 6 Enc - - 5 VDC Ground for stepping motor encoder Green 7 Enc + + 5 VDC to stepping motor encoder Blue/Black 8 Phase A To Phase A of stepping motor encoder White 9 Phase B To Phase B of stepping motor encoder Yellow/Red10 Dir Direction from PIC chip control board Black 11 Step Step from PIC chip control board Brown 12 Common/+5VDC + 5VDC from power supply Brown/Black
Table 19 includes a reference to a PIC chip control board. This board was also
manufactured by Dr. Chan, and is shown in Figure 39. A PIC chip is a micro controller, and
stands for Peripheral Interface Controller. It is programable to perform required computation and
communication tasks. The purpose of each PIC chip board is to instruct its respective Gecko
how many pulses, and in which direction, to move its linear actuator stepping motor. The pic
chip board recieves 5 VDC from the power supply and communications from the Master PIC
chip board. The Master PIC chip board is shown in Figure 40. The role of the Master PIC chip is
to receive data from the communication board, and send the appropriate instructions to each PIC
chip. The communication board is the leftmost white board in Figure 41. This board recives data
from the computer, and transmits it to the Master PIC chip board. Once the wiring and
communications were working properly, the wiring was neatly routed from each linear actuator
stepping motor to the control boards as seen in Figure 42. This was done to keep all wires away
from mechanical moving components, and out of the the way so the build area can be observed
from all sides of the machine.
71
PIC CHIP
Figure 39 PIC Chip Board
72
Master PIC Chip
Figure 40 Master PIC Chip Board
73
CommunicationsBoard
5 VDC Fuse
Figure 41 Communication Board
74
Figure 42 Wiring Routed Neatly
7.3 Mechanical Work Done
Once the controls system was in place, initial motion testing commenced. It was
immediately apparent that the hexapod was not as rigid as anticipated. To alleviate some of the
vibrations, the table was drilled, tapped, and the frame was bolted down to aluminium table base.
This helped reduce vibrations.
When the linear actuators were moved, one of the lower universal joints interfered with
the gear drive stepping motor. To correct this, a new universal joint was made as illustrated in
Figure 43. The new universal joint was also made of sheet metal, and designed so that the
75
original geometry was maintained. Interference may still be an issue at the maximum rotation
angles of the hexapod.
Figure 43 Motor Clearance Modification
Further motion testing revealed other mechanical flaws. An internally threaded bushing
inside one of the linear actuators jammed on the threaded rods and stuck. When the linear
actuator was disassembled, the distorted plastic bushing was replaced with a custom made brass
one, which allowed the linear actuator to extend and retract freely. As a result of this jamming,
the corresponding upper universal joint failed. Another sheet metal universal joint was made, as
seen in Figure 44, which maintained the original geometry. The linear actuators stepping motor
76
shafts were also shortened and remounted to eliminate backlash associated with the motor
motion when changing rotational directions. The brackets holding the linear actuators body to
the universal joint was also riveted and clamped to the actuator body as the original threads
holding them together stripped because of the vibrations. These modifications can also be seen
in Figure 44.
Figure 44 Replacement Universal Joint
7.4 5-axis G-Code and MasterCAM Post Processor Modifications
Generating G-code for a 5-axis machine is more complicated than creating 3-axis code.
With 3-axis G-code, the CAD model can be sliced into layers, and then the G-code can be
generated to fill in each slices cross section. With 5-axis deposition, the extrudate is deposited on
77
the surface of the previously deposited layer over the entire part. This means that the slices are
not simply taken vertically in the Z-direction. Each deposited layer builds up the part by adding
a shell, of one layer thickness, to the previous layer.
For initial 5-axis prototype parts built by the hexapod, the strategy will be to just deposit
the final shell layer thickness for a topless pyramid. The core of the part will be manufactured by
conventional machining methods. This way the G-code generation was simplified, and the stair
stepping elimination on the external surfaces can still be studied. To generate the outer shell 5-
axis G-code, MasterCAM Mill computer aided manufacturing, CAM, software was used.
MasterCAM includes several 5-axis machining modules including: Curve5ax, Drill5ax,
Swarf5ax, Msurf5ax, and Flow5ax. Flow5ax was used because it was easiest to learn about in
the help files, although each module is capable of creating the tool paths.
MasterCAM’s intended purpose is to generate G-code for machining, not for RP
deposition path generation. For this reason, a slightly different approach is required to setting up
the MasterCAM tool paths. To generate the G-code for the outermost layer of the part, the CAD
model must be one external layer thickness smaller than the final part. To generate the
appropriate depositions paths, an end mill tool must be selected with the same diameter as the
extrudate. Machining overlap must also be set to 0% so the road widths do not overlap. Flow5ax
allows the user to select the order the tool path will be generated for each face. The options are
also presented to choose the start point, traversal direction, maximum axis angles for each
surface to ensure continuity, and the machine can tilt appropriately. If the part surface angle
exceeds the set machine axis limits, MasterCAM compensates to create equivalent road widths.
An example of a tool path with all of the above mentioned characteristics is shown in Figure 45.
78
Figure 45 MasterCAM 5-axis Tool Path
Once the desired tool path is created, a post processor generates the corresponding G-
code. MasterCAM comes with a generic 5-axis post processor called MPGEN5X, which is
capable of generating G-code for various commercially available 5-axis machines. There are
several ways to get 5-axis control in 5-axis machines. An example is a three axis Cartesian tool
head that rotates in a 4th axis, and is coupled with a rotating part holding base. Another example
would be a standard 3-axis machine, coupled with a part holding base that has pitch and roll
capabilities. MPGEN5X does not include, and MasterCAM does not make, a post processor for
a stationary part holding base, where the tool holder contributes all 5-axis motion control.
However, the MPGEN5X post processor includes comments indicating the areas of the code that
can be modified.
79
MasterCAM post processors have three files associated with them. These file extensions
are .pst, .txt, and .psb, and all must have to have same name and be in same directory. Only
the .pst file requires modification to shape the output G-code produced. As the .pst file is fairly
long, only the modified code within the post processor is available, with indicated modifications,
in Appendix B.
80
Chapter 8
8.1 Discussion
The objective of this study was to investigate the possibility of eliminating stair stepping
errors associated with 3-axis rapid prototyping. The groundwork has been laid out for multi-axis
testing. Currently, an FDM module, including a machining module, has been built. The modules
were mounted on a 3-axis CNC machine to produce prototypes. The shape of the prototypes
being produced was that of a topless pyramid. Custom MATLAB programs were written that
generate the G-code that drives the 3-axis CNC machine. Results have been gathered from the
topless pyramid prototypes built to assess the linear and angular accuracies, as well as the
surface roughness of the prototypes produced for several build angles.
Due to the vibrations during machining, the Z-axis table limited the robustness of the
overall system. Six prototypes were produced before maintenance was required to the Z-axis
table. To maintain the integrity of the results, only consecutively made prototypes were analysed.
After the maintenance, timeline restraints prevented re-making a greater quantity of consecutive
prototypes with machining. As the machine was the only capable of producing six prototypes
with machining, six prototypes were created without machining, so the averaged results of each
would be analogous.
Producing parts with 5-axis deposition requires building up the core volume of the
prototype, using 3-axis or 5-axis deposition, and then using full 5-axis deposition to create the
shell. Multi-axis machining path generation in MasterCAM was used to generate the G-code.
The set-up for generating 5-axis G-code by modifying a MasterCAM post processor was
presented. To get the 5-axis hexapod machine up and running, the electrical system was wired,
81
and the major mechanical flaws highlighted for future modifications, which are listed in the final
section of this thesis.
8.2 Results and Conclusions
Results for 3-axis prototypes, with and without machining, were gathered to be used for
comparison with results gathered from 5-axis prototypes produced in the future. The prototypes
produced for comparison with these results should use the same build parameters such as feed
rate, nozzle diameter, temperatures, and all other deposition parameters. As expected, the surface
roughness data gathered for the prototypes made are better for the parts that were machined.
Without machining, the parts exhibit stair steps of a full layer thickness. The parts with
machining only have stair steps as a result of the machining steps. The angular data gathered
shows that the average inclinations of all the parts closely match the theoretical values. This
shows that the path generation code properly slices the CAD model and determines the correct
cross section parameters to deposit for each layer. The only unexpected results were that the
linear tolerances were tighter for the deposition only prototypes. This can be attributed to tight
and consistent deposition extrudate accuracy and control. An example of the consistency of the
new extruder is that on one day during testing, the extruder deposited material for over five
hours without any discontinuities, even when new threaded rods were fed in.
The angular results are acceptable for all of the prototypes made with and without
machining as the maximum and minimum bilateral tolerances all straddle the ideal inclination
angles. Linear results for deposition without machining also all have bilateral tolerances that are
on either side of the CAD model dimensions. These results show tendencies of being
82
Statistically independent, (SI), which attributes the fluctuations to random errors. There are not
enough measured values in each axis to perform statistical run tests, as a minimum of 10
measured values are needed to prove statistical independence of the data. To prove statistical
independence of the data, a higher number of consecutively built prototypes are required.
The X and Y linear results for the machined prototypes in Table 8 are all positive one-
sided bilateral tolerances. Without using the run test, it is obvious that there are external non-
random errors involved in the machining, and that the data is not SI as there is only one positive
run grouping in the data. An example of a possible non-random error is tool deflection, which
would account for the parts being bigger in the X and Y directions, but not in the Z-axis.
Compensation in the G-code software could be implemented to correct for these errors.
The surface roughness results with machining in Table 12 have rougher surfaces than the
theoretical values. The surface roughness results without machining in Tables 18 are smoother
than the theoretical, but much rougher than with machining as expected. Campbell [20]
produced a truncheon via several RP methods and experimentally determined that deposition
surface roughness is half of the theoretically predicted values without machining. Campbell [20]
suggests an empirically modified version of Equation (3) in this paper, by a factor of ½, for
better surface roughness prediction. This empirical modification shows consistency with the data
in Table 18 and explains the low surface roughness values measured in the prototypes without
machining.
The primary source of error during machining is due to a lack of rigidity of the Z-axis
build table. By including a counterweight to the table and another linear guide, vibrations
decreased. However, the design of the 3-axis machine does not lend itself to easy modification
of the Z-axis table. The results in this thesis were all obtained after these modifications.
Maintenance of the Z-axis table was required after the first six prototypes were built.
83
In Table 20, the results from Table 1 have been modified to include minimum and
maximum tolerance data from Madahian [11] and from the results obtained during this thesis,
which are labelled Mason. The machines have also been ranked in order of ascending linear
tolerance ranges. Results from Madahian [11] without machining were not ranked as the
tolerances were not competitive. Although Mason without machining has the tightest tolerance
range, prototypes made with machining had much better surface finishes.
Table 20 FDM Machine Experimental Linear Accuracies
Rank Machine Min. Tol.
(in) Max. Tol.
(in) Tol. Range
(in) 1 Mason w/o machining -0.017 +0.009 0.026 2 Mason w/machining -0.014 +0.022 0.036 3 Dimension -0.030 +0.020 0.050 5 ZPrinter -0.024 +0.035 0.059 4 InVision -0.037 +0.045 0.082 6 Madahian w/machining -0.022 +0.076 0.098
n/a Madahian w/o machining +0.196 +0.265 0.069
As the ranked results in Table 20 indicate, the extrusion module developed during this
research produces prototypes with accuracies competitive to current leading FDM machines in
industry. Vibrations during machining compromise linear accuracy. However, the addition of a
machining module improves the surface quality of inclined planes. Machining allows for the use
of a larger nozzle orifice diameter to produce prototypes that match the CAD model geometry
better than deposition alone. The upgrade to using ABS as extrudate aligns this research with
industry standards, and the proposals for 5-axis deposition will further advance the technology
of RP.
8.3 Future Recommendations
84
This study can be advanced by further developing the following items:
Before using the 3-axis machine again, the entire Z-axis table should be redesigned with
linear bearings on two sides of the build table to provide smoother motion.
Use a closed loop temperature controller to maintain the extrudate temperature at the nozzle.
Implement twelve zero-backlash universal joints to replace the sheet metal universal joints
on the hexapod. Since they will be smaller, these will also avoid the extruder stepping motor.
Replace the plastic threaded inserts in the hexapod’s linear actuators with brass ones for
smoother, more reliable, motion.
Use lead screws with anti-backlash nuts in the linear actuators to replace the threaded rod.
Develop calibration G-code for the hexapod to ensure accuracy and repeatability of the
machine before producing prototypes.
Adjust system stability controls on the Gecko drives to optimise the system response and
stability.
If time is not available to write full 5-axis G-code generating software, make several CAD
models, of decreasing size for the topless pyramid, and paste together the MasterCAM G-
code output using the modified post processor. To do this will involve determining the
size/shape of each CAD file so the part’s external surfaces are the correct geometry once all
layers are deposited.
85
Appendix A – Technical Drawings A1 – Extruder Drawings
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
A2 – Hexapod Modifications
101
102
103
Appendix B – Source Code
B1 – MATLAB Deposition with Machining Path Generation Code
MAIN CODE Pyramid_Topless.M (sub-function codes follow) clc clear all nozzle_diameter = 5/64 %input('\n\nPlease input the nozzle orafice diameter (fraction or decimal) you are using: '); tic %Inputting Vertecies and normals [top_normal, top_face_vertecies, south_normal, south_face_vertecies, north_normal, north_face_vertecies, bottom_normal, bottom_face_vertecies, west_normal, west_face_vertecies, east_normal, east_face_vertecies] = input_vertecies; clc fprintf('Please wait while the G-Code is being Generated\n') % Find distance between top and bottom plane of prototype prototype_height = top_face_vertecies(1,3) - bottom_face_vertecies(1,3); % End Find distance between top and bottom plane of prototype % Caclulating side inclination angles from vertecies % Angle is defined as vertical to surface tangent (opposite to Directed Studies Report definition) west_angle = atan( (west_face_vertecies(1,1)-west_face_vertecies(2,1)) / (west_face_vertecies(1,3)-west_face_vertecies(2,3))); west_angle_displayed = round((180/pi)*west_angle); south_angle = atan( (south_face_vertecies(1,2)-south_face_vertecies(2,2)) / (south_face_vertecies(1,3)-south_face_vertecies(2,3))); south_angle_displayed = round((180/pi)*south_angle); east_angle = atan( (east_face_vertecies(1,1)-east_face_vertecies(2,1)) / (east_face_vertecies(2,3)-east_face_vertecies(1,3))); east_angle_displayed = round((180/pi)*east_angle); north_angle = atan( (north_face_vertecies(1,2)-north_face_vertecies(2,2)) / (north_face_vertecies(2,3)-north_face_vertecies(1,3))); north_angle_displayed = round((180/pi)*north_angle); % End Caclulating side inclination angles from vertecies % Calculate Cad Model (theoretical) volume (in^3) if west_angle_displayed==15 & south_angle_displayed==30 & east_angle_displayed==45 & north_angle_displayed==60 cad_model_volume = 0.8152; %(1.44x2) end % End Calculate Cad Model (theoretical) volume bottom_base = bottom_face_vertecies(1,1)-bottom_face_vertecies(3,1); bottom_length = bottom_face_vertecies(1,2)-bottom_face_vertecies(2,2); deposition_delay = 0.75; % sec machining_delay = 5*60;%sec layer_thickness = 0.080; nozzle_offset_value = 1.25; %(times current layer thickness)
104
road_width = 0.080; deposition_overlap = 0.375*road_width; % Extra material deposited to compensate for round profile of deposition. % See "Machining Parameters.xls" for current calibrated offsets. X_offset = -3.318; Y_offset = -0.082; Z_offset = -0.764; X_loss_compensation = 0; Y_loss_compensation = 0.080; Z_loss_compensation = -0.025; X_offset = -3.318 + X_loss_compensation; Y_offset = -0.082 + Y_loss_compensation; Z_offset = -0.764 + Z_loss_compensation; Router_diameter = 0.250; XY_feed_rate = 6.0; Machining_feed_rate = 3.75; Z_feed_rate = 1.5; code_line_number = 10; data_points = 0; % Array for datapoints to be written to a text file. data_points_index = 1; fittest = 1; spindle_speed = 4; layer = 0; height_level = 0; X = 0; Y = 0; Z = 0.12; base_height = 0.080;%inch while height_level < prototype_height + base_height % Looping for every layer. %The Base is actually deposited in the negative heigh_level. %The +base_height is to deposit another layer on the top so it can be machined down to the correct height. layer = layer + 1; if height_level < prototype_height + base_height - layer_thickness %for every layer but the top. base = bottom_base - height_level*( tan(west_angle) + tan(east_angle) ); length = bottom_length - height_level*( tan(south_angle) + tan(north_angle) ); min_x = height_level*tan(west_angle); min_y = height_level*tan(south_angle); else %for the top extra deposited layer only. base = bottom_base - (height_level - layer_thickness)*( tan(west_angle) + tan(east_angle) ); length = bottom_length - (height_level - layer_thickness)*( tan(south_angle) + tan(north_angle) ); min_x = (height_level - layer_thickness)*tan(west_angle); min_y = (height_level - layer_thickness)*tan(south_angle); end cross_sectional_area = base*length; sectional_volume = cross_sectional_area*layer_thickness; nozzle_offset = nozzle_offset_value*layer_thickness; feed_rate = XY_feed_rate; % Setting to always do same feed rate as calibrated for the machine deposition_method = 2; % Setting to always do this deposition method if layer == 1 % print out setup G-Code. clc % fprintf('O Topless_Pyramid_G_Gode - Program Name\n') % fprintf(['N',num2str(code_line_number),' G20 (Inch mode)\n'])
105
% code_line_number = code_line_number + 10; % fprintf(['N',num2str(code_line_number),' G90 (Absolute mode)\n']) % code_line_number = code_line_number + 10; % fprintf(['N',num2str(code_line_number),' G54 (Set coordinate system to part)\n']) % code_line_number = code_line_number + 10; % fprintf(['N',num2str(code_line_number),' G43 H1 (nozzle height compensation)\n']) %MUST DEFINE H1**********s*********** % code_line_number = code_line_number + 10; % ************************************************************************************************************* % This code is for adding a single layer base to the pyramid. % Must set Z=0 at Z=layer_thickness. Thus the first layer (the base) will be deposited in the -Z region. height_level = height_level - layer_thickness; Z = nozzle_offset - layer_thickness; X = -1.5; Y = -0.75; fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' Z',num2str(Z),' F',num2str(Z_feed_rate),' (Return to home) (-1.5,-0.75,Z)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; X = min_x + (0.5*road_width) - deposition_overlap; fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y-0.75 Z',num2str(Z),' F',num2str(XY_feed_rate),' (Move to initial position)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; nozzle_offset = nozzle_offset_value*layer_thickness; num_of_x_roads = ceil((base + (2*deposition_overlap)) / road_width); [code_line_number, X, Y, Z, data_points, data_points_index] = Perimeter(fittest, height_level, base, length, min_x, min_y, num_of_x_roads, X, Y, Z, code_line_number, road_width, nozzle_offset, spindle_speed, data_points, data_points_index, feed_rate, deposition_delay, deposition_overlap); % Retracting nozzle to move to the next position X = bottom_base + (4*road_width); fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' F',num2str(XY_feed_rate),' (Retract over)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; Y = -0.75 - (1.25*road_width); fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' F',num2str(XY_feed_rate),' (Retract out)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X;
106
data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; X = 0 - deposition_overlap; fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' F',num2str(XY_feed_rate),' (Retract out)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; Z = Z + layer_thickness; fprintf(['\nN',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' Z',num2str(Z),' F',num2str(Z_feed_rate),' (Retract up)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; feed_rate = XY_feed_rate; height_level = height_level + layer_thickness; % ************************************************************************************************************* Z = height_level + nozzle_offset; X = -1.5; Y = -0.75; fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' Z',num2str(Z),' F',num2str(XY_feed_rate),' (Return to home) (-1.5,-0.75,Z)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; X = min_x + (0.5*road_width) - deposition_overlap; fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y-0.75 Z',num2str(Z),' F',num2str(XY_feed_rate),' (Move to initial position)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; end % Calling appropriate function to generate the G-Code for the fittest chromosome selected. nozzle_offset = nozzle_offset_value*layer_thickness; num_of_x_roads = ceil((base + (2*deposition_overlap)) / road_width); %if deposition_method == 1 % Zig-Zag Deposition. [outputs] = function(inputs). MUST be the same as IF statement below.
107
% [code_line_number, X, Y, Z, data_points, data_points_index] = Zig_Zag(fittest, height_level, base, length, min_x, min_y, num_of_x_roads, X, Y, Z, code_line_number, road_width, nozzle_offset, spindle_speed, data_points, data_points_index, feed_rate, deposition_delay, deposition_overlap); %end if deposition_method == 2 % Perimeter Zig-Zag Deposition [code_line_number, X, Y, Z, data_points, data_points_index] = Perimeter(fittest, height_level, base, length, min_x, min_y, num_of_x_roads, X, Y, Z, code_line_number, road_width, nozzle_offset, spindle_speed, data_points, data_points_index, feed_rate, deposition_delay, deposition_overlap); end %if deposition_method == 3 % Spiral Deposition % [code_line_number, X, Y, Z, data_points, data_points_index] = Spiral(fittest, height_level, base, length, min_x, min_y, num_of_x_roads, X, Y, Z, code_line_number, road_width, nozzle_offset, spindle_speed, data_points, data_points_index, feed_rate, deposition_delay, deposition_overlap); %end % Retracting nozzle to move to the next position X = bottom_base + (4*road_width); fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' F',num2str(XY_feed_rate),' (Retract over)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; Y = -0.75 - (1.25*road_width); fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' F',num2str(XY_feed_rate),' (Retract out)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; X = -1.0; fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' F',num2str(XY_feed_rate),' (Retract out)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; Z = Z + layer_thickness; fprintf(['\nN',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' Z',num2str(Z),' F',num2str(Z_feed_rate),' (Retract up)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; X = 0 - deposition_overlap; Y = -0.75; fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' F',num2str(XY_feed_rate),' (Move back in)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z;
108
data_points_index = data_points_index +1; feed_rate = XY_feed_rate; % Zig-Zag_Machining for machining down to the correct height. if height_level + layer_thickness > prototype_height + base_height % Only do it for the top surface. X = -3.0;%inch fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' F',num2str(XY_feed_rate),' (Retract out)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; fprintf(['N',num2str(code_line_number),' G04 X',num2str(machining_delay*10),' (dwell ',num2str(machining_delay/60),'min)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; height_level = height_level - layer_thickness; while height_level > prototype_height - (2*layer_thickness) height_level = height_level - 0.010; [code_line_number, X, Y, Z, data_points, data_points_index] = Zig_Zag_Machining(height_level, layer_thickness, base, length, min_x, min_y, num_of_x_roads, X, Y, Z, nozzle_offset, code_line_number, data_points, data_points_index, feed_rate, Z_feed_rate, Machining_feed_rate, X_offset, Y_offset, Z_offset, Router_diameter, prototype_height, deposition_overlap, base_height); end height_level = height_level + (3*layer_thickness); end height_level = height_level + layer_thickness; save data_points.txt data_points -ASCII % Outputting data_points array to a text file for openening in Surfacer. data_points_index = data_points_index +1; % Creates a blank line to break up data cloud for each layer. Data file manipulation Steps next. % 1.Open data_points.txt % 2.Find and Replace "0.0000000e+000 0.0000000e+000 0.0000000e+000" with nothing (blank line) OR "***End Cloud***" not including quotes for either. % 3.Open in SURFACER with option Open File As: ASCII Delimited. end % Layer Loop %fprintf(['N',num2str(code_line_number),' G28 (Return to home (0,0,2.5)\n']) %code_line_number = code_line_number + 10; %fprintf(['N',num2str(code_line_number),' G49 (End Tool Height Compensation)\n'])
109
%code_line_number = code_line_number + 10; %fprintf(['N',num2str(code_line_number),' M01 (End)\n']) %code_line_number = code_line_number + 10; % Perimeter_Machining for stairstep machining the angled sides. %[code_line_number, X, Y, Z, data_points, data_points_index] = Perimeter_Machining(height_level, bottom_base, bottom_length, X, Y, Z, code_line_number, data_points, data_points_index, feed_rate, Z_feed_rate, Machining_feed_rate, X_offset, Y_offset, Z_offset, Router_diameter, prototype_height, north_angle, south_angle, east_angle, west_angle); % Perimeter_Machining_TopDown for stairstep machining the angled sides. [code_line_number, X, Y, Z, data_points, data_points_index] = Perimeter_Machining_TopDown(height_level, bottom_base, bottom_length, X, Y, Z, code_line_number, data_points, data_points_index, feed_rate, Z_feed_rate, Machining_feed_rate, X_offset, Y_offset, Z_offset, Router_diameter, prototype_height, north_angle, south_angle, east_angle, west_angle, base_height); feed_rate = XY_feed_rate; fprintf(['\n\nN',num2str(code_line_number),' M02 (End Program and Rewind)\n\n']) save data_points.txt data_points -ASCII % Outputting data_points array to a text file for openening in Surfacer. data_points_index = data_points_index +1; % Creates a blank line to break up data cloud for each layer. Data file manipulation Steps next. % 1.Open data_points.txt % 2.Find and Replace "0.0000000e+000 0.0000000e+000 0.0000000e+000" with nothing (blank line) OR "***End Cloud***" not including quotes for either. % 3.Open in SURFACER with option Open File As: ASCII Delimited. toc SUB-FUNCTION import_verticies.M
function [top_normal,top_face_vertecies,south_normal,south_face_vertecies,north_normal,north_face_vertecies,bottom_normal,bottom_face_vertecies,west_normal,west_face_vertecies,east_normal,east_face_vertecies] = input_vertecies %Inputting Vertecies and normals in a function [top_normal,top_face_vertecies,south_normal,south_face_vertecies,north_normal,north_face_vertecies,bottom_normal,bottom_face_vertecies,west_normal,west_face_vertecies,east_normal,east_face_vertecies] = input_vertecies (dummy) % PROCEDURE FOR FORMATTING THE .STL FILE FOR THIS INPUT % 1. Save CAD model as .stl format (ASCII, Inches, Coarse, should be 12 triangles, check off "Do not translate STL output data to positive space", output coordinate system = default. % 2. Open the .stl file and Remove all text % 3. Convert all coordinates to 3 decimal places, no exponental form. Use Find-Replace function for all numbers in Note Pad to be consistant with rounding. % 4. The numbers should be in formated blocks of 4 lines (3 numbers per line.) These lines are i.surface normal ii.first vertex iii.second vertex iV.third vertex.
110
% 5. Remove the 2, 4, 6,.... blocks. These blocks are the second triangles that make up each side. The .m file only takes one triangle per side as the vertecies of one triangle provides sufficient information to process the coordinates of each side. % 6. Save the formatted .stl file to .txt and put in the matlab directory (E:\matlabR12\work) with the .m files. importdata('Pyramid_topless_15_30_45_60_90_1.44x2.txt'); vertecies = ans; top_normal = vertecies(1,:); top_face_vertecies(1,:) = vertecies(2,:); top_face_vertecies(2,:) = vertecies(3,:); top_face_vertecies(3,:) = vertecies(4,:); south_normal = vertecies(5,:); south_face_vertecies(1,:) = vertecies(6,:); south_face_vertecies(2,:) = vertecies(7,:); south_face_vertecies(3,:) = vertecies(8,:); north_normal = vertecies(9,:); north_face_vertecies(1,:) = vertecies(10,:); north_face_vertecies(2,:) = vertecies(11,:); north_face_vertecies(3,:) = vertecies(12,:); bottom_normal = vertecies(13,:); bottom_face_vertecies(1,:) = vertecies(14,:); bottom_face_vertecies(2,:) = vertecies(15,:); bottom_face_vertecies(3,:) = vertecies(16,:); west_normal = vertecies(17,:); west_face_vertecies(1,:) = vertecies(18,:); west_face_vertecies(2,:) = vertecies(19,:); west_face_vertecies(3,:) = vertecies(20,:); east_normal = vertecies(21,:); east_face_vertecies(1,:) = vertecies(22,:); east_face_vertecies(2,:) = vertecies(23,:); east_face_vertecies(3,:) = vertecies(24,:); %End Inputting Vertecies and Normal vertecies SUB-FUNCTION Perimeter.M function [code_line_number, X, Y, Z, data_points, data_points_index] = Perimeter(fittest, height_level, base, length, min_x, min_y, num_of_x_roads, X, Y, Z, code_line_number, road_width, nozzle_offset, spindle_speed, data_points, data_points_index, feed_rate, deposition_delay, deposition_overlap) perimeter_slow_down = 0.75; %For with machining. Y_deposition_compensation = 0; %in with and without machining. deposition_radius = 0; %For with machining. deposition_overlap = 0; %actually set in Pyramid_Topless, but set to 0 here for with machining.
111
Z = height_level + nozzle_offset; X = min_x + deposition_radius - deposition_overlap; Y = min_y + deposition_radius - deposition_overlap - Y_deposition_compensation; fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' Z',num2str(Z),' F',num2str(perimeter_slow_down*feed_rate),' (Move)\n']) code_line_number = code_line_number + 10; fprintf(['N',num2str(code_line_number),' G04 X',num2str(deposition_delay*10),' (dwell ',num2str(deposition_delay),'sec)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; Y = min_y + length - deposition_radius + deposition_overlap; fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' (Move)\n']) code_line_number = code_line_number + 10; fprintf(['N',num2str(code_line_number),' G04 X',num2str(deposition_delay*10),' (dwell ',num2str(deposition_delay),'sec)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; X = min_x + base - deposition_radius + deposition_overlap; fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' (Move)\n']) code_line_number = code_line_number + 10; fprintf(['N',num2str(code_line_number),' G04 X',num2str(deposition_delay*10),' (dwell ',num2str(deposition_delay),'sec)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; Y = min_y + deposition_radius - deposition_overlap - Y_deposition_compensation; fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' (Move)\n']) code_line_number = code_line_number + 10; fprintf(['N',num2str(code_line_number),' G04 X',num2str(deposition_delay*10),' (dwell ',num2str(deposition_delay),'sec)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; X = min_x + road_width; fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' (Move)\n']) code_line_number = code_line_number + 10; fprintf(['N',num2str(code_line_number),' G04 X',num2str(deposition_delay*10),' (dwell ',num2str(deposition_delay),'sec)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y;
112
data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; Y = min_y + road_width + deposition_radius - Y_deposition_compensation; for road_pass_number = 1 : (num_of_x_roads - 3) % "-3" because 2 are deposited in the perimeter, and the thrid because it is already in position for the first. X = min_x + (road_pass_number*road_width) - deposition_radius; if road_pass_number > 1 % To skip first lower left point of the zig zag pattern (already at the correct X first time). fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' F',num2str(feed_rate),' (Move)\n']) code_line_number = code_line_number + 10; fprintf(['N',num2str(code_line_number),' G04 X',num2str(deposition_delay*10),' (dwell ',num2str(deposition_delay),'sec)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; end if Y == min_y + road_width + deposition_radius - Y_deposition_compensation % Zig-Zagging to fill in section. Y = min_y + length - road_width - deposition_radius; else Y = min_y + road_width + deposition_radius - Y_deposition_compensation; end if X > (base + min_x - (1.15*road_width) - deposition_radius) % Deposits slower if there is < 15% of a road gap. fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' F',num2str(0.75*feed_rate),' (Move)\n']) else % Deposit at normal speed fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' F',num2str(feed_rate),' (Move)\n']) end code_line_number = code_line_number + 10; fprintf(['N',num2str(code_line_number),' G04 X',num2str(deposition_delay*10),' (dwell ',num2str(deposition_delay),'sec)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; end if X < (base + min_x - (1.25*road_width) - deposition_radius) % Deposits another road if there is < 25% of a road gap. road_pass_number = road_pass_number + 1; X = min_x + (road_pass_number*road_width) - deposition_radius; fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' F',num2str(feed_rate),' (Move)\n'])
113
code_line_number = code_line_number + 10; fprintf(['N',num2str(code_line_number),' G04 X',num2str(deposition_delay*10),' (dwell ',num2str(deposition_delay),'sec)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; if Y == min_y + road_width + deposition_radius - Y_deposition_compensation % Zig-Zagging to fill in section. Y = min_y + length - road_width - deposition_radius; else Y = min_y + road_width + deposition_radius - Y_deposition_compensation; end fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' F',num2str(feed_rate),' (Move)\n']) code_line_number = code_line_number + 10; fprintf(['N',num2str(code_line_number),' G04 X',num2str(deposition_delay*10),' (dwell ',num2str(deposition_delay),'sec)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; end SUB-FUNCTION Zig_Zag_Machining.M function [code_line_number, X, Y, Z, data_points, data_points_index] = Zig_Zag_Machining(height_level, layer_thickness, base, length, min_x, min_y, num_of_x_roads, X, Y, Z, nozzle_offset, code_line_number, data_points, data_points_index, feed_rate, Z_feed_rate, Machining_feed_rate, X_offset, Y_offset, Z_offset, Router_diameter, prototype_height, deposition_overlap, base_height) fprintf('(Begin Machining)\n') Overlap = 1.25; Router_diameter = Router_diameter/Overlap; Y = Y_offset - (3*Router_diameter); X = min_x + X_offset - (0.5*Router_diameter) - deposition_overlap; % Slightly left of first road width num_of_x_roads = ceil((base + (2*deposition_overlap)) / Router_diameter) + 1; % Using overlap fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' F',num2str(feed_rate),' (Move to initial XY)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; Z = height_level + layer_thickness + Z_offset + base_height; %this one is for machining all layers.
114
fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' Z',num2str(Z),' F',num2str(Z_feed_rate),' (Move down)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; for road_pass_number = 1 : num_of_x_roads prev_Y = Y; if Y == min_y + Y_offset + length + Router_diameter % Zig-Zagging to fill in section. Y = min_y + Y_offset - Router_diameter; else Y = min_y + Y_offset + length + Router_diameter; end fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' F',num2str(Machining_feed_rate),' (Move)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; prev_X = X; X = min_x + X_offset + (road_pass_number*Router_diameter) - (0.5*Router_diameter); % Centred on road width fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' F',num2str(Machining_feed_rate),' (Move)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; end X = (X_offset - (0.5*Router_diameter)); Y = (Y_offset - (2*Router_diameter)); fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' F',num2str(feed_rate),' (Move into position for Perimeter Machining)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; %end Router_diameter = Router_diameter*Overlap; % Resetting back to actual Router_diameter from overlap compensation. fprintf('(End Machining)\n\n')
115
SUB-FUNCTION Perimeter_Machining_TopDown.M
function [code_line_number, X, Y, Z, data_points, data_points_index] = Perimeter_Machining_TopDown(height_level, bottom_base, bottom_length, X, Y, Z, code_line_number, data_points, data_points_index, feed_rate, Z_feed_rate, Machining_feed_rate, X_offset, Y_offset, Z_offset, Router_diameter, prototype_height, north_angle, south_angle, east_angle, west_angle, base_height) perimeter_layer_thickness = 0.010; Perimeter_Cuts = ceil(prototype_height/perimeter_layer_thickness); Perimeter_Machining_feed_rate = 7.5; for perimeter_layer = 0 : (Perimeter_Cuts + 10) %+8 to cut the base, +2 to cut into the base. X = X - (0.5*Router_diameter); if abs(X) <= 0.001 % DeskNC can't read exponential terms. X = 0; end fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' F',num2str(Perimeter_Machining_feed_rate),' (Move Left)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; Z = Z_offset + prototype_height - (perimeter_layer*perimeter_layer_thickness); if abs(Z) <= 0.001 Z = 0; end fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' Z',num2str(Z),' F',num2str(Z_feed_rate),' (Move Into Perimeter_Machining Position)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; X = X + (0.5*Router_diameter); if abs(X) <= 0.001 % DeskNC can't read exponential terms. X = 0; end fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' F',num2str(Perimeter_Machining_feed_rate),' (Move Right)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; if perimeter_layer <= Perimeter_Cuts current_base = bottom_base - (Perimeter_Cuts - perimeter_layer)*perimeter_layer_thickness*( tan(west_angle) + tan(east_angle) );
116
current_length = bottom_length - (Perimeter_Cuts - perimeter_layer)*perimeter_layer_thickness*( tan(south_angle) + tan(north_angle) ); current_min_x = (Perimeter_Cuts - perimeter_layer)*perimeter_layer_thickness*tan(west_angle); current_min_y = (Perimeter_Cuts - perimeter_layer)*perimeter_layer_thickness*tan(south_angle); else % For cutting the base. current_base = bottom_base; current_length = bottom_length; current_min_x = 0; current_min_y = 0; end % Machining CounterClockWise Y = Y_offset + current_min_y - (0.5*Router_diameter); if abs(Y) <= 0.001 Y = 0; end fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' F',num2str(Perimeter_Machining_feed_rate),' (Move)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; X = X_offset + current_min_x + current_base + (0.5*Router_diameter); if abs(X) <= 0.001 % DeskNC can't read exponential terms. X = 0; end fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' (Move)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; Y = Y_offset + current_min_y + current_length + (0.5*Router_diameter); if abs(Y) <= 0.001 Y = 0; end fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' (Move)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; X = X_offset + current_min_x - (0.5*Router_diameter); if abs(X) <= 0.001 % DeskNC can't read exponential terms. X = 0; end fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' (Move)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1;
117
Y = Y_offset + current_min_y - (0.5*Router_diameter); if abs(Y) <= 0.001 Y = 0; end fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' F',num2str(Perimeter_Machining_feed_rate),' (Move)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; end Z = 0.04; fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' Z',num2str(Z),' F',num2str(Z_feed_rate),' (Move Up)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1;
118
B2 – MATLAB Deposition Only Path Generation Code
MAIN CODE Pyramid_Topless_Deposition_Only.M (sub-function codes follow) clc clear all nozzle_diameter = 5/64 %input('\n\nPlease input the nozzle orafice diameter (fraction or decimal) you are using: '); tic %Inputting Vertecies and normals [top_normal, top_face_vertecies, south_normal, south_face_vertecies, north_normal, north_face_vertecies, bottom_normal, bottom_face_vertecies, west_normal, west_face_vertecies, east_normal, east_face_vertecies] = input_vertecies; clc fprintf('Please wait while the G-Code is being Generated\n') % Find distance between top and bottom plane of prototype prototype_height = top_face_vertecies(1,3) - bottom_face_vertecies(1,3); % End Find distance between top and bottom plane of prototype % Caclulating side inclination angles from vertecies % Angle is defined as vertical to surface tangent (opposite to Directed Studies Report definition) west_angle = atan( (west_face_vertecies(1,1)-west_face_vertecies(2,1)) / (west_face_vertecies(1,3)-west_face_vertecies(2,3))); west_angle_displayed = round((180/pi)*west_angle); south_angle = atan( (south_face_vertecies(1,2)-south_face_vertecies(2,2)) / (south_face_vertecies(1,3)-south_face_vertecies(2,3))); south_angle_displayed = round((180/pi)*south_angle); east_angle = atan( (east_face_vertecies(1,1)-east_face_vertecies(2,1)) / (east_face_vertecies(2,3)-east_face_vertecies(1,3))); east_angle_displayed = round((180/pi)*east_angle); north_angle = atan( (north_face_vertecies(1,2)-north_face_vertecies(2,2)) / (north_face_vertecies(2,3)-north_face_vertecies(1,3))); north_angle_displayed = round((180/pi)*north_angle); % End Caclulating side inclination angles from vertecies % Calculate Cad Model (theoretical) volume (in^3) if west_angle_displayed==15 & south_angle_displayed==30 & east_angle_displayed==45 & north_angle_displayed==60 cad_model_volume = 0.8152; %(1.44x2) end % End Calculate Cad Model (theoretical) volume bottom_base = bottom_face_vertecies(1,1)-bottom_face_vertecies(3,1); bottom_length = bottom_face_vertecies(1,2)-bottom_face_vertecies(2,2); deposition_delay = 0.75; % sec layer_thickness = 0.080; nozzle_offset_value = 1.25; %(times current layer thickness) road_width = 0.080; deposition_overlap = 0; XY_feed_rate = 6.0; Z_feed_rate = 1.5; code_line_number = 10; fittest = 1;
119
data_points = 0; % Array for datapoints to be written to a text file. data_points_index = 1; spindle_speed = 4; layer = 0; height_level = 0; X = 0; Y = 0; Z = 0.12; base_height = 0.080;%inch while height_level < prototype_height %+ base_height % Looping for every layer. %The Base is actually deposited in the negative heigh_level. %The +base_height is to deposit another layer on the top so it can be machined down to the correct height. layer = layer + 1; if height_level < prototype_height + base_height - layer_thickness %for every layer but the top. base = bottom_base - height_level*( tan(west_angle) + tan(east_angle) ); length = bottom_length - height_level*( tan(south_angle) + tan(north_angle) ); min_x = height_level*tan(west_angle); min_y = height_level*tan(south_angle); else %for the top extra deposited layer only. base = bottom_base - (height_level - layer_thickness)*( tan(west_angle) + tan(east_angle) ); length = bottom_length - (height_level - layer_thickness)*( tan(south_angle) + tan(north_angle) ); min_x = (height_level - layer_thickness)*tan(west_angle); min_y = (height_level - layer_thickness)*tan(south_angle); end nozzle_offset = nozzle_offset_value*layer_thickness; feed_rate = XY_feed_rate; % Setting to always do same feed rate as calibrated for the machine deposition_method = 2; % Setting to always do this deposition method if layer == 1 % print out setup G-Code. clc layer = layer + 1; % fprintf('O Topless_Pyramid_G_Gode - Program Name\n') % fprintf(['N',num2str(code_line_number),' G20 (Inch mode)\n']) % code_line_number = code_line_number + 10; % fprintf(['N',num2str(code_line_number),' G90 (Absolute mode)\n']) % code_line_number = code_line_number + 10; % fprintf(['N',num2str(code_line_number),' G54 (Set coordinate system to part)\n']) % code_line_number = code_line_number + 10; % fprintf(['N',num2str(code_line_number),' G43 H1 % (nozzle height compensation)\n']) % code_line_number = code_line_number + 10; % ************************************************************************************************************* % This code is for adding a single layer base to the pyramid. % Must set Z=0 at Z=layer_thickness. Thus the first layer (the base) will be deposited in the -Z region. height_level = height_level - layer_thickness; Z = nozzle_offset - layer_thickness; X = -1.5; Y = -0.75;
120
fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' Z',num2str(Z),' F',num2str(Z_feed_rate),' (Return to home) (-1.5,-0.75,Z)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; X = min_x + (0.5*road_width) - deposition_overlap; fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y-0.75 Z',num2str(Z),' F',num2str(XY_feed_rate),' (Move to initial position)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; nozzle_offset = nozzle_offset_value*layer_thickness; num_of_x_roads = ceil((base + (2*deposition_overlap)) / road_width); [code_line_number, X, Y, Z, data_points, data_points_index] = Perimeter_Deposition_Only(fittest, height_level, base, length, min_x, min_y, num_of_x_roads, X, Y, Z, code_line_number, road_width, nozzle_offset, spindle_speed, data_points, data_points_index, feed_rate, deposition_delay, deposition_overlap, layer); % Retracting nozzle to move to the next position X = bottom_base + (4*road_width); fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' F',num2str(XY_feed_rate),' (Retract over)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; Y = -0.75 - (1.25*road_width); fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' F',num2str(XY_feed_rate),' (Retract out)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; X = -1; fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' F',num2str(XY_feed_rate),' (Retract out)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; Z = Z + layer_thickness; fprintf(['\nN',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' Z',num2str(Z),' F',num2str(Z_feed_rate),' (Retract up)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1;
121
feed_rate = XY_feed_rate; height_level = height_level + layer_thickness; % ************************************************************************************************************* Z = height_level + nozzle_offset; X = -1.5; Y = -0.75; fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' Z',num2str(Z),' F',num2str(XY_feed_rate),' (Return to home) (-1.5,-0.75,Z)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; X = min_x + (0.5*road_width) - deposition_overlap; fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y-0.75 Z',num2str(Z),' F',num2str(XY_feed_rate),' (Move to initial position)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; end % Calling appropriate function to generate the G-Code. nozzle_offset = nozzle_offset_value*layer_thickness; num_of_x_roads = ceil((base + (2*deposition_overlap)) / road_width); %if deposition_method == 1 % Zig-Zag Deposition. [outputs] = function(inputs). MUST be the same as IF statement below. % [code_line_number, X, Y, Z, data_points, data_points_index] = Zig_Zag(fittest, height_level, base, length, min_x, min_y, num_of_x_roads, X, Y, Z, code_line_number, road_width, nozzle_offset, spindle_speed, data_points, data_points_index, feed_rate, deposition_delay, deposition_overlap); %end if deposition_method == 2 % Perimeter Zig-Zag Deposition [code_line_number, X, Y, Z, data_points, data_points_index] = Perimeter_Deposition_Only(fittest, height_level, base, length, min_x, min_y, num_of_x_roads, X, Y, Z, code_line_number, road_width, nozzle_offset, spindle_speed, data_points, data_points_index, feed_rate, deposition_delay, deposition_overlap, layer); end %if deposition_method == 3 % Spiral Deposition % [code_line_number, X, Y, Z, data_points, data_points_index] = Spiral(fittest, height_level, base, length, min_x, min_y, num_of_x_roads, X, Y, Z, code_line_number, road_width, nozzle_offset, spindle_speed, data_points, data_points_index, feed_rate, deposition_delay, deposition_overlap); %end % Retracting nozzle to move to the next position X = bottom_base + (4*road_width); fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' F',num2str(XY_feed_rate),' (Retract over)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X;
122
data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; Y = -0.75 - (1.25*road_width); fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' F',num2str(XY_feed_rate),' (Retract out)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; X = -1.0; fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' F',num2str(XY_feed_rate),' (Retract out)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; Z = Z + layer_thickness; fprintf(['\nN',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' Z',num2str(Z),' F',num2str(Z_feed_rate),' (Retract up)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; X = 0 - deposition_overlap; Y = -0.75; fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' F',num2str(XY_feed_rate),' (Move back in)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; feed_rate = XY_feed_rate; height_level = height_level + layer_thickness; save data_points.txt data_points -ASCII % Outputting data_points array to a text file for openening in Surfacer. data_points_index = data_points_index +1; % Creates a blank line to break up data cloud for each layer. Data file manipulation Steps next. % 1.Open data_points.txt % 2.Find and Replace "0.0000000e+000 0.0000000e+000 0.0000000e+000" with nothing (blank line) OR "***End Cloud***" not including quotes for either. % 3.Open in SURFACER with option Open File As: ASCII Delimited. end % Layer Loop %fprintf(['N',num2str(code_line_number),' G28 (Return to home (0,0,2.5)\n']) %code_line_number = code_line_number + 10;
123
%fprintf(['N',num2str(code_line_number),' G49 (End Tool Height Compensation)\n']) %code_line_number = code_line_number + 10; %fprintf(['N',num2str(code_line_number),' M01 (End)\n']) %code_line_number = code_line_number + 10; feed_rate = XY_feed_rate; X = -1; fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' F',num2str(XY_feed_rate),' (Cool Down in)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; fprintf(['\n\nN',num2str(code_line_number),' M02 (End Program and Rewind)\n\n']) save data_points.txt data_points -ASCII % Outputting data_points array to a text file for openening in Surfacer. data_points_index = data_points_index +1; % Creates a blank line to break up data cloud for each layer. Data file manipulation Steps next. % 1.Open data_points.txt % 2.Find and Replace "0.0000000e+000 0.0000000e+000 0.0000000e+000" with nothing (blank line) OR "***End Cloud***" not including quotes for either. % 3.Open in SURFACER with option Open File As: ASCII Delimited. Toc SUBFUCNTION input_verticies.M code is the same as for with machining above. SUBFUNCTION Perimeter_Deposition_Only.M function [code_line_number, X, Y, Z, data_points, data_points_index] = Perimeter_Deposition_Only(fittest, height_level, base, length, min_x, min_y, num_of_x_roads, X, Y, Z, code_line_number, road_width, nozzle_offset, spindle_speed, data_points, data_points_index, feed_rate, deposition_delay, deposition_overlap, layer) perimeter_slow_down = 1; %For Deposition Only. perimeter_delay = 0; %For Deposition Only. Y_deposition_compensation = 0; %in with and without machining. deposition_radius = (0.5*road_width) + 0.015; deposition_overlap = 0; Z = height_level + nozzle_offset; X = min_x + deposition_radius - deposition_overlap; Y = min_y + deposition_radius - deposition_overlap - Y_deposition_compensation; fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' Z',num2str(Z),' F',num2str(perimeter_slow_down*feed_rate),' (Move)\n']) code_line_number = code_line_number + 10;
124
fprintf(['N',num2str(code_line_number),' G04 X',num2str(perimeter_delay*deposition_delay*10),' (dwell ',num2str(perimeter_delay*deposition_delay),'sec)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; Y = min_y + length - deposition_radius + deposition_overlap; fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' (Move)\n']) code_line_number = code_line_number + 10; fprintf(['N',num2str(code_line_number),' G04 X',num2str(perimeter_delay*deposition_delay*10),' (dwell ',num2str(perimeter_delay*deposition_delay),'sec)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; X = min_x + base - deposition_radius + deposition_overlap; fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' (Move)\n']) code_line_number = code_line_number + 10; fprintf(['N',num2str(code_line_number),' G04 X',num2str(perimeter_delay*deposition_delay*10),' (dwell ',num2str(perimeter_delay*deposition_delay),'sec)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; Y = min_y + deposition_radius - deposition_overlap - Y_deposition_compensation; fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' (Move)\n']) code_line_number = code_line_number + 10; fprintf(['N',num2str(code_line_number),' G04 X',num2str(perimeter_delay*deposition_delay*10),' (dwell ',num2str(perimeter_delay*deposition_delay),'sec)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; X = min_x + road_width + deposition_radius; fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' (Move)\n']) code_line_number = code_line_number + 10; fprintf(['N',num2str(code_line_number),' G04 X',num2str(perimeter_delay*deposition_delay*10),' (dwell ',num2str(perimeter_delay*deposition_delay),'sec)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; Y = min_y + road_width + deposition_radius - Y_deposition_compensation; for road_pass_number = 1 : (num_of_x_roads - 3) % "-3" because 2 are deposited in the perimeter, and the thrid because it is already in position for the first.
125
X = min_x + (road_pass_number*road_width) + deposition_radius; if road_pass_number > 1 % To skip first lower left point of the zig zag pattern (already at the correct X first time). fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' F',num2str(feed_rate),' (Move)\n']) code_line_number = code_line_number + 10; fprintf(['N',num2str(code_line_number),' G04 X',num2str(deposition_delay*10),' (dwell ',num2str(deposition_delay),'sec)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; end if Y == min_y + road_width + deposition_radius - Y_deposition_compensation % Zig-Zagging to fill in section. Y = min_y + length - road_width - deposition_radius; else Y = min_y + road_width + deposition_radius - Y_deposition_compensation; end if (X > (base + min_x - (1.15*road_width) - deposition_radius)) % Deposits slower if there is < 15% of a road gap. fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' F',num2str(0.75*feed_rate),' (Move)\n']) else % Deposit at normal speed fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' F',num2str(feed_rate),' (Move)\n']) end code_line_number = code_line_number + 10; fprintf(['N',num2str(code_line_number),' G04 X',num2str(deposition_delay*10),' (dwell ',num2str(deposition_delay),'sec)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; end if layer == 6 %X < (base + min_x - (1.25*road_width) - deposition_radius) % Deposits another road if there is < 25% of a road gap. road_pass_number = road_pass_number + 1; X = min_x + (road_pass_number*road_width) + deposition_radius; fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' F',num2str(feed_rate),' (Move)\n']) code_line_number = code_line_number + 10; fprintf(['N',num2str(code_line_number),' G04 X',num2str(deposition_delay*10),' (dwell ',num2str(deposition_delay),'sec)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z;
126
data_points_index = data_points_index +1; if Y == min_y + road_width + deposition_radius - Y_deposition_compensation % Zig-Zagging to fill in section. Y = min_y + length - road_width - deposition_radius; else Y = min_y + road_width + deposition_radius - Y_deposition_compensation; end fprintf(['N',num2str(code_line_number),' G01 X',num2str(X),' Y',num2str(Y),' F',num2str(feed_rate),' (Move)\n']) code_line_number = code_line_number + 10; fprintf(['N',num2str(code_line_number),' G04 X',num2str(deposition_delay*10),' (dwell ',num2str(deposition_delay),'sec)\n']) code_line_number = code_line_number + 10; data_points(data_points_index,1) = X; data_points(data_points_index,2) = Y; data_points(data_points_index,3) = Z; data_points_index = data_points_index +1; end
127
B3 – MasterCAM Deposition Path Generation Modified Post Processor
*The following are the modified sections of the post processor MPGEN5X.pst. The page
number indicated denotes where the code is found in the original post processor file when
opened in Microsoft Word. The note in brackets indicates the nature of the modification.
p.14 (removing Tool selection comments)
##### Custom changes allowed below #####
ptoolcomment #Comment for tool tnote = t toffnote = tloffno tlngnote = tlngno pstrtool #Comment for tool if strtool <> sblank, [ strtool = ucase(strtool) *strtool, " " ] pcomment #Comment from manual entry (must call pcomment2 if booleans) pcomment2 pcomment2 #Comment from manual entry scomm = ucase (scomm) if gcode = 1006 | gcode = 1026, scomm else, n, "(", scomm, ")" if gcode <> 1007 & gcode <> 1026, e ##### Stop custom changes ##### p.14-15 (reducing output in “else, #5-axis mode”) ##### Custom changes allowed below ##### if mill_plus, #HEXAPOD DOES NOT USE MILL_PLUS# [ if stagetool <= one, if stagetool = one, if n_tpln_mch > m_one, #Toolplane mode [ if lng3(tox_g), pbld, n, "G93", *tox_g, *toy_g, *toz_g, e
128
pbld, n, sg07, *s_out, pf_d_ang, *p_out, str_l1, e pbld, n, *sgabsinc, e pcan1, pbld, n, *sgcode, *xout, *yout, strctxt, e ] else, #5 axis mode [ plane_2 = zero pbld, n, sgplane, e pbld, n, sg07, str_l1, e pbld, n, *sgabsinc, e pcan1, pbld, n, *xout, *yout, *p_out, e ] pbld, n, *zout, e pbld, n, scoolant, e !n_tpln_mch ] else, [ if stagetool <= one, if cut_ra_head & use_g45, #Swap xout and yout based on offset axis [ tloffno2 = tlngno + g45_of_add pcan1, pbld, n, *sgcode, pwcs, *sgabsinc, *yout, *p_out, *s_out, *speed, *spindle, pgear, strctxt, e pbld, n, "G45", *tloffno2, *xout, e ] else, [ #pcan1, pbld, n, *sgcode, pwcs, *sgabsinc, *xout, *yout, *p_out, *s_out, #Stock Lines # *speed, *spindle, pgear, strctxt, e #G00 G54 G90 X.9601 Y.2771 C0. B0. S5000 M3 #Stock Lines pcan1, pbld, n, *sgcode, *xout, *yout, *p_out, *s_out, e #G00 X.9601 Y.2771 C0. B0. #First U and V line. ] if stagetool = one, pbld, n, *next_tool, e #pbld, n, "G43", *tlngno, *zout, scoolant, e #G43 H1 Z.48 #Stock Line pbld, n, *zout, e #Z.48# ] ##### Stop custom changes ##### p.15-16 (modifying 5-axis pitch and roll coordinates. Replaced entire code after main “else”) ##### Custom changes allowed below ##### if mill_plus, [ if n_tpln_mch > m_one, [ pcan1, pbld, n, pwcs, e if lng3(tox_g), pbld, n, "G93", *tox_g, *toy_g, *toz_g, e pbld, n, sg07, *s_out, pf_d_ang, *p_out, str_l1, e pbld, n, *sgabsinc, e pcan1, pbld, n, *sgcode, *xout, *yout, strctxt, e ]
129
else, [ pbld, n, pwcs, e if prv_n_tpln_mch > zero, [ plane_2 = zero pbld, n, sgplane, e pbld, n, sg07, str_l1, e pbld, n, sgabsinc, e ] pcan1, pbld, n, *sgcode, *xout, *yout, *p_out, *s_out, strctxt, e ] pbld, n, *zout, e ] #else, pbld, n, pwcs, sgabsinc, *xout, *yout, *zout, *p_out, *s_out, e #Stock Line else, if p_out = 0 & s_out = -30, [ pbld, n, *xout, *yout, *zout, "U0.", "V-30.", e ] if p_out = 90 & s_out = -45, [ pbld, n, *xout, *yout, *zout, "U-45.", "V0.", e ] if p_out = 180 & s_out = -46, [ pbld, n, *xout, *yout, *zout, "U0.", "V46.", e ] if p_out = 270 & s_out = -46, [ pbld, n, *xout, *yout, *zout, "U46.", "V0.", e ] !n_tpln_mch ##### Stop custom changes ##### p.16-17 (commenting out outputs in “if not(mill_plus)”) ##### Custom changes allowed below ##### if ntools = one, [ #skip single tool outputs, stagetool must be on stagetool = m_one !next_tool ] if progno = zero, progno = one if not(mill_plus), [ #pbld, n, *smetric, e #commented out
130
#pbld, n, "G00", *sgplane, "G40", "G80", "G90", *sgfeed, "G98", e #commented out ] sav_absinc = absinc absinc = one prefreturn #xout, p_out not output here absinc = zero p_absinc_chng ptoolcomment comment pcan ##### Stop custom changes ##### p.18 (removing outputs) ##### Custom changes allowed below ##### if not(mill_plus), sav_absinc = absinc absinc = one prefreturn #xout, p_out not output here absinc = sav_absinc ptoolcomment comment pcan sav_absinc = absinc absinc = zero p_absinc_chng ##### Stop custom changes ##### p.18-19 (replacing code after main “else” to set the feed rate). ##### Custom changes allowed below ##### pbld, n, scoolant, e pbld, n, sccomp, spindle, e pbld, n, s_plock, e pbld, n, s_slock, e absinc = one prefreturn #xout, p_out not output here absinc = sav_absinc if mill_plus, [ pbld, n, sg28, *g74zabs, "L1", e #EOF on prv_gcode = 1003 if prv_gcode = 1003, pbld, n, sg28, *g74xabs, *g74yabs, e pbld, n, sg07, str_l1, e if lng3(tox_g), pbld, n, "G93", "X0.", "Y0.", "Z0.", e if prv_gcode = 1003, frc_cinit = one protretinc if prv_gcode = 1003,
131
[ pbld, n, sg07, s_out, pf_d_ang, p_out, str_l1, e ] ] #else, pbld, n, *sg28, protretinc, e # Stock Line else, pbld, n, protretinc, e prefreturn #Refernce return if not(mill_plus), [ #pbld, n, *sgcode, *sg28, *sgabsinc, "Z0.", e #Stock Line with G28 pbld, n, *sg01, "Z2.0", "F6.0", *sgfeed, e #Modified to include G01 and Feed Rate. Line1. if toolchng = one, pbld, n, *sgcode, *sg28ref, "X0.", "Y0.", e ] ##### Stop custom changes ##### p.21 (removing feed rate output, “#” comments out code) plinout #Output to NC of linear movement - feed if mill_plus, [ pbld, n, sgplane, e pbld, n, sgabsinc, e pbld, n, sgfeed, e ] #pcan1, pbld, n, `sgcode, sgplane, sgabsinc, sgfeed, pccdia, #xout, yout, zout, p_out, s_out, p_mpls_feed, `feed, strctxt, scoolant, e #Stock Lines pcan1, pbld, n, `sgcode, xout, yout, zout, e if nc_lout <> m_one & feed = zero, psfeederror
132
References [1] Hur J. et al., Hybrid rapid prototyping system using machining and deposition. Computer-Aided Design 34 (2002) 741-754. [2] Yan, X. et al., Survey: A review of rapid prototyping technologies and systems. Computer-Aided Design, Vol, 28. No. 4, pp. 307-318, 1996. [3] Pham, D.T. et al., A comparison of rapid prototyping technologies. International Journal of Machine Tools & Manufacture 38 (1998) 1257-1287. [4] Williams, R.E. et al., Investigation of the effect of various build methods on the performance of rapid prototyping (stereolithography). Journal of Materials Processing Technology 61 (1996) 173-178. [5] Jandric, M. et al., Effect of heat sink on microstructure of three-dimensional parts built by welding-based deposition. International Journal of Machine Tools & Manufacture 44 (2004) 785-796. [6] Hongjun, L. et al., A note on rapid manufacturing process of metallic parts based on SLS plastic prototype. Journal of Materials Processing Technology 142 (2003) 710-713. [7] Karunakaran, K.P. et al., Efficient stock cutting for laminated manufacturing. Computer-Aided Design 34 (2002) 281-298. [8] Tyberg, J. et al., FDM systems and local adaptive slicing. Materials and Design 20 (1999) 77-82. [9] Grida, I. et al., Extrusion freeforming of ceramics through fine nozzles. Journal of the European Ceramic Society 23 (2003) 629-635. [10] Dimension Printing, Online Articles, http://www.dimensionprinting.com/company/company-articles.shtml (April, 2006). [11] Madahian P., Implementation and testing of a 3-D hybrid rapid prototyping system capable of deposition and machining. Ryerson University Masters Thesis Report (2003). [12] Salustri F., Design Methodologies, http://deseng.ryerson.ca/dm1016/ (April, 2006). [13] Groover, M.P., Fundamentals of Modern Manufacturing: Materials, Processes, and Systems, John Wiley & Sons, Inc, New York, 1999. [14] Zhong, W. et al., Short fiber reinforced composites for fused deposition modeling. Materials Science and Engineering A301 (2001) 125–130.
133
[15] Juvinal, R.C. et al., Fundamentals of Machine Component Design, 3rd Edition. John Wiley & Sons, Inc, New York, 2000. [16] Rosato, D.V. et al., Plastics Design Handbook. Springer-Verlag. USA, 2001. [17] Pandey, P.M. et al., Improvement of surface finish by staircase machining in fused deposition modeling. Journal of Materials Processing Technology 132 (2003) 323-331. [18] Pratt, M.J. et al., Progress towards an international standard for data transfer in rapid prototyping and layered manufacturing. Computer-Aided Design 34 (2002) 1111-1121. [19] Chen, Y.H. et al., The development of a layer based machining system. Computer-Aided Design 33 (2001) 331-342. [20] Campbell, R.I. et al., Surface roughness visualisation for rapid prototyping models. Computer-Aided Design 34 (2002) 717-725.
134