Inhoudsopgave:

I2C infrarood afstandsbediening met de Arduino - Ajarnpa
I2C infrarood afstandsbediening met de Arduino - Ajarnpa

Video: I2C infrarood afstandsbediening met de Arduino - Ajarnpa

Video: I2C infrarood afstandsbediening met de Arduino - Ajarnpa
Video: Arduino Tutorial 31- How to Use the Infrared (IR) Remote 2024, November
Anonim
I2C infrarood afstandsbediening met de Arduino
I2C infrarood afstandsbediening met de Arduino
I2C infrarood afstandsbediening met de Arduino
I2C infrarood afstandsbediening met de Arduino

PreambleThis Instructable beschrijft hoe u een universele afstandsbediening kunt maken met I2C voor de interface.

Hoe vreemd zeg je, een I2C-slave-apparaat gebruiken?

Ja, een I2C-slaveapparaat.

Dit komt omdat de nauwkeurige timing van IR-pakketten behoorlijk veeleisend is en waar een typische Arduino moeite mee zal hebben als hij al veel andere taken tegelijkertijd uitvoert. Het is beter om de computerbelasting te verdelen door zoveel mogelijk tijdintensieve activiteiten toe te wijzen aan speciale processors (beter nog steeds in hardware). Aangezien I2C een goed gedocumenteerde en robuuste communicatiemethode is tussen IC's, heb ik deze als interface gekozen.

Invoering

Zoals hierboven vermeld, beschrijft deze instructable hoe huishoudelijke apparaten zoals tv, dvd-speler en satelliet enz. te bedienen met behulp van de IRremote-bibliotheek op de Arduino.

Het eindigt met een ontwerpvoorbeeld dat de Arduino verandert in een I2C-slave-afstandsbedieningsmodule (foto 1 hierboven) met prototype-testcircuit (foto 2 hierboven) en gaat verder in detail hoe u uw ontwerp kunt verkleinen tot de minimale componenten die nodig zijn, zodat het kan worden ingebed in een ander ontwerp. In mijn geval gebruik ik dit embedded apparaat in een IoT Universal afstandsbedieningsapparaat gebaseerd op een ESP8266-12E.

Welke onderdelen heb ik nodig?

Om de in stap 1 (IR-zender) afgebeelde schakeling te bouwen, hebt u de volgende onderdelen nodig;

  • 2 off 10K weerstanden
  • 1 off 390R weerstand
  • 1 uit 33R weerstand
  • 1 uit 3K8 weerstand
  • 1 uit Rode LED
  • 1 uit IR Led TSAL6400
  • 1 uit Transistor BC337
  • 1 off 220uF condensator
  • 1 uit Arduino Uno

Om de in stap 4 (IR-ontvanger) afgebeelde schakeling te bouwen, hebt u de volgende onderdelen nodig;

  • 1 off 10K weerstand
  • 1 korting op TSOP38328
  • 1 off 220uF condensator
  • 1 uit Arduino Uno

Om het circuit te bouwen dat is afgebeeld in stap 5 (Slave-testcircuit), hebt u de volgende onderdelen nodig;

  • 4 off 10K weerstanden
  • 2 off 390R weerstand
  • 1 uit 33R weerstand
  • 1 uit 3K8 weerstand
  • 2 uit Rode LED
  • 1 uit IR Led TSAL6400
  • 1 uit Transistor BC337
  • 1 off 220uF condensator
  • 2 uit SPST-knoppen
  • 2 uit Arduino Unos

Om het circuit te bouwen dat is afgebeeld in stap 6 (gekrompen ontwerp), hebt u de volgende onderdelen nodig;

  • 3 off 10K weerstanden
  • 1 off 270R weerstand
  • 1 uit 15R weerstand
  • 4 off 1K weerstanden
  • 1 uit Rode LED
  • 1 uit IR Led TSAL6400 of TSAL5300
  • 1 uit Transistor BC337
  • 1 uit 220uF condensator elektrolytisch @ 6.3v
  • 1 off 1000uF condensator elektrolytisch @ 6.3v
  • 2 off 0.1uF condensatoren
  • 2 off 22pF condensatoren
  • 1 uit 16MHz Xtal
  • 1 van ATMega328P-PU

Opmerking: u hebt ook een FTDI-apparaat nodig om de ATMega328P te programmeren

Welke vaardigheden heb ik nodig?

  • Een minimale kennis van elektronica,
  • Kennis van Arduino en zijn IDE,
  • Een beetje geduld,
  • Enig begrip van I2C zou nuttig zijn (zie hier voor enkele algemene I2C/Wire Library-details).

Behandelde onderwerpen

  • Kort overzicht van het circuit,
  • Kort overzicht van de software,
  • I2C-pakketinhoud,
  • Afstandsbedieningscodes ophalen (ui32Data),
  • Hoe u uw I2C Slave-apparaat kunt testen,
  • Je ontwerp verkleinen,
  • Conclusie,
  • Referenties gebruikt.

Vrijwaring

Zoals altijd gebruikt u deze instructies op eigen risico en worden ze niet ondersteund.

Stap 1: Kort overzicht van het circuit

Kort overzicht van het circuit
Kort overzicht van het circuit

Het doel van het circuit is om IR-afstandsbedieningscodes te verzenden. Het ontwerp is vrij eenvoudig en vrij eenvoudig.

Wanneer transistor Q1 a BC337 NPN wordt ingeschakeld via een logische van Arduino PWM O/P D3 naar weerstand R5, gaat de stroom door leds 1 en 2. Alleen beperkt door respectievelijk ballastweerstanden R3 en R4. Q1 wordt gebruikt om de stroom die door de IR-diode gaat (IF Max = 100mA) te verhogen tot meer dan wat de Arduino O/P kan ~40mA @ +5v voeding.

Condensator C1 a 220uF Elektrolytisch zorgt voor enige stabilisatie die voorkomt dat de voedingsrail uitvalt door het vermogen dat wordt opgenomen door Leds 1 en 2.

Weerstanden R1 en R2 zijn I2C pull-ups.

Stap 2: Kort overzicht van de software

Kort overzicht van de software
Kort overzicht van de software
Kort overzicht van de software
Kort overzicht van de software
Kort overzicht van de software
Kort overzicht van de software

Preambule

Om deze broncode succesvol te compileren heb je de volgende extra bibliotheek nodig;

IRremote.h

  • Door: z3t0
  • Doel: Infrarood externe bibliotheek voor Arduino: verzend en ontvang infraroodsignalen met meerdere protocollen
  • Van:

Codeoverzicht

Zoals getoond in afbeelding 1 hierboven, configureert de code bij het opstarten de microcontroller-I/O en peilt vervolgens de status van de interne softwarevlag 'bFreshDataFlag'. Wanneer deze vlag is ingesteld, bevestigt de controller dat de lijn 'Bezet' is (verzendt datapin D4 laag) en gaat naar de 'eBUSY'-status, leest achtereenvolgens de knopdrukcommando's in uDataArray en verzendt de IR-gemoduleerde gegevens naar de IR-LED in een volgorde van verzending.

Zodra de gegevens in uDataArray volledig zijn verzonden, wordt de status 'eIDLE' hervat en wordt de 'Bezet'-regel opgeheven (verzendt gegevenspin D4 hoog). Het apparaat is nu klaar om meer toetsaanslagen te ontvangen die het einde van de transmissiereeks markeren.

Ontvangst van IR-knop drukgegevens

Wanneer gegevens via I2C naar de infraroodafstandsbediening worden verzonden, wordt een onderbreking geactiveerd en wordt de functie-aanroep ReceiveEvent() asynchroon geactiveerd.

Eenmaal geactiveerd worden de ontvangen I2C-gegevens sequentieel in de buffer 'uDataArray' geschreven.

Als tijdens de gegevensontvangst een einde van de reeks wordt gesignaleerd door de master (bFreshData!=0x00), wordt de 'bFreshDataFlag' ingesteld, waarmee het begin van de transmissiereeks wordt gesignaleerd.

Afbeeldingen 2…3 geven een voorbeeld van een typische pakketvolgorde.

Opmerking: volledige broncode hier beschikbaar

Stap 3: I2C-pakketinhoud

I2C-pakketinhoud
I2C-pakketinhoud

Het formaat van het controlepakket dat via I2C naar de slave wordt verzonden, wordt hierboven in afbeelding 1 gegeven, de betekenis van elk veld wordt hieronder gegeven

Betekenis van de controlepakketvelden

byte bEncoding;

  • IR afstandsbediening codering,

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

uint32_t ui32Data;

De hexadecimale weergave van de binaire IR-gegevensstroom 4 databytes (unsigned long), LSByte … MSByte

byte bNumberOfBitsInTheData;

Aantal bits in de gegevens (max. 32). Bereik = 1 … 32

byte bPulseTrainHerhaalt;

Hoeveel herhalingen van deze pulstrein. Bereik = 1 … 255. Typisch 2…4 herhalingen. Misschien wilt u dit uitbreiden voor aan/uit-commando's, aangezien het ontvangende apparaat soms een paar extra pulstreinherhalingen nodig heeft om een inschakelsignaal te ontvangen

byte bVertragingTussenPulseTreinHerhalingen;

Vertraging tussen herhalingen van deze pulstrein. Bereik = 1 … 255mS. Meestal 22 mS … 124 mS

byte bButtonHerhalingen;

Simuleert herhaald indrukken van dezelfde knop (maar ondersteunt de gewijzigde code niet zoals een Apple-afstandsbediening, het herhaalt alleen de knopcode). Bereik = 1 … 256. Standaard = 1

uint16_t ui16DelayBetweenButtonRepeats;

Vertraging tussen knopherhalingen (unsigned int). 2 bytes in totaal LSByte … MSByte. Bereik = 1 … 65535mS. Standaard = 0mS

byte bFreshData;

  • Verse gegevens. Een waarde die niet nul is. Als laatste geschreven, activeert de IR TX-reeks. Bereik 0x00…0xFF

    • Er komen nog meer controlepakketten = 0
    • Dit is het laatste controlepakket = niet-nulwaarde 1, 2, … 255

Let op het gebruik van de compiler-richtlijn '_packed_'. Dit is om ervoor te zorgen dat de gegevens pakketbyte voor byte in het geheugen zijn, ongeacht het gebruikte doelsysteem (Uno, Due, ESP8266 enz.). Dit betekent dat de koppeling tussen registerAllocationType en dataArrayType alleen sequentieel hoeft uit te klokken/klokken in bytes vanuit een controlepakket, wat de TX/RX-software eenvoudig maakt.

Stap 4: Afstandsbedieningscodes verkrijgen (ui32Data)

Afstandsbedieningscodes verkrijgen (ui32Data)
Afstandsbedieningscodes verkrijgen (ui32Data)
Afstandsbedieningscodes verkrijgen (ui32Data)
Afstandsbedieningscodes verkrijgen (ui32Data)
Afstandsbedieningscodes verkrijgen (ui32Data)
Afstandsbedieningscodes verkrijgen (ui32Data)
Afstandsbedieningscodes verkrijgen (ui32Data)
Afstandsbedieningscodes verkrijgen (ui32Data)

Er zijn drie manieren waarop u een respectieve sleutelcode voor de afstandsbediening kunt verkrijgen;

  1. Via bittelling met een oscilloscoop,
  2. Zoek het op op een website,
  3. Decodeer het direct uit de datastroom in software.

Via bittelling met een scope

Dit is geen efficiënte methode omdat het behoorlijk wat tijd kost en mogelijk meer dan één poging vereist, maar het kan zeer nauwkeurig zijn. Het is ook nuttig bij het visueel valideren van codes die zijn verkregen met methode 2 en 3, ook bij het bepalen van eventuele eigenaardigheden van een afstandsbediening. Bijvoorbeeld bij het ingedrukt houden van een knop op een Apple IR-afstandsbediening. De afstandsbediening zal in eerste instantie een commandoreeks geven en daarna een herhaalde gecomprimeerde reeks van 0xF….

Zoek het op op een website

De database met afstandsbedieningscodes op de Linux Infrared Remote Control-website is een goede bron.

Het nadeel is echter dat u misschien een paar codes moet proberen totdat u er een vindt die voor u werkt. Mogelijk moet u ook enkele weergaven van de codes interpreteren om ze om te zetten in hun equivalente hexadecimale vorm.

Decodeer het rechtstreeks uit de datastroom

Met behulp van het circuit in afbeelding 1 hierboven in combinatie met het IRremote-bibliotheekvoorbeeld 'IRrecvDumpV2.ino' is het mogelijk om de datastroom rechtstreeks vanaf de afstandsbediening te decoderen. Afbeelding 2 toont een gedecodeerde Samsung TV-afstandsbediening voor een aan/uit-knop in het Arduino IDE-terminalvenster.

Gecombineerde ontvanger/zender

Foto's 3 en 4 hierboven tonen een oplossing die zowel ontvangst als verzending van IR-commando's mogelijk maakt om eenvoudig prototypen mogelijk te maken.

Om het indrukken van de IR-afstandsbedieningsknop te decoderen, moet u de Arduino flashen met het voorbeeld 'IRrecvDumpV2.ino' dat bij de IRremote-bibliotheek wordt geleverd.

Het werkt ook even goed voor verzending als IR-commando's. Een rode led is inbegrepen als visuele indicatie dat het apparaat in actie is.

Stap 5: Hoe u uw I2C-slave-apparaat kunt testen?

Hoe u uw I2C-slave-apparaat kunt testen
Hoe u uw I2C-slave-apparaat kunt testen
Hoe u uw I2C-slave-apparaat kunt testen
Hoe u uw I2C-slave-apparaat kunt testen

Gebruik de broncode hier en het circuit dat hierboven in afbeelding 1 is beschreven, programmeer de 'Master' Arduino met 'IR_Remote_Sim_Test.ino' en de 'Slave' Arduino met 'IR_Remote_Sim.ino'.

Ervan uitgaande dat je een Sony Bravia TV, Sky HD-box en een Sony BT SoundBar hebt, druk je op knop 1 en je tv schakelt over naar BBC1 (kanaal 101). Druk op knop 2 en je soundbar wordt gedempt. Druk nogmaals en het dempen wordt weer opgeheven.

Tijdens het uitvoeren van de IR-transmissievolgorde zal LED3 oplichten om aan te geven dat de slave bezet is en zal LED1 in lijn met het IR-transmissieproces flikkeren.

Als u niet hetzelfde entertainmentsysteem hebt ingesteld als hierboven, kunt u de slaaf natuurlijk opnieuw programmeren met 'IRrecvDumpV2.ino', uw afstandsbedieningscommando's decoderen en ze vervolgens programmeren in de 'IR_Remote_Sim_Test.ino' voor uw gegeven scenario.

Afbeelding 2 toont het overzicht van de testsoftware op systeemniveau tussen Master en Slave.

Stap 6: Uw ontwerp verkleinen

Uw ontwerp verkleinen
Uw ontwerp verkleinen

Ok, dus ervan uitgaande dat je deze instructable hebt gevolgd, vertrouwend op twee Arduino's om je thuisapparaten te bedienen, is niet het meest efficiënte gebruik van je Arduino-voorraad. Als u dus de schakeling bouwt die in de afbeelding hierboven wordt getoond en de instructies hier volgt om de ATMega328P te programmeren met 'IR_Remote_Sim.ino', kunt u het hele systeem terugbrengen tot de minimale componenten. Hiermee kunt u uw ontwerp in een ander systeem insluiten.

Stap 7: Conclusie

Conclusie
Conclusie
Conclusie
Conclusie

De oplossing is stabiel en werkt goed, hij zit al een aantal weken zonder problemen in een ander systeem.

Ik koos de Arduino Uno R3 omdat ik een apparaat wilde met voldoende RAM, zodat ik een knopbuffer van redelijke diepte kon hebben. Ik heb genoegen genomen met een buffergrootte van 20 pakketten (MAX_SEQUENCES).

Het hybride TX/RX-schild dat ik heb gemaakt, kwam ook goed van pas bij het decoderen van Sony- en Sky-afstandsbedieningen. Hoewel ik moet bekennen dat ik van tijd tot tijd mijn digitale scoop gebruikte om te controleren of de software-gedecodeerde IR-opdracht hetzelfde was als die van de ontvangen IR (TSOP38328).

Het enige dat ik anders zou hebben gedaan, zou zijn geweest om het constante stroomcircuit voor de IR-led te gebruiken, zoals hierboven weergegeven in foto 2.

Een ander punt om op te merken is dat niet alle IR-zenders gemoduleerd zijn met 38KHz, de TSOP38328 is geoptimaliseerd voor 38KHz.

Stap 8: Gebruikte referenties

IRremote.h

  • Door: z3t0
  • Doel: Infrarood externe bibliotheek voor Arduino: verzend en ontvang infraroodsignalen met meerdere protocollen
  • Van:

IR Remote bibliotheek

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

IR (infrarood) ontvangersensor - TSOP38238 (equivalent)

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

Opvulling van gegevensstructuren tot woordgrenzen vermijden

  • 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

Goede bron van IR-afstandsbedieningsdetails

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

I2C

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

IR-afstandsbedieningen-database

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

BC337-gegevensblad

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

1N4148 Gegevensblad

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

Aanbevolen: