Monitor an Arduino's serial output from Python
Debugging Arduino sensors can sometimes be tricky. While working on my Arduino sonar project, I found myself wanting to know what values the Arduino was reading from its analog port.
It's easy enough to print from the Arduino to its USB-serial line. First add some code like this in setup():
Serial.begin(9600);Then in loop(), if you just read the value "val":
Serial output from Python
That's all straightforward -- but then you need something that reads it on the PC side.
When you're using the Arduino Java development environment, you can
set it up to display serial output in a few lines at the bottom of
the window. But it's not terrifically easy to read there, and I
don't want to be tied to the Java IDE -- I'm much happier doing my
development from the command line. But then how do you read serial
output when you're debugging?
In general, you can use the screen program to talk to serial
ports -- it's the tool of choice to log in to plug computers.
For the Arduino, you can do something like this:
screen /dev/ttyUSB0 9600
But I found that a bit fiddly for various reasons. And I discovered
that it's easy to write something like this in Python, using
You can start with something as simple as this:
import serial ser = serial.Serial("/dev/ttyUSB0", 9600) while True: print ser.readline()
Serial input as well as output
That worked great for debugging purposes. But I had another project (which I will write up separately) where I needed to be able to send commands to the Arduino as well as reading output it printed. How do you do both at once?
With the select module, you can monitor several file descriptors at once. If the user has typed something, send it over the serial line to the Arduino; if the Arduino has printed something, read it and display it for the user to see.
That loop looks like this:
while True : # Check whether the user has typed anything (timeout of .2 sec): inp, outp, err = select.select([sys.stdin, self.ser], , , .2) # If the user has typed anything, send it to the Arduino: if sys.stdin in inp : line = sys.stdin.readline() self.ser.write(line) # If the Arduino has printed anything, display it: if self.ser in inp : line = self.ser.readline().strip() print "Arduino:", line
Add in a loop to find the right serial port (the Arduino doesn't always show up on /dev/ttyUSB0) and a little error and exception handling, and I had a useful script that met all my Arduino communication needs: ardmonitor.
[ 20:27 Oct 16, 2011 More hardware | permalink to this entry | ]