Professional Documents
Culture Documents
01 Rheology Open Science Final
01 Rheology Open Science Final
Rasmus Røjkjær‡, Emil Andersen‡,#, Simon Heide-Jørgensen†, Carmine Ciallella#, René Mikkelsen#,
Søren Kristiansen#, Mogens Hinge‡*
‡
Plastic and Polymer Engineering, Department of Engineering, Aarhus University, Hangøvej 2, DK-
8200 Aarhus N, Denmark
†Mechanical Engineering Section, Department of Engineering, Aarhus University, Inge Lehmanns
Gade 10, DK-8000 Aarhus C, Denmark
#
LEGO Systems A/S, Kløvermarken 16, DK-7190 Billund, Denmark
Abstract
An automated way of evaluating the recovery process of polymers was developed. Poly(acrylonitrile
butadiene styrene) (ABS) specimens were exposed to a constant strain for 24 hr, and thus creep and
stress relaxation occurred. Manual and automated procedures were developed and tested, and the
results were compared. The automated data acquisition process was superior both quantitatively and
qualitatively in terms of data compared to the manual acquisition. A Weibull distribution function
was successfully fitted to the data. The developed experimental setup produced a stable system,
reliable data, and it was found that the recovery of ABS followed the Weibull model during the
recovery process.
Introduction
When polymeric materials are exposed to the same amount of deformation, or strain, over a period
of time, stress relaxation, which is a phenomenon where the strain remains constant to the stress,
decreases over time introducing plastic strain to the material. This is due to the polymers being
viscoelastic. When a polymer element is elongated, the intertwined polymer strands in said element
will straighten and start to move in the element. Thus, prolonged strain can cause the polymer
strands to elongate to such a degree that permanent deformation occurs and recovery is only
partially possible. When the loading is removed from the material it will only recover the elastic
part of the strain, while the plastic part from the relaxation will remain, which effects the overall
dimensions and shape of the structure. A similar phenomenon, called creep, occurs if a constant
stress is applied to the polymer over time resulting in continuous deformation and accumulation of
plastic strain. Relaxation-recovery, or creep-recovery, testing can be used to reveal long-term
properties of polymer materials and is crucial for mechanical performance of plastics in many
products (e.g. soft drink containers, caps, seat polstering, and piping).
Page 1
Figure 1. – The monomers of ABS; acrylonitrile, butadiene, and styrene.
Where 𝜀𝑒𝑙𝑎𝑠𝑡𝑖𝑐 is the instantaneous, elastic strain, 𝜀𝑣𝑖𝑠𝑐𝑜𝑒𝑙𝑎𝑠𝑡𝑖𝑐 is the delayed, time-dependent
viscoelastic strain and 𝜀𝑝𝑒𝑟𝑚𝑎𝑛𝑒𝑛𝑡 is permanent, inelastic, viscous strain. Elastic strain occurs
immediately when the load is applied. Viscoelastic strain and the viscous strain are delayed
compared to the elastic strain and happens at a decreasing rate until they become self-similar. Upon
unloading the viscoelastic strain recovery occurs at a decreasing rate until only the unrecoverable
viscous strain remains. To get a description of a viscoelastic material experiencing creep (or stress
relaxation) a combination of different models are often necessary e.g. Burger’s model and Zener
Model (Crawford, 2006) (Findley, et al., 1989). An effective way of modelling the recovery
behaviour of polymers is through the Weibull distribution function, which reads: (Fancey, 2005)
𝑡 − 𝑡0 𝛽𝑟
𝜀(𝑡) = 𝜀𝑣𝑖𝑠𝑐𝑜𝑒𝑙𝑎𝑠𝑡𝑖𝑐 [exp (− ) ] + 𝜀𝑝𝑒𝑟𝑚𝑎𝑛𝑒𝑛𝑡 (2)
𝜂𝑟
Where 𝑡 is the time from load application, 𝑡0 is the time of load removal, 𝜂𝑟 is the life factor and 𝛽𝑟
is the shape parameter. Since recovery only takes place after the load has been removed, the elastic
strain disappears as it recovers immediately.
This work gives a standardised way of evaluating the recovery process of polymer elements.
Testing procedures are developed and evaluated using ABS specimens. An optical approach
employing a standard webcam, adapted reading table, ImageJ, and a custom-made algorithm is
implemented whereby constants are obtained by curve fitting.
Page 2
Figure 2. - 3D-model of experimental setup (left) and developed experimental setup (right)
Sample stressing
Standard dogbones specimens (100x10x2 mm3) with
a 40 mm thought were used for testing. Specimens
were mounted in a fixture resulting in 2.5% axial
strain (see Figure 4) at the middle of the specimen.
The strain was kept for 24 hr in a temperature-
controlled environment of 20-22 °C. Figure 3. –Test specimen
Page 3
Weibull Fitting
Eq. (2) was used to fit the model to the data and the constants were obtained. The programs used were
OriginPro 2018, and/or Microsoft Office Excel 2018 with the add-on “solver”. The solver add-on
utilizes the method of least squares, which calculates the constants by minimizing the difference
between the measured and calculated values
Results
Preliminary experiments showed that an artificial light source was necessary for minimizing the
change in daylight and that ceiling light was sufficient for this purpose. Images were captured on the
black and white backgrounds, as seen in Figure 5.
Figure 5. – Automatically captured image on black background (left) and manually captured image on white background (right)
Black background produces better contrast for the image analysis algorithm compared to the white
background as seen in Figure 5. Please note that there is a difference in resolution from 8 megapixels
(left) to 10 megapixels (right) in the two images.
Page 4
While-loop states that while the variable “self.k” (name of the currently captured image) is less or
equal to the constant “self.MAX” (being the number of images captured) then the progress bar is
updated and after a 60 sec delay an image is captured. Every fifth image is saved as
“IMG_XXXX.jpg” where XXXX is the image number, which also timestamps the image relative to
when the script has been started. The full script is given in Appendix III: Python (3.6) IDLE
ImageJ Macro
A custom macro was written for ImageJ to find the
bending height. Only a short explanation of the central
parts of the macro is described. See Appendix II: ImageJ
Macro for the full macro. Pre-image transformations are
shown in Figure 8 and is executed before evaluating the
height of the creeped specimen.
Figure 9 shows first part of the bend height algorithm defining the constants and the line at which the
pixel analysis takes place. For-loop evaluates all the pixel on the line and the x-value is changed to
the intensity-value of the current pixel. Three counters counts the number of black pixels before the
first white (end of the specimen), the number of white pixels (width at the first end of the specimen),
and number of black pixels before the next white pixel (hence between the two ends of the specimen),
respectively.
Page 5
Figure 10. - Height analysis algorithm part 2
Knowing the distance between the specimen ends the second part of the algorithm (Figure 10) is
executed. Initial counting the number of white pixels at the end of the specimen. Hereafter the two
variables “maks” and “sted” are set equal to “result” and “x”, respectively (they are used later to log
and save the values). The midpoint of a line determined by half the sizes of the specimen’s ends
(whiteteller1 and 2) and the distance between these (blackteller2) is found. A new line is drawn
perpendicular from this midpoint to the top of the image. A new for-loop is started where the number
of black pixels to the first white pixel (below the specimen) and
the number of white pixels (the width of the specimen) are
counted and stored in blackteller3 and whiteteller3 (not shown),
respectively.
Recovery experiments
The recovery data obtained with the manual approach are shown in Figure 12.
Page 6
Figure 12. - Recovery data of ABS test specimens manually captured and evaluated with exponential decay fits
Figure 12 shows that the recovery curves resemble exponential decaying functions. The different
values of the curves when fitting the Weibull model are given in Table 1.
Table 1. – Weibull model values obtained from the least squares method
Specimen a b c d e
εve 1.95·10 -3
1.67·10 -3
1.92·10 -3
1.79·10 -3
1.75·10-3
ηr 41597 61793 35106 37679 47939
βr 0.363 0.395 0.359 0.359 0.270
εf 4.8·10-3 4.7·10-3 4.6·10-3 5.5·10-3 4.7·10-3
Table 2 shows a comparison between manual and automated procedures performed on the same
images.
Table 2. - Comparison between automatic and manual bending heights in pixel and mm
Image Image Time Manual Manual (mm) Automatic Automatic
number name (hr) (pixels) (pixels) (mm)
1 1 0.02 68.3 10.04 67.5 9.93
49 241 4.02 53.7 7.89 53.0 7.79
577 2881 48.02 45.5 6.69 44.0 6.47
2017 10081 168.02 38.7 5.68 36.5 5.37
Manual results are one to two pixels lower than the automated counterparts. Giving a precision of 0.1
mm which is within human error in the manual analysis.
Results obtained from the automated recovery experiment of only one test specimen gave 2016
pictures analysed automatically and the recovery data are shown in Figure 13.
Page 7
Figure 13. – Fitted Weibull model of automatically obtained recovery data
Discussion
The scope of the experimental setup is to produce an easy-to-make setup that produces stable and
uniform images from which the recovery process of specimens can be evaluated. In the produced
setup a large degree of flexibility was necessary to ensure that the setup could easily be adjusted to
fit different angels and distances. For a permanent setup this flexibility is not necessary, and a
permanent fixation of the webcam and specimen holder could be made. A small economical
evaluation showed that the automated experimental setup was approx. 1000DKK all included. This
low-price range is easily compensated by the short operation time, compared to the operation time of
the manual procedure (with only 4 images). The images captured with the setup differed only in the
amount of light, and the recovery process of the specimens, meaning that the images were deemed
stable.
When comparing the image quality (Figure 5) it is seen that the experimental setup produces images
similar to the manually captured with only one major difference being the resolution. This difference
can be minimised with a higher resolution webcam, if deemed necessary. Other major differences are
the introduction of human factors when capturing and analysing images manually. Especially
difficulties when controlling the distance between the camera and specimen and the camera angle
with respect to the specimen. Manual and automatic evaluation of the specimen strain was performed
on the same images to examine if similar results were obtainable with the two procedures. The
methods are within two pixels from each other. This difference is within human errors when
evaluating the height in ImageJ. It is evaluated that the automatic method is equal to (or better) than
the manual method. Furthermore, the image capturing settings are fully controlled in the automatic
experimental setup.
From Figure 13 the fitted model to the automated data is shown. It is seen that the Weibull distribution
describes the obtained data with a R2-value of 0.989. When comparing Figure 12 and Figure 13 it is
Page 8
noted that a significant amount of information is missing in the manual method, when only capturing
images in specific time points. This also results in the difference in values obtained from the Weibull
fitting, it is seen that the automatic variables vary from the manual being 325 times larger (𝜀𝑣𝑒 ) to
2237 times smaller (𝜀𝑓 ) which confirms the difference in information gathered in the experiments. In
a previous study made by (Daver, et al., 2016) where the creep-recovery phenomena were
investigated in Polyolefin-Rubbers similar values, to the automatic experiment, were obtained, which
suggests that the values obtained automatically can be assumed reliable.
Conclusion
A cheap, stable, and reliable optical setup is made, and an image capture script is developed
together with an automatic image analysis macro for ImageJ. The setup produces 500 times (can
easily be tweaked to produce 2500 times) more data points than the manual approach with less
human interaction/effort. This is a dramatically increase in data-points resulting in better estimation
of the mechanically parameters.
Acknowledgements
The authors greatly acknowledge Dan Kristiansen (Software-Engineer student, Data-logical faculty,
Aalborg University) for his support and read-through the programming in Python.
References
Crawford, R. J., 2006. Plastics Engineering. 3rd ed. Oxford: Elsevier.
Daver, F., Mladenko, K., Brandt, M. & Shanks, R. A., 2016. Creep and Recovery Behaviour of
Polyolefin-Rubber Nanocomposites Developed for Additive Manufacturing. Special Issue
Nanocomposites of Polymers and Inorganic Particles 2016, 8(12), p. 437.
Fancey, K. S., 2005. A mechanical model for creep, recovery and stress relaxation in polymeric
materials. Journal of material science - September 2005.
Fancey, K. S., 2005. A mechanical model for creep, recovery and stress relaxation in polymeric
materials. JOURNAL OF MATERIALS SCIENCE , 40(18), p. 4827–4831.
Findley, W. N., Lai, J. S. & Onaran, K., 1989. Creep and Relaxation of Nonlinear Viscoelastic
materials. New York: Dover publications, INC..
Gere, J. M., 2004. MECHANICS of MATERIALS. 6th ed. Belmount, USA: THOMSON;
BROOKS/COLE.
Schiessel, H., Metzler, R., Blument, A. & Nonnonmacher, T. F., 1995. Generalized viscoelastic
models: their fractional equations with solutions. Freiburg, Germany: IOP Publishing Ltd..
Wang, X. & al., e., 2015. Temperature dependence of creep and recovery behaviors of polymer
composites filled with chemically reduced graphene oxide. Composites Part A; Applied Science and
Manufacturing , Volume 69, pp. 288-298.
Wittcoff, H. A., Reuben, B. G. & Plotkin, J. S., 2013. Industrial Organic Chemistry. 3rd ed.
Hoboken (New Jersey): Wiley.
Page 9
Appendix I: Experimental setup dimensions
Page I
Appendix II: ImageJ Macro
//------------------------------Constants and Naming-----------------------------//
bilstart = 1;
bilslut = 10081;
base = "C:\\...add link to images... \\IMG_";
picturetype = ".JPG"
//------------------------------Area of Interest-------------------------------//
startx = 4
starty = 125
deltax = 642
deltay = 187
xmindste = 5
black =70
linjexstart = 0
linjeystart = 170
linjexslut = 642
linjeyslut=170
//-------------------------------Counters---------------------------------------------//
whiteteller1=0
blackteller1=0
whiteteller2=0
blackteller2=0
whiteteller3=0
blackteller3=0
//------------------------------Code for Naming-------------------------------//
print("\\Clear")
print("Working on converting "+bilslut+bilstart+" images");
print("Please wait...");
setBatchMode(true);
run("Clear Results");
Teller = 0
for(j=bilstart; j<=(bilslut+bilstart); j+=5) {
showProgress(j, bilslut);
navn = j;
//if (j<10) {navn = "000"+j;}
//if (j>9) {navn = "00"+j;}
//if (j>99) {navn = "0"+j;}
//if (j>999) {navn = ""+j;}
sti =base+navn+picturetype;
open(sti);
input = getImageID();
//-------------------------------Pre-Imagetransformation--------//
run("8-bit");
makeRectangle(startx, starty, deltax, deltay);
run("Crop");
setAutoThreshold("Default B&W");
setThreshold(0, black);
run("Convert to Mask");
Page II
//------------------------------Algorithm for height analysis--------------//
k=1;
maks=0;
result=0;
whiteteller1=0;
whiteteller2=0;
blackteller1=0;
blackteller2=0;
makeLine(linjexstart, linjeystart, linjexslut, linjeyslut);
for(x=0; x<=deltax-1; x++) {
result=getPixel(x,linjeystart);
if(whiteteller1<=0) {
if(result>254) {
if(x<(deltax/2)) {
blackteller1=blackteller1+1;
};};};
if(result<1) {
if(x<(deltax/2)) {
whiteteller1=whiteteller1+1;
};};
if(whiteteller1>0) {
if(whiteteller2 <=0) {
if(result>254) {
blackteller2=blackteller2+1;
};};};
if(result<1) {
if(x>(deltax/2)) {
whiteteller2=whiteteller2+1;
result=0;
};};
if(x>xmindste) {
if(result>maks) {
maks=result;sted=x;
};};
};
makeLine((blackteller1+(whiteteller1/2)), linjeystart,
(blackteller1+whiteteller1+blackteller2+(whiteteller2/2)), linjeyslut);
length = (whiteteller2/2) + (whiteteller1/2) + blackteller2;
midpoint = blackteller1 + (length/2);
makeLine(midpoint, linjeystart, midpoint, 0);
whiteteller3=0;
blackteller3=0;
for(y=linjeystart; y>=1; y--) {
resulty=getPixel(midpoint,y);
if(whiteteller3<=0) {
if(resulty>254) {
blackteller3=blackteller3+1;
};};
Page III
if(resulty<1) {
whiteteller3=whiteteller3+1;
};};
height = (whiteteller3/2) + blackteller3;
setResult(k, Teller, navn);
setResult(k+1, Teller, length);
setResult(k+2, Teller, height);
selectImage(input);
run("Close");
Teller=Teller+1;
};
//-----------------------------Writing and Saving of Results ------------------//
gemnavn = base+"resultat.txt";
updateResults();
saveAs("Results",gemnavn);
setBatchMode(false);
beep();
print("DONE! :)");
//-----------------------------Information in the log-window-----------------------------//
print("\n")
print("Please note that in the results window, column:")
print("1 = The image number")
print("2 = The length of the test element")
print("3 = The height of the test element af half the length")
Page IV
Appendix III: Python (3.6) IDLE script
from tkinter import Tk, Label, Button, ttk, LEFT, RIGHT, BOTTOM, TOP
from tkinter import *
import time, threading, os, errno
class GUI:
experiment = 0
MAX=60*24*7
path = '/home/pi/Webcam/' + time.strftime("%d-%m-%Y")
def start(self):
self.k = 0
self.pictureCount = 0
#self.start_button["text"] = "Reset"
self.start_button.destroy()
self.close_button.pack(side=LEFT)
if os.path.exists(self.path):
os.makedirs(self.path)
else:
while os.path.exists(self.path + str(self.experiment)):
self.experiment += 1
os.makedirs(self.path + str(self.experiment))
self.label = Label(master, text="This program was developed to capture images of test elements
doing experiments, \n in order to evaluate the relaxation process.")
self.label.pack(side=TOP)
self.t1 = threading.Thread(target=self.start)
self.start_button = Button(text="Start", command=self.t1.start)
self.start_button.pack(side=LEFT)
Page V
self.close_button = Button(master, text="Stop", command=master.quit)
#self.close_button.pack(side=LEFT)
self.progress_var = DoubleVar()
self.progressbar = ttk.Progressbar(root, variable=self.progress_var, maximum=self.MAX)
self.progressbar.pack(fill=X, expand=1, side=LEFT)
self.photo = PhotoImage(file=self.pathlego)
self.photo_label = Label(image=self.photo)
self.photo_label.image = self.photo
self.photo_label.pack(side=RIGHT)
root = Tk()
root.geometry('{}x{}'.format(700, 350))
my_gui = GUI(root)
root.mainloop()
Page VI