Akustische Signale erzeugen - Teil 1
 
 
 
 

Donnerstag, 3. November 2022

Akustische Signale erzeugen - Teil 1

 

Mit dem Arduino können auch Töne erzeugt werden. Dazu gibt es unter anderem die tone()-Funktion, welche einen (vermeintlichen) Sinuston erzeugen kann.

Das erste größere Ziel ist es mit einem Arduino und einem Lautsprecher Sinus-Töne zu erzeugen und mit einem anderen Arduino diese aufzunehmen und die Frequenz zu ermitteln. Mit einem solchen System können auf akustische Weise Daten auf kürzerer Entfernung ausgetauscht werden. Das Protokoll wird selber entwickelt und ich möchte herausfinden, wie man auf diese Weise sicher Daten übertragen kann.

Das zweite größere Ziel ist es über den akustischen Weg Signale von einem Arduino zum anderen zu senden und dabei die Laufzeit zu messen. Darüber soll dann über die bekannte Schallgeschwindigkeit die Entfernung zwischen Sender und Empfänger ermittelt werden.


int speakerPIN = 8;


void setup() {

  // put your setup code here, to run once:


}


void loop() {

  // put your main code here, to run repeatedly:

  tone(speakerPIN, 1000, 1000);

  delay(10000);

}


Beim obigen Programmcode wird ein Ton mit der Frequenz 1000 Hz über den PIN 8 der Arduino-Boards erzeugt. An diesem PIN hängt dann ein Verstärkermodul, welches den Strom um 100x verstärkt und dann auf den Lautsprecher schickt.


Auf dem iPhone gibt es die App „iNVH“ von Bosch mit der Ton mitgeschnitten werden kann. Damit kann aber auch in Echtzeit eine FastFFT-Analyse eines akustischen Signals erzeugt werden, und das Ergebnis im Frequenzband dargestellt werden. Hier wurde die Frequenz 1000 Hz erzeugt mittels Arduino und tone()-Funktion und vom erzeugten Signal direkt eine FFT-Analyse aufgenommen.

Auffällig sind die harmonischen Oberwellen. Neben der 1000 Hz als Basisfrequenz sind auch die Vielfachen 2000 Hz, 3000 Hz usw. zu hören. Dadurch entsteht kein reiner Sinuston sondern ein Mischton der etwas rauer klingt. Warum diese Oberwellen so stark zu hören sind möchten wir jetzt noch rausfinden. Vielleicht gibt es eine Methode um diese zu eliminieren oder zumindest zu reduzieren.



Betrachtet man das erzeugte Signal einmal am Arduino-Ausgang (PIN 8, Messkanal A blau) mit einem Oszilloskop, so erkennt man dass es sich leider nicht um eine Sinuswelle handelt, sondern um ein Rechteck-Signal. Wird ein Rechteck-Signal mittels Fourier-Analyse in seine Bestandteile zerlegt so wird klar dass die unterste Frequenz als Basis-Schwingung enthalten ist, als auch die ganzzahligen Vielfachen davon in entsprechender Höhe. Nur durch massive Überlagerung von vielen Sinus-Schwingungen wird dann ein Rechtecksignal erzeugt.



Da wir eine reine Sinuswelle haben möchten und kein Rechtecksignal müssen wir nochmal schauen ob die tone()-Funktion für unsere Zwecke überhaupt geeignet ist. Um akustisch wenig Störgeräusche zu erzeugen wäre eine reine Sinuswelle ideal ... denn dann wären andere Frequenzen noch frei für andere Zwecke.

Zur Erklärung warum die Frequenzanalyse einer Rechteckfunktion die ganzzahligen Vielfachen der Basisfrequenz aufweist sei hier auf die Beschreibung der Fourierreihe verwiesen (Quelle www.mintwiki.de)


Im Folgenden werden eine Rechteckspannung, eine Dreiecksspannung und eine Sägezahnspannung mittels Fourier-Reihe erzeugt.





Damit ist die Frage geklärt warum die Oberschwingungen zu sehen sind und dass keine reine Sinus-Spannung erzeugt wird.

Zur Frage warum eine Rechteckspannung mit der tone()-Funktion erzeugt wird möchten wir in einem weiteren Beitrag eingehen. Hierbei soll auf die Technik der Spannungserzeugung von analogen Signalausgängen von Mikro-Controllern mittels der Methode der Pulsweitenmodulation eingegangen werden. Auch zur Frage ob man damit einen einigermaßen brauchbaren Sinuston hinzubekommen ist möchten wir eingehen.

 
 
 

Weiter >

< Zurück

Erstellt auf einem Mac