Echtzeit-Oszilloskop mit Matplotlib erstellen

PythonPythonBeginner
Jetzt üben

This tutorial is from open-source community. Access the source code

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

Dieses Tutorial ist eine Schritt-für-Schritt-Anleitung, wie man mit Python's Matplotlib-Bibliothek ein Oszilloskop erstellt. Ein Oszilloskop ist ein Gerät, das zur Messung und Darstellung von Spannungssignalen über die Zeit verwendet wird. In diesem Tutorial werden wir das Animationsmodul von Matplotlib nutzen, um eine Echtzeitdarstellung eines Spannungssignals zu erstellen.

Tipps für die virtuelle Maschine (VM)

Nachdem die virtuelle Maschine gestartet wurde, klicken Sie in der oberen linken Ecke, um zur Registerkarte Notebook zu wechseln und auf Jupyter Notebook für die Übung zuzugreifen.

Manchmal müssen Sie möglicherweise einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Die Validierung von Operationen kann aufgrund von Einschränkungen in Jupyter Notebook nicht automatisiert werden.

Wenn Sie während des Lernens Probleme haben, können Sie sich gerne an Labby wenden. Geben Sie uns nach der Sitzung Feedback, und wir werden das Problem umgehend für Sie lösen.

Bibliotheken importieren

Bevor wir mit dem Codieren beginnen, müssen wir die erforderlichen Bibliotheken importieren. Wir werden Matplotlib, NumPy und das Animationsmodul verwenden.

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.animation as animation
from matplotlib.lines import Line2D

Die Scope-Klasse einrichten

Die Scope-Klasse wird die Daten und Methoden enthalten, die wir für die Erstellung des Oszilloskops benötigen. Im Konstruktor initialisieren wir die erforderlichen Variablen und richten das Diagramm ein.

class Scope:
    def __init__(self, ax, maxt=2, dt=0.02):
        self.ax = ax
        self.dt = dt
        self.maxt = maxt
        self.tdata = [0]
        self.ydata = [0]
        self.line = Line2D(self.tdata, self.ydata)
        self.ax.add_line(self.line)
        self.ax.set_ylim(-.1, 1.1)
        self.ax.set_xlim(0, self.maxt)

Die Update-Methode definieren

Die update-Methode wird für jeden Frame der Animation aufgerufen. Sie nimmt einen neuen Wert entgegen und aktualisiert das Diagramm entsprechend.

def update(self, y):
        lastt = self.tdata[-1]
        if lastt >= self.tdata[0] + self.maxt:  ## reset the arrays
            self.tdata = [self.tdata[-1]]
            self.ydata = [self.ydata[-1]]
            self.ax.set_xlim(self.tdata[0], self.tdata[0] + self.maxt)
            self.ax.figure.canvas.draw()

        t = self.tdata[0] + len(self.tdata) * self.dt

        self.tdata.append(t)
        self.ydata.append(y)
        self.line.set_data(self.tdata, self.ydata)
        return self.line,

Die Emitter-Funktion erstellen

Die emitter-Funktion generiert die Daten, die an die update-Methode übergeben werden. In diesem Fall generieren wir Zufallsdaten mit einer Wahrscheinlichkeit von 0,1.

def emitter(p=0.1):
    while True:
        v = np.random.rand()
        if v > p:
            yield 0.
        else:
            yield np.random.rand()

Das Diagramm einrichten

Wir erstellen ein neues Diagramm (Figure) und ein Achsenobjekt (Axis) und initialisieren die Scope-Klasse. Anschließend übergeben wir die update- und emitter-Funktionen an die FuncAnimation-Methode, um die Animation zu erstellen.

fig, ax = plt.subplots()
scope = Scope(ax)

ani = animation.FuncAnimation(fig, scope.update, emitter, interval=50,
                              blit=True, save_count=100)

plt.show()

Zusammenfassung

In diesem Tutorial haben wir gelernt, wie man Matplotlib verwendet, um ein Oszilloskop zu erstellen, das Spannungssignale über die Zeit anzeigt. Wir haben eine Scope-Klasse definiert, um die für das Oszilloskop benötigten Daten und Methoden zu speichern, eine update-Methode erstellt, um das Diagramm zu aktualisieren, und die emitter-Funktion verwendet, um die Daten zu generieren. Schließlich haben wir das Diagramm eingerichtet und die update- und emitter-Funktionen an die FuncAnimation-Methode übergeben, um die Animation zu erstellen.