Innholdsfortegnelse:

I2C infrarød fjernkontroll med Arduino: 8 trinn (med bilder)
I2C infrarød fjernkontroll med Arduino: 8 trinn (med bilder)

Video: I2C infrarød fjernkontroll med Arduino: 8 trinn (med bilder)

Video: I2C infrarød fjernkontroll med Arduino: 8 trinn (med bilder)
Video: Amazing arduino project 2024, November
Anonim
I2C infrarød fjernkontroll med Arduino
I2C infrarød fjernkontroll med Arduino
I2C infrarød fjernkontroll med Arduino
I2C infrarød fjernkontroll med Arduino

Denne forklaringen beskriver hvordan du lager en universell fjernkontroll ved hjelp av I2C for grensesnittet.

Hvor rart du sier, ved hjelp av en I2C -slaveenhet?

Ja, en I2C -slaveenhet.

Dette er fordi den nøyaktige timingen for IR -pakker er ganske krevende, og en typisk Arduino vil slite med hvis den allerede utfører mange andre oppgaver samtidig. Det er bedre å fordele databehandlingen ved å tildele tidkrevende aktiviteter til dedikerte prosessorer når det er mulig (det er bedre å gjøre det i maskinvare). Gitt I2C er en veldokumentert og robust kommunikasjonsmetode mellom ICer, valgte jeg dette som grensesnitt.

Introduksjon

Som nevnt ovenfor beskriver denne instruksjonen hvordan du kan kontrollere husholdningsapparater som TV, DVD -spiller og satellitt etc. ved bruk av IRremote -biblioteket på Arduino.

Den avsluttes med et designeksempel som gjør Arduino til en I2C -slave -fjernkontrollmodul (bilde 1 ovenfor) med prototype testkrets (bilde 2 ovenfor) og fortsetter med å detaljere hvordan du krymper designet til minimumskomponentene som er nødvendige, slik at det kan være innebygd i et annet design. I mitt tilfelle bruker jeg denne innebygde enheten i en IoT Universal fjernkontrollenhet basert på en ESP8266-12E.

Hvilke deler trenger jeg?

For å bygge kretsen vist i trinn 1 (IR -sender) trenger du følgende deler;

  • 2 av 10K motstander
  • 1 av 390R motstand
  • 1 av 33R motstand
  • 1 av 3K8 motstand
  • 1 av rød LED
  • 1 av IR Led TSAL6400
  • 1 av Transistor BC337
  • 1 av 220uF kondensator
  • 1 av Arduino Uno

For å bygge kretsen vist i trinn 4 (IR -mottaker) trenger du følgende deler;

  • 1 av 10K motstand
  • 1 av TSOP38328
  • 1 av 220uF kondensator
  • 1 av Arduino Uno

For å bygge kretsen vist i trinn 5 (slave testkrets) trenger du følgende deler;

  • 4 av 10K motstander
  • 2 av 390R motstand
  • 1 av 33R motstand
  • 1 av 3K8 motstand
  • 2 av rød LED
  • 1 av IR Led TSAL6400
  • 1 av Transistor BC337
  • 1 av 220uF kondensator
  • 2 av SPST -knapper
  • 2 av Arduino Unos

For å bygge kretsen vist i trinn 6 (krympet design) trenger du følgende deler;

  • 3 av 10K motstander
  • 1 av 270R motstand
  • 1 av 15R motstand
  • 4 av 1K motstander
  • 1 av rød LED
  • 1 av IR Led TSAL6400 eller TSAL5300
  • 1 av Transistor BC337
  • 1 av 220uF kondensator elektrolytisk @ 6.3v
  • 1 av 1000uF kondensator elektrolytisk @ 6.3v
  • 2 av 0,1 uF kondensatorer
  • 2 av 22pF kondensatorer
  • 1 av 16MHz Xtal
  • 1 av ATMega328P-PU

Merk: Du trenger også en FTDI -enhet for å programmere ATMega328P

Hvilke ferdigheter trenger jeg?

  • Et minimalt grep om elektronikk,
  • Kunnskap om Arduino og dens IDE,
  • Litt tålmodighet,
  • Litt forståelse av I2C ville være nyttig (se her for noen generiske I2C/Wire Library -detaljer).

Emner dekket

  • Kort oversikt over kretsen,
  • Kort oversikt over programvaren,
  • I2C -pakkeinnhold,
  • Anskaffelse av fjernkontrollkoder (ui32Data),
  • Slik tester du I2C Slave -enheten,
  • Krymper designet ditt,
  • Konklusjon,
  • Referanser brukt.

Ansvarsfraskrivelse

Som alltid bruker du disse instruksjonene på egen risiko, og de kommer ikke støttet.

Trinn 1: Kort oversikt over kretsen

Kort oversikt over kretsen
Kort oversikt over kretsen

Formålet med kretsen er å overføre IR -fjernkontrollkoder. Designet er ganske rett frem og ganske enkelt.

Når transistoren Q1 blir en BC337 NPN slått på via en logisk fra Arduino PWM O/P D3 til motstand R5, passerer strømmen gjennom lysdioder 1 og 2. Begrenset bare av ballastmotstander R3 og R4. Q1 brukes til å øke strømmen som går gjennom IR -dioden (IF Max = 100mA) til det som overstiger det Arduino O/P er i stand til ~ 40mA @ +5v forsyning.

Kondensator C1 a 220uF Electrolytic gir en viss stabilisering som forhindrer at forsyningsskinnen faller av kraften fra Leds 1 og 2.

Motstandene R1 og R2 er I2C pull -ups.

Trinn 2: Kort oversikt over programvaren

Kort oversikt over programvaren
Kort oversikt over programvaren
Kort oversikt over programvaren
Kort oversikt over programvaren
Kort oversikt over programvaren
Kort oversikt over programvaren

Innledning

For å lykkes med å kompilere denne kildekoden trenger du følgende ekstra bibliotek;

IRfjern.h

  • Av: z3t0
  • Formål: Infrarødt eksternt bibliotek for Arduino: send og motta infrarøde signaler med flere protokoller
  • Fra:

Kodeoversikt

Som vist på bilde 1 ovenfor, ved oppstart, konfigurerer koden mikrokontrolleren I/O, deretter undersøkes statusen til det interne programvareflagget 'bFreshDataFlag'. Når dette flagget er satt, bekrefter kontrolleren at det er 'Opptatt' linje (sender datapinne D4 lavt) og beveger seg til 'eBUSY' -status, sekvensielt leser knappetrykkommandoene som holdes i uDataArray og sender IR -modulerte data til IR -lysdioden i en overføringssekvens.

Når dataene i uDataArray er fullstendig sendt, gjenopptas tilstanden 'eIDLE' og 'Opptatt' linje blir avkreftet (sender datapinne D4 høy). Enheten er nå klar til å motta flere knappetrykk som markerer slutten på overføringssekvensen.

Mottak av IR -knappetrykkdata

Når data sendes til InfraRed -fjernkontrollen via I2C, utløser det et avbrudd og mottaksevent () -funksjonsanropet utløses asynkront.

Når de mottatte I2C -dataene er utløst, skrives de sekvensielt i bufferen 'uDataArray '.

Under mottak av data, hvis en slutten av sekvensen signaliseres av masteren (bFreshData! = 0x00), er 'bFreshDataFlag' angitt, og dermed signaliseres starten på overføringssekvensen.

Bilder 2 … 3 gir et eksempel på en typisk pakkesekvens.

Merk: Full kildekoden er tilgjengelig her

Trinn 3: I2C -pakkeinnhold

I2C -pakkeinnhold
I2C -pakkeinnhold

Formatet til kontrollpakken som sendes til slaven over I2C er gitt ovenfor i bilde 1, betydningen av hvert felt er gitt nedenfor

Betydningen av kontrollpakkefeltene

byte bKoding;

  • IR -fjernkontrollkoding,

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

uint32_t ui32Data;

Den sekskantede representasjonen av den binære IR -datastrømmen 4 Databyte (usignert lang), LSByte … MSByte

byte bNumberOfBitsInTheData;

Antall biter i dataene (maks 32). Rekkevidde = 1… 32

byte bPulseTrainRepeats;

Hvor mange repetisjoner av dette pulstoget. Område = 1… 255. Vanligvis 2 … 4 gjentakelser. Det kan være lurt å utvide dette for På/Av -kommandoer, ettersom mottaksenheten noen ganger krever noen ekstra pulstogrepetisjoner for å motta et signal som skal slås på

byte bDelayBetweenPulseTrainRepeats;

Forsinkelse mellom repetisjoner av dette pulstoget. Rekkevidde = 1… 255mS. Typisk 22mS … 124mS

byte bButtonRepeats;

Simulerer gjentatt trykk på den samme knappen (men støtter ikke den endrede koden som en Apple -fjernkontroll, den gjentar bare knappekoden). Område = 1… 256. Standard = 1

uint16_t ui16DelayBetweenButtonRepeats;

Forsinkelse mellom knappene gjentas (usignert int). 2 byte totalt LSByte … MSByte. Rekkevidde = 1… 65535mS. Standard = 0 ms

byte bFreshData;

  • Nye data. En verdi som ikke er null. Skrevet sist, utløser IR TX -sekvensen. Område 0x00 … 0xFF

    • Flere kontrollpakker kommer = 0
    • Dette er den endelige kontrollpakken = Ikke-null verdi 1, 2, … 255

Legg merke til bruken av kompileringsdirektivet '_packed_'. Dette er for å sikre at dataene er pakkebyte for byte i minnet uavhengig av målsystemet som brukes (Uno, Due, ESP8266 etc.). Dette betyr at foreningen mellom registerAllocationType og dataArrayType bare trenger å sekvensielt klokke ut/klokke i byte fra en kontrollpakke, noe som gjør TX/RX -programvaren enkel.

Trinn 4: Anskaffelse av fjernkontrollkoder (ui32Data)

Skaffe fjernkontrollkoder (ui32Data)
Skaffe fjernkontrollkoder (ui32Data)
Skaffe fjernkontrollkoder (ui32Data)
Skaffe fjernkontrollkoder (ui32Data)
Skaffe fjernkontrollkoder (ui32Data)
Skaffe fjernkontrollkoder (ui32Data)
Skaffe fjernkontrollkoder (ui32Data)
Skaffe fjernkontrollkoder (ui32Data)

Det er tre måter du kan skaffe en respektive fjernkontrollnøkkelkode på.

  1. Via bittelling med et oscilloskop,
  2. Slå opp på et nettsted,
  3. Dekode det direkte fra datastrømmen i programvaren.

Via bit telling med et omfang

Dette er ikke en effektiv metode, da det tar ganske lang tid og potensielt krever mer enn ett forsøk, men det kan være svært nøyaktig. Det er også nyttig for å visuelt validere koder oppnådd ved hjelp av metode 2 og 3, også for å bestemme eventuelle særegenheter ved en fjernkontroll. For eksempel når du holder inne en knapp på en Apple IR -fjernkontroll. Fjernkontrollen vil først utstede en kommandosekvens og deretter følge den med en gjentatt komprimert sekvens på 0xF….

Slå opp på et nettsted

Fjernkontrollkodedatabasen på Linux Infrared Remote Control -nettstedet er en god kilde.

Ulempen er imidlertid at du kanskje må prøve noen koder til du finner en som fungerer for deg. Du må kanskje også tolke noen av representasjonene til kodene for å konvertere dem til tilsvarende hex -form.

Dekode det direkte fra datastrømmen

Ved å bruke kretsen på bilde 1 ovenfor i forbindelse med IRremote -bibliotekseksemplet 'IRrecvDumpV2.ino' er det mulig å dekode datastrømmen direkte fra fjernkontrollen. Bilde 2 viser en dekodet Samsung TV -fjernkontroll for et av/på -knappetrykk i Arduino IDE -terminalvinduet.

Kombinert mottaker/sender

Bildene 3 og 4 ovenfor viser en løsning som muliggjør både mottak og overføring av IR -kommando for enkel prototyping.

For å dekode IR -fjernkontrollknappene må du blinke Arduino med eksempelet 'IRrecvDumpV2.ino' som følger med IRremote -biblioteket.

Det fungerer også like godt for overføring hvis IR -kommandoer. En rød lysdiode er inkludert som en visuell indikasjon på at enheten er i bruk.

Trinn 5: Slik tester du I2C -slaveenheten

Hvordan teste din I2C -slaveenhet
Hvordan teste din I2C -slaveenhet
Slik tester du I2C -slaveenheten
Slik tester du I2C -slaveenheten

Ved å bruke kildekoden her og kretsen som er skissert ovenfor på bilde 1, programmerer du 'Master' Arduino med 'IR_Remote_Sim_Test.ino' og 'Slave' Arduino med 'IR_Remote_Sim.ino'.

Forutsatt at du har en Sony Bravia TV, Sky HD -boks og en Sony BT SoundBar, trykker du på knapp 1 og TVen din bytter til BBC1 (kanal 101). Trykk på knapp 2, så vil lydfeltet dempes. Trykk på igjen, og den vil dempe lyden.

Under utførelsen av IR -overføringssekvensen lyser LED3 for å indikere at slaven er opptatt og LED1 vil flimre inline med IR -overføringsprosessen.

Selvfølgelig, hvis du ikke har det samme underholdningssystemet som ovenfor, kan du omprogrammere slaven med 'IRrecvDumpV2.ino', dekode dine eksterne kommandoer av interesse og deretter programmere dem i 'IR_Remote_Sim_Test.ino' for din gitt scenario.

Bilde 2 viser oversikten over systemnivå -testprogramvare mellom Master og Slave.

Trinn 6: Krymper designet

Krymper designet ditt
Krymper designet ditt

Ok, så forutsatt at du har fulgt denne instruksjonsbaserte avhengigheten av to Arduinoer for å kontrollere hjemmene dine, er ikke den mest effektive bruken av Arduino -aksjen. Følgelig, hvis du konstruerer kretsen vist på bildet ovenfor og følger instruksjonene her for å programmere ATMega328P med 'IR_Remote_Sim.ino', vil du kunne redusere hele systemet til minimale komponenter. Dette lar deg bygge inn designet i et annet system.

Trinn 7: Konklusjon

Konklusjon
Konklusjon
Konklusjon
Konklusjon

Løsningen er stabil og fungerer bra, den har vært innebygd i et annet system i ganske mange uker nå uten problemer.

Jeg valgte Arduino Uno R3 da jeg ønsket en enhet som hadde tilstrekkelig RAM slik at jeg kunne ha en knappbuffer med rimelig dybde. Jeg nøyde meg med en bufferstørrelse på 20 pakker (MAX_SEQUENCES).

Hybrid TX/RX -skjoldet jeg laget, kom også veldig godt i bruk når jeg dekodte fjernkontroller fra Sony og Sky. Selv om jeg må innrømme at jeg bruker mitt digitale omfang fra tid til annen for å kontrollere at programvaren som er avkodet IR -kommandoen var den samme som den som kom fra IR mottatt (TSOP38328).

Det eneste jeg ville ha gjort annerledes ville ha vært å bruke konstant strømkrets for IR -ledningen som vist ovenfor på bilde 2.

Et annet punkt å merke seg er at ikke alle IR -sendere er modulert med 38KHz, TSOP38328 er optimalisert for 38KHz.

Trinn 8: Referanser brukt

IRRemote.h

  • Av: z3t0
  • Formål: Infrarødt eksternt bibliotek for Arduino: send og motta 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) mottakersensor - TSOP38238 (ekvivalent)

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

For å unngå datastruktur utfylling til ordgrenser

  • 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 fjernkontrolldatabase

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

BC337 Datablad

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

1N4148 Dataark

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

Anbefalt: