From b0f61ccf3f32ec1b7ae895a0fe45bbbb16b39675 Mon Sep 17 00:00:00 2001 From: Christopher Stone Date: Thu, 8 Feb 2018 20:35:04 +0000 Subject: [PATCH] Working demo for plotting a live graph of data recieved over a serial connection! --- telemetry/code/monitor/graph_plotter.py | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ telemetry/code/monitor/pyglet_test.py | 65 ----------------------------------------------------------------- telemetry/code/robot/analogread_demo/analogread_demo.ino | 20 ++++++++++++++++++++ telemetry/code/robot/fading_led_demo/fading_led_demo.ino | 6 ++++-- 4 files changed, 116 insertions(+), 67 deletions(-) create mode 100755 telemetry/code/monitor/graph_plotter.py delete mode 100644 telemetry/code/monitor/pyglet_test.py create mode 100644 telemetry/code/robot/analogread_demo/analogread_demo.ino diff --git a/telemetry/code/monitor/graph_plotter.py b/telemetry/code/monitor/graph_plotter.py new file mode 100755 index 0000000..d36881b --- /dev/null +++ b/telemetry/code/monitor/graph_plotter.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python + +import pyglet +import math +import random +import time +import serial + +datafeed = serial.Serial( + port='/dev/ttyUSB0', + baudrate = 9600, + parity=serial.PARITY_NONE, + stopbits=serial.STOPBITS_ONE, + bytesize=serial.EIGHTBITS, + timeout=1 +) + +window = pyglet.window.Window() +window.set_caption("Test graph") + +starttime = time.time() + +title = pyglet.text.Label('Test Graph', + font_name='Arkhip', + font_size=12, + x=window.width//2, y=window.height//2, + anchor_x='center', anchor_y='top') + + +def round_sig(x, sig=2): + return round(x, sig-int(math.floor(math.log10(abs(x))))-1) + +def drawgrid(xlines, ylines, xlimits, ylimits): + pyglet.gl.glColor4f(0.5, 0.5, 0.5, 1.0) + for xpos in range(0, window.width, window.width/xlines): + pyglet.graphics.draw(2, pyglet.gl.GL_LINES, ('v2i', (xpos, 0, xpos, window.height))) + tagtext = str(round((xlimits[1]-xlimits[0])*(float(xpos)/window.width), 1)) + tag = pyglet.text.Label(tagtext, font_name='Arkhip', font_size=10, x=xpos-2, y=0, anchor_x='right', anchor_y='bottom') + tag.draw() + for ypos in range(0, window.width, window.width/ylines): + pyglet.graphics.draw(2, pyglet.gl.GL_LINES, ('v2i', (0, ypos, window.width, ypos))) + tagtext = str(round((ylimits[1]-ylimits[0])*(float(ypos)/window.height), 1)) + tag = pyglet.text.Label(tagtext, font_name='Arkhip', font_size=10, x=0, y=ypos-2, anchor_x='left', anchor_y='top') + tag.draw() + + +def plotline(xdata, ydata): + pyglet.gl.glColor4f(1, 0, 0, 1.0) + points = [] + for n in range(max(len(xdata), len(ydata))): + try: + xpos = ((xdata[n]-min(xdata))*window.width)/(max(xdata)-min(xdata)) + except: + xpos = 0 + xpos = int(xpos) + try: + ypos = ((ydata[n]-min(ydata))*window.height)/(max(ydata)-min(ydata)) + except: + ypos = 0 + ypos = int(ypos) + points.append([xpos, ypos]) + for n in range(len(points)-1): + pyglet.graphics.draw(2, pyglet.gl.GL_LINES, ('v2i', (points[n][0], points[n][1], points[n+1][0], points[n+1][1]))) + + +xdata = [0] +ydata = [0] + + +@window.event +def on_draw(): + window.clear() + #ydata.append(random.uniform(0, 10)) + value = datafeed.readline() + try: + value = float(value) + ydata.append(value) + print("Value: " + str(ydata[-1])) + + if len(ydata) > 250: + del ydata[0] + xdata.append(round(time.time() - starttime, 3)) + if len(xdata) > 250: + del xdata[0] + except: + pass + drawgrid(10, 12, [min(xdata), max(xdata)], [min(ydata), max(ydata)]) + plotline(xdata, ydata) + + + +pyglet.app.run() \ No newline at end of file diff --git a/telemetry/code/monitor/pyglet_test.py b/telemetry/code/monitor/pyglet_test.py deleted file mode 100644 index e03abb5..0000000 --- a/telemetry/code/monitor/pyglet_test.py +++ /dev/null @@ -1,65 +0,0 @@ -import pyglet -import math -import random -import time - -window = pyglet.window.Window() -window.set_caption("Test graph") - -starttime = time.time() - -title = pyglet.text.Label('Test Graph', - font_name='Arkhip', - font_size=12, - x=window.width//2, y=window.height//2, - anchor_x='center', anchor_y='top') - - -def round_sig(x, sig=2): - return round(x, sig-int(math.floor(math.log10(abs(x))))-1) - -def drawgrid(xlines, ylines, xlimits, ylimits): - pyglet.gl.glColor4f(0.5, 0.5, 0.5, 1.0) - for xpos in range(0, window.width, window.width/xlines): - pyglet.graphics.draw(2, pyglet.gl.GL_LINES, ('v2i', (xpos, 0, xpos, window.height))) - tagtext = str(round((xlimits[1]-xlimits[0])*(float(xpos)/window.width), 1)) - tag = pyglet.text.Label(tagtext, font_name='Arkhip', font_size=10, x=xpos-2, y=0, anchor_x='right', anchor_y='bottom') - tag.draw() - for ypos in range(0, window.width, window.width/ylines): - pyglet.graphics.draw(2, pyglet.gl.GL_LINES, ('v2i', (0, ypos, window.width, ypos))) - tagtext = str(round((ylimits[1]-ylimits[0])*(float(ypos)/window.height), 1)) - tag = pyglet.text.Label(tagtext, font_name='Arkhip', font_size=10, x=0, y=ypos-2, anchor_x='left', anchor_y='top') - tag.draw() - - -def plotline(xdata, ydata): - pyglet.gl.glColor4f(1, 0, 0, 1.0) - points = [] - for n in range(max(len(xdata), len(ydata))): - xpos = ((xdata[n]-min(xdata))*window.width)/(max(xdata)-min(xdata)) - xpos = int(xpos) - ypos = ((ydata[n]-min(ydata))*window.height)/(max(ydata)-min(ydata)) - ypos = int(ypos) - points.append([xpos, ypos]) - for n in range(len(points)-1): - pyglet.graphics.draw(2, pyglet.gl.GL_LINES, ('v2i', (points[n][0], points[n][1], points[n+1][0], points[n+1][1]))) - - -xdata = [0] -ydata = [0] - - -@window.event -def on_draw(): - window.clear() - ydata.append(random.uniform(0, 10)) - if len(ydata) > 100: - del ydata[0] - xdata.append(round(time.time() - starttime, 3)) - if len(xdata) > 100: - del xdata[0] - drawgrid(10, 12, [min(xdata), max(xdata)], [min(ydata), max(ydata)]) - plotline(xdata, ydata) - - -pyglet.app.run() \ No newline at end of file diff --git a/telemetry/code/robot/analogread_demo/analogread_demo.ino b/telemetry/code/robot/analogread_demo/analogread_demo.ino new file mode 100644 index 0000000..b2417cd --- /dev/null +++ b/telemetry/code/robot/analogread_demo/analogread_demo.ino @@ -0,0 +1,20 @@ +/* + * Read analogue data, send it on + * + * A starting point for a robot monitoring system + * By the UoN Robot Wars project, 2018 + * This code is under the GPL + */ + +#include + +void setup() { + Serial.begin(9600); + Serial.println("Hello, World"); + pinMode(13, OUTPUT); +} + +void loop() { + float avalue = analogRead(A0); + Serial.println(avalue); +} diff --git a/telemetry/code/robot/fading_led_demo/fading_led_demo.ino b/telemetry/code/robot/fading_led_demo/fading_led_demo.ino index 0ed51f1..423cf05 100644 --- a/telemetry/code/robot/fading_led_demo/fading_led_demo.ino +++ b/telemetry/code/robot/fading_led_demo/fading_led_demo.ino @@ -16,12 +16,14 @@ void setup() { void loop() { // PWM an LED, fading sinusoidally - double major_frequency = 0.3; - double minor_frequency = 100; + double major_frequency = 0.5; + double minor_frequency = 50; double duty = 0.5+(0.5*sin(2*PI*major_frequency*millis()/1000)); Serial.println(duty); digitalWrite(13, HIGH); delay(1000 * duty/minor_frequency); digitalWrite(13, LOW); delay(1000 * (1-duty)/minor_frequency); + float avalue = analogRead(A0); + //Serial.println(avalue); } -- libgit2 0.21.2