Cuprins:

Telecomandă cu infraroșu I2C cu Arduino: 8 pași (cu imagini)
Telecomandă cu infraroșu I2C cu Arduino: 8 pași (cu imagini)

Video: Telecomandă cu infraroșu I2C cu Arduino: 8 pași (cu imagini)

Video: Telecomandă cu infraroșu I2C cu Arduino: 8 pași (cu imagini)
Video: Считывание кода кнопок пульта ДУ с помощью Arduino 2024, Iulie
Anonim
Telecomandă cu infraroșu I2C cu Arduino
Telecomandă cu infraroșu I2C cu Arduino
Telecomandă cu infraroșu I2C cu Arduino
Telecomandă cu infraroșu I2C cu Arduino

Preambul Acest instructabil detaliază cum să creați o telecomandă universală folosind I2C pentru interfață.

Cât de ciudat spuneți că utilizați un dispozitiv sclav I2C?

Da, un dispozitiv sclav I2C.

Acest lucru se datorează faptului că sincronizarea exactă a pachetelor IR este destul de solicitantă și una cu care se va lupta un tipic Arduino dacă îndeplinește deja multe alte sarcini în același timp. Este mai bine să distribuiți sarcina de calcul prin atribuirea activităților intensive de sincronizare procesorelor dedicate ori de câte ori este posibil (mai bine să o faceți în hardware). Având în vedere că I2C este o metodă de comunicații bine documentată și robustă între circuite integrate, am ales aceasta ca interfață.

Introducere

După cum sa menționat mai sus, acest instructiv descrie cum să controlați aparatele de uz casnic, cum ar fi TV, DVD player și satelit etc., utilizând biblioteca IRremote de pe Arduino.

Se încheie cu un exemplu de proiectare care transformă Arduino într-un modul de control de la distanță I2C sclav (imaginea 1 de mai sus) cu circuit de testare prototip (imaginea 2 de mai sus) și continuă să detalieze cum să vă micșorați designul până la componentele minime necesare pentru a putea fi încorporat într-un alt design. În cazul meu, folosesc acest dispozitiv încorporat într-un dispozitiv de telecomandă IoT Universal bazat pe un ESP8266-12E.

De ce piese am nevoie?

Pentru a construi circuitul descris în Pasul 1 (Transmițător IR) veți avea nevoie de următoarele părți;

  • 2 rezistențe de 10K
  • 1 rezistor 390R
  • 1 rezistor 33R
  • 1 rezistor 3K8
  • 1 oprit LED roșu
  • 1 off IR Led TSAL6400
  • 1 de pe tranzistorul BC337
  • 1 off condensator 220uF
  • 1 de pe Arduino Uno

Pentru a construi circuitul descris în Pasul 4 (Receptor IR) veți avea nevoie de următoarele părți;

  • 1 rezistor de 10K
  • 1 de pe TSOP38328
  • 1 off condensator 220uF
  • 1 de pe Arduino Uno

Pentru a construi circuitul descris în Pasul 5 (Circuitul de testare a sclavilor) veți avea nevoie de următoarele părți;

  • 4 rezistențe de 10K
  • 2 rezistențe 390R
  • 1 rezistor 33R
  • 1 rezistor 3K8
  • 2 oprit LED roșu
  • 1 off IR Led TSAL6400
  • 1 de pe tranzistorul BC337
  • 1 off condensator 220uF
  • 2 de pe butoanele SPST
  • 2 de pe Arduino Unos

Pentru a construi circuitul descris în Pasul 6 (proiectare Shrunk) veți avea nevoie de următoarele părți;

  • 3 rezistențe de 10K
  • 1 rezistor 270R
  • 1 rezistor 15R
  • 4 rezistențe 1K
  • 1 oprit LED roșu
  • 1 de pe IR Led TSAL6400 sau TSAL5300
  • 1 de pe tranzistorul BC337
  • 1 off 220uF condensator electrolitic @ 6.3v
  • 1 off 1000uF condensator electrolitic @ 6.3v
  • 2 off condensatori 0.1uF
  • 2 condensatori de 22pF
  • 1 off Xtal 16MHz
  • 1 de pe ATMega328P-PU

Notă: Veți avea nevoie și de un dispozitiv FTDI pentru a programa ATMega328P

De ce abilități am nevoie?

  • O înțelegere minimă a electronicii,
  • Cunoașterea Arduino și a IDE-ului său,
  • Puțină răbdare,
  • O anumită înțelegere a I2C ar fi utilă (consultați aici câteva detalii generice I2C / Wire Library).

Subiecte acoperite

  • Scurtă prezentare generală a circuitului,
  • Scurtă prezentare generală a software-ului,
  • Conținutul pachetului I2C,
  • Achiziționarea codurilor de control de la distanță (ui32Data),
  • Cum să vă testați dispozitivul I2C Slave,
  • Reducerea designului,
  • Concluzie,
  • Referințe utilizate.

Declinare de responsabilitate

Ca întotdeauna, utilizați aceste instrucțiuni pe propriul risc și acestea sunt neacceptate.

Pasul 1: Scurtă prezentare generală a circuitului

Scurtă prezentare generală a circuitului
Scurtă prezentare generală a circuitului

Scopul circuitului este de a transmite coduri de telecomandă IR. Designul său este destul de simplu și destul de simplu.

Când tranzistorul Q1 un BC337 NPN este pornit printr-unul logic de la Arduino PWM O / P D3 la rezistorul R5, curentul trece prin ledurile 1 și 2. Limitat doar de rezistențele de balast R3 și respectiv R4. Q1 este utilizat pentru a crește curentul care trece prin dioda IR (IF Max = 100mA) la cel care depășește ceea ce este capabil Arduino O / P ~ 40mA @ + 5v de alimentare.

Condensatorul C1 a 220uF electrolitic asigură o anumită stabilizare, prevenind o cădere a șinei de alimentare prin puterea consumată de ledurile 1 și 2.

Rezistențele R1 și R2 sunt extrageri I2C.

Pasul 2: Prezentare succintă a software-ului

Scurtă prezentare generală a software-ului
Scurtă prezentare generală a software-ului
Scurtă prezentare generală a software-ului
Scurtă prezentare generală a software-ului
Scurtă prezentare generală a software-ului
Scurtă prezentare generală a software-ului

Preambul

Pentru a compila cu succes acest cod sursă, veți avea nevoie de următoarea bibliotecă suplimentară;

IRremote.h

  • De: z3t0
  • Scop: Bibliotecă la distanță cu infraroșu pentru Arduino: trimite și primi semnale în infraroșu cu mai multe protocoale
  • De la:

Prezentare generală a codului

Așa cum se arată în imaginea 1 de mai sus, la pornire, codul configurează I / O pentru microcontroler, apoi sondează starea semnalizatorului software intern „bFreshDataFlag”. Când acest semnal este setat, controlerul afirmă că este linia „Ocupată” (trimiterea pinului de date D4 scăzut) și se deplasează la starea „eBUSY” citind secvențial butonul de apăsare a comenzilor ținute în uDataArray și trimiterea datelor modulate IR către LED-ul IR într-un secvența de transmisie.

Odată ce datele deținute în uDataArray au fost complet trimise, starea „eIDLE” este reluată și linia „Ocupată” este anulată (trimiterea pinului D4 ridicat). Dispozitivul este acum gata să primească mai multe apăsări de butoane care marchează sfârșitul secvenței de transmisie.

Recepția datelor de apăsare a butonului IR

Când datele sunt trimise la telecomanda InfraRed prin I2C, aceasta declanșează o întrerupere și apelul funcției ReceEvent () este declanșat asincron.

Odată declanșate datele I2C primite sunt scrise secvențial în bufferul „uDataArray ”.

În timpul recepției de date, dacă un final de secvență este semnalat de master (bFreshData! = 0x00) este setat „bFreshDataFlag”, semnalând astfel începutul secvenței de transmisie.

Imaginile 2 … 3 oferă un exemplu de secvență tipică de pachete.

Notă: Codul sursă complet disponibil aici

Pasul 3: Conținutul pachetului I2C

Conținutul pachetului I2C
Conținutul pachetului I2C

Formatul pachetului de control trimis sclavului prin I2C este dat mai sus în imaginea 1, semnificația fiecărui câmp este dată mai jos

Înțelesul câmpurilor de pachete de control

octet bCodificare;

  • Codificare telecomandă IR,

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

uint32_t ui32Data;

Reprezentarea hexagonală a fluxului de date IR binar 4 octeți de date (nesemnat lung), LSByte … MSByte

octet bNumberOfBitsInTheData;

Numărul de biți din date (maximum 32). Gama = 1 … 32

octet bPulseTrainRepeats;

Câte repetări ale acestui tren de impulsuri. Interval = 1 … 255. De obicei 2 … 4 repetări. Poate doriți să extindeți acest lucru pentru comenzile On / Off, deoarece dispozitivul receptor necesită uneori câteva repetări suplimentare ale trenului de impulsuri pentru a primi un semnal de pornire

octet bDelayBetweenPulseTrainRepeats;

Întârziere între repetări ale acestui tren de impulsuri. Interval = 1 … 255mS. De obicei 22mS … 124mS

octet bButtonRepeats;

Simulează apăsarea repetată a aceluiași buton (dar nu acceptă codul modificat ca o telecomandă Apple, doar repetă codul butonului). Gama = 1 … 256. Implicit = 1

uint16_t ui16DelayBetweenButtonRepeats;

Întârziere între repetarea butonului (int semnat). 2 octeți în total LSByte … MSByte. Interval = 1 … 65535mS. Implicit = 0mS

octet bFreshData;

  • Date noi. O valoare diferită de zero. Scris ultima dată, declanșează secvența IR TX. Gama 0x00 … 0xFF

    • Mai multe pachete de control viitoare = 0
    • Acesta este pachetul de control final = valoare non-zero 1, 2, … 255

Rețineți utilizarea directivei compilatorului „_packed_”. Acest lucru este pentru a vă asigura că datele sunt pachete de octeți pentru octeți în memorie, indiferent de sistemul țintă utilizat (Uno, Due, ESP8266 etc.). Aceasta înseamnă că unirea dintre registerAllocationType și dataArrayType are nevoie doar de secvențial clock out / clock in bytes dintr-un pachet de control, ceea ce face software-ul TX / RX simplu.

Pasul 4: Achiziționarea codurilor de control de la distanță (ui32Data)

Achiziționarea codurilor de control de la distanță (ui32Data)
Achiziționarea codurilor de control de la distanță (ui32Data)
Achiziționarea codurilor de control de la distanță (ui32Data)
Achiziționarea codurilor de control de la distanță (ui32Data)
Achiziționarea codurilor de control de la distanță (ui32Data)
Achiziționarea codurilor de control de la distanță (ui32Data)
Achiziționarea codurilor de control de la distanță (ui32Data)
Achiziționarea codurilor de control de la distanță (ui32Data)

Există trei moduri în care puteți obține un cod cheie de telecomandă respectiv;

  1. Prin numărarea de biți cu un osciloscop,
  2. Căutați-l pe un site web,
  3. Decodează-l direct din fluxul de date din software.

Prin numărarea de biți cu un scop

Aceasta nu este o metodă eficientă, deoarece durează destul de mult timp și necesită potențial mai mult de o încercare, însă poate fi extrem de precisă. De asemenea, este util în validarea vizuală a codurilor obținute folosind metodele 2 și 3, de asemenea, în determinarea particularităților unei telecomenzi. De exemplu, când țineți apăsat un buton pe o telecomandă Apple IR. Telecomanda va emite inițial o secvență de comandă, apoi va urma aceea cu o secvență repetată comprimată de 0xF …

Căutați-l pe un site web

Baza de date a codului de control de la distanță de pe site-ul web Linux Remote Control este o sursă bună.

Dezavantajul este că va trebui să încercați câteva coduri până când veți găsi unul care să vă funcționeze. De asemenea, poate fi necesar să interpretați câteva dintre reprezentările codurilor pentru a le converti în forma hexagonală echivalentă.

Decodează-l direct din fluxul de date

Utilizând circuitul din imaginea 1 de mai sus împreună cu exemplul de bibliotecă IRremote „IRrecvDumpV2.ino” este posibil să decodificați fluxul de date direct de la distanță. Imaginea 2 prezintă o telecomandă Samsung TV decodificată pentru apăsarea unui buton de pornire / oprire în fereastra terminalului Arduino IDE.

Receptor / emițător combinat

Imaginile 3 și 4 de mai sus descriu o soluție care permite recepția și transmiterea comenzilor IR pentru a permite o prototipare ușoară.

Pentru a decoda apăsarea butonului telecomenzii IR, va trebui să luminați Arduino cu exemplul „IRrecvDumpV2.ino” care vine cu biblioteca IRremote.

De asemenea, funcționează la fel de bine pentru transmisie dacă comandă IR. Un led roșu este inclus ca o indicație vizuală a dispozitivului în acțiune.

Pasul 5: Cum să vă testați dispozitivul sclav I2C

Cum să vă testați dispozitivul sclav I2C
Cum să vă testați dispozitivul sclav I2C
Cum să vă testați dispozitivul sclav I2C
Cum să vă testați dispozitivul sclav I2C

Folosind codul sursă aici și circuitul prezentat mai sus în imaginea 1, programați „Master” Arduino cu „IR_Remote_Sim_Test.ino” și „Slave” Arduino cu „IR_Remote_Sim.ino”.

Presupunând că aveți un televizor Sony Bravia, o cutie Sky HD și un Sony BT SoundBar, apăsați butonul 1 și televizorul dvs. va trece la BBC1 (canalul 101). Apăsați butonul 2 și bara de sunet se va dezactiva. Apăsați din nou și va dezactiva sunetul.

În timpul executării secvenței de transmisie IR LED3 se va aprinde indicând faptul că sclavul este ocupat și LED1 va pâlpâi în linie cu procesul de transmisie IR.

Desigur, dacă nu aveți același sistem de divertisment configurat ca mai sus, puteți reprograma sclavul cu „IRrecvDumpV2.ino”, decoda comenzile de la distanță de interes, apoi le puteți programa în „IR_Remote_Sim_Test.ino” pentru scenariu dat.

Imaginea 2 arată prezentarea generală a software-ului la nivel de sistem între Master și Slave.

Pasul 6: Reducerea designului

Reducerea designului
Reducerea designului

Ok, deci presupunând că ați urmărit acest lucru instructiv bazându-vă pe două Arduino pentru a vă controla dispozitivele de acasă nu este cea mai eficientă utilizare a stocului dvs. Arduino. În consecință, dacă construiți circuitul prezentat în imaginea de mai sus și urmați instrucțiunile de aici pentru a programa ATMega328P cu „IR_Remote_Sim.ino”, veți putea reduce întregul sistem la componentele minime. Acest lucru vă va permite să încorporați designul în alt sistem.

Pasul 7: Concluzie

Concluzie
Concluzie
Concluzie
Concluzie

Soluția este stabilă și funcționează bine, a fost încorporată într-un alt sistem de câteva săptămâni, fără probleme.

Am ales Arduino Uno R3 pentru că doream un dispozitiv care să aibă suficientă memorie RAM, astfel încât să pot avea un buton tampon de o adâncime rezonabilă. M-am mulțumit cu o dimensiune tampon de 20 de pachete (MAX_SEQUENCES).

Scutul hibrid TX / RX pe care l-am făcut a fost foarte util la decodarea telecomenzilor Sony și Sky. Deși trebuie să mărturisesc că folosind din când în când scopul digital pentru a verifica dacă comanda IR decodificată de software a fost aceeași cu cea provenită de la IR primită (TSOP38328).

Singurul lucru pe care l-aș fi făcut diferit ar fi fost să folosesc circuitul de acționare a curentului constant pentru ledul IR așa cum se arată mai sus în imaginea 2.

Un alt punct de remarcat este că nu toate emițătoarele IR sunt modulate cu 38KHz, TSOP38328 este optimizat pentru 38KHz.

Pasul 8: Referințe utilizate

IRRemote.h

  • De: z3t0
  • Scop: Bibliotecă la distanță cu infraroșu pentru Arduino: trimite și primi semnale în infraroșu cu mai multe protocoale
  • De la:

Biblioteca la distanță IR

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

Senzor receptor IR (infraroșu) - TSOP38238 (echivalent)

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

Pentru a evita completarea structurii datelor la limitele cuvintelor

  • 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

Sursă bună de detalii la distanță IR

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

I2C

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

Baza de date IR Telecomandă

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

BC337 Foaie de date

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

1N4148 Foaie de date

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

Recomandat: