Inhaltsverzeichnis:

I2C Infrarot-Fernbedienung mit dem Arduino - Gunook
I2C Infrarot-Fernbedienung mit dem Arduino - Gunook

Video: I2C Infrarot-Fernbedienung mit dem Arduino - Gunook

Video: I2C Infrarot-Fernbedienung mit dem Arduino - Gunook
Video: Arduino Tutorial 31- How to Use the Infrared (IR) Remote 2024, Juli
Anonim
I2C Infrarot-Fernbedienung mit dem Arduino
I2C Infrarot-Fernbedienung mit dem Arduino
I2C Infrarot-Fernbedienung mit dem Arduino
I2C Infrarot-Fernbedienung mit dem Arduino

PräambelDiese Anleitung beschreibt, wie man eine universelle Fernbedienung mit I2C für die Schnittstelle erstellt.

Wie seltsam Sie sagen, ein I2C-Slave-Gerät zu verwenden?

Ja, ein I2C-Slave-Gerät.

Dies liegt daran, dass das genaue Timing von IR-Paketen ziemlich anspruchsvoll ist und ein typischer Arduino damit zu kämpfen hat, wenn er bereits viele andere Aufgaben gleichzeitig ausführt. Es ist besser, die Rechenlast zu verteilen, indem nach Möglichkeit zeitintensive Aktivitäten dedizierten Prozessoren zugewiesen werden (besser noch in Hardware). Da I2C eine gut dokumentierte und robuste Kommunikationsmethode zwischen ICs ist, habe ich diese als Schnittstelle gewählt.

Einführung

Wie oben erwähnt, beschreibt dieses anweisbare, wie man Haushaltsgeräte wie Fernseher, DVD-Player und Satelliten usw. mit der IRremote-Bibliothek auf dem Arduino steuert.

Es endet mit einem Designbeispiel, das den Arduino in ein I2C-Slave-Fernbedienungsmodul (Bild 1 oben) mit Prototyp-Testschaltung (Bild 2 oben) verwandelt und geht weiter, um Ihr Design auf die minimal erforderlichen Komponenten zu verkleinern, damit es möglich ist eingebettet in ein anderes Design. In meinem Fall verwende ich dieses eingebettete Gerät in einem IoT Universal-Fernbedienungsgerät basierend auf einem ESP8266-12E.

Welche Teile brauche ich?

Um die in Schritt 1 dargestellte Schaltung (IR-Sender) aufzubauen, benötigen Sie die folgenden Teile;

  • 2 von 10K Widerständen
  • 1 aus 390R Widerstand
  • 1 von 33R Widerstand
  • 1 von 3K8 Widerstand
  • 1 aus rote LED
  • 1 von IR-LED TSAL6400
  • 1 aus Transistor BC337
  • 1 aus 220uF Kondensator
  • 1 Stück Arduino Uno

Um die in Schritt 4 dargestellte Schaltung (IR-Empfänger) aufzubauen, benötigen Sie die folgenden Teile;

  • 1 von 10K Widerstand
  • 1 Stück TSOP38328
  • 1 aus 220uF Kondensator
  • 1 Stück Arduino Uno

Um die in Schritt 5 dargestellte Schaltung (Slave-Testschaltung) aufzubauen, benötigen Sie die folgenden Teile;

  • 4 von 10K Widerständen
  • 2 aus 390R Widerstand
  • 1 von 33R Widerstand
  • 1 von 3K8 Widerstand
  • 2 aus rote LED
  • 1 von IR-LED TSAL6400
  • 1 aus Transistor BC337
  • 1 aus 220uF Kondensator
  • 2 von SPST-Tasten
  • 2 von Arduino Unos

Um die in Schritt 6 (Shrunk Design) dargestellte Schaltung aufzubauen, benötigen Sie die folgenden Teile;

  • 3 von 10K Widerständen
  • 1 aus 270R Widerstand
  • 1 von 15R Widerstand
  • 4 von 1K-Widerständen
  • 1 aus rote LED
  • 1 aus IR-LED TSAL6400 oder TSAL5300
  • 1 aus Transistor BC337
  • 1 von 220uF Kondensatorelektrolyt @ 6.3v
  • 1 von 1000uF Kondensatorelektrolyt @ 6.3v
  • 2 von 0,1uF Kondensatoren
  • 2 von 22pF Kondensatoren
  • 1 von 16MHz Xtal
  • 1 Stück ATMega328P-PU

Hinweis: Sie benötigen auch ein FTDI-Gerät, um den ATMega328P zu programmieren

Welche Fähigkeiten brauche ich?

  • Ein minimales Verständnis von Elektronik,
  • Kenntnisse von Arduino und seiner IDE,
  • Ein bisschen Geduld,
  • Ein gewisses Verständnis von I2C wäre nützlich (siehe hier für einige allgemeine Details zur I2C/Wire-Bibliothek).

Behandelten Themen

  • Kurzer Überblick über die Schaltung,
  • Kurzer Überblick über die Software,
  • Inhalt des I2C-Pakets,
  • Erfassen von Fernbedienungscodes (ui32Data),
  • So testen Sie Ihr I2C-Slave-Gerät,
  • Verkleinern Sie Ihr Design,
  • Abschluss,
  • Referenzen verwendet.

Haftungsausschluss

Wie immer verwenden Sie diese Anweisungen auf eigene Gefahr und werden nicht unterstützt.

Schritt 1: Kurzer Überblick über die Schaltung

Kurzer Überblick über die Schaltung
Kurzer Überblick über die Schaltung

Der Zweck der Schaltung besteht darin, IR-Fernbedienungscodes zu übertragen. Das Design ist ziemlich geradlinig und ziemlich einfach.

Wenn der Transistor Q1 a BC337 NPN über eine logische Eins von Arduino PWM O/P D3 zum Widerstand R5 eingeschaltet wird, fließt Strom durch die LEDs 1 und 2. Nur durch die Ballastwiderstände R3 bzw. R4 begrenzt. Q1 wird verwendet, um den durch die IR-Diode fließenden Strom (IF Max = 100 mA) auf den Wert zu erhöhen, der über das hinausgeht, was das Arduino O / P mit ~ 40 mA @ +5 V versorgen kann.

Kondensator C1 a 220uF Electrolytic bietet eine gewisse Stabilisierung, die einen Abfall der Versorgungsschiene durch die von den LEDs 1 und 2 aufgenommene Leistung verhindert.

Die Widerstände R1 und R2 sind I2C-Pull-Ups.

Schritt 2: Kurzer Überblick über die Software

Kurzer Überblick über die Software
Kurzer Überblick über die Software
Kurzer Überblick über die Software
Kurzer Überblick über die Software
Kurzer Überblick über die Software
Kurzer Überblick über die Software

Präambel

Um diesen Quellcode erfolgreich zu kompilieren, benötigen Sie die folgende zusätzliche Bibliothek;

IRremote.h

  • Von: z3t0
  • Zweck: Infrarot-Fernbibliothek für Arduino: Senden und Empfangen von Infrarotsignalen mit mehreren Protokollen
  • Von:

Codeübersicht

Wie in Bild 1 oben gezeigt, konfiguriert der Code beim Start die Mikrocontroller-E/A und fragt dann den Status des internen Software-Flags 'bFreshDataFlag' ab. Wenn dieses Flag gesetzt ist, bestätigt der Controller seine 'Busy'-Leitung (sendet den Daten-Pin D4 niedrig) und wechselt in den 'eBUSY'-Zustand, liest sequentiell die in uDataArray gehaltenen Tastendruckbefehle und sendet die IR-modulierten Daten an die IR-LED in a Übertragungsreihenfolge.

Sobald die in uDataArray gehaltenen Daten vollständig gesendet wurden, wird der 'eIDLE'-Zustand wieder aufgenommen und die 'Busy'-Leitung wird deaktiviert (Daten-Pin D4 wird hoch gesendet). Das Gerät ist nun bereit, weitere Tastendrücke zu empfangen, die das Ende der Sendesequenz markieren.

Empfang von IR-Tastendruckdaten

Wenn Daten über I2C an die Infrarot-Fernbedienung gesendet werden, löst dies einen Interrupt aus und der Funktionsaufruf receiveEvent() wird asynchron ausgelöst.

Nach dem Auslösen werden die empfangenen I2C-Daten sequentiell in den Puffer 'uDataArray' geschrieben.

Wird beim Datenempfang ein Sequenzende vom Master signalisiert (bFreshData!=0x00), wird das 'bFreshDataFlag' gesetzt und damit der Beginn der Sendesequenz signalisiert.

Die Bilder 2…3 zeigen ein Beispiel für eine typische Paketsequenz.

Hinweis: Vollständiger Quellcode hier verfügbar

Schritt 3: Inhalt des I2C-Pakets

Inhalt des I2C-Pakets
Inhalt des I2C-Pakets

Das Format des über I2C an den Slave gesendeten Steuerpakets ist oben in Bild 1 angegeben. Die Bedeutung der einzelnen Felder ist unten angegeben

Bedeutung der Steuerpaketfelder

Byte bEncoding;

  • Codierung der IR-Fernbedienung,

    • RC6 (Himmel) = 0,
    • SONY = 1,
    • SAMSUNG = 2,
    • NEC = 3,
    • LG = 4

uint32_t ui32Data;

Die Hex-Darstellung des binären IR-Datenstroms 4 Datenbytes (unsigned long), LSByte … MSByte

byte bNumberOfBitsInTheData;

Anzahl der Bits in den Daten (maximal 32). Bereich = 1 … 32

byte bPulseTrainRepeats;

Wie viele Wiederholungen dieser Impulsfolge. Bereich = 1 … 255. Typischerweise 2…4 Wiederholungen. Möglicherweise möchten Sie dies für Ein/Aus-Befehle erweitern, da das empfangende Gerät manchmal einige zusätzliche Impulsfolgewiederholungen benötigt, um ein Einschaltsignal zu empfangen

byte bDelayBetweenPulseTrainRepeats;

Verzögerung zwischen Wiederholungen dieser Impulsfolge. Bereich = 1 … 255mS. Typisch 22mS … 124mS

Byte-bButtonRepeats;

Simuliert wiederholtes Drücken derselben Taste (unterstützt jedoch nicht den geänderten Code wie eine Apple-Fernbedienung, sondern wiederholt nur den Tastencode). Bereich = 1 … 256. Standard = 1

uint16_t ui16DelayBetweenButtonRepeats;

Verzögerung zwischen Tastenwiederholungen (unsigned int). 2 Byte insgesamt LSByte … MSByte. Bereich = 1 … 65535mS. Standard = 0mS

Byte bFreshData;

  • Frische Daten. Ein Wert ungleich Null. Zuletzt geschrieben, löst die IR-TX-Sequenz aus. Bereich 0x00…0xFF

    • Weitere Kontrollpakete folgen = 0
    • Dies ist das letzte Kontrollpaket = Wert ungleich Null 1, 2, … 255

Beachten Sie die Verwendung der Compiler-Direktive '_packed_'. Damit soll sichergestellt werden, dass die Daten unabhängig vom verwendeten Zielsystem (Uno, Due, ESP8266 etc.) paketweise im Speicher liegen. Dies bedeutet, dass die Vereinigung zwischen registerAllocationType und dataArrayType nur sequentiell Bytes aus einem Steuerpaket aus-/eintakten muss, was die TX/RX-Software einfach macht.

Schritt 4: Erfassen von Fernbedienungscodes (ui32Data)

Abrufen von Fernbedienungscodes (ui32Data)
Abrufen von Fernbedienungscodes (ui32Data)
Abrufen von Fernbedienungscodes (ui32Data)
Abrufen von Fernbedienungscodes (ui32Data)
Abrufen von Fernbedienungscodes (ui32Data)
Abrufen von Fernbedienungscodes (ui32Data)
Abrufen von Fernbedienungscodes (ui32Data)
Abrufen von Fernbedienungscodes (ui32Data)

