Die Musik auf dem Raspberry Pi mit dem Oszilloskop stimmen

Als ich das Projekt Mit dem Raspberry Pi Musik machen und "Alle meine Entchen" spielen programmierte, hatte ich schon den leisen Verdacht, dass die GPIO-Aufrufe ein wenig Zeit schlucken würde und die Frequenz darum geringfügig zu niedrig sein würde. Aber ist musste einfach davon ausgehen, dass dies nicht ins Gewicht fallen würde und so habe ich bei 400 Hertz den Lautsprecher 440 mal in der Sekunde ein- und ausgeschaltet.



Jetzt ist mein Billig-Oszilloskop DSO138 (ca. 20 Euro) aus China endlich angekommen. Die Platine kam lieblos zusammengeschustert an - der Draht für die Testschleife fehlte ganz und die Löcher dafür waren zugelötet, ein Trimmkondensator ließ sich gar nicht mehr drehen und das Display war total schief auf die Trägerplatine aufgeklebt. Zudem eine Uralt-Version der Firmware. Ich musste also erst noch selbst den Lötkolben zur Hand nehmen, obwohl versprochen war, dass alles fertig gelötet und getestet sei und man nur das Gehäuse im Do it yourself-Verfahren selbst aufbauen musste.

Das Einbauen ins Klarsicht-Acryl-Gehäuse war eine endlose Fummelei, weil keine Aufbauanleitung dabei lag und die Abstände zwischen den Acrylglas-Layern nicht klar waren, sondern nur nach dem Prinzip "zusammenbauen - passt nicht - auseinandernehmen, eine Unterlegscheibe mehr dazwischen - zusammenbauen - passt nicht ..." vorgegangen werden konnte. Dabei mussten alle Layer und die Unterlegscheiben/Muttern eine auf den Millimeter genaue Höhe ergeben, die genau zur Höhe der Seitenteile passen musste. Gleichzeitig mussten noch die Anschlüsse gut von außen steckbar sein und das Display musste in einer Höhe genau abschließen. Außerdem musste noch genug von den Tasten und Schiebern herausragen, um es bedienen zu können. Beim Zusammenbau macht man natürlich jedes mal neue Fingerabdrücke auf das Klarsichtplastik, und jedes mal wischt man sie aufs Neue weg. Zum Schluss passten dann die Seitenteile nicht, weil die Kerben zu nah aneinander waren. Da musste ich nochmal alles auseinander bauen und mit dem Teppichmesser an zwei Teile 1 mm wegnehmen. Kurz ausgedrückt: ein Puzzle mit gehobenem Schwierigkeitsgrad.

Doch nun ist es endlich fertig aufgebaut und einsatzbereit. Als erster wurde das Oszilloskop natürlich einem Funktionstest unterzogen mit dem eingebauter !kHz-Frequenzgenerator. Der Test bestand es tadellos, auch wenn das Rechtecksignal hier und da ein wenig ausgefranst daher kam.


Dann musster der selbst zusammengelötete Waveform-Generator antreten.

Viel hatte ich von der mit 1.27 Euro unschlagbar billigen Selbstbau-Platine nicht erwartet.

Trotz nur auf chinesisch vorhandenen Aufbauanleitung ließ sie sich erstaunlich gut löten, denn alle Positionen waren auf der Platine noch einmal aufgedruckt und zum Glück verwenden die Chinesen auch die arabischen Zahlen wie wir.

Unklar war nur, ob ich nicht vielleicht doch irgendwo einen Löt- oder Bestückungsfehler gemacht hatte. Darum war ich schon gespannt, ob die Platine auf Anhieb funktionieren würde.



Sie tat es. Man kann die erzeugten Wellenformen schon erkennen. Von links nach rechts: Rechteck, Sägezahn, Dreieck und Sinuskurve. Wobei der Sägezahn eher wie eine Haifischflosse aussieht. Aber allzuhohe Erwartungen wären bei diesen Preise übertrieben.

Es ging mir ja auch nur darum, ein Oszilloskop zu haben, mit dem ich zumindestens rudimentär etwas erkennen kann. Ein Profi-Gerät kann und will ich mir einfach nicht leisten, dafür brauche ich es zu selten.

Der erste Anwendungsfall, der mir in den Sinn kam, war einmal die wirkliche Frequenz der Töne zu messen, die in dem Musik-Projekt aus dem Lautsprecher kommen zu messen. Mit dem DSO138 kein Problem: Die Messfühhler an den Plus-Pol des Lautsprechers und an Masse dere Senso-Platine angeschlossen. Und dann das A angespielt, also die Frequenz von 440 Hz. Also wovon ich dachte, dass es 440 Hz wären. Denn der Laufzeitverlust beträgt etwa 9% und die reale Frequenz beträgt nur 392 Hz (erster Teil im nachfolgenden Video).

Damit die Frequenz der Wirklichkeit näher kommt, musste ich den Code der Funktion sound(...) ein wenig anspassen: def sound(freq, t): # Diese Funktion erzeugt eine bestimmte Zeit t lang pulseLen = 1.0/freq/2.0 # die Frequenz freq pulseLen *= .877 # Ausgleich, um auf richtige Frequenz zu kommen, gemessen mit dem Oszilloskop anz=int(t/pulseLen/2) for i in range (0,anz): GPIO.output(buzzer, GPIO.HIGH) time.sleep (pulseLen) GPIO.output(buzzer, GPIO.LOW) time.sleep (pulseLen) Ich bin auf einen Faktor von 0.877 gekommen, den ich verwenden muss, damit echte 440 Hz aus dem Lautsprecher kommen (zweiter Teil im Video).

Wobei es immer noch Schwankungen gibt, die von der Nutzung des Systems abhängen. Speichere ich im Hintergrund über Samba eine Datei, kratzt es immer noch fürchterlich. Um hier mehr herauszufinden benötigte man ein Speicher-Oszilloskop oder einen Logic Analyzer. Auch da ist eine Billig-Version aus China zu mir unterwegs und der ersten Anwendungsfall ist hiermit auch schon klar.