Taula de continguts:

Control remot infraroig I2C amb l'Arduino: 8 passos (amb imatges)
Control remot infraroig I2C amb l'Arduino: 8 passos (amb imatges)

Vídeo: Control remot infraroig I2C amb l'Arduino: 8 passos (amb imatges)

Vídeo: Control remot infraroig I2C amb l'Arduino: 8 passos (amb imatges)
Vídeo: Arduino Nano 16 Relay IR Remote Switch 2024, Desembre
Anonim
Control remot infraroig I2C amb l'Arduino
Control remot infraroig I2C amb l'Arduino
Control remot infraroig I2C amb l'Arduino
Control remot infraroig I2C amb l'Arduino

Preàmbul Aquest document instructiu detalla com crear un control remot universal mitjançant I2C per a la interfície.

Què us sembla estrany de fer servir un dispositiu esclau I2C?

Sí, un dispositiu esclau I2C.

Això es deu al fet que la sincronització exacta dels paquets IR és bastant exigent i amb la qual un Arduino típic lluitarà si ja està realitzant moltes altres tasques al mateix temps. És millor distribuir la càrrega informàtica assignant activitats intensives de temps a processadors dedicats sempre que sigui possible (millor fer-ho encara en maquinari). Atès que I2C és un mètode de comunicacions robust i ben documentat entre ICs, he escollit aquesta com a interfície.

Introducció

Com s'ha esmentat anteriorment, aquesta instrucció descriu com controlar els electrodomèstics com TV, reproductor de DVD i satèl·lit, etc. mitjançant la biblioteca IRremote de l'Arduino.

Conclou amb un exemple de disseny que converteix l’Arduino en un mòdul de control remot esclau I2C (foto 1 anterior) amb circuit de prova de prototip (foto 2 superior) i continua detallant com reduir el disseny fins als components mínims necessaris perquè pugui ser incrustat en un altre disseny. En el meu cas, faig servir aquest dispositiu incrustat en un dispositiu de control remot IoT Universal basat en un ESP8266-12E.

Quines parts necessito?

Per construir el circuit representat al pas 1 (transmissor IR) necessitareu les parts següents;

  • 2 resistències de 10K de descompte
  • 1 resistència 390R fora
  • 1 resistència de 33R
  • 1 resistència 3K8 de descompte
  • 1 apagat LED vermell
  • 1 de LED IR TSAL6400
  • 1 del transistor BC337
  • 1 condensador de 220uF de descompte
  • 1 de descompte a Arduino Uno

Per construir el circuit representat al pas 4 (receptor IR), necessitareu les parts següents;

  • 1 resistència de 10K fora
  • 1 de descompte TSOP38328
  • 1 condensador de 220uF de descompte
  • 1 de descompte a Arduino Uno

Per construir el circuit representat al pas 5 (circuit de prova d’esclau), necessitareu les parts següents;

  • 4 resistències de 10K de descompte
  • 2 resistències 390R
  • 1 resistència de 33R
  • 1 resistència 3K8 de descompte
  • 2 apagats LED vermell
  • 1 de LED IR TSAL6400
  • 1 de transistor BC337
  • 1 condensador de 220uF de descompte
  • 2 botons SPST
  • 2 de descompte a Arduino Unos

Per construir el circuit representat al pas 6 (disseny reduït), necessitareu les parts següents;

  • 3 resistències de 10K de descompte
  • 1 resistència de 270R
  • 1 resistència 15R fora
  • 4 resistències de 1K de descompte
  • 1 apagat LED vermell
  • 1 de LED IR TSAL6400 o TSAL5300
  • 1 de transistor BC337
  • 1 off 220uF condensador electrolític @ 6,3v
  • 1 off de condensador 1000uF electrolític @ 6,3v
  • 2 condensadors de 0,1 uF de descompte
  • 2 condensadors de 22pF
  • 1 descompte Xtal a 16 MHz
  • 1 de descompte en ATMega328P-PU

Nota: També necessiteu un dispositiu FTDI per programar l'ATMega328P