Es gibt drei Möglichkeiten, einen entsprechenden Fernbedienungsschlüsselcode zu erhalten;

  1. Über Bitzählung mit einem Oszilloskop,
  2. Schauen Sie auf einer Website nach,
  3. Decodieren Sie es direkt aus dem Datenstrom in der Software.

Über Bitzählen mit einem Scope

Dies ist keine effiziente Methode, da sie einige Zeit in Anspruch nimmt und möglicherweise mehr als einen Versuch erfordert, sie kann jedoch sehr genau sein. Es ist auch nützlich bei der visuellen Validierung von Codes, die mit den Methoden 2 und 3 erhalten wurden, sowie bei der Bestimmung jeglicher Besonderheiten einer Fernbedienung. Zum Beispiel beim Gedrückthalten einer Taste auf einer Apple IR-Fernbedienung. Die Fernbedienung gibt zunächst eine Befehlssequenz aus, gefolgt von einer wiederholten komprimierten Sequenz von 0xF….

Schau es auf einer Website nach

Die Fernbedienungscode-Datenbank auf der Linux Infrared Remote Control-Website ist eine gute Quelle.

Der Nachteil ist jedoch, dass Sie möglicherweise einige Codes ausprobieren müssen, bis Sie einen finden, der für Sie funktioniert. Möglicherweise müssen Sie auch einige der Darstellungen der Codes interpretieren, um sie in ihre entsprechende Hex-Form umzuwandeln.

Dekodieren Sie es direkt aus dem Datenstrom

Mit der Schaltung in Bild 1 oben in Verbindung mit dem IRremote-Bibliotheksbeispiel 'IRrecvDumpV2.ino' ist es möglich, den Datenstrom direkt von der Fernbedienung zu dekodieren. Bild 2 zeigt eine dekodierte Samsung TV-Fernbedienung für einen Ein-/Aus-Tastendruck im Arduino IDE-Terminalfenster.

Kombinierter Empfänger/Sender

Die Bilder 3 und 4 oben zeigen eine Lösung, die sowohl den Empfang als auch die Übertragung von IR-Befehlen ermöglicht, um ein einfaches Prototyping zu ermöglichen.

Um das Drücken der IR-Fernbedienungstaste zu decodieren, müssen Sie das Arduino mit dem Beispiel 'IRrecvDumpV2.ino' flashen, das mit der IRremote-Bibliothek geliefert wird.

Es funktioniert auch genauso gut für die Übertragung von IR-Befehlen. Eine rote LED ist als visuelle Anzeige enthalten, dass das Gerät in Aktion ist.

Schritt 5: So testen Sie Ihr I2C-Slave-Gerät

So testen Sie Ihr I2C-Slave-Gerät
So testen Sie Ihr I2C-Slave-Gerät
So testen Sie Ihr I2C-Slave-Gerät
So testen Sie Ihr I2C-Slave-Gerät

Mit dem Quellcode hier und der oben in Bild 1 skizzierten Schaltung programmieren Sie den 'Master' Arduino mit 'IR_Remote_Sim_Test.ino' und den 'Slave' Arduino mit 'IR_Remote_Sim.ino'.

Angenommen, Sie haben einen Sony Bravia Fernseher, eine Sky HD Box und eine Sony BT SoundBar, drücken Sie die Taste 1 und Ihr Fernseher schaltet auf BBC1 (Kanal 101) um. Drücken Sie Taste 2 und Ihre Soundbar wird stumm geschaltet. Drücken Sie erneut und die Stummschaltung wird aufgehoben.

Während der Ausführung der IR-Übertragungssequenz leuchtet LED3, um anzuzeigen, dass der Slave beschäftigt ist, und LED1 flackert während des IR-Übertragungsprozesses.

Wenn Sie nicht das gleiche Unterhaltungssystem wie oben haben, können Sie den Slave natürlich mit 'IRrecvDumpV2.ino' neu programmieren, Ihre interessierenden Fernbedienungsbefehle decodieren und sie dann in die 'IR_Remote_Sim_Test.ino' für Ihr programmieren gegebenes Szenario.

Bild 2 zeigt die Übersicht der Testsoftware auf Systemebene zwischen Master und Slave.

Schritt 6: Verkleinern Ihres Designs

Verkleinern Sie Ihr Design
Verkleinern Sie Ihr Design

Ok, vorausgesetzt, Sie haben diese Anleitung befolgt, die sich auf zwei Arduinos verlässt, um Ihre Heimgeräte zu steuern, ist nicht die effizienteste Nutzung Ihres Arduino-Lagers. Wenn Sie also die im Bild oben gezeigte Schaltung aufbauen und den Anweisungen hier folgen, um den ATMega328P mit 'IR_Remote_Sim.ino' zu programmieren, können Sie das gesamte System auf die minimalen Komponenten reduzieren. Auf diese Weise können Sie Ihr Design in ein anderes System einbetten.

Schritt 7: Fazit

Abschluss
Abschluss
Abschluss
Abschluss

Die Lösung ist stabil und funktioniert gut, sie ist seit einigen Wochen ohne Probleme in ein anderes System eingebettet.

Ich habe mich für das Arduino Uno R3 entschieden, da ich ein Gerät mit ausreichend RAM wollte, um einen Tastenpuffer mit angemessener Tiefe zu haben. Ich habe mich für eine Puffergröße von 20 Paketen (MAX_SEQUENZEN) entschieden.

Das von mir hergestellte Hybrid TX / RX-Schild war auch sehr praktisch beim Decodieren von Sony- und Sky-Fernbedienungen. Obwohl ich gestehen muss, dass ich von Zeit zu Zeit mein digitales Zielfernrohr verwende, um zu überprüfen, dass der von der Software decodierte IR-Befehl derselbe war, der vom empfangenen IR (TSOP38328) stammt.

Das einzige, was ich anders gemacht hätte, wäre die Konstantstrom-Treiberschaltung für die IR-LED zu verwenden, wie oben in Bild 2 gezeigt.

Ein weiterer zu beachtender Punkt ist, dass nicht alle IR-Sender mit 38KHz moduliert sind, der TSOP38328 ist für 38KHz optimiert.

Schritt 8: Verwendete Referenzen

IRRemote.h

  • Von: z3t0
  • Zweck: Infrarot-Fernbibliothek für Arduino: Senden und Empfangen von Infrarotsignalen mit mehreren Protokollen
  • Von:

IR-Fernbedienungsbibliothek

  • z3t0.github.io/Arduino-IRremote/
  • https://arcfn.com/2009/08/multi-protocol-infrared-remote-library.html

IR (Infrarot) Empfängersensor - TSOP38238 (äquivalent)

https://cdn-shop.adafruit.com/datasheets/tsop382.pdf

Um das Auffüllen von Datenstrukturen an Wortgrenzen zu vermeiden

  • https://github.com/esp8266/Arduino/issues/1825
  • https://github.com/tuanpmt/esp_bridge/blob/master/modules/include/cmd.h#L15
  • https://stackoverflow.com/questions/11770451/what-is-the-meaning-of-attribute-packed-aligned4

Gute Quelle für IR-Fernbedienungsdetails

https://www.sbprojects.com/knowledge/ir/index.php

I2C

  • https://playground.arduino.cc/Main/WireLibraryDetailedReference
  • https://www.arduino.cc/en/Reference/WireSend

Datenbank für IR-Fernbedienungen

  • https://www.lirc.org/
  • https://lirc-remotes.sourceforge.net/remotes-table.html

BC337 Datenblatt

https://www.onsemi.com/pub/Collateral/BC337-D. PDF

1N4148 Datenblatt

https://www.vishay.com/docs/81857/1n4148.pdf

Empfohlen: