Inhaltsverzeichnis:

Arduino RF-Sensor-Decoder - Gunook
Arduino RF-Sensor-Decoder - Gunook

Video: Arduino RF-Sensor-Decoder - Gunook

Video: Arduino RF-Sensor-Decoder - Gunook
Video: How to decode any RF signal remote in Arduino | Arduino Project| ALPHA Lab 2024, November
Anonim
Arduino RF-Sensor-Decoder
Arduino RF-Sensor-Decoder

Mein vorheriges Haus war mit einem vorinstallierten Sicherheitssystem ausgestattet, das Türsensoren, einen Bewegungssensor und ein Bedienfeld hatte. Alles war fest mit einer großen Elektronikbox in einem Schrank verkabelt, und es gab Anweisungen, wie man ein Festnetztelefon so verkabeln konnte, dass es im Alarmfall automatisch anwählte. Als ich versuchte, damit zu spielen, stellte ich fest, dass einer der Türsensoren unvollständig installiert war und ein anderer aufgrund einer falschen Ausrichtung unterbrochen war. Soweit die professionelle Installation, die auf der Visitenkarte des Sicherheitsunternehmens angepriesen wird. Meine damalige Lösung bestand darin, ein paar Internet-Überwachungskameras und einen billigen drahtlosen Sicherheitsalarm zu kaufen.

Schneller Vorlauf bis heute und dieser Funkalarm sitzt in einer Kiste in meinem Keller. Nach dem Erwerb eines billigen RF-Empfängers habe ich mich entschieden, zu sehen, ob ich die Nachrichten entschlüsseln kann, die von den verschiedenen Alarmsensoren und Fernbedienungen, die ich habe, gesendet werden. Ich dachte mir, da sie alle mit der billigen Alarmbox arbeiten, müssen sie alle das gleiche Nachrichtenformat mit nur einer anderen ID verwenden. Ich fand bald heraus, dass sie sich nur in der allgemeinen Struktur der Nachrichten ähneln. So wurde das Projekt schnell von trivial zu sehr interessant.

Schritt 1: Sensormodule

Sensormodule
Sensormodule
Sensormodule
Sensormodule
Sensormodule
Sensormodule
Sensormodule
Sensormodule

Wie Sie in den obigen Bildern sehen können, enthalten die Sender Türöffnungssensoren, Bewegungsmelder, Fernbedienungen zum Scharfschalten und eine drahtlose Tastatur, die zum Programmieren der Alarmbox verwendet wird. Wie sich herausstellt, verwenden keine zwei dieser Geräte die gleiche Sync-Länge oder Bit-Dauer. Die einzige Gemeinsamkeit außer der Nachrichtenlänge ist das Grundformat der Bits. Jedes Bit benötigt eine feste Zeitperiode, wobei die Differenz zwischen einer Null und einer Eins das Tastverhältnis der High/Low-Anteile ist.

Die oben gezeigte hübsche Wellenform ist NICHT das, was ich zuerst erhalten habe. Da es im 433-MHz-Frequenzband so viel Verkehr gibt, musste ich sicherstellen, dass der Sensor aktiviert wird, kurz bevor ich das Oszilloskop auf einen einzelnen Trigger eingestellt habe. Glücklicherweise geben die Sensoren bei Aktivierung mehrere Kopien der Datennachricht aus und die Fernbedienungen und die Tastatur geben weiterhin Nachrichten aus, solange eine Taste gedrückt wird. Durch die Verwendung des Oszilloskops konnte ich die Sync-Länge und die Datenbitdauer für jedes Element bestimmen. Wie bereits erwähnt, sind die Sync-Zeiten unterschiedlich und die Bit-Zeiten sind unterschiedlich, aber die Nachrichtenformate haben alle eine Low-Level-Synchronisierung, gefolgt von 24 Datenbits und einem Stoppbit. Das war genug für mich, um einen generischen Decoder in Software bauen zu können, ohne all die verschiedenen Details für jedes Gerät hart codieren zu müssen.

