Summary of Simple Arduino data-collection
The article discusses a simple method to use an Arduino as a tethered analog-to-digital converter for direct data collection to a computer. The Arduino waits for a command byte via serial, then sends N pairs of timestamp (millis()) and analogRead() data from pin A0 at 10 ms intervals. On the computer side, a Python script using Pylab reads the data, saves it, and plots it. This setup allows straightforward real-time data acquisition with minimal hardware and software complexity, suitable for physics lab experiments.
Parts used in the Arduino Data Collection Project:
- Arduino board (e.g., Arduino Uno)
- Analog sensor (e.g., light sensor connected to analog pin A0)
- USB cable for serial communication
- Computer with Python environment (with pylab/scipy/numpy/matplotlib installed)
At this year’s “Arduinos in the Physics Lab” workshop at the AAPT meeting, one of the participants asked for a simple way of using the Arduino as a tethered A/D converter for data collection direct to a computer. This is my quick & dirty demonstration solution.
Here’s the code for the Arduino. It waits for a single byte ‘N’ to arrive on the serial port, then once that byte arrives it sends out N data pairs formatted as tab-separated millis() and analogRead() values. The readings are separated by roughly 10 milliseconds. This version of the code only reports the values of analog pin 0 (A0), but it can be easily modified to return other (or more) ports.
For the computer end, I used Python: here’s the code. This was done on a Macintosh, with Pylab installed so I can use matplotlib to handle the plotting nicely. On Linux or Windows the port will be described differently, and if the program fails for you on the line ‘import pylab as pl’ then … well, install pylab on your system. It’s a great wrapper package for scipy, numpy, and matplotlib. The program expects two arguments: the number of points to collect and the filename where points should be saved.
Here’s a sample output plot, showing relatively meaningless data from a light sensor.
One glitch I found was that there needs to be a short delay between starting the serial communications to the Arduino and sending the request for N data points. I do not know whether this is a problem with the Arduino in general, or with the Arduino Uno I was using as a testbed, or with the pyserial library, or with the Macintosh implementation of pyserial…
For more detail: Simple Arduino data-collection