Commit d9d096654b60a4186c37e26a4aa4cd8e350f3d61
1 parent
ba381288
Exists in
master
Demo reading two values from serial, plotting them on the same graph
Showing
4 changed files
with
43 additions
and
26 deletions
Show diff stats
robots/little_john/telemetry/code/monitor/version1/main.py
... | ... | @@ -40,7 +40,7 @@ else: |
40 | 40 | os='Other' |
41 | 41 | logging.info('OS = ' + os) |
42 | 42 | |
43 | -testseries = Series(points=150, ylimits=(9, 1024), title="Sine wave demo", xname="Time (s)", yname="100sin(t)") | |
43 | +testseries = Series(points=150, ylimits=(0, 1024), title="Data from serial", xname="Time (s)", yname="ADC output") | |
44 | 44 | plots = [] |
45 | 45 | plots.append(Plot(testseries)) |
46 | 46 | |
... | ... | @@ -48,13 +48,22 @@ def pollSerial(elapsed): |
48 | 48 | """Check serial port for incoming data""" |
49 | 49 | # Note: 'elapsed' is time since last call of this function |
50 | 50 | # This works, but it might be better for performance to have two seperate functions, only one of which is run. |
51 | - if os=='Windows': | |
52 | - values = datafeed.readline().strip().split(b", ") | |
53 | - else: | |
54 | - values = datafeed.readline().strip() | |
55 | - values = values.split(b', ') | |
51 | + try: | |
52 | + if os=='Windows': | |
53 | + values = datafeed.readline().strip().split(b", ") | |
54 | + else: | |
55 | + values = datafeed.readline().strip() | |
56 | + values = values.split(b', ') | |
57 | + except: | |
58 | + logging.error("Failed to recieve or parse input data") | |
59 | + return | |
60 | + | |
56 | 61 | for n, value in enumerate(values): |
57 | - values[n] = float(value) | |
62 | + try: | |
63 | + values[n] = float(value) | |
64 | + except: | |
65 | + logging.error("Failed to convert input to float") | |
66 | + return | |
58 | 67 | #logging.info("Recieved data: " + str(values)) |
59 | 68 | testseries.addpoint([time.time()-starttime] + values) |
60 | 69 | |
... | ... | @@ -66,6 +75,6 @@ def fakePollSerial(elapsed): |
66 | 75 | testseries.addpoint(values) |
67 | 76 | |
68 | 77 | # Pyglet looks after the main event loop, but this ensures that data keeps being read in |
69 | -pyglet.clock.schedule_interval(pollSerial, 0.04) | |
78 | +pyglet.clock.schedule_interval(pollSerial, 0.01) | |
70 | 79 | |
71 | 80 | pyglet.app.run() | ... | ... |
robots/little_john/telemetry/code/monitor/version1/plot.py
... | ... | @@ -40,7 +40,7 @@ class Plot(pyglet.window.Window): |
40 | 40 | self.drawHeading() |
41 | 41 | self.drawAxis(0) |
42 | 42 | self.drawAxis(1) |
43 | - self.drawLine(self.series) | |
43 | + self.drawLines(self.series) | |
44 | 44 | |
45 | 45 | def drawBackground(self): |
46 | 46 | """Draw the graph background, currently a plain colour""" |
... | ... | @@ -54,7 +54,7 @@ class Plot(pyglet.window.Window): |
54 | 54 | anchor_x='center', anchor_y='top') |
55 | 55 | heading.draw() |
56 | 56 | |
57 | - def drawLine(self, series): | |
57 | + def drawLines(self, series): | |
58 | 58 | xscale = float(self.series.xlimits[1]-self.series.xlimits[0])/(self.bounds[0][1]-self.bounds[0][0]) |
59 | 59 | yscale = float(self.series.ylimits[1]-self.series.ylimits[0])/(self.bounds[1][1]-self.bounds[1][0]) |
60 | 60 | lmar = int(self.width * self.margins[0]) |
... | ... | @@ -63,17 +63,24 @@ class Plot(pyglet.window.Window): |
63 | 63 | bmar = int(self.height * self.margins[1]) |
64 | 64 | |
65 | 65 | pyglet.gl.glLineWidth(2) |
66 | - | |
67 | - for n in range(len(series.data) - 1): | |
68 | - x1, y1 = series.data[n][0]-series.xlimits[0], series.data[n][1]-series.ylimits[0] | |
69 | - x2, y2 = series.data[n+1][0]-series.xlimits[0], series.data[n+1][1]-series.ylimits[0] | |
70 | - x1 = int((x1/xscale)+lmar) | |
71 | - y1 = int((y1/yscale)+bmar) | |
72 | - x2 = int((x2/xscale)+lmar) | |
73 | - y2 = int((y2/yscale)+bmar) | |
74 | - pyglet.graphics.draw(2, pyglet.gl.GL_LINES, | |
75 | - ('v2i', (x1, y1, x2, y2)), | |
76 | - ('c3B', (255, 0, 0, 255, 0, 0))) | |
66 | + | |
67 | + linecolours = [(255, 0, 0, 255, 0, 0), (0, 0, 255, 0, 0, 255)] | |
68 | + | |
69 | + try: | |
70 | + for m in range(len(series.data[0])-1): | |
71 | + for n in range(len(series.data) - 1): | |
72 | + x1, y1 = series.data[n][0]-series.xlimits[0], series.data[n][m+1]-series.ylimits[0] | |
73 | + x2, y2 = series.data[n+1][0]-series.xlimits[0], series.data[n+1][m+1]-series.ylimits[0] | |
74 | + x1 = int((x1/xscale)+lmar) | |
75 | + y1 = int((y1/yscale)+bmar) | |
76 | + x2 = int((x2/xscale)+lmar) | |
77 | + y2 = int((y2/yscale)+bmar) | |
78 | + pyglet.graphics.draw(2, pyglet.gl.GL_LINES, | |
79 | + ('v2i', (x1, y1, x2, y2)), | |
80 | + ('c3B', linecolours[m])) | |
81 | + except: | |
82 | + logging.error("Failed to plot lines, possibly due to corrupt/missing data. (This happens at startup)") | |
83 | + | |
77 | 84 | pyglet.gl.glLineWidth(1) |
78 | 85 | |
79 | 86 | ... | ... |
robots/little_john/telemetry/code/monitor/version1/series.py
... | ... | @@ -32,8 +32,11 @@ class Series: |
32 | 32 | self.data.append(point) |
33 | 33 | if len(self.data) > self.points: |
34 | 34 | del self.data[0] |
35 | - self.autoscale(0) | |
36 | - | |
35 | + try: | |
36 | + self.autoscale(0) | |
37 | + except: | |
38 | + logging.error("Series autoscale failed") | |
39 | + | |
37 | 40 | def autoscale(self, axis): # axis=0 is x, 1 is y |
38 | 41 | minval = self.data[0][axis] |
39 | 42 | maxval = self.data[0][axis] | ... | ... |
robots/little_john/telemetry/code/robot/analogread_demo/analogread_demo.ino
... | ... | @@ -6,7 +6,6 @@ |
6 | 6 | * This code is under the GPL |
7 | 7 | */ |
8 | 8 | |
9 | -#include <math.h> | |
10 | 9 | #include <SoftwareSerial.h> |
11 | 10 | |
12 | 11 | SoftwareSerial Bluetooth(3, 2); // Rx, Tx |
... | ... | @@ -14,7 +13,6 @@ SoftwareSerial Bluetooth(3, 2); // Rx, Tx |
14 | 13 | void setup() { |
15 | 14 | Serial.begin(9600); |
16 | 15 | Bluetooth.begin(115200); |
17 | - //Bluetooth.print("Hello, wireless world!"); | |
18 | 16 | pinMode(13, OUTPUT); |
19 | 17 | } |
20 | 18 | |
... | ... | @@ -25,5 +23,5 @@ void loop() { |
25 | 23 | Bluetooth.print(a0value); |
26 | 24 | Bluetooth.print(", "); |
27 | 25 | Bluetooth.println(a7value); |
28 | - delay(500); | |
26 | + delay(100); | |
29 | 27 | } | ... | ... |