Schritt 2: Hardware

Hardware
Hardware
Hardware
Hardware

Ich habe ursprünglich einen Sensor-Decoder mit einem PIC-Mikrocontroller und einer Assemblersprache gebaut. Ich habe in letzter Zeit mit Arduino-Varianten gespielt, also dachte ich, ich würde sehen, ob ich es replizieren könnte. Der einfache Schaltplan ist oben gezeigt und es gibt auch ein Bild von meinem Prototyp. Alles, was ich tat, war, drei gemeinsame Überbrückungsdrähte zu verwenden, um vom Arduino Nano zur HF-Empfängerplatine zu gehen. Es werden nur Strom und eine einzige Datenleitung benötigt.

Wenn Sie mein Instructable auf der "3-in-1-Zeit- und Wetteranzeige" lesen, werden Sie sehen, dass ich einen üblichen RXB6, 433-MHz-Empfänger verwende. Möglicherweise können Sie die wirklich billigen Empfänger mit der für dieses Projekt erforderlichen kurzen Reichweite zum Laufen bringen, aber ich empfehle immer noch, einen Superheterodyn-Empfänger zu verwenden.

Schritt 3: Software

Die Software wandelt die empfangenen Bits in darstellbare ASCII-Zeichen um. Es gibt den Wert der Sync-Länge und die Längen der 1- und 0-Bits aus. Da ich die Sync-Längen und die Bit-Formate bereits kannte, hätte ich die Software speziell dafür schreiben können. Stattdessen entschied ich mich zu sehen, ob ich es schreiben könnte, um die Sync-Längen zu sortieren und die Datenbits automatisch herauszufinden. Das sollte es einfacher machen, zu ändern, falls ich versuchen möchte, zu einem bestimmten Zeitpunkt andere Formate zu erkennen. Es ist wichtig zu beachten, dass die Software nicht weiß, ob das erste Bit einer Nachricht eine 1 oder eine 0 ist. Sie geht davon aus, dass es eine 1 ist, aber wenn sie herausfindet, dass es eine Null hätte sein sollen, invertiert sie die Bits in der abgeschlossenen Nachricht, bevor Sie sie über den seriellen Port senden.

Die Zeiten des Sync-Impulses und der Datenbits werden bestimmt, indem der externe Interrupt-Eingang INT0 verwendet wird, um einen Interrupt-Handler auszulösen. INT0 kann bei steigenden, fallenden oder beiden Flanken oder bei einem konstant niedrigen Pegel triggern. Die Software wird an beiden Flanken unterbrochen und misst die Zeit, die der Puls niedrig bleibt. Das vereinfacht die Dinge, da der Nachrichtenstart/-sync ein Low-Level-Impuls ist und die Bits basierend auf ihrer Low-Level-Zeit bestimmt werden können.

Der Interrupt-Handler bestimmt zuerst, ob der erfasste Zählwert lang genug ist, um ein Start-/Sync-Impuls zu sein. Die verschiedenen Geräte, die ich habe, verwenden Sync-Impulse von 4, 9, 10 und 14 Millisekunden. Die Define-Anweisungen für die zulässigen min/max-Sync-Werte stehen in der Software im Vordergrund und sind derzeit auf 3 und 16 Millisekunden eingestellt. Die Bitzeiten variieren auch zwischen den Sensoren, daher muss der Algorithmus zum Decodieren von Bits dies berücksichtigen. Die Bitzeit des ersten Bits wird ebenso gespeichert wie die Zeit eines nachfolgenden Bits, das einen signifikanten Unterschied zum ersten Bit aufweist. Ein direkter Vergleich aufeinanderfolgender Bitzeiten ist nicht möglich, daher wird eine „Fudge Factor“-Definition („Variation“) verwendet. Die Bitdecodierung beginnt mit der Annahme, dass das erste Datenbit immer als logische 1 aufgezeichnet wird. Dieser Wert wird gespeichert und dann zum Testen nachfolgender Bits verwendet. Befindet sich eine nachfolgende Datenbitzählung innerhalb des Varianzfensters des gespeicherten Werts, wird sie ebenfalls als logische 1 aufgezeichnet. Liegt sie außerhalb des Varianzfensters des gespeicherten Werts, wird sie als logische 0 aufgezeichnet. Wenn die logische 0 Wenn die Bitzeit kürzer als die erste Bitzeit ist, wird ein Flag gesetzt, um der Software mitzuteilen, dass die Bytes vor der Anzeige invertiert werden müssen. Der einzige Fall, in dem dieser Algorithmus fehlschlägt, ist, wenn die Bits in einer Nachricht alle Nullen sind. Wir können diese Einschränkung akzeptieren, weil diese Art von Botschaft bedeutungslos ist.

Die Sensoren, die mich interessieren, haben alle eine Nachrichtenlänge von 24 Datenbits, aber die Software ist nicht auf diese Länge beschränkt. Es gibt einen Puffer für bis zu sieben Bytes (mehr könnten hinzugefügt werden) und definiert die minimale und maximale Nachrichtenlänge in Bytes. Die Software ist so eingerichtet, dass sie die Bits sammelt, in Bytes umwandelt, zwischenspeichert und dann über die serielle Schnittstelle im ASCII-Format ausgibt. Das Ereignis, das die Ausgabe der Nachricht auslöst, ist der Empfang eines neuen Start-/Sync-Impulses.

Schritt 4: Datenprotokollierung

Datenerfassung
Datenerfassung

Die Software ist so eingestellt, dass sie die konvertierten Daten als ASCII-Zeichen über den seriellen (TX) Ausgang des Arduino ausgibt. Als ich die PIC-Version erstellte, musste ich mich mit einem Terminalprogramm auf dem PC verbinden, um die Daten anzuzeigen. Ein Vorteil der Arduino IDE ist, dass sie über eine eingebaute Serial Monitor-Funktion verfügt. Ich setze die serielle Portrate auf 115.2k und setze dann das Serial Monitor-Fenster auf die gleiche Rate. Der Screenshot hier zeigt eine typische Anzeige mit Ausgängen von einer Vielzahl von Sensoren, die ich habe. Wie Sie sehen, sind die Daten manchmal nicht perfekt, aber Sie können leicht den tatsächlichen Wert jedes Sensors bestimmen.

Schritt 5: Beispiel-Empfängersoftware

Beispiel-Empfänger-Software
Beispiel-Empfänger-Software

Ich habe eine Beispielsoftwareliste beigefügt, die zeigt, wie Sie die gesammelten Informationen verwenden können, um einen bestimmten Codesatz für Ihre Anwendung zu erhalten. Dieses Beispiel ist so eingerichtet, dass es eine meiner Etekcity-Remote-Steckdosen emuliert. Ein Befehl schaltet die im Nano eingebaute LED (D13) ein und der andere Befehl schaltet die LED aus. Wenn Sie keine LED in Ihrem Arduino eingebaut haben, fügen Sie den Widerstand und die LED wie im Diagramm gezeigt hinzu. In einer realen Anwendung würde diese Funktion die Stromversorgung einer Steckdose ein- und ausschalten (mithilfe eines Relais oder eines Triacs). Die Synchronisationszeiten, Bitzeiten und erwarteten Datenbytes werden alle im Voraus definiert, um eine einfache Modifikation zu ermöglichen. Sie können jede der verbleibenden Datenleitungen verwenden, um Dinge für Ihre spezifische Anwendung ein- oder auszuschalten usw. Fügen Sie einfach den entsprechenden Befehlscode hinzu und ersetzen Sie die LED-Ein/Aus-Logik in „Schleife“, um Ihren Anforderungen zu entsprechen.

Empfohlen: