Based
Data Acquisition
Quick and easy data
By Eric Bogatin
[email protected]
acquisition and display
with an Arduino
I love data. Measuring things, plotting the results in a way to instantly
visualize the behavior, and — most importantly — analyzing the results.
Maybe it's because of my physics training, but even as old as I am, I still
get a thrill when I can measure something and have it match the
predictions of a simple model. This is especially ex 1g when I can
collect the measurements by computer and utilize the power of easy-to-
use yet powerful tools to perform the plotting and analysi
Why an Arduino Based Data
Acquisition System
Figure 1 is an example of the measured voltage from
4 modified speaker with a large hanging mass that is part
of the sensor I use in a selsmometer project. This is the
transient response of the system when perturbed, showing
the damped oscillations
The setup for this measurement is shown in Figure 2. |
used an analog front end to convert the induced current
from the speaker into a voltage in the range an Arduino
can measure with its analog pin,
From the measured data, | can fit the resonant
frequency and ¢factor for an ideal damped oscillator. The
agreement of this simple ideal model and this real physical
system is really remarkable.
‘Av the heart ofthis process is bringing the data into
the computer. While there are a few really cool low cost
data acquisition systems like the DATAQ DF145 Electronic
34 WITSEVONS June 2015
Strip Chart Recorder ($29) and the more advanced
Lablack ($108), 've been exploring using an Arduino as a
data acquisition interface to the real world,
Even a low end! RedBoard (UNO compatible from
SparkFun for $19.95) has six independent analog-to-igital
converters (ADC), each with 10-bit resolution, This makes
Arduinos potentially great platforms for sensor data
acquisition. When I started down this path to use an
Arduino as a data acquisition system, the stumbling block
for me was how to get the data from the Arduino directly
into an analysis tool like Microsoft Excel.
I wanted a method that was easy, robust, low cost,
and wasn't a long time-consuming process involving
hacking a lot of code. Did | mention | wanted it to be
easy?
The problem was not that | couldn't find any way of
doing this. The problem was that | found too many ways
Cf doing this. When | Googled “Arduino data acquisition,”
1 got more than 250,000 entries. They generally fell intoPost comments on this article and find any associated files and/or downloads at
‘www. nutsvolts.com/index.php?/magazine/article/june2015 Bogatin.
three categories: in real time through the serial port;
data logging into an SD card; or by WiFi into the 600
cloud.
‘While data logging or sending the data to acloud 3 go9
server are really cool, for my first application | wanted B
to use my Arduino as a tethered data acquisition unit <
and suck out the data over the USB cable. git
Programming the Arduino to print data to the serial =
port — while there are a few timing limitations — is g 300
easy. It’s getting the data from the serial port into an B® + os Cd
immediately useful format that was the challenge. Z 200
There were only 129,000 entries in Google under &
“Arduino serial data acquisition.” The options for 300
reading the data on the serial port ranged from simple
programs written in Processing, Python, or C, to using ml
highend tools like LabVIEW and MatLab. (Did | sf sf Su Gk oS Ge oF
mention | wanted an easy process?)
Then, there were the standalone tools that folks Time, sec
had written to read the serial terminal, parse the FIGURE 1. Measured response from the speaker and the fit to an
numbers, and display them in various ways. Some ideal damped oscilator model, The agreement is excellent and even
‘were free; some cost from $19 to over $99. shows the onset of anharmonic behavior at small amplitude
I spent time playing
around with many of these
tools. My criterion was |
wanted to look at the data in
real time as it came out of the
Arduino, and display it in a
high quality plot — preferably
Excel compatible. Plus, |
wanted the learning curve to
be at most five minutes with
minimal additional code | had
to add to my Arduino
sketches. (Did I mention |
wanted it easy?)
After trying out more than
20 different tools, | settled on
the best tool | found that met
my criterion of being really
easy and — best of all — it was
free: PLY-DAQ.
The Simplest
Way to Get
Data from an
Arduino into
Microsoft Excel
PLX.DAQ is really a FIGURE 2, a compete measurement system consisting of the sensor (modified seat),
macro that runs in Microsoft the analog front end (an op-amp moumied in a breadboard), the data acguistion system
Excel. It is free and can be (my Arduino), and a scope used for diagnostics and debugging.
June 2015 WUTSIVONS. 35downloaded from Parallax, Ine. Ironically, it was.
32 af (PEK flag == true) (
xc | Makanesedk putees “hy originally written for Stamp microcontrollers — a
| Wetec bklocee) Competitor to Arduinos. Since it just reads the data
= pase a coming in on the serial port, it’s really independent
. mata geENE I", “i of the specific microcontroller, as long as the
aF correct command words are sent over the USB
37 Serfal.print (tame_dat: es
38 Serdal.print(", "); The Arduino writes successive rows of data
23) separated by commas to the serial port using the
40 crStnte aftne _Serialprint() command. The word "DATA" has to
41 Seetal. print (chant_val) ; sonal one be written in front of each row of data, with each
23| donee iguana eo commands column of data separated by commas. That's it.
a POR BAG to That's all that needs to be added to normal
12,| Ogee nc vail pare the Arduino code to start plotting data in Excel using
- ae characters on PLX-DAQ. Figure 3 shows a code snippet to write
49° Serial.print(", ")7 the serial port dala to PLXDAQ.
as oe 1 adided a conditional flag to print the fist two
87 Serial. printin(chand_val) ; mere is
P val) + spreadsheet columns of data containing the number of averages
40° digatalweite (pin_ledl1, LoW) ; for each data point and the specific time the data
a) item was taken, only when using PLX-DAQ.
‘As a quick test, | looked at the data printed to
the serial monitor as the three channels were read
LABEL, NpteAveraged, Time (sec) ,Chani,Chan2,Chan3 34 printed to the serial port. Figure 4 shows the
e " : - serial monitor response — just as we expected. It
DATA, 129, 0.025, 199.00, 569.57, 465.00 has the right format to be read by PLCDAQ.
DATA, 123, 0.076, 199.00, 569.55, 465.00 When you download and install the PLX-DAQ
DATA, 123, 0.126, 199.00, 569.56, 465.00 ool fe crenlesian Excel spreait eer wihan:
embedded macro. You have to enable the macro
DATA, 123, 0.176, 199.00, 569.54, 465.00 sredalloudetnrunt the strendibedt ltopersiam
DATA, 123, 0.227, 199.00, 569.54, 465.00 has three tabs, or worksheets. By default, PL-DAQ
DATA, 123, 0.277, 199.00, 569.54, 465.00 will write all new data into the first worksheet. | set
FIGURE 4, The characters printed tothe sertl port inthe format read ne uP t0 prot the values ithe des data
ane columns against the time column, using an XY
ii laa a scatter graph. This is just one of the multiple types
of displays PLX:DAQ can create.
In the small dialog window that opens up in PL-DAQ
(shown in Figure 5), there are two settings you have to
set: the COM port for the Arduino; and the baud rate. 1
always use the highest baud rate | can get away with
3 While most published example code I see uses 9600
PLX-DAQ 3 : baud, | never do this.
ings The highest baud rate | routinely get transferring into
Eres s PLX-DAQ is 56000. This is my default value, In the void
setup() function, I place the line Serial.begin (56000);. You
also have to set this value in the PLX-DAQ dialog box.
‘When you click the “connect” button, PLX-DAQ sends
a rest command to the Arduino which starts the sketch
from the beginning and catches all the transmitted data.
This is effectively the start button,
Figure 6 shows an example of the Excel spreadsheet
with the five columns of data and the plot of the three
FIGURE 5. The dialog box to set up PLX-DAQ. It automatically
‘opens when you open Excel and enable macros. You only need
to change the COM port and baud rate.
36 WUTSNONS June 2015B_pe, bie
[Chant Chan? Chan]
O05 | 2067317452 46h 27
oor | 2oe73 17334 46438
os | 209 73s asta7
ore | 2oee 172.19 46459
O27 | aos 17297 48476
o2re | aoees 17272 4647
036 | 2o67e. 1725 asu73
oars | ose? 1727 46476
0426 | 20677 arn0s 5474
oar? | 2069 shot 46477
gor | 2oes6 17016 4s
sre | 20a artot 446
0626 | 20562 17096 465
ogre | ose 17134 465.02
07s | 0677 17136 46481
07m | 20688 17128 6408
oes | aoser arias 45499
oars | 2oga 17115 448
ea | 2oes ria 45495
0976 | 20659 1700546501
1026 | 20688 7201465
1076 | 2067817086 46506
FIGURE 6. The final result: The spreadsheet showing the data as it came in and the result
‘Analog values, ADUs
8
fF 6 8
8
0 1 2 3% 4 so 6 70 8
Time, see
plot of the three channels of
‘ADCvalues (0 to 1023) using the time stamp data, This plot can be modified using standard Excel tools.
analog channels. | created the plot using the builtin Excel
functions so that any data written into the columns D, €,
and F would be plotted in real time as it came in, using
column B — the time —as the X axis,
A Little Finesse —
Making Life Easier
It really took me less than five minutes after opening
PLX-DAQ for the first time before | had data in Excel and
plotted. Now, I was ready to add a few simple features to
lean up the data.
PLX-DAQ understands a few code words. The word
DATA in front of each line of data (separated by commas)
is the command to place each data value in a separate
cell on the same row.
The line feed Serial printin(), as the last line in the
serial print statements, also prints the line feed and tells,
Avoid this common problem: While the standard baud
‘ate forthe serial partis 57600, PLX-DAG only offers the option for
‘56000 f you use 57600, some ofthe data read by PLX-DAQ wil be
‘garbled. You must set up the baud rate inthe Arduino sketch withthe
‘same value as you select in PLX-DAQ. | recommend the highest value
of S6000 as your default.
‘Avoid this common problem: Only one device can use the
serial port ata time. The most common mistake | make is having the
serial monitor open to read the serial port while I want to have PLX-
DAQ read the data.| get an error in this case, Wait for the cade to be
‘uploaded tothe Arduino and be running. Make sure nothing else is
talking over the same COM port, and then click the “connect” button.
Likewise, to talk tothe Arduino, be sure to click the “disconnect”
‘button on the PLX-DAQ dialog box to free up the serial port
connection for the Arduino
PLXDAQ to add the next set of data to a new row.
There are two other commands | find very useful. The
first is CLEARDATA. When this key word is printed to the
serial port, PLX-DAQ will clear the cells in the Excel
spreadsheet and move its pointer to start adding data to
row 1 in the first worksheet. This means | can use the
same worksheet over and over again — especially if | have
a graph already formatted the way | want.
‘When I have a set of data collected and I want to
keep it, | make a copy of it and place the copy in the first
sheet position, This is done with a right mouse click on
the worksheet tab and selecting the copy command.
Now, | have a new worksheet ready to collect and
plot data with formatted plots, but it’s full of old data,
When the CLEARDATA command is sent, the old data in
this new spreadsheet is cleared out and I start over with a
blank worksheet. Fortunately, a plot is already formatted,
waiting for new data to plot.
The second command that makes my life easier is
LABEL. [like to have my data as well documented as
possible. In this simple example, | wanted to display five
columns of data, the number of points averaged per data
value, the real time each data point was taken, and the
three analog values from each channel. | used the LABEL
‘command to send the labels for each column (separated
by commas) as the first command,
This command only needs to be sent once, to set up
the column labels. | put this in the void setup() function,
so it executes right at the beginning of the sketch. Since |
‘wanted a litte flexibility on how use the serial port, |
added the flag to only print the LABEL command and
values if the PLX_flag is set for true. These commands are
June 2015 MITSTONS. 3798 if (PLX_flag == true) (
39 Serial. print1n("CLEAPDATA")
too
101}
Avoid this common problem: Since the CLEARDATA
command erases all the data inthe spreadsheet, make sure you
cither want to remove the data or have anew worksheet set up in the
first tab position before you click the “connect” button
shown in Figure 7.
With these two additional features, I can set up a
worksheet exactly the way I want it with the graph
formatied using all the builtin cool features of Excel, and I
ccan use this worksheet over and over for each new run of
measurements. The old data in the copied sheet is cleared
out, the column headings are added, and all the data
flows into the sheet in real time.
Measuring the Timing
of Arduino Operation:
a New Window for Debugging
Now that 1 could effortlessly bring data into a
spreadsheet, | focused on the quality of the data and how
FIGURE 8, Screenshot from the Analog Discovery scope
showing the measured 10-90 rise time of the Arduino digital
signal of 16 nsec. This is limited by the scope. Its actual rise
time, measured with a faster scope, is 3 nsec.
38 WITSNIONS June 2015
FIGURE 7. The additional commands added in the void
setup() function to first clear the old data out and add labels
in the first row of the spreadsheet.
Serial. print 1n("LABEL, IptsAveraged, Time (sec) ,Chan1, Chan2,Chan3") ;
fast I could take it
A key feature of a data acquisition system is to have
an accurate time associated with each data point. | didn’t
just want a lot of data points; | wanted a lot of data at
welkdefined instants of time.
The best way of capturing the acquisition time is to
take advantage of the builtin timer functions, milis() and
imicros(). They return the current elapsed time since the
‘Arduino was turned on in milliseconds and microseconds,
respectively
‘As long as | record the system time just before and
just after an analog measurement, | can get an accurate
measure of the actual time stamp for each data point, The
challenge was to determine how fast I could collect and
write the data.
‘Most online forums suggest using the builtin timer
functions like millis() ot micros() to calculate the execution
times and print the results to the serial port, You just have
to add debug code to measure the time intervals between
sections of your code, print the times out to the serial
port, and read them with the serial monitor.
While this is a useful technique, | am a measurement
guy and like to use my scope and digital write pins to get
Useful timing information of Arduino code. | think this is
an important technique as it gives a very visual window
into the time it takes for sections of code to execute. | use
Avoid this common problem: Evenif you initialize a
timer as an unsigned long the largest integer value it can hold is
43x 10°, If ths is in microseconds, the longest time you can
record before the timer resets is 43x 10%3 seconds, which is about
‘T1 minutes. If you want to record date with atime stamp for a
longer time than 71 minutes, use the mis) timer. This can count up
1000x longer, or 49 days before resetting,
‘wow datag.comv/product/-145/
hitpaabjack coms
www sperifun.com/products/12757
ww paraliax.com/downloads/pi-daq
‘wwew digilentine.com/Products/Detailcfm?NavPath=2,842,
iProd=ANALOG-DISCOVERY&CFID=78249778
fOKEN=6286900393957611-CES4CASE-5056-201-
(2083883866529
www sparkfun,com/products/250
‘wewwsparkfun.com/products/9088
2
<
i
= on
md oTit to debug my code all the time.
‘My favorite scope is the Digilent Analog Discovery
scope. This is a two-channel, 10 MHz bandwidth, 100
Msample/sec, USB scope with 14-bit vertical resolution
and a builtin two-channel arbitrary wave generator. It also,
has a 16