Created
May 4, 2014 06:14
-
-
Save electronut/d5e5f68c610821e311b0 to your computer and use it in GitHub Desktop.
Display analog data from Arduino using Python (matplotlib animation)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
ldr.py | |
Display analog data from Arduino using Python (matplotlib) | |
Author: Mahesh Venkitachalam | |
Website: electronut.in | |
""" | |
import sys, serial, argparse | |
import numpy as np | |
from time import sleep | |
from collections import deque | |
import matplotlib.pyplot as plt | |
import matplotlib.animation as animation | |
# plot class | |
class AnalogPlot: | |
# constr | |
def __init__(self, strPort, maxLen): | |
# open serial port | |
self.ser = serial.Serial(strPort, 9600) | |
self.ax = deque([0.0]*maxLen) | |
self.ay = deque([0.0]*maxLen) | |
self.maxLen = maxLen | |
# add to buffer | |
def addToBuf(self, buf, val): | |
if len(buf) < self.maxLen: | |
buf.append(val) | |
else: | |
buf.pop() | |
buf.appendleft(val) | |
# add data | |
def add(self, data): | |
assert(len(data) == 2) | |
self.addToBuf(self.ax, data[0]) | |
self.addToBuf(self.ay, data[1]) | |
# update plot | |
def update(self, frameNum, a0, a1): | |
try: | |
line = self.ser.readline() | |
data = [float(val) for val in line.split()] | |
# print data | |
if(len(data) == 2): | |
self.add(data) | |
a0.set_data(range(self.maxLen), self.ax) | |
a1.set_data(range(self.maxLen), self.ay) | |
except KeyboardInterrupt: | |
print('exiting') | |
return a0, | |
# clean up | |
def close(self): | |
# close serial | |
self.ser.flush() | |
self.ser.close() | |
# main() function | |
def main(): | |
# create parser | |
parser = argparse.ArgumentParser(description="LDR serial") | |
# add expected arguments | |
parser.add_argument('--port', dest='port', required=True) | |
# parse args | |
args = parser.parse_args() | |
#strPort = '/dev/tty.usbserial-A7006Yqh' | |
strPort = args.port | |
print('reading from serial port %s...' % strPort) | |
# plot parameters | |
analogPlot = AnalogPlot(strPort, 100) | |
print('plotting data...') | |
# set up animation | |
fig = plt.figure() | |
ax = plt.axes(xlim=(0, 100), ylim=(0, 1023)) | |
a0, = ax.plot([], []) | |
a1, = ax.plot([], []) | |
anim = animation.FuncAnimation(fig, analogPlot.update, | |
fargs=(a0, a1), | |
interval=50) | |
# show plot | |
plt.show() | |
# clean up | |
analogPlot.close() | |
print('exiting.') | |
# call main | |
if __name__ == '__main__': | |
main() |
I'm having the following error:
usage: ldr.py [-h] --port PORT
ldr.py: error: the following arguments are required: --port
An exception has occurred, use %tb to see the full traceback.
Hi, i really like your job. Can you tell me how could i change de direction of the grafic?, for this code run to turn left, i want to right
JuanDanielSoto,
Change addToBuffer to:
add to buffer
def addToBuf(self, buf, val):
if len(buf) < self.maxLen:
buf.append(val)
#buf.extendleft(val)
else:
#buf.pop()
#buf.appendleft(val)
buf.popleft()
buf.append(val)
can we use pyfirmata for the same code ?and how we edit that in this code
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Very helpfull but I have this error when I run my code
usage: ldr.py [-h] --port PORT ldr.py: error: the following arguments are required: --port
can you help me ?