Ob PWM, I2C oder RS-232, jeder Bus tickt ein wenig anders. Wie? Das zeigt Ihnen bereits ein einfaches Speicheroszilloskop wie das JYE Tech DSO112A.
Die Kosten für ein Speicheroszilloskop der Profiklasse lassen sich in etwa mit denen für ein Notebook vergleichen. Sind Sie sich unsicher, ob Sie eines benötigen, führen Sie die ersten Tests am besten mit einem sogenannten Taschenoszilloskop durch. Wir haben bereits in einem früheren Artikel [1] das Oszilloskop DSO112A der Firma JYE Tech vorgestellt. Im Internet ist es bereits für weniger als 100 Euro zu haben.
Dieser Artikel erläutert den Einsatz eines solchen Speicheroszilloskops in der Praxis. Zum einen macht das Gerät die elektrischen Signale diverser Sensoren sichtbar, zum anderen ist es ein unentbehrliches Werkzeug, um einem Raspberry Pi bei der Arbeit zu beobachten. So lässt sich ein Blick auf die Signale des I2C-Busses und die RS232- und PWM-Kanäle werfen.
Speicheroszilloskop DSO112A
Das DSO112A besitzt fast alle Eigenschaften eines großen Speicheroszilloskops. Die Einschränkungen fasst der Kasten “Grenzen des DSO112A” zusammen. Das Gerät lässt sich auch als einfacher AD-Wandler einsetzen und kann seine Daten unmittelbar an einen Rechner weitergeben.
Grenzen des DSO112A
- Einfaches Gehäuse, wenig mechanische Schalter, filigrane Kontakte
- Einkanal-Oszilloskop
- Grenzfrequenz: 2 MHz
- Auflösung der Eingangsspannung: 8 Bit
- Trigger: ab einer Zeitbasiseinstellung von 5 µs/div
- Automatische Frequenzbestimmung: unterhalb von 50 ms/div
- Speichertiefe: 512 oder 1024 Messwerte
- Nichtflüchtiger Speicher: 1 Datenscan
Die Grundzüge, wie ein Linux-Rechner, beispielsweise ein Raspberry Pi, Daten einliest, beschrieb ausführlich der vorige Beitrag zum DSO112A, den Sie auch im Download-Bereich zu diesem Artikel finden. Eine Kurzfassung einer Session mit dem DSO112A zeigt Listing 1. Die Befehle daraus könnte ein Shell-Skript nacheinander abarbeiten. Stattdessen bettet Listing 2 die Befehle in die Kontrollstruktur von Python ein.
Listing 1
Daten einlesen
### Vorbereitung $ screen -d -m -S uartn /dev/ttyUSB0 115200 ### Warten auf Daten $ screen -S uartn -X exec \!\! rx -X daten.csv ### Testen des Status $ fuser -u daten.csv ### Beenden $ screen -S uartn -p 0 -X quit
Listing 2
readdso.py
#!/usr/bin/env python3
'''
Usage: ./readdso.py filename.csv
Read data from DSO112a and save it in filename.csv
'''
import sys
import subprocess
import time
waitmax=90 # seconds
def readdsof(fn):
# prepare session named "uartn"
comscreen = 'screen -d -m -S uartn /dev/ttyUSB0 115200'
result = subprocess.run(comscreen, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
time.sleep(1)
# wait for data
comscreen = f'screen -S uartn -X exec \!\! rx -X {fn}'
result = subprocess.run(comscreen, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
print("Press 'send data' now!'")
comfile = f'fuser -u {fn}'.split()
waitfor = waitmax #sec
while waitfor:
time.sleep(1)
result = subprocess.run(comfile, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
print('*', end='', flush=True)
if result.returncode:
print("ready!")
break
waitfor -= 1
if not waitfor:
print("Failure")
# error procedure may follow ( print variables, terminate screen...)
else:
print(f' {fn} successfully saved after {waitmax-waitfor} seconds.')
# terminate screen session
comscreen = 'screen -S uartn -p 0 -X quit'.split()
result = subprocess.run(comscreen, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
print('done')
if name == '__main__':
assert sys.version_info >= (3,7)
fn=sys.argv[1]
print('read DSO')
readdsof(fn)
Das Programm readdso.py testet in Zeile 44 zunächst die Version von Python und bricht ab, wenn sie älter ist als 3.7. Anderenfalls müsste der subprocess angepasst werden. Sowohl Ubuntu 20.04 als auch das aktuelle Raspberry Pi OS bringen eine ausreichend neue Python-Version mit. Zunächst ruft das Programm über die Bibliothek subprocess die drei ersten Kommandos aus Listing 1 auf (Listing 2, Zeile 16 bis 23). Die folgende Schleife ab Zeile 25 wartet auf Daten und bricht nach waitmax Sekunden ab. Während dieser Zeit müssen Sie den Datentransfer des DSO112 über Menu | Send Data initiieren.
Beim Aufruf des Python-Programms übergeben Sie den Dateinamen für das zu speichernde Daten-File als Parameter. Eine verbesserte Version könnte testen, ob der Dateiname gültig ist und ob möglicherweise eine bestehende Datei überschrieben wird.
Daten visualisieren
Nach dem Speichern der Messwerte gibt der Aufruf aus Listing 3 diese dann mittels Gnuplot als Grafik aus. Einen ausführlichen Artikel [2] zu diesem Programm aus unserer Schwesterzeitschrift LinuxUser finden Sie im Download-Bereich zu diesem Artikel.
Listing 3
Ausgabe mit Gnuplot
$ gnuplot -persist -e "plot 'Datei.csv' every ::16 with lines notitle"
Auch die grafische Ausgabe lässt sich statt über Kommandozeilenwerkzeuge recht einfach via Python erledigen. Listing 4 zeigt das entsprechende Programm plotdso.py, dem Sie beim Aufruf den Namen des auszuwertenden Daten-Files übergeben. Als Ausgabe liefert es eine Grafikdatei im PNG-Format mit dem Plot.
Zunächst muss das Programm drei Grundbedingungen festlegen: Sollen die Werte in Volt oder Millivolt ausgegeben werden, die Zeitachse in Sekunden oder Millisekunden? Darüber hinaus gilt es, den Null-Volt-Bezugspunkt festzulegen. Alle notwendigen Parameter stehen in den ersten 16 Zeilen, dem Header der eben vom DSO112A übertragenen Datei. Das Plotten mithilfe von Pythons Matplotlib übernehmen die Funktionen plt.plot() (Zeile 82) für die Iteration über die Daten und plt.save() beziehungsweise plt.show() (Zeile 84) für die Ausgabe in eine Datei oder auf den Bildschirm.






