Inhaltsverzeichnis:

Binärbaum-Morse-Decoder - Gunook
Binärbaum-Morse-Decoder - Gunook

Video: Binärbaum-Morse-Decoder - Gunook

Video: Binärbaum-Morse-Decoder - Gunook
Video: Compression codes | Journey into information theory | Computer Science | Khan Academy 2024, November
Anonim
Image
Image
Schaltplan
Schaltplan

Dieses anweisbare erklärt, wie man Morsecode mit einem Arduino Uno R3 dekodiert.

Der Decoder, der sich automatisch an die Sendegeschwindigkeit anpasst, ist in der Lage, bis zu 80 Wörter pro Minute Morse zu decodieren.

Der eingehende Code wird als Text auf Ihrem Arduino Serial Monitor (oder TFT-Bildschirm, falls vorhanden) angezeigt.

Ein Tonoszillator wurde eingebaut, falls Sie das Senden von Morsen üben möchten.

Der Decoder verfügt über:

  • ein 320 x 240 TFT-Display-Modul [1]
  • ein digitaler Goertzel-Bandpassfilter zur Trennung unerwünschter Signale.
  • ein „Binärer Morsebaum“zur Dekodierung des Signals
  • Auto-Speed-Tracking
  • eine hörbare Ausgabe beim Üben von Morse
  • sowohl eingehender als auch ausgehender Text werden angezeigt.

Folgende Zeichen und Symbole werden erkannt:

  • [A.. Z]
  • [0..9]
  • [., ? ' ! / () &:; = + - _ " @]

Die geschätzten Kosten für das Morse-Decoder-Schild abzüglich des TFT-Displays betragen 25 US-Dollar. [1]

Bilder

  • Das Titelbild zeigt eine komplett montierte Einheit
  • Das Video zeigt, wie der Decoder funktioniert

Anmerkungen

[1]

  • Das TFT-Display-Modul ist optional, da der gesamte Text an Ihren Arduino „Serial Monitor“gesendet wird.
  • Das TFT-Modul ist in meinem instructable https://www.instructables.com/id/Arduino-TFT-Grap beschrieben…

Schritt 1: Teileliste

Die folgenden Teile wurden von https://www.aliexpress.com/ bezogen.

1 einziges Prototyp-Shield für Arduino UNO R3, 2,54 mm Pitch

Folgende Teile wurden vor Ort bezogen:

  • 1 nur LM358 Dual-Operationsverstärker
  • 1 nur LED grün
  • 1 nur LED-Clip
  • 1 nur Elektret-Mikrofonkapsel
  • 1 nur Schließer-Taster
  • 1 nur 8-polige DIP-Buchse
  • 2 nur 330 Ohm Widerstände
  • 2 nur 2K2 Widerstände
  • 5 nur 10K Ohm Widerstände
  • 2 nur 56K Ohm Widerstände
  • 2 nur 1uF Kondensator
  • 1 nur 10uF Kondensator

Die folgenden Teile sind optional:

  • Nur 1 2,2 Zoll TFT SPI LCD Display Modul 240*320 ILI9341 mit SD Kartenslot für Arduino Raspberry Pi 51/AVR/STM32/ARM/PIC [1]
  • Morsetaste / Drucktaste
  • 1 nur BC548 NPN-Transistor
  • 1 nur 1-Zoll-Lautsprecher
  • 1 nur 33K Ohm Widerstand
  • 1 nur 3,5-mm-Monostecker (für Morsetaste)
  • 1 nur 3,5mm Monobuchse (für Morsetaste)
  • 3 nur 9 mm M3-Nylon-Abstandshalter mit Gewinde
  • 1 nur 130 x 68 x 44 mm ABS-Kunststoffbox
  • 5 nur 2-polige rechtwinklige Anschlüsse

Die geschätzten Kosten für das Morse-Decoder-Schild abzüglich des optionalen TFT-Displays betragen 25 US-Dollar. [1]

Anmerkungen

[1]

Die Teileliste für das optionale 320 x 240 TFT-Display-Modul ist in meinem anweisbaren

[2]

Wenn Sie den Sender verwenden möchten, benötigen Sie einen Morseschlüssel oder einen stabilen Druckknopf.

Schritt 2: Schaltplan

Schaltplan
Schaltplan
Schaltplan
Schaltplan
Schaltplan
Schaltplan

Bilder

Foto 1 zeigt den Schaltplan für den Morse-Decoder. Der 330-Ohm-Widerstand in Reihe mit der Morsetaste begrenzt den D4-Ausgangsstrom bei einem versehentlichen Masseschluss … eine Erhöhung seines Wertes verringert die Audioausgabe des Lautsprechers. Aus diesem Grund habe ich es nicht dem Schild hinzugefügt, sondern direkt an der Morse-Tastenbuchse befestigt, um die Einstellung zu erleichtern

Foto 2 zeigt einen passenden Schild. Das Schild ist von meinem instructable https://www.instructables.com/id/Arduino-TFT-Grap…, dem ich den Mikrofonverstärker und den Tonoszillator hinzugefügt habe. [1]

Foto 3 zeigt das fertige Schild, das an einem Arduino befestigt ist. Es werden keine weiteren Komponenten benötigt, wenn der Text auf Ihrem Arduino „Serial Monitor“angezeigt werden soll

Foto 4 zeigt den Decoder teilweise verpackt. In den Deckel wurde ein Loch geschnitten, um das Display zu sehen. Lautsprecher und Mikrofon sind mit dem Gehäuse verklebt. Bohren Sie einige Lautsprecherlöcher in den Deckel, bevor Sie den Lautsprecher montieren. Die mittlere Buchse auf dem Deckel ist für ein Erweiterungsmikrofon … sonst muss der Decoder in der Nähe des Lautsprechers platziert werden, was nicht immer möglich ist

Foto 5 zeigt den TFT-Bildschirm. An den Displayrändern wurde schwarzes Isolierband angebracht … dieses Klebeband verhindert das Austreten von Licht und maskiert jede Fehlausrichtung zwischen dem Display und der Öffnung im Deckel

Wichtig

[1]

Arduinos mit einem großen USB-Anschluss benötigen eine Schicht Isolierband zwischen dem USB-Anschluss und dem Arduino-Shield. Versehentliche Kurzschlüsse sind ohne das Band möglich, da der Abstand gering ist. Für Arduinos mit kleinen Anschlüssen ist das Band nicht erforderlich

Schritt 3: Theorie

Theorie
Theorie
Theorie
Theorie
Theorie
Theorie

Jeder Morsecode-Buchstabe besteht aus einer Reihe von Tönen mit kurzer und langer Dauer, die als „Punkte“und „Strichstriche“bezeichnet werden.

  • ein Punkt (.) ist 1 Längeneinheit
  • ein Bindestrich (_) ist 3 Einheiten lang
  • der Abstand zwischen Buchstabenelementen beträgt 1 Einheit
  • der Abstand zwischen den Buchstaben beträgt 3 Einheiten
  • der Abstand zwischen den Wörtern beträgt 7 Einheiten

Wir können feststellen, ob der eingehende Ton ein Punkt oder ein Strich ist, indem wir seine Dauer mit einem Referenzton von 2 Längeneinheiten vergleichen.

  • ein Punkt ist weniger als 2 Einheiten
  • ein Strich ist größer als 2 Einheiten

Es gibt zwei deutlich unterschiedliche Methoden zum Decodieren des eingehenden Musters von Punkten und Strichen:

  • lineare Suche
  • Binärbaum (auch als dichotomische Suche bekannt)

Lineare Suche

Eine gängige Methode besteht darin, ein Array von Zeichen und ihren passenden Morsemustern zu erstellen. Jedes der folgenden Zeichen würde beispielsweise gespeichert als:

  • A. _
  • B _…
  • C _. _.
  • 0 _ _ _ _ _
  • 1. _ _ _ _
  • 2.. _ _ _

Jeder Buchstabe benötigt 6 Zellen … 1 für den Buchstaben selbst und 5 für die (.)’s und (_)’s. Dazu benötigen wir ein Buchstaben-[36][6] Zeichen-Array mit insgesamt 216 Zellen. Nicht verwendete Zellen werden normalerweise mit einer Null oder einem Leerzeichen gefüllt.

Um die eingehenden Punkte und Striche zu entschlüsseln, müssen wir das Punkt-/Strichmuster jedes eingehenden Buchstabens mit unseren Referenzzeichenmustern vergleichen.

Diese Methode funktioniert zwar, ist aber extrem langsam.

Angenommen, wir haben 26 Buchstaben ('A',..' Z') und die Ziffern ('0', … '9') in einem Array gespeichert, dann müssen wir 36 Suchen mit jeweils bis zu 5 Untersuchen durchführen, das sind insgesamt 36*5=180 Suchen, um die Ziffer '9' zu decodieren.

Binärbaum

Eine binäre Suche ist viel schneller, da keine Suchen erforderlich sind.

Im Gegensatz zur linearen Suche, bei der sowohl das Zeichen als auch die Morsemuster gespeichert werden müssen, speichert der Binärbaum nur die Zeichen, was bedeutet, dass die Arraygröße kleiner ist.

Ich habe meinen Binärbaum (Foto1) in zwei Hälften (Fotos 2 und 3) geteilt, um ihn besser lesbar zu machen.

Um ein Zeichen zu finden, bewegen wir jedes Mal, wenn wir einen Punkt hören, einen Zeiger nach links und jedes Mal, wenn wir einen Bindestrich hören, den Zeiger nach rechts. Nach jedem Zug halbieren wir den Zeigerabstand für den nächsten Zug … daher der Name Binärbaum.

Um den Buchstaben „9“(Strich, Strich, Strich, Strich, Punkt) zu entschlüsseln, sind 5 Bewegungen erforderlich … 4 nach rechts und 1 nach links, wodurch der Zeiger direkt über der „9“liegt.

Fünf Züge sind deutlich schneller als 180 Suchen !!!!!

Das binäre Zeichenarray ist auch kleiner … 26 Buchstaben und 10 Ziffern erfordern nur ein 64 x 1 Zeilenarray. Ich habe mich entschieden, ein 128-Zeichen-Array zu erstellen, damit ich Satzzeichen decodieren kann.

Schritt 4: Designhinweise

Designhinweise
Designhinweise
Designhinweise
Designhinweise
Designhinweise
Designhinweise
Designhinweise
Designhinweise

Morse ist in Gegenwart von Störsignalen schwer zu decodieren. Die unerwünschten Signale müssen zurückgewiesen werden … dies erfordert eine Art Filter.

Es gibt viele Möglichkeiten:

  1. Phasenregelkreise
  2. Induktor-Kondensator-Filter
  3. Aktive Widerstands-Kondensator-Filter
  4. Digitale Signalverarbeitung wie Fast Fourier Transform oder das Goertzel-Filter.

Die Verfahren 1, 2, 3 erfordern externe Komponenten, die sperrig sind.

Methode 4 erfordert keine externen Komponenten … die Frequenzen werden mit mathematischen Algorithmen erfasst.

Schnelle Fourier-Transformation (FFT)

Eine Methode, um das Vorhandensein eines Tons in einer komplexen Wellenform zu erkennen, besteht darin, die schnelle Fourier-Transformation zu verwenden

Foto 1 zeigt, wie FFT (Fast Fourier Transform) das Audiospektrum in „Bins“aufteilt.

Foto 2 zeigt, wie die FFT-„Bins“auf ein Signal reagieren … in diesem Fall 800 Hz. Wenn ein zweites Signal von beispielsweise 1500 Hz vorhanden wäre, würden wir zwei Antworten sehen … eine bei 800 Hz und eine andere bei 1500 Hz.

Theoretisch kann ein Morsecode-Decoder erstellt werden, indem der Ausgangspegel eines bestimmten FFT-Frequenz-Bins überwacht wird … eine große Zahl steht für das Vorhandensein eines Punkts oder Strichs … eine kleine Zahl bedeutet kein Signal.

Ein solcher Morsecode-Decoder könnte durch die Überwachung von „Bin 6“in Foto 2 erstellt werden, aber bei diesem Ansatz sind einige Dinge falsch:

  • wir wollen nur einen Frequenzbereich … der Rest sind verschwendete Berechnungen
  • die Frequenzbins erscheinen möglicherweise nicht genau auf der interessierenden Frequenz
  • es ist relativ langsam (20 ms pro Arduino-Schleife ()

Eine andere Methode ist die Verwendung eines Goertzel-Filters.

Görtzel-Filter

Der Goertzel-Filter ähnelt der FFT, hat aber nur einen einzelnen Frequenz-Bin.

Foto 3 zeigt den Frequenzgang eines Goertzel-Filters auf diskrete Audioschritte.

Foto 4 ist ein Sweep des gleichen Filters über den gleichen Frequenzbereich.

Ich entschied mich für den Goertzel-Algorithmus als:

  • Die Arduino-Schleife () mit dem Goertzel-Algorithmus betrug 14 mS (Millisekunden) gegenüber 20 mS (Millisekunden) für eine FFT-Lösung mit der Arduino-Bibliothek „fix_FFT“.
  • Es ist einfach, die Mittenfrequenz eines Goertzel-Bandpassfilters einzustellen.
  • Die Bandbreite beträgt ca. 190Hz.

Foto 5 zeigt die numerische Ausgabe eines 900-Hz-Goertzel-Filters, wenn ein Ton erkannt wird. Ich habe meine Tonschwelle auf einen Wert von 4000 eingestellt … Werte über 4000 zeigen einen Ton an.

Theoretisch müssen Sie Ihren Filter nur auf eine angenehme Hörfrequenz einstellen. Leider fällt die Audioausgabe meines 1-Zoll-Monitoring-Lautsprechers schnell unter 900 Hz. Um Probleme zu vermeiden, verwende ich eine Filterfrequenz von 950Hz. Die notwendigen Formeln zur Berechnung alternativer Filterfrequenzen finden Sie in meinem Code-Header.

Dekodierung

Die Entschlüsselung der Punkte und Striche ist nicht so einfach, wie es auf den ersten Blick aussieht.

Perfektes Morse ist definiert als:

  • Punkt = 1 Einheit
  • Leerzeichen innerhalb des Buchstabens = 1 Einheit
  • Strich = 3 Einheiten
  • Leerzeichen zwischen den Buchstaben = 3 Einheiten
  • Leerzeichen zwischen Wörtern = 7 Einheiten

Um den perfekten Morsewert zu dekodieren, benötigen wir lediglich eine Referenztondauer von 2 Einheiten

  • Punkt < 2 Einheiten
  • Elementraum < 2 Einheiten
  • Strich > 2 Einheiten
  • Buchstabe _Leerzeichen > 2 Einheiten
  • word_space > 6 Einheiten (d. h. 3 x Referenzeinheiten)

Dies funktioniert für maschinelles Morse, aber in der „realen Welt“:

  • die Sendegeschwindigkeit variiert
  • die Dauer der einzelnen Punkte variiert
  • die Dauer jedes Strichs variiert
  • die Buchstaben E, I, S, H, 5 enthalten nur Punkte, die der Punktdauer entsprechen
  • die Buchstaben T, M, O, 0 enthalten nur Striche, die den Durchschnitt der Strichdauer ergeben
  • Wortlücken kommen möglicherweise nicht an
  • Fading erzeugt Fehler, von denen der Decoder sich erholen muss.
  • verfälschte Signale durch Interferenzen

Buchstaben, die nur Punkte und Striche enthalten, werden teilweise aufgelöst, wenn:

Wir schätzen die Referenzdauer, bis wir einen gültigen Punkt und einen gültigen Bindestrich erhalten haben. Ich verwende 200 Millisekunden, was gültig ist, wenn die Sendegeschwindigkeit zwischen 6 WPM (Wörter pro Minute) und 17 WPM liegt. Möglicherweise müssen Sie diesen Wert erhöhen, wenn Sie Morse lernen. Eine Geschwindigkeitstabelle ist in der Software enthalten

Geschwindigkeitsschwankungen werden gelöst, wenn:

  • wir führen einen gleitenden Durchschnitt für jeden Punkt und jeden Strich durch und
  • Berechnen Sie die Referenzdauer neu, nachdem jedes Symbol empfangen wurde

Wortlücken und nicht ankommende Wortlücken werden gelöst, wenn wir:

  • Merken Sie sich die Zeit des letzten Übergangs von der Hinterkante (Ton zu Nicht-Ton),
  • Starten Sie den Algorithmus nach jedem Buchstaben neu,
  • Berechnen Sie die verstrichene Zeit während des Wartens auf den nächsten Übergang der Vorderflanke (kein Ton zu Ton) und
  • fügen Sie ein Leerzeichen ein, wenn 6 Zeiteinheiten überschritten wurden.

Morse-Oszillator

Ich habe zunächst einige Piezo-Summer ausprobiert, aber festgestellt:

  • die Frequenz wurde festgelegt
  • die Ausgangsfrequenz war für längeres Hören zu hoch
  • die Piezos tendierten dazu, aus dem Goertzel-Passband zu driften

Ich habe dann versucht, einen akustischen Wandler mit einer 750-Hz-Rechteckwelle anzusteuern, stellte jedoch fest, dass er eine Resonanz aufwies, die die 1. und 3. Harmonische herausfilterte. Foto 6 zeigt den Ausgang des Mikrofonverstärkers zu einer 750Hz-Rechteckwelle … wir sehen die 5. Harmonische !!!

Ich griff dann zu einem mit einem kleinen Lautsprecher. Foto 7 zeigt den Mikrofonausgang zu einer 750Hz-Rechteckwelle, die an einen kleinen Lautsprecher gesendet wurde … diesmal sehen wir die Grundwelle … nicht die 5. Harmonische. Der Goertzel-Filter ignoriert alle Oberwellen.

Anmerkungen

[1]

en.wikipedia.org/wiki/Goertzel_algorithm

www.embedded.com/the-goertzel-algorithm/

Schritt 5: Software

Software
Software
Software
Software
Software
Software

Installation

  • Laden Sie die angehängte Datei MorseCodeDecoder.ino herunter [1]
  • Kopieren Sie den Inhalt dieser Datei in eine neue Arduino-Skizze
  • Speichern Sie die Skizze als "MorseCodeDecoder" (ohne Anführungszeichen)
  • Kompilieren und laden Sie die Skizze auf Ihren Arduino

Software-Update 23. Juli 2020

Die folgenden Funktionen wurden der angehängten Datei "MorseCodeDecoder6.ino" hinzugefügt

  • ein "Exact Blackman"-Fenster [2]
  • ein "Noise_blanker"

Einstellung:

  • Erhöhen Sie den Audiopegel Ihres Empfängers, bis die LED zu flackern beginnt, und schalten Sie sie dann wieder aus
  • Tunen Sie nun Ihren Empfänger, bis die LED im Gleichschritt mit dem eingehenden Morse blinkt
  • der Noise_blanker wurde so eingestellt, dass er Rauschbursts bis zu 8mS (eine Schleifenzeit) ignoriert.
  • der Rauschschwellenwert kann angepasst werden, indem Debug=true gesetzt und Ihr serieller Plotter beobachtet wird

Notiz

[1]

Stellen Sie Ihren Arduino Serial Monitor auf 115200 Baud ein, wenn Sie auch den Text anzeigen möchten.

[2]

  • Foto 1 … Genaues Blackman-Fenster
  • Foto 2 … Goertzel-Filter ohne Exact Blackman-Fenster
  • Foto 3,,, Goertzel-Filter mit angewendetem Exact Blackman-Fenster

Schritt 6: Betrieb

Decoder

Stellen Sie das Gerät neben Ihren Lautsprecher, wenn Sie Morse hören.

  • Die Elektret-Mikrofonkapsel nimmt das Morsesignal Ihres Lautsprechers auf.
  • Der Ausgang des Elektretmikrofons wird dann 647-mal (56 dB) verstärkt, bevor er zur Verarbeitung an das Arduino weitergeleitet wird.
  • Ein digitaler Bandpassfilter von Goertzel extrahiert das Morsesignal aus dem Rauschen.
  • Die Dekodierung erfolgt unter Verwendung eines Binärbaums.
  • Die Decoderausgabe wird als Text auf einem 320 x 240 Pixel großen TFT-Display angezeigt. Es wird auch an Ihren Arduino „Serial Monitor“gesendet, wenn Sie kein Display verwenden möchten.

Morse-Absender

Ein Morsesender wurde ebenfalls eingefügt. Damit kannst du das Senden von Morsen üben und funktioniert wie folgt:

  • Am Arduino-Pin 4 wird ein konstant hörbarer Ton erzeugt.
  • Wir hören diesen Ton über den Lautsprecher des Decoders, wenn wir die Morsetaste drücken.
  • Der Ton ist auf die gleiche Frequenz wie der Goertzel-Filter eingestellt, was dem Decoder vorgaukelt, er höre echtes Morse … was auch immer Sie senden, erscheint als gedruckter Text auf dem Display.

Ihr Senden wird sich verbessern, da der Decoder häufige Fehler erkennt, wie zum Beispiel:

  • zu viel Platz zwischen den Symbolen. (Beispiel: Q als MA bezeichnet)
  • zu viel Platz zwischen den Buchstaben (Beispiel: JETZT als NO W gedruckt)
  • Falscher Code

Schritt 7: Zusammenfassung

Decoder

Dieses anweisbare beschreibt, wie man einen Morse-Decoder macht, der Morse-Code in gedruckten Text umwandelt.

  • Der Decoder ist in der Lage, Morse bis mindestens 80 WPM (Wörter pro Minute) zu decodieren.
  • Der Decoder verfolgt automatisch Variationen in der empfangenen Sendegeschwindigkeit.
  • Der Text wird auf Ihrem Serial Monitor (oder auf einem 320 x 240 TFT-Displaymodul, falls vorhanden) angezeigt [1]

Absender

Ein Morsesender wurde auch eingefügt

  • Der Sender hilft Ihnen, die Qualität Ihres Morseversands zu verbessern.
  • Der Decoder bestätigt, dass das, was Sie gesendet haben, korrekt ist

Teilekosten

Die geschätzten Kosten für das Morse-Decoder-Schild abzüglich des optionalen TFT-Displays betragen 25 US-Dollar.

Klicken Sie hier, um meine anderen instructables anzuzeigen.

Audio-Challenge 2020
Audio-Challenge 2020
Audio-Challenge 2020
Audio-Challenge 2020

Zweiter Preis bei der Audio Challenge 2020