Sommario:

Telecomando a infrarossi I2C con Arduino: 8 passaggi (con immagini)
Telecomando a infrarossi I2C con Arduino: 8 passaggi (con immagini)

Video: Telecomando a infrarossi I2C con Arduino: 8 passaggi (con immagini)

Video: Telecomando a infrarossi I2C con Arduino: 8 passaggi (con immagini)
Video: Ricevitore ad infrarossi (Sensori con Arduino) 2024, Dicembre
Anonim
Telecomando a infrarossi I2C con Arduino
Telecomando a infrarossi I2C con Arduino
Telecomando a infrarossi I2C con Arduino
Telecomando a infrarossi I2C con Arduino

Preambolo Questo Instructable spiega come creare un telecomando universale utilizzando I2C per l'interfaccia.

Che strano dici, usando un dispositivo slave I2C?

Sì, un dispositivo slave I2C.

Questo perché la tempistica accurata dei pacchetti IR è piuttosto impegnativa e un tipico Arduino avrà difficoltà se sta già svolgendo molte altre attività contemporaneamente. È meglio distribuire il carico di elaborazione assegnando attività ad alta intensità di temporizzazione a processori dedicati quando possibile (meglio ancora farlo in hardware). Dato che I2C è un metodo di comunicazione ben documentato e robusto tra i circuiti integrati, ho scelto questo come interfaccia.

introduzione

Come accennato in precedenza, questa istruzione descrive come controllare elettrodomestici come TV, lettore DVD e satellite ecc. Utilizzando la libreria IRremote su Arduino.

Si conclude con un esempio di progettazione che trasforma l'Arduino in un modulo di controllo remoto slave I2C (foto 1 sopra) con un circuito di prova prototipo (foto 2 sopra) e passa a dettagliare come ridurre il progetto ai componenti minimi necessari in modo che possa essere incorporato in un altro disegno. Nel mio caso utilizzo questo dispositivo integrato in un dispositivo di controllo remoto universale IoT basato su un ESP8266-12E.

Di quali parti ho bisogno?

Per costruire il circuito illustrato nel passaggio 1 (trasmettitore IR) avrai bisogno delle seguenti parti;

  • 2 resistenze da 10K
  • 1 off 390R resistore
  • 1 resistore 33R
  • 1 off 3K8 resistore
  • 1 LED rosso spento
  • 1 led IR spento TSAL6400
  • 1 fuori Transistor BC337
  • 1 condensatore da 220uF
  • 1 sconto su Arduino Uno

Per costruire il circuito illustrato al punto 4 (Ricevitore IR) avrai bisogno delle seguenti parti;

  • 1 resistore da 10K
  • 1 sconto TSOP38328
  • 1 condensatore da 220uF
  • 1 sconto su Arduino Uno

Per costruire il circuito raffigurato al punto 5 (Slave test circuit) avrai bisogno delle seguenti parti;

  • 4 resistenze da 10K
  • 2 off 390R resistore
  • 1 off 33R resistore
  • 1 off 3K8 resistore
  • 2 LED rossi spenti
  • 1 led IR spento TSAL6400
  • 1 fuori Transistor BC337
  • 1 condensatore da 220uF
  • 2 pulsanti SPST off
  • 2 su Arduino Unos

Per costruire il circuito illustrato nel passaggio 6 (Shrunk design) avrai bisogno delle seguenti parti;

  • 3 resistenze da 10K
  • 1 resistore da 270R
  • 1 off 15R resistore
  • 4 resistenze da 1K
  • 1 LED rosso spento
  • 1 led IR spento TSAL6400 o TSAL5300
  • 1 off Transistor BC337
  • 1 condensatore elettrolitico da 220uF a 6,3 v
  • 1 condensatore elettrolitico da 1000uF a 6,3 v
  • 2 condensatori da 0.1uF
  • 2 condensatori da 22 pF
  • 1 off 16MHz Xtal
  • 1 pezzo ATMega328P-PU

Nota: sarà necessario anche un dispositivo FTDI per programmare ATMega328P

Di quali competenze ho bisogno?

  • Una conoscenza minima dell'elettronica,
  • Conoscenza di Arduino e del suo IDE,
  • Un po 'di pazienza,
  • Una certa comprensione di I2C sarebbe utile (vedi qui per alcuni dettagli generici di I2C/Wire Library).

Argomenti trattati

  • Breve panoramica del circuito,
  • Breve panoramica del software,
  • Contenuto del pacchetto I2C,
  • Acquisizione codici telecomando (ui32Data),
  • Come testare il tuo dispositivo I2C Slave,
  • Riducendo il tuo disegno,
  • Conclusione,
  • Riferimenti utilizzati.

Disclaimer

Come sempre, utilizzi queste istruzioni a tuo rischio e pericolo e non sono supportate.

Passaggio 1: breve panoramica del circuito

Breve panoramica del circuito
Breve panoramica del circuito

Lo scopo del circuito è trasmettere codici di telecomando IR. Il suo design è piuttosto diretto e abbastanza semplice.

Quando il transistor Q1 un BC337 NPN viene acceso tramite uno logico da Arduino PWM O/P D3 a Resistor R5, la corrente passa attraverso i LED 1 e 2. Limitata solo dai resistori di zavorra R3 e R4 rispettivamente. Q1 viene utilizzato per aumentare la corrente che passa attraverso il diodo IR (IF Max = 100mA) a quella superiore a quella che l'O/P di Arduino è in grado di fornire ~40mA @ +5v.

Il condensatore C1 a 220uF elettrolitico fornisce una certa stabilizzazione prevenendo una caduta della linea di alimentazione dalla potenza assorbita dai LED 1 e 2.

I resistori R1 e R2 sono pull up I2C.

Passaggio 2: breve panoramica del software

Breve panoramica del software
Breve panoramica del software
Breve panoramica del software
Breve panoramica del software
Breve panoramica del software
Breve panoramica del software

Preambolo

Per compilare correttamente questo codice sorgente avrai bisogno della seguente libreria aggiuntiva;

IRremote.h

  • Di: z3t0
  • Scopo: libreria remota a infrarossi per Arduino: inviare e ricevere segnali a infrarossi con più protocolli
  • Da:

Panoramica del codice

Come mostrato nella figura 1 sopra, all'avvio il codice configura l'I/O del microcontrollore quindi interroga lo stato del flag software interno 'bFreshDataFlag'. Quando questo flag è impostato, il controller afferma che è la linea "Occupato" (inviando il pin di dati D4 basso) e si sposta nello stato "eBUSY" leggendo in sequenza i comandi della pressione del pulsante mantenuti in uDataArray e inviando i dati modulati IR al LED IR in un sequenza di trasmissione.

Una volta che i dati contenuti in uDataArray sono stati completamente inviati, lo stato 'eIDLE' viene ripristinato e la linea 'Occupato' viene deasserita (invio dati pin D4 alto). Il dispositivo è ora pronto per ricevere più pressioni dei pulsanti che segnano la fine della sequenza di trasmissione.

Ricezione dei dati di pressione del pulsante IR

Quando i dati vengono inviati al telecomando a infrarossi tramite I2C, viene attivato un interrupt e la chiamata alla funzione receiverEvent() viene avviata in modo asincrono.

Una volta attivato, i dati I2C ricevuti vengono scritti in sequenza nel buffer 'uDataArray'.

Durante la ricezione dei dati, se viene segnalata la fine della sequenza dal master (bFreshData!=0x00) viene impostato 'bFreshDataFlag', segnalando così l'inizio della sequenza di trasmissione.

Le figure 2…3 forniscono un esempio di una tipica sequenza di pacchetti.

Nota: il codice sorgente completo è disponibile qui

Passaggio 3: contenuto del pacchetto I2C

Contenuto del pacchetto I2C
Contenuto del pacchetto I2C

Il formato del pacchetto di controllo inviato allo slave su I2C è riportato sopra in figura 1 il significato di ciascun campo è riportato di seguito

Significato dei campi del pacchetto di controllo

byte bCodifica;

  • Codifica telecomando IR,

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

uint32_t ui32Data;

La rappresentazione esadecimale del flusso di dati IR binario 4 Byte di dati (unsigned long), LSByte … MSByte

byte bNumberOfBitsInTheData;

Numero di Bit nei dati (Max di 32). Campo = 1 … 32

byte bPulseTrainRepeats;

Quante ripetizioni di questo treno di impulsi. Intervallo = 1 … 255. Tipicamente 2…4 ripetizioni. Potresti voler estendere questo per i comandi On/Off poiché il dispositivo ricevente a volte richiede alcune ripetizioni del treno di impulsi extra per ricevere un segnale di accensione

byte bDelayBetweenPulseTrainRepeats;

Ritardo tra le ripetizioni di questo treno di impulsi. Intervallo = 1 … 255 ms. Tipicamente 22 ms … 124 ms

byte bButtonRepeats;

Simula la pressione ripetuta dello stesso pulsante (ma non supporta il codice modificato come un telecomando Apple, ripete semplicemente il codice del pulsante). Intervallo = 1 … 256. Predefinito = 1

uint16_t ui16DelayBetweenButtonRepeats;

Ritardo tra le ripetizioni del pulsante (unsigned int). 2 byte in totale LSByte … MSByte. Intervallo = 1 … 65535 mS. Predefinito = 0mS

byte bFreshData;

  • Dati freschi. Un valore diverso da zero. Scritto per ultimo, attiva la sequenza IR TX. Gamma 0x00…0xFF

    • Altri pacchetti di controllo in arrivo = 0
    • Questo è il pacchetto di controllo finale = Valore diverso da zero 1, 2, … 255

Notare l'uso della direttiva del compilatore '_packed_'. Questo per garantire che i dati siano pacchetti byte per byte in memoria indipendentemente dal sistema di destinazione utilizzato (Uno, Due, ESP8266 ecc.). Ciò significa che l'unione tra registerAllocationType e dataArrayType necessita solo di un clock sequenziale in byte da un pacchetto di controllo, rendendo semplice il software TX/RX.

Passaggio 4: acquisizione dei codici di controllo remoto (ui32Data)

Acquisizione dei codici di controllo remoto (ui32Data)
Acquisizione dei codici di controllo remoto (ui32Data)
Acquisizione dei codici di controllo remoto (ui32Data)
Acquisizione dei codici di controllo remoto (ui32Data)
Acquisizione dei codici di controllo remoto (ui32Data)
Acquisizione dei codici di controllo remoto (ui32Data)
Acquisizione dei codici di controllo remoto (ui32Data)
Acquisizione dei codici di controllo remoto (ui32Data)

Ci sono tre modi per acquisire un rispettivo codice chiave del telecomando;

  1. Tramite il conteggio dei bit con un oscilloscopio,
  2. Cercalo su un sito web,
  3. Decodificalo direttamente dal flusso di dati nel software.

Tramite conteggio bit con un oscilloscopio

Questo non è un metodo efficiente in quanto richiede un po' di tempo e potenzialmente richiede più di un tentativo, tuttavia può essere molto accurato. È utile anche per validare visivamente i codici ottenuti con i metodi 2 e 3, anche per determinare eventuali peculiarità di un telecomando. Ad esempio quando si tiene premuto un pulsante su un telecomando Apple IR. Il telecomando inizialmente emetterà una sequenza di comandi, quindi seguirà quella con una sequenza compressa ripetuta di 0xF….

Cercalo su un sito web

Il database del codice di controllo remoto sul sito Web Linux Infrared Remote Control è una buona fonte.

Il rovescio della medaglia, tuttavia, è che potresti dover provare alcuni codici finché non ne trovi uno che funzioni per te. Potrebbe anche essere necessario interpretare alcune delle rappresentazioni dei codici per convertirli nella loro forma esadecimale equivalente.

Decodificalo direttamente dal flusso di dati

Utilizzando il circuito nella figura 1 sopra in combinazione con l'esempio della libreria IRremote 'IRrecvDumpV2.ino' è possibile decodificare il flusso di dati direttamente dal telecomando. L'immagine 2 mostra un telecomando TV Samsung decodificato per la pressione del pulsante di accensione/spegnimento nella finestra del terminale IDE di Arduino.

Ricevitore/trasmettitore combinato

Le figure 3 e 4 sopra mostrano una soluzione che consente sia la ricezione che la trasmissione del comando IR per consentire una facile prototipazione.

Per decodificare le pressioni dei pulsanti del telecomando IR sarà necessario eseguire il flashing di Arduino con l'esempio 'IRrecvDumpV2.ino' fornito con la libreria IRremote.

Funziona altrettanto bene anche per la trasmissione se i comandi IR. Un led rosso è incluso come indicazione visiva che il dispositivo è in azione.

Passaggio 5: come testare il dispositivo slave I2C

Come testare il tuo dispositivo slave I2C
Come testare il tuo dispositivo slave I2C
Come testare il tuo dispositivo slave I2C
Come testare il tuo dispositivo slave I2C

Usando il codice sorgente qui e il circuito descritto sopra nella figura 1, programma l'Arduino 'Master' con 'IR_Remote_Sim_Test.ino' e l'Arduino 'Slave' con 'IR_Remote_Sim.ino'.

Supponendo che tu abbia una TV Sony Bravia, un decoder Sky HD e una Sony BT SoundBar, premi il pulsante 1 e la tua TV passerà a BBC1 (canale 101). Premi il pulsante 2 e la soundbar si disattiverà. Premi di nuovo e si riattiverà.

Durante l'esecuzione della sequenza di trasmissione IR, il LED3 si illuminerà indicando che lo slave è occupato e il LED1 lampeggerà in linea con il processo di trasmissione IR.

Ovviamente se non hai lo stesso sistema di intrattenimento configurato come sopra, puoi riprogrammare lo slave con 'IRrecvDumpV2.ino', decodificare i tuoi comandi remoti di interesse, quindi programmarli in 'IR_Remote_Sim_Test.ino' per il tuo dato scenario.

La figura 2 mostra la panoramica del software di test a livello di sistema tra Master e Slave.

Passaggio 6: restringere il tuo design

Ridurre il tuo design
Ridurre il tuo design

Ok, quindi supponendo che tu abbia seguito questa istruzione fare affidamento su due Arduino per controllare i tuoi dispositivi domestici non è l'uso più efficiente del tuo stock Arduino. Di conseguenza, se si costruisce il circuito mostrato nell'immagine sopra e si seguono le istruzioni qui per programmare l'ATMega328P con 'IR_Remote_Sim.ino', sarà possibile ridurre l'intero sistema ai componenti minimi. Questo ti permetterà di incorporare il tuo design in qualche altro sistema.

Passaggio 7: conclusione

Conclusione
Conclusione
Conclusione
Conclusione

La soluzione è stabile e funziona bene, è stata incorporata in un altro sistema per parecchie settimane senza problemi.

Ho scelto Arduino Uno R3 perché volevo un dispositivo che avesse una RAM sufficiente in modo da poter avere un buffer dei pulsanti di ragionevole profondità. Ho optato per una dimensione del buffer di 20 pacchetti (MAX_SEQUENCES).

Anche lo shield Hybrid TX/RX che ho realizzato è stato molto utile durante la decodifica dei telecomandi Sony e Sky. Anche se devo confessare di aver usato di tanto in tanto il mio telescopio digitale per verificare che il comando IR decodificato dal software fosse lo stesso di quello proveniente dall'IR ricevuto (TSOP38328).

L'unica cosa che avrei fatto diversamente sarebbe stata quella di utilizzare il circuito di azionamento a corrente costante per il led IR come mostrato sopra nella foto 2.

Un ulteriore punto da notare è che non tutti i trasmettitori IR sono modulati con 38KHz, il TSOP38328 è ottimizzato per 38KHz.

Passaggio 8: riferimenti utilizzati

IRremote.h

  • Di: z3t0
  • Scopo: libreria remota a infrarossi per Arduino: inviare e ricevere segnali a infrarossi con più protocolli
  • Da:

Libreria IR Remote

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

Sensore ricevitore IR (infrarossi) - TSOP38238 (equivalente)

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

Per evitare il riempimento della struttura dati ai limiti delle parole

  • 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-signing-of-attribute-packed-aligned4

Buona fonte di dettagli del telecomando IR

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

I2C

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

Database telecomandi IR

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

Scheda tecnica BC337

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

1N4148 Scheda tecnica

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

Consigliato: