Innehållsförteckning:

I2C InfraRed fjärrkontroll med Arduino: 8 steg (med bilder)
I2C InfraRed fjärrkontroll med Arduino: 8 steg (med bilder)

Video: I2C InfraRed fjärrkontroll med Arduino: 8 steg (med bilder)

Video: I2C InfraRed fjärrkontroll med Arduino: 8 steg (med bilder)
Video: ESP8266 Diesel Injector Purging Station - PWM NodeMCU pump flow Control (Subtittled) 2024, Juli
Anonim
I2C infraröd fjärrkontroll med Arduino
I2C infraröd fjärrkontroll med Arduino
I2C infraröd fjärrkontroll med Arduino
I2C infraröd fjärrkontroll med Arduino

Den här instruktionen beskriver hur du skapar en universell fjärrkontroll med I2C för gränssnittet.

Hur udda säger du att du använder en I2C -slavenhet?

Ja, en I2C -slavenhet.

Detta beror på att den exakta tidpunkten för IR -paket är ganska krävande och ett typiskt Arduino kommer att kämpa med om det redan utför många andra uppgifter samtidigt. Det är bättre att fördela datorbelastningen genom att tilldela dedikerade processorer när det är möjligt med tidkrävande aktiviteter (bättre gör det fortfarande i hårdvara). Med tanke på att I2C är en väldokumenterad och robust kommunikationsmetod mellan IC: er, valde jag detta som gränssnitt.

Introduktion

Som nämnts ovan beskriver denna instruktionsbok hur man styr hushållsapparater som TV, DVD -spelare och satellit etc. med hjälp av IRremote -biblioteket på Arduino.

Den avslutas med ett designexempel som förvandlar Arduino till en I2C -slavfjärrkontrollmodul (bild 1 ovan) med prototyptestkrets (bild 2 ovan) och fortsätter med detaljer om hur du minskar din design till de minimikomponenter som behövs så att den kan vara inbäddad i en annan design. I mitt fall använder jag den här inbäddade enheten i en IoT Universal fjärrkontroll baserad på en ESP8266-12E.

Vilka delar behöver jag?

För att bygga kretsen som visas i steg 1 (IR -sändare) behöver du följande delar;

  • 2 av 10K motstånd
  • 1 av 390R motstånd
  • 1 av 33R -motstånd
  • 1 av 3K8 motstånd
  • 1 av Röd LED
  • 1 av IR Led TSAL6400
  • 1 av Transistor BC337
  • 1 av 220uF kondensator
  • 1 av Arduino Uno

För att bygga kretsen som visas i steg 4 (IR -mottagare) behöver du följande delar;

  • 1 av 10K motstånd
  • 1 rabatt på TSOP38328
  • 1 av 220uF kondensator
  • 1 av Arduino Uno

För att bygga kretsen som visas i steg 5 (slavtestkrets) behöver du följande delar;

  • 4 av 10K motstånd
  • 2 av 390R motstånd
  • 1 av 33R -motstånd
  • 1 av 3K8 motstånd
  • 2 av röd LED
  • 1 av IR Led TSAL6400
  • 1 av Transistor BC337
  • 1 av 220uF kondensator
  • 2 av SPST -knappar
  • 2 av Arduino Unos

För att bygga kretsen som visas i steg 6 (krympt design) behöver du följande delar;

  • 3 av 10K motstånd
  • 1 av 270R motstånd
  • 1 av 15R motstånd
  • 4 av 1K motstånd
  • 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 rabatt på ATMega328P-PU

Obs! Du behöver också en FTDI -enhet för att programmera ATMega328P

Vilka färdigheter behöver jag?

  • Ett minimalt grepp om elektronik,
  • Kunskap om Arduino och dess IDE,
  • Lite tålamod,
  • Viss förståelse av I2C skulle vara användbart (se här för några generiska I2C/Wire Library -detaljer).

Ämnen som behandlas

  • Kort översikt över kretsen,
  • Kort översikt över programvaran,
  • I2C -paketinnehåll,
  • Skaffa fjärrkontrollkoder (ui32Data),
  • Hur man testar din I2C Slave -enhet,
  • Minskar din design,
  • Slutsats,
  • Referenser används.

varning

Som alltid använder du dessa instruktioner på egen risk och de kommer inte att stödjas.

Steg 1: Kort översikt över kretsen

Kort översikt över kretsen
Kort översikt över kretsen

Syftet med kretsen är att överföra IR -fjärrkontrollkoder. Dess design är ganska rak och ganska enkel.

När transistorn Q1 aktiveras en BC337 NPN via en logisk från Arduino PWM O/P D3 till motstånd R5, passerar ström genom lysdioderna 1 och 2. Begränsas endast av ballastmotstånd R3 respektive R4. Q1 används för att öka strömmen som passerar genom IR -dioden (IF Max = 100mA) till det som överstiger vad Arduino O/P har ~ 40mA @ +5v matning.

Kondensator C1 a 220uF Electrolytic ger viss stabilisering som förhindrar att en matningsskena tappar av kraften från lysdioderna 1 och 2.

Motstånden R1 och R2 är I2C pull -ups.

Steg 2: Kort översikt över programvaran

Kort översikt över programvaran
Kort översikt över programvaran
Kort översikt över programvaran
Kort översikt över programvaran
Kort översikt över programvaran
Kort översikt över programvaran

Inledning

För att lyckas sammanställa denna källkod behöver du följande extrabibliotek;

IRremote.h

  • Av: z3t0
  • Syfte: Infrarött fjärrbibliotek för Arduino: skicka och ta emot infraröda signaler med flera protokoll
  • Från:

Kodöversikt

Som visas på bild 1 ovan, vid uppstart, konfigurerar koden mikrokontrollerens I/O och sedan undersöker statusen för den interna mjukvaruflaggan "bFreshDataFlag". När denna flagga är inställd hävdar styrenheten att den är "Upptagen" -linje (sänder datastift D4 låg) och flyttar till "eBUSY" -läget sekventiellt läser knapptryckningskommandon som hålls i uDataArray och skickar IR -modulerade data till IR -lysdioden i en överföringssekvens.

När data som finns i uDataArray har skickats helt, återupptas tillståndet 'eIDLE' och 'Upptagen' rad avaktiveras (skickar datastift D4 högt). Enheten är nu redo att ta emot fler knapptryckningar som markerar slutet på överföringssekvensen.

Mottagning av IR -knapptrycksdata

När data skickas till InfraRed -fjärrkontrollen via I2C utlöser det ett avbrott och funktionen callEvent () utlöses asynkront.

När den mottagna I2C -data väl har utlösts skrivs sekventiellt i bufferten 'uDataArray '.

Under datamottagning, om ett slutet av sekvensen signaleras av mastern (bFreshData! = 0x00) ställs 'bFreshDataFlag' in, vilket signalerar start av överföringssekvensen.

Bilder 2 … 3 ger ett exempel på en typisk paketsekvens.

Obs! Full källkod finns här

Steg 3: I2C -paketinnehåll

I2C -paketinnehåll
I2C -paketinnehåll

Formatet för kontrollpaketet som skickas till slaven över I2C ges ovan i bild 1, betydelsen av varje fält ges nedan

Betydelsen av kontrollpaketfälten

byte bKodning;

  • IR -fjärrkontrollkodning,

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

uint32_t ui32Data;

Hexrepresentation av den binära IR -dataströmmen 4 Databyte (osignerad lång), LSByte … MSByte

byte bNumberOfBitsInTheData;

Antal bitar i data (max 32). Område = 1… 32

byte bPulseTrainRepeats;

Hur många repetitioner av detta pulståg. Område = 1… 255. Vanligtvis 2 … 4 upprepningar. Du kanske vill förlänga detta för På/Av -kommandon eftersom mottagarenheten ibland kräver några extra pulstågsupprepningar för att få en påslagningssignal

byte bDelayBetweenPulseTrainRepeats;

Fördröjning mellan upprepningar av detta pulståg. Område = 1… 255mS. Vanligtvis 22mS … 124mS

byte bButtonRepeats;

Simulerar upprepad tryckning på samma knapp (men stöder inte den modifierade koden som en Apple -fjärrkontroll, den upprepar bara knappkoden). Område = 1… 256. Standard = 1

uint16_t ui16DelayBetweenButtonRepeats;

Fördröjning mellan knappupprepningar (osignerad int). 2 byte totalt LSByte … MSByte. Område = 1… 65535mS. Standard = 0 ms

byte bFreshData;

  • Färsk data. Ett värde som inte är noll. Skrivet sist, utlöser IR TX -sekvensen. Område 0x00 … 0xFF

    • Fler kontrollpaket kommer = 0
    • Detta är det slutliga kontrollpaketet = Icke-nollvärde 1, 2, … 255

Observera användningen av kompileringsdirektivet '_packed_'. Detta för att säkerställa att data är paketbyte för byte i minnet oavsett målsystem som används (Uno, Due, ESP8266 etc.). Detta innebär att föreningen mellan registerAllocationType och dataArrayType endast behöver sekvensvis klocka ut/klocka in byte från ett kontrollpaket, vilket gör TX/RX -programvaran enkel.

Steg 4: Skaffa fjärrkontrollkoder (ui32Data)

Skaffa fjärrkontrollkoder (ui32Data)
Skaffa fjärrkontrollkoder (ui32Data)
Skaffa fjärrkontrollkoder (ui32Data)
Skaffa fjärrkontrollkoder (ui32Data)
Skaffa fjärrkontrollkoder (ui32Data)
Skaffa fjärrkontrollkoder (ui32Data)
Skaffa fjärrkontrollkoder (ui32Data)
Skaffa fjärrkontrollkoder (ui32Data)

Det finns tre sätt att skaffa en respektive fjärrkontrollnyckelkod;

  1. Via biträkning med ett oscilloskop,
  2. Leta upp det på en webbplats,
  3. Avkoda det direkt från dataströmmen i programvaran.

Via biträkning med ett omfång

Detta är inte en effektiv metod eftersom det tar ganska lång tid och potentiellt kräver mer än ett försök, men det kan vara mycket exakt. Det är också användbart vid visuell validering av koder som erhållits med hjälp av metod 2 och 3, även för att bestämma alla särdrag hos en fjärrkontroll. Som exempel när du håller ned en knapp på en Apple IR -fjärrkontroll. Fjärrkontrollen kommer initialt att utfärda en kommandosekvens och sedan följa den med en upprepad komprimerad sekvens på 0xF….

Leta upp det på en webbplats

Fjärrkontrollkoddatabasen på Linux Infrared Remote Control -webbplatsen är en bra källa.

Nackdelen är dock att du kanske måste prova några koder tills du hittar en som fungerar för dig. Du kan också behöva tolka några av kodernas representationer för att konvertera dem till motsvarande hexform.

Avkoda det direkt från dataströmmen

Med kretsen i bild 1 ovan i samband med IRremote -biblioteksexemplet 'IRrecvDumpV2.ino' är det möjligt att avkoda dataströmmen direkt från fjärrkontrollen. Bild 2 visar en avkodad Samsung TV -fjärrkontroll för på/av -knapptryckning i Arduino IDE -terminalfönstret.

Kombinerad mottagare/sändare

Bilderna 3 och 4 ovan visar en lösning som möjliggör både mottagning och överföring av IR -kommando för enkel prototypering.

För att avkoda IR -fjärrkontrollens knapptryckningar måste du blinka Arduino med exemplet 'IRrecvDumpV2.ino' som medföljer IRremote -biblioteket.

Det fungerar också lika bra för överföring om IR -kommandon. En röd lysdiod ingår som en visuell indikation på att enheten är i funktion.

Steg 5: Hur man testar din I2C -slavenhet

Hur man testar din I2C -slavenhet
Hur man testar din I2C -slavenhet
Hur man testar din I2C -slavenhet
Hur man testar din I2C -slavenhet

Använd källkoden här och kretsen som beskrivs ovan i bild 1, programmera 'Master' Arduino med 'IR_Remote_Sim_Test.ino' och 'Slave' Arduino med 'IR_Remote_Sim.ino'.

Förutsatt att du har en Sony Bravia TV, Sky HD -box och en Sony BT SoundBar, tryck på knapp 1 och din TV växlar till BBC1 (kanal 101). Tryck på knapp 2 så stängs ljudet av. Tryck igen så stängs ljudet av.

Under utförandet av IR -överföringssekvensen tänds LED3 för att indikera att slaven är upptagen och LED1 kommer att flimra i linje med IR -överföringsprocessen.

Naturligtvis, om du inte har samma underhållningssystem som ovan, kan du programmera om slaven med 'IRrecvDumpV2.ino', avkoda dina fjärrkommandon av intresse och sedan programmera dem till 'IR_Remote_Sim_Test.ino' för din givet scenario.

Bild 2 visar översikt över systemnivå testprogramvara mellan Master och Slave.

Steg 6: Minskar din design

Minskar din design
Minskar din design

Ok, så förutsatt att du har följt denna instruerbara förlita sig på två Arduinos för att styra dina hem enheter är inte den mest effektiva användningen av din Arduino lager. Följaktligen, om du konstruerar kretsen som visas på bilden ovan och följer instruktionerna här för att programmera ATMega328P med 'IR_Remote_Sim.ino', kommer du att kunna reducera hela systemet till de minimala komponenterna. Detta gör att du kan bädda in din design i något annat system.

Steg 7: Slutsats

Slutsats
Slutsats
Slutsats
Slutsats

Lösningen är stabil och fungerar bra, den har varit inbäddad i ett annat system i ganska många veckor nu utan problem.

Jag valde Arduino Uno R3 eftersom jag ville ha en enhet som hade tillräckligt med RAM så att jag kunde ha en knappbuffert av rimligt djup. Jag nöjde mig med en buffertstorlek på 20 paket (MAX_SEQUENCES).

Hybrid TX/RX -skölden som jag gjorde var också mycket användbar vid avkodning av fjärrkontroller från Sony och Sky. Även om jag måste erkänna att jag använde mitt digitala omfång då och då för att kontrollera att programvarans avkodade IR -kommando var detsamma som det som kom från IR -mottaget (TSOP38328).

Det enda jag skulle ha gjort annorlunda skulle ha varit att använda konstantströmkretsen för IR -lysdioden som visas ovan på bild 2.

En ytterligare punkt att notera är att inte alla IR -sändare är modulerade med 38KHz, TSOP38328 är optimerad för 38KHz.

Steg 8: Referenser används

IRRemote.h

  • Av: z3t0
  • Syfte: Infrarött fjärrbibliotek för Arduino: skicka och ta emot infraröda signaler med flera protokoll
  • Från:

IR fjärrbibliotek

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

IR (infraröd) mottagarsensor - TSOP38238 (motsvarande)

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

För att undvika att datastrukturen fylls med 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

Bra källa till IR -fjärrdetaljer

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

I2C

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

IR -fjärrdatabas

  • 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

ATMega328P-PU-datablad

Rekommenderad: