Hallo Schatz!
In diesem Artikel erfahren Sie auf vielfachen Wunsch, wie Sie ein einfaches hydroakustisches Modem herstellen: ein bisschen digitale Signalverarbeitung, ein bisschen Programmierung, ein bisschen hausgemachte Leiterplatten und ein bisschen praktische Hydrologie.
An alle Interessierten - wir bitten Sie, in der nachhallenden Welt der Unterwasserkommunikation willkommen zu sein!
Und hier ist das relevante Bild, um Aufmerksamkeit zu erregen:

"Letztendlich besteht der Sinn unserer Existenz darin, Energie zu verbrauchen ... Und wenn möglich, wissen Sie, dass es für Sie selbst und für andere interessant ist."
(C) ABS, Mittag, XXII Jahrhundert
Sparen Sie Zeit - Zusammenfassung
- Akustische Modems werden bei Aliexpress noch nicht verkauft
- Es gibt ein einfaches und anspruchsloses Verfahren zur Erkennung von Tonberechnungen für Ressourcen, dessen Frequenz viermal niedriger ist als die Abtastfrequenz. Arduino reicht für die Implementierung
- Beispielcode für PC liegt auf GitHub
- Wir stellen Empfangs- und Sendeantennen von Tortenpflückern zu je 10 r her
- Wir kaufen (oder machen es selbst) eine Verstärkerplatine auf TDA2030 auf Ali für 50 Rubel
- Wir stellen einen LUT-Ohm-Vorverstärker mit Gesamtkosten von ~ 100 Rubel her
- Wir verbinden uns und gehen zum Teich
- Freut euch
Motivationsvorspiel
Jetzt können Sie fast alles bei Aliexpress oder eBay kaufen. Besonders viele verschiedene Dinge für die unabhängige Herstellung von etwas Elektronischem auf Arduino-Basis. Sie können (wenn Sie es einfach nicht interessant kaufen) eine Milieu-Zwischenstopp-Wetterstation mit Internetverbindung, einem automatischen Katzenfutterautomat, einer Steuerung der Hausbrauerei, aber Sie können immer noch kein Sonarmodem, einen Designer für dessen Herstellung oder zumindest ein Modul für Adruino kaufen. Schön und gut! Und nicht - jetzt werden wir Ihnen sagen, wie es gemacht wird und wie es funktioniert.
Wir, das ganze Labor, haben lange darüber nachgedacht, was Liebhabern für eine unabhängige Herstellung geboten werden kann. Etwas sehr Einfaches, das von einem Schüler und von einem
Stock und einem Seil von dem, was jeder zur Hand hat, gesammelt werden kann, aber gleichzeitig mindestens einen minimalen praktischen oder pädagogischen Wert darstellt.
Etwas, das eine lange und aufregende Verbesserung verspricht, etwas, das später sogar auf Arduino übertragen werden kann
, wenn es nicht stimmt .
Wenn wir uns dem Problem materialistisch nähern, möchten wir ein detailliertes Tutorial für die Herstellung eines einfachen Geräts anbieten, das mehr oder weniger Daten in einem Flachwasserkörper übertragen kann (ein flacher Sonarkanal ist am komplexesten), was eine maximale Produktion einer Leiterplatte mit LUT bedeuten würde. mit Gesamtkosten von nicht mehr als ein paar dreihundert Rubel an minimalen Punkten.
Was werden wir heute tun?
- Denken Sie daran, wie man eine geeignete Sonarantenne herstellt und ein Paar herstellt.
- Schließen Sie eine der Antennen über einen Verstärker am TDA für ~ 50 Rubel an einen PC an und holen Sie sich einen Sender.
- für den zweiten machen wir einen Vorverstärker mit ~ LUT für ~ 100 Rubel;
- Wir werden
ein einfaches Modem in C # schreiben (ich habe bereits alles geschrieben und auf Git gestellt) und alles im nächsten Gewässer ausprobieren.
Was brauchen wir dafür?
- zwei piezoelektrische Elemente. Zum Beispiel von einer Uhr oder Postkarte ;
- RG-174 / U-Kabel (oder ähnliches) ~ 5 Meter;
- Essigsiegel;
- wasserfester Lack;
- Folientextolit, insgesamt ca. 100x200 mm;
- einen Verstärker für TDA2030 (zum Beispiel einen für 50 Rubel);
- Vorverstärkerkomponenten
Wie funktioniert es
Die ganze Idee des einfachsten Modems basiert wiederum auf dem einfachsten (Zufall?) Detektor eines bestimmten Tons, von dem ich zu meiner Schande nichts gehört habe.
Hat mir ganz zufällig von ihm erzählt
andrey_9999a . Übrigens hat er auch eine Vorverstärkerplatine gemacht.
In diesem Zusammenhang erinnerte ich mich an ein Zitat aus Leonard Sasskinds Buch „Die Schlacht am Schwarzen Loch“:
„Als Weinkenner bin ich mir mehr oder weniger sicher, dass ich auch mit geschlossenen Augen Rot von Weiß unterscheiden kann. Noch zuverlässiger unterscheide ich Wein von Bier. Aber dann wird mich der Geschmack im Stich lassen. “
Ich kann mir sagen, dass ich als echter Elektronikingenieur mehr oder weniger sicher bin, dass ich definitiv zwei dicke Drähte löten kann. Noch zuverlässiger unterscheide ich einen heißen Lötkolben von einem kalten, auch wenn ich die Augen geschlossen habe, aber dann wird mich die Fähigkeit im Stich lassen. Daher ist alles, was mit der Entwicklung und Herstellung von Brettern zu
tun hat, die Arbeit meiner Kameraden und Kollegen
andrey_9999a und
StDmitriev .
Also zurück zum Detektor. Es ist ein vereinfachter Sonderfall der Berechnung des Fourier-Integrals:
Im Fall eines digitalen Signals ist es zur Berechnung der Amplitude einer beliebigen Harmonischen erforderlich, eine diskrete Fourier-Transformation durchzuführen. Für Arduina ist dies schwierig. Der Trick besteht jedoch darin, dass
Fc als Trägerfrequenz genau viermal kleiner als die Abtastfrequenz
Fs ist Die Amplitude dieser Harmonischen kann dämonisch einfacher berechnet werden.
In diesem Fall ist
dt = 2π * (Fs / 4) / Fs = π / 2 , und nur 4 Proben fallen auf die Trägerperiode:

Wenn alles um
π / 4 verschoben ist
, nehmen die Abtastwerte nur zwei Werte an: √2 / 2 und -√2 / 2. Der Einfachheit halber lassen wir nur die Vorzeichen -
"+" und "-" .
Das Wesentliche der Methode ist, dass wir die Sinusphase als Folge von Zeichen
"+" "+" "-" "-" und die Cosinusphase als
"+" "-" "-" + "darstellen .
Wenn sich das Eingangssignal im
sn- Puffer befindet, haben wir zwei Ringmittelungspuffer für die Sinus- und Cosinusphase -
bs und
bc der Größe
N. Zeiger auf Kopf und Schwanz sind für sie üblich -
bH und
bT . Zum anfänglichen Zeitpunkt ist
bH = N-1, bT = 0 . Mittelungszykluszähler
C = 0 .
Wir nehmen 4 Samples aus dem Eingabepuffer und fügen sie entsprechend den Zeichenfolgen hinzu.
Codebeispiela = sn(i)
bs(bH) = a
bc(bH) = a
s1 = s1 + a - bs(bT)
s2 = s2 + a - bc(bT)
bH = (bH + 1) % N
bT = (bT + 1) % N
a = sn(i+1)
bs(bH) = a
bc(bH) = -a
s1 = s1 + a - bs(bT)
s2 = s2 - a - bc(bT)
bH = (bH + 1) % N
bT = (bT + 1) % N
a = sn(i+2)
bs(bH) = -a
bc(bH) = -a
s1 = s1 - a - bs(bT)
s2 = s2 - a - bc(bT)
bH = (bH + 1) % N
bT = (bT + 1) % N
a = sn(i+3)
bs(bH) = -a
bc(bH) = a
s1 = s1 - a - bs(bT)
s2 = s2 + a - bc(bT)
bH = (bH + 1) % N
bT = (bT + 1) % N
Nach jeder verarbeiteten vier Abtastung überprüfen wir den Zähler der Mittelungszyklen und wenn er
N überschritten hat, berechnen wir die Trägeramplitude
cA :
if ++cycle >= N cA = sqrt(s1 * s1 + s2 * s2) cycle = 0 end
So sieht es bei einem idealen Signal aus:

Das Signal selbst wird blau und die Trägeramplitudenwerte rot angezeigt (alles wird auf den Bereich -1..1 reduziert). In diesem Fall ist
N = 2 seit Es gibt keinen Lärm und alles funktioniert trotzdem gut.
Fügen Sie nun etwas weißes Rauschen hinzu und sehen Sie, wie unser Detektor darauf reagiert:

Ich habe weißes Rauschen hinzugefügt, sodass das Signal-Rausch-Verhältnis 0 dB betrug. In der obigen Abbildung ist das verrauschte Signal blau, das Quellensignal grün und der Amplitudenwert rot dargestellt. In diesem Fall hat der Detektor bei
N = 2 bereits nichts erkannt, und das Minimum N, bei dem er ordnungsgemäß funktioniert, ist 32. Das heißt, Die Größe des Verarbeitungsfensters in Proben betrug
32 · 4 = 128 Proben.
Das heißt, wir können jetzt das Eingangssignal analysieren und einen Parameter auswerten, der das Vorhandensein einer Frequenz quantifiziert, viermal weniger als die Abtastfrequenz. Wenn Sie einen bestimmten Schwellenwert für diesen Parameter festlegen, kann alles binärisiert werden. Wenn wir auf einfache Weise sprechen, können wir die Frage beantworten: Gibt es einen bestimmten Ton im Eingangssignal oder nicht?
Das ist sehr gut, aber wir müssen Bits übertragen, und Bits können zwei Werte annehmen.
Das Implementieren eines Systems mit zwei Signalisierungszuständen mit Hilfe eines ist eine mittelmäßige Idee, daher werden wir einen der Zustände nicht mit Stille (Pause) codieren. Dies würde die Erkennung sehr erschweren: Es wäre notwendig, den Beginn der Prämisse irgendwie hervorzuheben, herauszufinden, wie das Ende angeordnet werden kann usw.
Stattdessen werden "1" und "0" mit Impulsen unterschiedlicher Länge codiert, zwischen den Bits befindet sich ein sogenanntes Schutzintervall - weil wir uns immer noch mit Mehrwegeausbreitung und Hall befassen müssen. In einfachen Worten ist das Schutzintervall der Ort (die Zeit), an dem alle Reflexionen des vorherigen Bits, alle Nachgeräusche und Echos aussterben.
Mit Blick auf die Zukunft stellen wir fest, dass mit einer solchen Signalstruktur der Betriebsalgorithmus des Empfängers erheblich vereinfacht wird: Wir warten auf das Erscheinen des Tons, bemerken den Anfang, warten auf das Verschwinden des Tons und notieren erneut die Zeit - wenn die empfangene Zeit eher „1“ lang ist, wahrscheinlich haben wir ein bisschen mit einem Wert von "1" genommen, wenn es eher wie "0" aussieht - dann haben wir anscheinend ein bisschen mit einem Wert von "0" gemacht.
Im Allgemeinen können wir sagen, dass dies eine Art Morsecode ist.
Software-Teil des Modems
Für die Ungeduldigen -
ein Beispiel liegt auf GitHub . Es wurde in C # erstellt (weil ich für den PC darauf schreibe und es für mich einfach bequemer und schneller ist).
Die wunderbare
NAudio- Bibliothek wird zum Abspielen und Aufnehmen von Ton vom Mikrofoneingang verwendet.
Die gesamte
Modemlogik gehört zur Klasse
SUAModem (Simple Underwater Acoustic Modem).
Die folgenden Parameter werden an den Konstruktor übergeben:
doppelte sRateHz - Abtastrate in Hertz;
int wSize - die Größe des Verarbeitungsfensters in Beispielen;
int oneMultiplier - wie viele "Fenster" halten ein bisschen mit einem Wert von "1"
int zeroMultiplier - wie viele "Fenster" dauern ein bisschen mit einem Wert von "0"
double eThreshold - Schwelle, lassen Sie uns später darüber sprechen
Um ein Signal aus einem Array von Bytes zu generieren, gibt es eine ModulateData-Methode (Byte [] -Daten), die ein Array von 16-Bit-Samples mit Vorzeichen zurückgibt.
public short [] ModulateData (Byte [] Daten) public short[] ModulateData(byte[] data) { double alpha = 0; double phase = 0; List<short> samples = new List<short>(); BitArray bits = new BitArray(data); for (int i = 0; i < bits.Length; i++) { int sLim = (bits[i]) ? oneDurationSmp : zeroDurationSmp; alpha = 0; phase = 0; for (int sIdx = 0; sIdx <= sLim; sIdx++) { alpha = Math.Sin(phase); phase += delta; if (phase >= alimit) phase -= alimit; samples.Add(Convert.ToInt16(alpha * short.MaxValue)); } samples.AddRange(new short[defenseIntervalSmp]); } return samples.ToArray(); }
In der Hauptschleife durch übertragene Bits wird die Abtastliste gefüllt. Abhängig vom aktuell übertragenen Bit wird die Länge sLim des erzeugten Signals in Abtastwerten eingestellt. Nach jedem Bit wird ein Schutzintervall hinzugefügt.
Natürlich ...Viele mögen bemerken, dass man beim Erzeugen eines Signals auf die Sinusfunktion verzichten könnte, aber dieses Beispiel ermöglicht es, durch entsprechende Änderung des Delta-Werts die Frequenz des erzeugten Tons zu ändern.
Einen Ton mit einer Frequenz erzeugen
bei einer gegebenen Abtastrate
entsprechender Wert
einfach berechnet:
Zum Generieren und Ausgeben eines Signals gibt es die TransmitData-Methode (Byte [] Daten), die intern ModulateData aufruft:
public double TransmitData (Byte [] Daten) public double TransmitData(byte[] data) { var samples = ModulateData(data); double txTime = ((double)samples.Length) / SampleRateHz; var rawBytes = new byte[samples.Length * 2]; for (int i = 0; i < samples.Length; i++) { var bts = BitConverter.GetBytes(samples[i]); rawBytes[i * 2] = bts[0]; rawBytes[i * 2 + 1] = bts[1]; } using (var ms = new MemoryStream(rawBytes)) { using (var rs = new RawSourceWaveStream(ms, new WaveFormat(Convert.ToInt32(SampleRateHz), 16, 1))) { using (var wo = new WaveOutEvent()) { wo.Init(rs); wo.Play(); while (wo.PlaybackState == PlaybackState.Playing) { Thread.SpinWait(1); } } rs.Close(); } ms.Close(); } return txTime; }
Die SUAModem-Klasse meldet die Akzeptanz des nächsten Bytes mithilfe des DataReceivedEventHandler-Ereignisses.
Eingabeproben werden mit der ProcessInputSignal-Methode (short [] data) an die Analyse gesendet und dort in den Ringpuffer geschrieben. Die Analyse erfolgt in einem separaten Thread in der Receiver-Methode.
Und der Empfänger selbst lebt in der Empfangsmethode:
private void Receive () private void Receive() int a; while (rCnt >= 4) { a = ring[rRPos]; rRPos = (rRPos + 1) % rSize; rCnt--; dRing1[rHead] = a; dRing2[rHead] = a; s1 += a - dRing1[rTail]; s2 += a - dRing2[rTail]; rHead = (rHead + 1) % windowSize; rTail = (rTail + 1) % windowSize; a = ring[rRPos]; rRPos = (rRPos + 1) % rSize; rCnt--; dRing1[rHead] = a; dRing2[rHead] = -a; s1 += a - dRing1[rTail]; s2 += -a - dRing2[rTail]; rHead = (rHead + 1) % windowSize; rTail = (rTail + 1) % windowSize; a = ring[rRPos]; rRPos = (rRPos + 1) % rSize; rCnt--; dRing1[rHead] = -a; dRing2[rHead] = -a; s1 += -a - dRing1[rTail]; s2 += -a - dRing2[rTail]; rHead = (rHead + 1) % windowSize; rTail = (rTail + 1) % windowSize; a = ring[rRPos]; rRPos = (rRPos + 1) % rSize; rCnt--; dRing1[rHead] = -a; dRing2[rHead] = a; s1 += -a - dRing1[rTail]; s2 += a - dRing2[rTail]; rHead = (rHead + 1) % windowSize; rTail = (rTail + 1) % windowSize; if (++cycle >= windowSize) { cycle = 0; currentEnergy = Math.Sqrt(s1 * s1 + s2 * s2) / windowSize; double de = currentEnergy - prevEnergy; #region analysis if (skip > 0) skip -= windowSize * 4; else { if (isRise) { if (de > -Threshold) { riseSmp += windowSize * 4; } else { // analyse symbol isRise = false; double oneDiff = Math.Abs(oneDurationSmp - riseSmp); double zeroDiff = Math.Abs(zeroDurationSmp - riseSmp); if (oneDiff > zeroDiff) { // Mostly likely "0" AddBit(false); } else { // Mostly likely "1" AddBit(true); } samplesSinceLastBit = 0; skip = defenseIntervalSmp / 2; } } else { if (de > Threshold) { isRise = true; riseSmp = windowSize * 4; } } } #endregion prevEnergy = currentEnergy; if (bPos > 0) { samplesSinceLastBit += 4 * windowSize; if (samplesSinceLastBit >= defenseIntervalSmp * 2 + zeroDurationSmp + oneDurationSmp) { DiscardBits(); } } } } }
Aus dem Code ist ersichtlich, dass die Analyse in 4 Proben durchgeführt wird. Wenn Sie möchten, können Sie den Status speichern und eine Probe verarbeiten, was bei der Übertragung auf ein schwaches MK hilfreich ist.
Beim Empfang von Daten wird der Wert der Amplitude s mit einer Frequenz sRateHz / 4 berechnet. Die Differenz zwischen dem vorherigen und dem aktuellen Wert der Amplitude wird berechnet und dann mit einem bestimmten Schwellenwert verglichen, der experimentell ausgewählt wurde. In einem Beispiel können Sie diesen Schwellenwert in Echtzeit ändern.
Ein starker Anstieg der Amplitude zeigt den Beginn eines „Bits“ an, ein starker (aufgrund des Nachhalls etwas weniger scharfer) Abfall zeigt das Ende eines „Bits“ an.
Nachdem wir das nächste Bit erhalten haben, berechnen wir das Schutzintervall - wir überspringen die angegebene Anzahl von Proben - es sind alle Arten von Echos in ihnen, sie stören uns nur.
Der eiserne Teil des Modems
Mit der Struktur des Signals ist also alles klar, wie man es zu klar empfängt. Die kleine Sache ist zu lernen, wie man ein Signal ins Wasser ausstrahlt und es vom Wasser empfängt.
Wenn Sie noch keine Sonarantennen haben, ist es an der Zeit, diese in
unserem vorherigen Tutorial durchzuführen .
Ich blieb von dieser Zeit bei ihnen, also überspringe ich diesen Schritt.
Wir verbinden die Antenne, die zur Übertragung vorgesehen ist,
mit aliexpress an
die Verstärkerplatine . Für einige zehn Meter (vielleicht sogar Hunderte) ist das für uns völlig ausreichend. Hier gibt es keine Tricks - der Ausgang der Soundkarte des Laptops geht an den Eingang des Verstärkers, der von einer 12-Volt-4-Ah-Blei-Säure-Batterie gespeist wird. Unsere hydroakustische Sendeantenne von einem Piezo-Hochtöner ist an den Ausgang angeschlossen. In meinem Fall sieht es so aus:


Auf dem Foto oben befindet sich auf dem Bildschirm ein kleiner Spoiler für den nächsten Artikel. Das nächste Mal werden wir auf denselben Drüsen erneut versuchen, den "Video" -Sound durch Wasser zu übertragen, jedoch auf eine völlig andere Weise als beim
letzten Mal .
Mit einer Empfangsantenne ist das etwas komplizierter. Obwohl Piezo-Hochtöner sehr empfindlich sind, reicht dies immer noch nicht aus. Wir müssen eine Vorverstärkerplatine mit einem Filter im 5-35-kHz-Band zusammenbauen.
Der Gewinn, den wir nehmen, ist 1000.
Die Schaltung, das Design der Leiterplatte und die Liste der Vorverstärkerkomponenten befinden sich auf unserem GitHub:
Schaltung , Spuren -
oberste Schicht und
unterste Schicht ,
Stückliste .
Die LUT-
Technologie wurde hunderte Male diskutiert, aber lassen Sie uns auch unseren Beitrag leisten.
Foto verarbeitenAlso nehmen wir eine passende Zeitschrift, wir hatten nur diese zur Hand:

Von dort nehmen wir ein paar Seiten und drucken die Schichten mit einem Laserdrucker darauf.

Mit Nadeln kombinieren und auf einer Seite kleben, wie auf dem Foto gezeigt:

Bevor wir das Eisen verwenden, befeuchten wir den Toner mit Isopropylalkohol:

Viermal gefaltetes A4-Blech bügeln:

In warmem Wasser unter dem Wasserhahn einweichen:

Und wir waschen die Papierreste. Danach bereiten wir ein Werkstück zum Ätzen vor:

Wir schneiden den Überschuss mit Hilfe einer Metallschere ab oder für wen es bequemer ist.
Wir vergiften Eisenchlorid. Speziell für den Artikel, den wir frisch geworfen haben, stellte sich heraus, dass er so wählerisch war, dass Blasen aktiv vom zukünftigen Board kommen:

Als Ergebnis erhalten wir nach dem Ätzen und Waschen des Toners ein solches Halbzeug:


Nach dem Löten der Komponenten und dem Waschen sieht die Platine so aus.

Und es sieht aus wie die Baugruppe der Empfangsteile. Die Stromversorgung erfolgt über dieselbe 12-Volt-Bleibatterie:

Kleiner Filter HaftungsausschlussWenn der Leser das Band ändern möchte, schlagen wir vor, den Filter 8. Ordnung, der auf einem billigen 4-Kanal-Operationsverstärker TL084C (DA2 im
Diagramm ), den Widerständen R10-R13, R15-R23 und den Kondensatoren C5-C8, C11, C12, C14 und 4 aufgebaut ist, wiederzugeben C15.
Nur für den Fall, hier ist der Frequenzgang der aktuellen Filterimplementierung:

Und hier ist ein weiteres
Projekt für diesen Filter, das in der
Qucs- Anwendung erstellt wurde
Erfahrungen und Tests
Um eine Verbindung zu einem Laptop herzustellen, verwenden wir eine normale Buchse von 3,5 mm. Die Spitze ist ein Signal, die mittlere ist nicht angeschlossen, die Erde -
Staub zu Staub zum Boden. Alle Verstärkungen und Effekte des Mikrofons müssen ausgeschaltet sein und die Lautstärke muss abgespielt werden, um den optimalen Pegel zu erreichen. Die Trittfrequenz sollte auftreten, wenn Sie die an den Vorverstärker angeschlossene Antenne mit Ihrem Finger berühren und leicht streicheln.
Wenn Sie einfach ein Stück ohne Verstärker und Vorverstärker auf ein anderes setzen und diese mit dem Audioeingang und -ausgang verbinden, funktioniert alles perfekt. Unten ist ein Abschnitt des Signals und Sie können sogar mit dem Auge bestimmen, wo die Werte der Bits sind:

Das Signal selbst wird in Blau angezeigt, die Differenz zwischen den aktuellen und vorherigen Werten der Amplitude (vorne) in Rot und die Differenz zwischen den vorherigen und aktuellen Werten (Abnahme) in Grün. Sie können diesen Teil der Prämisse leicht „demodulieren“: 1 0 0 0 1 1 0. Unsere Null ist doppelt so lang wie die Einheit, und die Dauer des Schutzintervalls entspricht der Dauer von Null.
Auch ohne Verstärker und Vorverstärker senken wir unsere Antennen in einen Metalltank mit den Abmessungen 3x1,5x1,5. Wir haben dies im Labor und haben die Regel aufgestellt, dass wir keine Kommunikation durchführen, wenn sie in diesem Tank irgendwie nicht arbeiten kann. Tatsache ist, dass es in einem so geschlossenen Energievolumen keinen Weg gibt - der Schall wird wunderbar und wiederholt von den Metallwänden reflektiert und an der Empfangsstelle wird Brei erhalten. Und angesichts der Tatsache, dass wir normalerweise vorgefertigte Geräte mit Energie prüfen, die für Tausende von Metern berechnet wurde, können Sie sich vorstellen, was dort vor sich geht.
Zum Beispiel arbeiten zwei unserer
RedLINE- Modems in diesem Tank nur in einer Entfernung von nicht mehr als zwei Metern stabil, und zwei
uWAVEs arbeiten stabil in einer Entfernung von etwa 1 Meter. Während der erste im offenen Wasser bis zu 8000 Meter und der zweite
bis zu einem Kilometer arbeitet .
Natürlich verwenden nicht alle kommerziellen Produkte solche primitiven Modulationsschemata, die im Artikel besprochen werden und viel komplizierter sind, aber jetzt ist es wichtig, dass wir die Grundlagen verstehen und sinnvollerweise etwas mit unseren Händen tun.
Im Allgemeinen senken wir die Antennen bis zu einer Entfernung von etwa 50 Zentimetern in den Tank und erhalten bereits etwas viel weniger Schönes als bei direktem Kontakt der Antennen:

Obwohl hier ein viel längeres Schutzintervall verwendet wird, ist immer noch sichtbar, dass das Echo fast bis zum nächsten Bit geht, die Fronten und insbesondere die Einbrüche sehr verschwommen sind. Sie können jedoch weiterhin den Inhalt der Nachricht bestimmen: 1 0 0 0 1 1 0
In beiden Fällen habe ich die Nachricht „123“ gesendet und diese sieben Bits gehören zum Einheitensymbol.
Es sah ungefähr so aus, dann wurde die Oberfläche leicht überarbeitet

Auf dem Bildschirm oben ist zu sehen, dass mit diesen Einstellungen die Meldung „Hallo,
habr !!! :-) "bestehend aus 19 Bytes dauert 9,132 Sekunden, dh die Übertragungsgeschwindigkeit betrug 16,6 Bit / s. Damit das Modem in unserem Tank funktioniert, mussten wir übrigens das Schutzintervall erhöhen, damit die Übertragungsgeschwindigkeit auf ~ 3 Bit / s abfiel.
Wir überprüften die hausgemachten Arbeiten im Schwimmbad, wo sie stetig 10 Meter verdienten.

Wir haben uns auch hausgemachte Arbeiten am Teich gegönnt. Ich habe ein aktives Hydrophon verwendet, dessen Design dem im Artikel vorgeschlagenen sehr ähnlich ist. Nur anstelle eines Piezo-Hochtöners wurde ein Sensor von den Parksensoren verwendet. Die Batterie wurde dort in einer Spule montiert, auf die das Kabel gewickelt war:


Die Antenne des Empfängers und des Senders senkte sich direkt vom Ufer ab, die Tiefe dort geht stark von 0,5 bis 2 Meter. Seltsamerweise waren in dem auf dem Foto oben gezeigten Experiment die schlechtesten Bedingungen, die Entfernung dort betrug nur etwa 5 Meter - dies war im Allgemeinen die anfängliche Einstellung. Von den 20 übertragenen Nachrichten, jeweils 3 Bytes, wurde in sechs ein Byte geschlagen.
Als wir dann den Empfänger an einen zweiten Laptop anschlossen und ihn auf die andere Seite des Teichs (Entfernung von etwa 30 Metern) stellten, lief die Übertragung viel besser - es gab nur ein paar Fehler mit 40 Nachrichten mit einer Größe von 3 bis 13 Byte.

Auf dem nächsten Foto auf der Karte sind die Orte sichtbar, an denen sich die Antennen befanden.

Schlussfolgerung und weitere Forschung
Wie versprochen haben wir für ein paar Rubel ein funktionierendes Gerät zusammengestellt. Obwohl sein praktischer Wert zweifelhaft ist, wird der Prozess der Herstellung und Abstimmung auf einem Teich für Anfänger sehr nützlich sein. Unter Verwendung der beschriebenen Trägererkennungsmethode ist es durchaus möglich, verschiedene einfache Navigationssysteme für den Amateurgebrauch zu entwickeln, und was besonders schön ist, die Rechenkomplexität ermöglicht es Ihnen, die Methode auf einem einfachen Mikrocontroller zu implementieren.
Um nicht unbegründet über den Aufbau von Navigationssystemen auf einfachen Signalen zu sein, werfen Sie einen Blick auf die
interessante Arbeit, in der sie ein vollwertiges Fernnavigationssystem gebaut haben. In diesem System wird die Position des Pingers bestimmt, der seine Tiefe periodisch überträgt. Der Tiefenwert wird durch den Abstand zwischen zwei einfachen Impulsen bei einer bestimmten Frequenz codiert. Also ja, ja, die Töpfe werden nicht von den Göttern verbrannt, die Straße wird vom Wanderer überwältigt, Geduld und Arbeit, Lernen, Lernen, Lernen - das ist alles.
Wenn wir Zeit haben, werden wir vielleicht ein DIY-Projekt durchführen, um einen autonomen Pinger zu positionieren, der einfache Signale aussendet. Wir haben bereits etwas Ähnliches gemacht, aber kein DIY,
basierend auf unseren
uWAVE- Modems, über die wir sogar versucht haben,
ein Video zu
drehen . Es wird sehr interessant sein, Ihre Meinung zu diesem Thema zu hören - es ist sehr wichtig, eine Bestätigung zu haben, dass Sie etwas tun, das nicht umsonst ist.
Zurück zum Hauptthema stellen wir jedoch fest, was im vorgeschlagenen Schema verbessert werden könnte:
- Schwellenwertberechnung adaptiv machen
- Signalbreiten automatisch analysieren
- Versuchen Sie, unterschiedliche Längen für unterschiedliche Bitkombinationen zu verwenden
Fehlerkorrekturcodierung festziehen- Übertragen Sie alles auf Arduino
- Die Lautstärke und der Schwellenwert müssen für eine lange und langwierige Zeit ausgewählt werden, daher wäre es schön, AGC zum Vorverstärker hinzuzufügen
Bei diesem Treffen werde ich für geschlossen erklären, und wenn Sie an dem Thema interessiert sind, finden Sie hier eine Liste unserer vorherigen Artikel:
Unterwasser-GPS von Grund auf neu pro JahrUnterwasser-GPS auf einem Unterwasserroboter: ErfahrungWir haben das kleinste Sonarmodem der Welt hergestelltÜber die Wirkung von Cyanobakterien auf die Sprachfunktionen des PräsidentenAus dem Müll eine einfache Sonarantenne machenSitzung der Videoübertragung von Ton durch Wasser mit BelichtungUnterwasser-GPS auf zwei TransceivernNavigation unter Wasser: Peilung nicht Peilung - Sie sind zum Erfolg verurteiltUnterwasser-GPS: FortsetzungPS
Wie immer freuen wir uns über Kommentare und Vorschläge, fundierte Kritik und Beifall.
PPS
Entfernen Sie die Drüsen nicht weit - das nächste Mal werden wir sie wieder verwenden, um das "Video" durch das Wasser zu übertragen.