riservata:ir
Differenze
Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.
Entrambe le parti precedenti la revisioneRevisione precedenteProssima revisione | Revisione precedente | ||
riservata:ir [2018/09/14 17:12] – [Esempio con decodifica segnale IR] admin | riservata:ir [2020/07/03 15:58] (versione attuale) – modifica esterna 127.0.0.1 | ||
---|---|---|---|
Linea 1: | Linea 1: | ||
====== Comunicazione a infrarosso ====== | ====== Comunicazione a infrarosso ====== | ||
+ | |||
+ | Esperimenti di comunicazione a infrarosso con Arduino usando | ||
+ | * decodifica dei segnali di un telecomando | ||
+ | * telecomando per scatto remoto di una macchina fotografica digitale | ||
+ | * telecomando di una TV | ||
===== Hardware ===== | ===== Hardware ===== | ||
Linea 15: | Linea 20: | ||
==== Trasmettitore ==== | ==== Trasmettitore ==== | ||
- | ===== Esempio | + | Un LED a infrarosso della lunghezza d'onda giusta (compatibile col ricevitore) da pilotare a 38kHz con un microcontrollore. |
+ | |||
+ | ===== Idee per progetti ===== | ||
+ | |||
+ | * video/foto di un telecomando mentre va (si vede col sensore di una camera digitale) | ||
+ | * reverse engineering di un protocollo IR | ||
+ | * copiare i dati di un telecomando (usare la libreria) per fare un telecomando | ||
+ | |||
+ | ===== Osservazioni ===== | ||
+ | |||
+ | * perché 38kHz? non confonde il segnale con altro | ||
+ | * non si riesce a vedere il segnale modulato, il ricevitore dà in uscita un segnale già demodulato | ||
+ | |||
+ | ===== Decodifica | ||
+ | |||
+ | Esiste una libreria molto facile da utilizzare fatta da Ken Shirrif. Il programma seguente invece non usa librerie ed è sufficientemente facile da capire. Prerequisiti: | ||
+ | * tipi di dati | ||
+ | * bitwise math (shift, AND) | ||
+ | * array | ||
+ | * registri microcontrollori | ||
<code C> | <code C> | ||
Linea 145: | Linea 170: | ||
</ | </ | ||
+ | |||
+ | ===== Telecomando IR con Arduino ===== | ||
+ | |||
+ | Programma adattato da adafruit per pilotare lo scatto remoto della mia Nikon D50 (funziona). Il codice IR è stato ottenuto con un telecomando Nikon e qualcosa tipo il programma sopra. Non usa i registri quindi è sicuramente migliorabile lato prestazioni. | ||
+ | |||
+ | <code C> | ||
+ | |||
+ | // Intervallometro IR per la Nikon D50 (da adafruit) | ||
+ | |||
+ | // IRED sul pin 13 con resistore da 1k | ||
+ | byte IRED = 13; | ||
+ | // intervallo in secondi tra gli scatti | ||
+ | byte intervallo = 5; | ||
+ | |||
+ | void setup() { | ||
+ | pinMode(IRED, | ||
+ | Serial.begin(9600); | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | Serial.println(" | ||
+ | // invia comando scatto | ||
+ | SendNikonCode(); | ||
+ | // intervallo | ||
+ | delay(intervallo * 1000); | ||
+ | } | ||
+ | |||
+ | // genera un segnale a 38kHz per tot microsecondi | ||
+ | void pulseIR(long usecs) { | ||
+ | |||
+ | // disattiva gli interrupt | ||
+ | noInterrupts(); | ||
+ | |||
+ | while (usecs > 0) { | ||
+ | // 38 kHz corrisponde circa a 26 us (3+10+3+10) | ||
+ | // digitalWrite impiega 3 us (usare i registri? | ||
+ | digitalWrite(IRED, | ||
+ | delayMicroseconds(10); | ||
+ | digitalWrite(IRED, | ||
+ | delayMicroseconds(10); | ||
+ | usecs -= 26; | ||
+ | } | ||
+ | |||
+ | // riattiva gli interrupt | ||
+ | interrupts(); | ||
+ | } | ||
+ | |||
+ | // sequenza IR per scatto remoto Nikon D50 | ||
+ | void SendNikonCode() { | ||
+ | // comando scatto | ||
+ | pulseIR(2000); | ||
+ | delay(27); | ||
+ | pulseIR(440); | ||
+ | delayMicroseconds(1500); | ||
+ | pulseIR(460); | ||
+ | delayMicroseconds(3440); | ||
+ | pulseIR(480); | ||
+ | |||
+ | // pausa | ||
+ | delay(65); | ||
+ | |||
+ | // ripetizione comando scatto | ||
+ | pulseIR(2000); | ||
+ | delay(27); | ||
+ | pulseIR(440); | ||
+ | delayMicroseconds(1500); | ||
+ | pulseIR(460); | ||
+ | delayMicroseconds(3440); | ||
+ | pulseIR(480); | ||
+ | } | ||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | ===== Telecomando ON/OFF TV LG ===== | ||
+ | |||
+ | La sequenza corretta è stata ottenuta confrontando il protocollo utilizzato dalla TV LG (il protocollo NEC) con la sequenza ottenuta col programma che decodifica i segnali IR (vedi sopra). E' possibile accendere e spegnere la TV con Arduino, un IRED (di lunghezza d'onda compatibile) e resistore. Testato su smart TV LG 43LF590V. | ||
+ | |||
+ | <code C> | ||
+ | |||
+ | // TODO riscriverlo con array (o byte per la sequenza) | ||
+ | |||
+ | // on/off smart tv LG | ||
+ | // invia il comando e lo ripete dopo 2 minuti | ||
+ | // reset per rilanciarlo | ||
+ | |||
+ | // IRED sul pin 13 con resistore da 1k | ||
+ | byte IRED = 13; | ||
+ | |||
+ | void setup() { | ||
+ | pinMode(IRED, | ||
+ | Serial.begin(9600); | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | Serial.println(" | ||
+ | delay(1000); | ||
+ | // invia comando on/off | ||
+ | SendCode(); | ||
+ | // intervallo | ||
+ | delay(120000); | ||
+ | } | ||
+ | |||
+ | // genera un segnale a 38kHz per tot microsecondi | ||
+ | void pulseIR(long usecs) { | ||
+ | // disattiva gli interrupt | ||
+ | noInterrupts(); | ||
+ | while (usecs > 0) { | ||
+ | // 38 kHz corrisponde circa a 26 us (3+10+3+10) | ||
+ | // digitalWrite impiega 3 us (usare i registri? | ||
+ | digitalWrite(IRED, | ||
+ | delayMicroseconds(10); | ||
+ | digitalWrite(IRED, | ||
+ | delayMicroseconds(10); | ||
+ | usecs -= 26; | ||
+ | } | ||
+ | // riattiva gli interrupt | ||
+ | interrupts(); | ||
+ | } | ||
+ | |||
+ | // sequenza IR per pulsante on/off LG | ||
+ | // il protocollo e il NEC | ||
+ | // 562 + 562 codifica il valore logico 0 | ||
+ | // 562 + 1687 codifica il valore logico 1 | ||
+ | // ottenuto con arduino e un ricevitore IR è questo | ||
+ | //mark (L) space (H) | ||
+ | //IR ON IR OFF | ||
+ | // | ||
+ | // | ||
+ | // | ||
+ | // | ||
+ | //540 540 | ||
+ | //560 540 | ||
+ | //540 540 | ||
+ | //560 540 | ||
+ | //560 540 | ||
+ | // | ||
+ | //540 1660 | ||
+ | // | ||
+ | //560 1680 | ||
+ | //520 1680 | ||
+ | //520 1680 | ||
+ | //520 1680 | ||
+ | //520 1680 | ||
+ | // | ||
+ | //560 540 | ||
+ | // | ||
+ | //560 1680 | ||
+ | //520 540 | ||
+ | //560 540 | ||
+ | //560 540 | ||
+ | //560 540 | ||
+ | // | ||
+ | //540 1660 | ||
+ | // | ||
+ | //540 540 | ||
+ | //540 1680 | ||
+ | //540 1660 | ||
+ | //540 1660 | ||
+ | //540 1660 | ||
+ | //540 fine trasmissione | ||
+ | |||
+ | void SendCode() { | ||
+ | // inizio trasmissione | ||
+ | pulseIR(9000); | ||
+ | delayMicroseconds(4000); | ||
+ | // indirizzo 00100000 | ||
+ | pulseIR(560); | ||
+ | delayMicroseconds(560); | ||
+ | pulseIR(560); | ||
+ | delayMicroseconds(560); | ||
+ | pulseIR(560); | ||
+ | delayMicroseconds(1687); | ||
+ | pulseIR(560); | ||
+ | delayMicroseconds(560); | ||
+ | pulseIR(560); | ||
+ | delayMicroseconds(560); | ||
+ | pulseIR(560); | ||
+ | delayMicroseconds(560); | ||
+ | pulseIR(560); | ||
+ | delayMicroseconds(560); | ||
+ | pulseIR(560); | ||
+ | delayMicroseconds(560); | ||
+ | // indirizzo complementato 11011111 | ||
+ | pulseIR(560); | ||
+ | delayMicroseconds(1687); | ||
+ | pulseIR(560); | ||
+ | delayMicroseconds(1687); | ||
+ | pulseIR(560); | ||
+ | delayMicroseconds(560); | ||
+ | pulseIR(560); | ||
+ | delayMicroseconds(1687); | ||
+ | pulseIR(560); | ||
+ | delayMicroseconds(1687); | ||
+ | pulseIR(560); | ||
+ | delayMicroseconds(1687); | ||
+ | pulseIR(560); | ||
+ | delayMicroseconds(1687); | ||
+ | pulseIR(560); | ||
+ | delayMicroseconds(1687); | ||
+ | // comando 00010000 | ||
+ | pulseIR(560); | ||
+ | delayMicroseconds(560); | ||
+ | pulseIR(560); | ||
+ | delayMicroseconds(560); | ||
+ | pulseIR(560); | ||
+ | delayMicroseconds(560); | ||
+ | pulseIR(560); | ||
+ | delayMicroseconds(1687); | ||
+ | pulseIR(560); | ||
+ | delayMicroseconds(560); | ||
+ | pulseIR(560); | ||
+ | delayMicroseconds(560); | ||
+ | pulseIR(560); | ||
+ | delayMicroseconds(560); | ||
+ | pulseIR(560); | ||
+ | delayMicroseconds(560); | ||
+ | // comando complementato 11101111 | ||
+ | pulseIR(560); | ||
+ | delayMicroseconds(1687); | ||
+ | pulseIR(560); | ||
+ | delayMicroseconds(1687); | ||
+ | pulseIR(560); | ||
+ | delayMicroseconds(1687); | ||
+ | pulseIR(560); | ||
+ | delayMicroseconds(560); | ||
+ | pulseIR(560); | ||
+ | delayMicroseconds(1687); | ||
+ | pulseIR(560); | ||
+ | delayMicroseconds(1687); | ||
+ | pulseIR(560); | ||
+ | delayMicroseconds(1687); | ||
+ | pulseIR(560); | ||
+ | delayMicroseconds(1687); | ||
+ | // fine trasmissione | ||
+ | pulseIR(560); | ||
+ | delayMicroseconds(4000); | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ===== Riferimenti ===== | ||
+ | |||
+ | * protocollo NEC (usato anche dalla mia smart TV LG) https:// | ||
+ | * tutorial e programma senza librerie (adattato sopra) https:// | ||
+ | * tutorial con molti riferimenti utili https:// | ||
+ | * autore della libreria IR http:// | ||
+ | * generalità sulla trasmissione IR https:// | ||
+ | * datasheet https:// | ||
+ | * circuito di un ricevitore vishay https:// | ||
+ |
riservata/ir.1536945141.txt.gz · Ultima modifica: 2020/07/03 15:59 (modifica esterna)