Quines habilitats necessito?

  • Una comprensió mínima de l’electrònica,
  • Coneixement d'Arduino i el seu IDE,
  • Una mica de paciència,
  • Alguna comprensió d’I2C seria útil (consulteu aquí alguns detalls genèrics d’I2C / Wire Library).

Temes tractats

  • Breu visió general del circuit,
  • Breu descripció general del programari,
  • Contingut del paquet I2C,
  • Adquirir codis de control remot (ui32Data),
  • Com provar el dispositiu I2C Slave,
  • Reduir el vostre disseny,
  • Conclusió,
  • Referències utilitzades.

Exempció de responsabilitat

Com sempre, utilitzeu aquestes instruccions pel vostre compte i risc i no s’admeten.

Pas 1: Breu visió general del circuit

Breu visió general del circuit
Breu visió general del circuit

El propòsit del circuit és transmetre codis de control remot IR. El seu disseny és bastant senzill i senzill.

Quan el transistor Q1 s’encén un BC337 NPN mitjançant un lògic des d’Arduino PWM O / P D3 fins a la resistència R5, el corrent passa per les leds 1 i 2. Limitades només per les resistències de llast R3 i R4 respectivament. Q1 s'utilitza per augmentar el corrent que passa pel díode IR (IF Max = 100mA) fins a un excés del que és capaç de subministrar Arduino O / P ~ 40mA @ + 5v.

El condensador C1 a 220uF electrolític proporciona una certa estabilització que impedeix que el carril de subministrament caigui per la potència consumida pels leds 1 i 2.

Les resistències R1 i R2 són extraccions I2C.

Pas 2: Breu descripció general del programari

Breu visió general del programari
Breu visió general del programari
Breu visió general del programari
Breu visió general del programari
Breu visió general del programari
Breu visió general del programari

Preàmbul

Per compilar correctament aquest codi font, necessitareu la següent biblioteca addicional;

IRremote.h

  • Per: z3t0
  • Finalitat: biblioteca remota d'infrarojos per a Arduino: enviar i rebre senyals d'infrarojos amb múltiples protocols
  • De:

Visió general del codi

Com es mostra a la imatge 1 anterior, en iniciar el codi, es configura la E / S del microcontrolador i, a continuació, examina l'estat de la marca interna del programari "bFreshDataFlag". Quan s'estableix aquest senyalador, el controlador afirma que és la línia "Ocupat" (envia el pin de dades D4 baix) i es mou a l'estat "eBUSY" llegint seqüencialment el botó de premsa de les ordres que es mantenen a uDataArray i envia les dades modulades IR al LED IR a seqüència de transmissió.

Un cop enviades les dades de uDataArray , es reprèn l'estat "eIDLE" i es deixa la línia "Ocupat" (enviant el pin D4 alt). Ara el dispositiu està a punt per rebre més prems de botons que marquen el final de la seqüència de transmissió.

Recepció de dades de premsa de botó IR

Quan les dades s’envien al controlador remot InfraRed mitjançant I2C, provoca una interrupció i la trucada de la funció recevevent () s’activa de manera asíncrona.

Un cop activades, les dades I2C rebudes s'escriuen seqüencialment al buffer 'uDataArray '.

Durant la recepció de dades, si el mestre assenyala un final de seqüència (bFreshData! = 0x00), es defineix "bFreshDataFlag", cosa que indica l'inici de la seqüència de transmissió.

Les imatges 2 … 3 donen un exemple d'una seqüència de paquets típica.

Nota: el codi font complet està disponible aquí

Pas 3: contingut del paquet I2C

Contingut del paquet I2C
Contingut del paquet I2C

El format del paquet de control enviat a l'esclau a través d'I2C es dóna a la imatge 1 a la part superior; el significat de cada camp es dóna a continuació.

Significat dels camps del paquet de control

byte bCodificació;

  • Codificació de control remot IR,

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

uint32_t ui32Data;

Representació hexadecimal del flux de dades IR binari 4 bytes de dades (sense signar llarg), LSByte … MSByte

byte bNumberOfBitsInTheData;

Nombre de bits a les dades (màxim 32). Rang = 1 … 32

byte bPulseTrainRepeats;

Quantes repeticions d’aquest tren de pulsacions. Rang = 1 … 255. Normalment 2 … 4 repeticions. És possible que vulgueu ampliar això per a les ordres d’encès / apagat, ja que el dispositiu receptor de vegades requereix algunes repeticions addicionals del tren de polsos per rebre un senyal d’encès

byte bDelayBetweenPulseTrainRepeats;

Retard entre les repeticions d’aquest tren d’impulsos. Abast = 1 … 255 mS. Normalment 22mS … 124mS

byte bButtonRepeats;

Simula que es prem repetidament el mateix botó (però no admet el codi modificat com un comandament a distància d'Apple, només repeteix el codi del botó). Rang = 1 … 256. Per defecte = 1

uint16_t ui16DelayBetweenButtonRepeats;

Retard entre les repeticions del botó (int sense signe). 2 bytes en total LSByte … MSByte. Abast = 1 … 65535 mS. Per defecte = 0 mS

byte bFreshData;

  • Dades noves. Un valor diferent de zero. L'últim escrit, activa la seqüència IR TX. Rang 0x00 … 0xFF

    • Hi haurà més paquets de control = 0
    • Aquest és el paquet de control final = valor diferent de zero 1, 2, … 255

Tingueu en compte l'ús de la directiva del compilador "_packed_". Això és per garantir que les dades siguin paquets de bytes per bytes a la memòria, independentment del sistema de destinació utilitzat (Uno, Due, ESP8266, etc.). Això significa que la unió entre registerAllocationType i dataArrayType només necessita rellotjar / byclock en bytes d’un paquet de control de manera seqüencial, cosa que fa que el programari TX / RX sigui senzill.

Pas 4: Adquisició de codis de control remot (ui32Data)

Adquisició de codis de control remot (ui32Data)
Adquisició de codis de control remot (ui32Data)
Adquisició de codis de control remot (ui32Data)
Adquisició de codis de control remot (ui32Data)
Adquisició de codis de control remot (ui32Data)
Adquisició de codis de control remot (ui32Data)
Adquisició de codis de control remot (ui32Data)
Adquisició de codis de control remot (ui32Data)

Hi ha tres maneres d’adquirir un codi de clau de control remot respectiu;

  1. Mitjançant el recompte de bits amb un oscil·loscopi,
  2. Cerqueu-ho en un lloc web,
  3. Descodifiqueu-lo directament des del flux de dades del programari.

Mitjançant el recompte de bits amb un abast

Aquest no és un mètode eficient, ja que triga força temps i pot requerir més d’un intent, però pot ser molt precís. També és útil per validar visualment els codis obtinguts mitjançant els mètodes 2 i 3, també per determinar les peculiaritats d’un comandament a distància. A tall d’exemple quan es manté premut un botó d’un comandament a distància IR d’Apple. El comandament remot inicialment emetrà una seqüència d’ordres i després la seguirà amb una seqüència comprimida repetida de 0xF …

Cerqueu-lo en un lloc web

La base de dades de codis de control remot al lloc web de control remot per infrarojos de Linux és una bona font.

L'inconvenient, però, és que potser haureu de provar uns quants codis fins que en trobeu un que us funcioni. És possible que també hagueu d’interpretar algunes de les representacions dels codis per convertir-los en la seva forma hexadecimal equivalent.

Descodifiqueu-lo directament des del flux de dades

Utilitzant el circuit de la imatge 1 anterior junt amb l'exemple de la biblioteca IRremote 'IRrecvDumpV2.ino' és possible descodificar el flux de dades directament des del comandament a distància. La imatge 2 mostra un comandament Samsung TV descodificat per prémer un botó d’encesa / apagat a la finestra del terminal Arduino IDE.

Receptor / transmissor combinat

Les imatges 3 i 4 anteriors representen una solució que permet tant la recepció com la transmissió de comandes IR per facilitar el prototipatge.

Per descodificar els botons de control remot IR, haureu de fer flash l'Arduino amb l'exemple "IRrecvDumpV2.ino" que inclou la biblioteca IRremote.

També funciona igual de bé per a la transmissió si ordena IR. S'inclou un led vermell com a indicació visual del dispositiu en acció.

Pas 5: Com provar el dispositiu esclau I2C

Com provar el dispositiu esclau I2C
Com provar el dispositiu esclau I2C
Com provar el dispositiu esclau I2C
Com provar el dispositiu esclau I2C

Utilitzant el codi font aquí i el circuit esbossat anteriorment a la imatge 1, programeu l'Arduino 'Master' amb 'IR_Remote_Sim_Test.ino' i l'Arduino 'Slave' amb 'IR_Remote_Sim.ino'.

Suposant que tingueu un televisor Sony Bravia, una caixa Sky HD i un Sony BT SoundBar, premeu el botó 1 i el televisor canviarà a BBC1 (canal 101). Premeu el botó 2 i la barra de so es silenciarà. Torneu a prémer i es silenciarà.

Durant l'execució de la seqüència de transmissió IR el LED3 s'encendrà indicant que l'esclau està ocupat i el LED1 parpellejarà en línia amb el procés de transmissió IR.

Per descomptat, si no teniu configurat el mateix sistema d’entreteniment que l’anterior, podeu tornar a programar l’esclau amb “IRrecvDumpV2.ino”, descodificar les ordres remotes d’interès i, a continuació, programar-les a “IR_Remote_Sim_Test.ino” per al vostre escenari determinat.

La imatge 2 mostra la visió general del programari de proves de nivell de sistema entre Master i Slave.

Pas 6: reduir el disseny

Reduir el vostre disseny
Reduir el vostre disseny

D’acord, doncs, suposant que heu seguit aquesta instrucció basant-vos en dos Arduinos per controlar els vostres dispositius domèstics, no és l’ús més eficient de les vostres existències d’Arduino. En conseqüència, si construïu el circuit que es mostra a la imatge superior i seguiu les instruccions aquí per programar l'ATMega328P amb 'IR_Remote_Sim.ino', podreu reduir tot el sistema als components mínims. Això us permetrà incrustar el vostre disseny en algun altre sistema.

Pas 7: Conclusió

Conclusió
Conclusió
Conclusió
Conclusió

La solució és estable i funciona bé, ja fa força setmanes que està incrustada en un altre sistema sense cap problema.

Vaig triar l'Arduino Uno R3 ja que volia un dispositiu que tingués prou memòria RAM per poder tenir un botó de memòria intermèdia de profunditat raonable. Em vaig conformar amb una mida de memòria intermèdia de 20 paquets (MAX_SEQUENCES).

L’escut Hybrid TX / RX que vaig fabricar també va ser molt útil a l’hora de descodificar els comandaments a distància de Sony i Sky. Tot i que he de confessar que fer servir el meu abast digital de tant en tant per comprovar si la comanda IR descodificada del programari era la mateixa que la procedent de la IR rebuda (TSOP38328).

L'única cosa que hauria fet de manera diferent hauria estat utilitzar el circuit de transmissió de corrent constant per al led IR, tal com es mostra a la imatge 2.

Un altre punt a destacar és que no tots els transmissors d’IR estan modulats a 38 KHz, el TSOP38328 està optimitzat per a 38 KHz.

Pas 8: referències utilitzades

IRRemote.h

  • Per: z3t0
  • Finalitat: biblioteca remota d'infrarojos per a Arduino: enviar i rebre senyals d'infrarojos amb múltiples protocols
  • De:

Biblioteca remota IR

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

Sensor de receptor IR (infrarojos): TSOP38238 (equivalent)

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

Per evitar el farciment de l'estructura de dades als límits de les paraules

  • 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

Bona font de detalls remots IR

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

I2C

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

Base de dades de comandaments a distància IR

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

BC337 Full de dades

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

1N4148 Full de dades

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

Recomanat: