Indholdsfortegnelse:

I2C infrarød fjernbetjening med Arduino: 8 trin (med billeder)
I2C infrarød fjernbetjening med Arduino: 8 trin (med billeder)

Video: I2C infrarød fjernbetjening med Arduino: 8 trin (med billeder)

Video: I2C infrarød fjernbetjening med Arduino: 8 trin (med billeder)
Video: Lesson 77: Using VL53L0X 200cm Laser Distance Sensor | Arduino Step By Step Course 2024, November
Anonim
I2C infrarød fjernbetjening med Arduino
I2C infrarød fjernbetjening med Arduino
I2C infrarød fjernbetjening med Arduino
I2C infrarød fjernbetjening med Arduino

Denne forudsigelse beskriver, hvordan du opretter en universel fjernbetjening ved hjælp af I2C til grænsefladen.

Hvor mærkeligt siger du ved hjælp af en I2C -slaveenhed?

Ja, en I2C -slaveenhed.

Det skyldes, at den nøjagtige timing af IR -pakker er ret krævende, og en typisk Arduino vil kæmpe med, hvis den allerede udfører mange andre opgaver på samme tid. Det er bedre at fordele computerbelastningen ved at tildele timingintensive aktiviteter til dedikerede processorer, når det er muligt (bedre stadig gøre det i hardware). Da I2C er en veldokumenteret og robust kommunikationsmetode mellem IC'er, valgte jeg dette som grænseflade.

Introduktion

Som nævnt ovenfor beskriver denne instruktør hvordan man styrer husholdningsapparater som f.eks. Tv, dvd -afspiller og satellit osv. Ved hjælp af IRremote -biblioteket på Arduino.

Det afsluttes med et designeksempel, der gør Arduino til et I2C -slave -fjernbetjeningsmodul (billede 1 ovenfor) med prototype -testkredsløb (billede 2 ovenfor) og fortsætter med at detaljerede, hvordan du formindsker dit design til de minimumskomponenter, der er nødvendige, så det kan være indlejret i et andet design. I mit tilfælde bruger jeg denne integrerede enhed i en IoT Universal fjernbetjening baseret på en ESP8266-12E.

Hvilke dele har jeg brug for?

For at bygge kredsløbet afbildet i trin 1 (IR -sender) skal du bruge følgende dele;

  • 2 off 10K modstande
  • 1 off 390R modstand
  • 1 off 33R modstand
  • 1 off 3K8 modstand
  • 1 slukket Rød LED
  • 1 off IR LED TSAL6400
  • 1 fra Transistor BC337
  • 1 off 220uF kondensator
  • 1 fra Arduino Uno

For at bygge kredsløbet afbildet i trin 4 (IR -modtager) skal du bruge følgende dele;

  • 1 off 10K modstand
  • 1 fra TSOP38328
  • 1 off 220uF kondensator
  • 1 fra Arduino Uno

For at bygge det kredsløb, der er afbildet i trin 5 (Slave -testkredsløb), skal du bruge følgende dele;

  • 4 off 10K modstande
  • 2 off 390R modstand
  • 1 off 33R modstand
  • 1 off 3K8 modstand
  • 2 slukket Rød LED
  • 1 off IR LED TSAL6400
  • 1 fra Transistor BC337
  • 1 off 220uF kondensator
  • 2 off SPST -knapper
  • 2 fra Arduino Unos

For at bygge kredsløbet afbildet i trin 6 (krympet design) skal du bruge følgende dele;

  • 3 off 10K modstande
  • 1 off 270R modstand
  • 1 off 15R modstand
  • 4 off 1K modstande
  • 1 slukket Rød LED
  • 1 off IR Led TSAL6400 eller TSAL5300
  • 1 fra Transistor BC337
  • 1 off 220uF kondensator elektrolytisk @ 6.3v
  • 1 off 1000uF kondensator elektrolytisk @ 6.3v
  • 2 off 0.1uF kondensatorer
  • 2 off 22pF kondensatorer
  • 1 fra 16MHz Xtal
  • 1 rabat på ATMega328P-PU

Bemærk: Du skal også bruge en FTDI -enhed til at programmere ATMega328P

Hvilke færdigheder har jeg brug for?

  • Et minimalt greb om elektronik,
  • Kendskab til Arduino og dens IDE,
  • Lidt tålmodighed,
  • En vis forståelse af I2C ville være nyttig (se her for nogle generiske I2C/Wire Library -detaljer).

Emner dækket

  • Kort oversigt over kredsløbet,
  • Kort oversigt over softwaren,
  • I2C -pakkeindhold,
  • Anskaffelse af fjernbetjeningskoder (ui32Data),
  • Sådan testes din I2C Slave -enhed,
  • Skrumper dit design,
  • Konklusion,
  • Referencer brugt.

Ansvarsfraskrivelse

Som altid bruger du disse instruktioner på egen risiko, og de kommer ikke understøttet.

Trin 1: Kort oversigt over kredsløbet

Kort oversigt over kredsløbet
Kort oversigt over kredsløbet

Formålet med kredsløbet er at transmittere IR -fjernbetjeningskoder. Designet er ret ligetil og ganske enkelt.

Når transistoren Q1 en BC337 NPN tændes via en logisk en fra Arduino PWM O/P D3 til modstand R5, passerer strøm gennem Leds 1 og 2. Begrænset kun af ballastmodstande R3 og R4. Q1 bruges til at øge strømmen, der passerer gennem IR -dioden (IF Max = 100mA) til den, der overstiger hvad Arduino O/P er i stand til ~ 40mA @ +5v forsyning.

Kondensator C1 a 220uF Electrolytic giver en vis stabilisering, der forhindrer en forsyningsskinne i at falde af strømmen fra Leds 1 og 2.

Modstandene R1 og R2 er I2C pull ups.

Trin 2: Kort oversigt over softwaren

Kort oversigt over softwaren
Kort oversigt over softwaren
Kort oversigt over softwaren
Kort oversigt over softwaren
Kort oversigt over softwaren
Kort oversigt over softwaren

Præambel

For at kunne kompilere denne kildekode skal du bruge følgende ekstra bibliotek;

IRfjern.h

  • Af: z3t0
  • Formål: Infrarødt fjernbibliotek til Arduino: Send og modtag infrarøde signaler med flere protokoller
  • Fra:

Kodeoversigt

Som vist på billede 1 ovenfor, ved opstart, konfigurerer koden mikro-controller I/O, derefter undersøger status for det interne softwareflag 'bFreshDataFlag'. Når dette flag er indstillet, hævder controlleren, at det er 'Optaget' linje (sender datapind D4 lavt) og flytter til tilstanden 'eBUSY' sekvensielt læseknap -tryk på kommandoer i uDataArray og sender IR -modulerede data til IR -LED'en i en transmissionssekvens.

Når dataene i uDataArray er blevet sendt fuldstændigt, genoptages tilstanden 'eIDLE', og linjen 'Optaget' fjernes (afsendelse af datapind D4 høj). Enheden er nu klar til at modtage flere tastetryk, der markerer afslutningen på transmissionssekvensen.

Modtagelse af IR -knappetryksdata

Når data sendes til InfraRed -fjernbetjeningen via I2C, udløser det en afbrydelse, og modtageevent () funktionsopkald udløses asynkront.

Når de modtagne I2C -data er udløst, skrives de sekventielt i bufferen 'uDataArray '.

Hvis en sekvensafslutning under datamodtagelse signaleres af masteren (bFreshData! = 0x00), indstilles 'bFreshDataFlag', hvilket signalerer starten af transmissionssekvensen.

Billeder 2 … 3 giver et eksempel på en typisk pakkesekvens.

Bemærk: Fuld kildekode er tilgængelig her

Trin 3: I2C -pakkeindhold

I2C -pakkeindhold
I2C -pakkeindhold

Formatet på kontrolpakken sendt til slaven over I2C er angivet ovenfor i billede 1, betydningen af hvert felt er angivet nedenfor

Betydningen af kontrolpakkefelterne

byte bKodning;

  • IR fjernbetjeningskodning,

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

uint32_t ui32Data;

Hexrepræsentation af den binære IR -datastrøm 4 Databyte (usigneret lang), LSByte … MSByte

byte bNumberOfBitsInTheData;

Antal bits i dataene (maks. 32). Område = 1… 32

byte bPulseTrainRepeats;

Hvor mange gentagelser af dette pulstog. Område = 1… 255. Typisk 2… 4 gentagelser. Du vil måske udvide dette til tænd/sluk -kommandoer, da den modtagende enhed nogle gange kræver et par ekstra pulstogs gentagelser for at modtage et tændingssignal

byte bDelayBetweenPulseTrainRepeats;

Forsinkelse mellem gentagelser af dette pulstog. Rækkevidde = 1… 255mS. Typisk 22mS … 124mS

byte bButtonRepeats;

Simulerer gentaget tryk på den samme knap (men understøtter ikke den ændrede kode som en Apple -fjernbetjening, den gentager bare knapkoden). Område = 1… 256. Standard = 1

uint16_t ui16DelayBetweenButtonRepeats;

Forsinkelse mellem gentagelser af knapper (usigneret int). 2 bytes i alt LSByte … MSByte. Rækkevidde = 1… 65535mS. Standard = 0mS

byte bFreshData;

  • Friske data. En værdi uden nul. Skrevet sidst, udløser IR TX -sekvensen. Område 0x00… 0xFF

    • Flere kontrolpakker kommer = 0
    • Dette er den sidste kontrolpakke = Non-Zero værdi 1, 2, … 255

Bemærk brugen af kompileringsdirektivet '_packed_'. Dette er for at sikre, at dataene er pakkebyte for byte i hukommelsen uanset det anvendte målsystem (Uno, Due, ESP8266 osv.). Det betyder, at foreningen mellem registerAllocationType og dataArrayType kun behøver sekvensielt at klokke ud/ur i bytes fra en kontrolpakke, hvilket gør TX/RX -softwaren enkel.

Trin 4: Anskaffelse af fjernbetjeningskoder (ui32Data)

Anskaffelse af fjernbetjeningskoder (ui32Data)
Anskaffelse af fjernbetjeningskoder (ui32Data)
Anskaffelse af fjernbetjeningskoder (ui32Data)
Anskaffelse af fjernbetjeningskoder (ui32Data)
Anskaffelse af fjernbetjeningskoder (ui32Data)
Anskaffelse af fjernbetjeningskoder (ui32Data)
Anskaffelse af fjernbetjeningskoder (ui32Data)
Anskaffelse af fjernbetjeningskoder (ui32Data)

Der er tre måder, hvorpå du kan erhverve en respektive fjernbetjeningsnøglekode;

  1. Via bittælling med et oscilloskop,
  2. Slå det op på en hjemmeside,
  3. Afkod det direkte fra datastrømmen i software.

Via bit tælling med et omfang

Dette er ikke en effektiv metode, da det tager ganske lang tid og muligvis kræver mere end et forsøg, men det kan være meget præcist. Det er også nyttigt til visuelt at validere koder opnået ved hjælp af metode 2 og 3, også til at bestemme eventuelle særegenheder ved en fjernbetjening. Som eksempel, når du holder en knap nede på en Apple IR -fjernbetjening. Fjernbetjeningen vil i første omgang udsende en kommandosekvens og derefter følge den med en gentagen komprimeret sekvens på 0xF….

Slå det op på et websted

Fjernbetjeningskodedatabasen på Linux Infrared Remote Control -webstedet er en god kilde.

Ulempen er dog, at du muligvis skal prøve et par koder, indtil du finder en, der fungerer for dig. Du skal muligvis også fortolke nogle af repræsentationerne af koderne for at konvertere dem til deres tilsvarende hexform.

Afkod det direkte fra datastrømmen

Ved hjælp af kredsløbet i billede 1 ovenfor i forbindelse med IRremote -bibliotekets eksempel 'IRrecvDumpV2.ino' er det muligt at afkode datastrømmen direkte fra fjernbetjeningen. Billede 2 viser en afkodet Samsung TV -fjernbetjening til et tryk på tænd/sluk -knappen i Arduino IDE -terminalvinduet.

Kombineret modtager/sender

Billeder 3 og 4 ovenfor viser en løsning, der giver mulighed for både modtagelse og transmission af IR -kommando for let prototypering.

For at afkode IR -fjernbetjeningsknapperne skal du blinke Arduino med eksemplet 'IRrecvDumpV2.ino', der følger med IRremote -biblioteket.

Det fungerer også lige godt til transmission, hvis IR -kommandoer. En rød lysdiode er inkluderet som en visuel indikation, at enheden er i aktion.

Trin 5: Sådan testes din I2C -slaveenhed

Sådan testes din I2C -slaveenhed
Sådan testes din I2C -slaveenhed
Sådan testes din I2C -slaveenhed
Sådan testes din I2C -slaveenhed

Ved hjælp af kildekoden her og kredsløbet skitseret ovenfor i billede 1 programmeres 'Master' Arduino med 'IR_Remote_Sim_Test.ino' og 'Slave' Arduino med 'IR_Remote_Sim.ino'.

Forudsat at du har et Sony Bravia TV, Sky HD -boks og en Sony BT SoundBar, skal du trykke på knap 1, og dit tv skifter til BBC1 (kanal 101). Tryk på knap 2, og din lydbjælke slås fra. Tryk igen, så deaktiveres lyden.

Under udførelsen af IR -transmissionssekvensen lyser LED3, hvilket angiver, at slaven er optaget, og LED1 blinker inline med IR -transmissionsprocessen.

Selvfølgelig, hvis du ikke har det samme underholdningssystem oprettet som ovenfor, kan du omprogrammere slaven med 'IRrecvDumpV2.ino', afkode dine fjernkommandoer af interesse og derefter programmere dem i 'IR_Remote_Sim_Test.ino' til din givet scenario.

Billede 2 viser systemniveau testsoftwareoversigt mellem Master og Slave.

Trin 6: Skrumpning af dit design

Skrumper dit design
Skrumper dit design

Ok, så forudsat at du har fulgt denne instruerbare afhængighed af to Arduinos til at styre dine hjemmeapparater, er ikke den mest effektive brug af din Arduino -lager. Hvis du derfor konstruerer kredsløbet vist på billedet ovenfor og følger instruktionerne her for at programmere ATMega328P med 'IR_Remote_Sim.ino', vil du være i stand til at reducere hele systemet til de minimale komponenter. Dette giver dig mulighed for at integrere dit design i et andet system.

Trin 7: Konklusion

Konklusion
Konklusion
Konklusion
Konklusion

Løsningen er stabil og fungerer godt, den har været integreret i et andet system i nogle uger nu uden problemer.

Jeg valgte Arduino Uno R3, da jeg ville have en enhed, der havde tilstrækkelig RAM, så jeg kunne have en knapbuffer af rimelig dybde. Jeg nøjedes med en bufferstørrelse på 20 pakker (MAX_SEQUENCES).

Hybrid TX/RX -skjoldet, jeg lavede, var også meget praktisk, når jeg dekodede Sony- og Sky -fjernbetjeninger. Selvom jeg fra tid til anden må indrømme, at jeg brugte mit digitale omfang til at kontrollere, at softwarekodede IR -kommandoen var den, der kom fra IR modtaget (TSOP38328).

Det eneste, jeg ville have gjort anderledes, ville have været at bruge konstantstrømskredsløbet til IR -lysdioden som vist ovenfor i billede 2.

Et yderligere punkt at bemærke er, at ikke alle IR -sendere er moduleret med 38KHz, TSOP38328 er optimeret til 38KHz.

Trin 8: Anvendte referencer

IRRemote.h

  • Af: z3t0
  • Formål: Infrarødt fjernbibliotek til Arduino: Send og modtag infrarøde signaler med flere protokoller
  • Fra:

IR fjernbibliotek

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

IR (infrarød) modtagersensor - TSOP38238 (ækvivalent)

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

For at undgå datastruktur, der fylder til ordgrænser

  • 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

God kilde til IR -fjerndetaljer

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

I2C

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

IR fjernbetjeningsdatabase

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

BC337 Datablad

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

1N4148 Datablad

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

Anbefalede: