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:33] – [Riferimenti] 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 28: | Linea 33: | ||
* non si riesce a vedere il segnale modulato, il ricevitore dà in uscita un segnale già demodulato | * non si riesce a vedere il segnale modulato, il ricevitore dà in uscita un segnale già demodulato | ||
- | ===== Esempio con decodifica | + | ===== 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: | Esiste una libreria molto facile da utilizzare fatta da Ken Shirrif. Il programma seguente invece non usa librerie ed è sufficientemente facile da capire. Prerequisiti: | ||
Linea 165: | 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 ===== | ===== Riferimenti ===== |
riservata/ir.1536946424.txt.gz · Ultima modifica: 2020/07/03 15:59 (modifica esterna)