«

»

dic 02

Stampa Articolo

Tutorial: Arduino come trasmettitore IR o come telecomando

In questi giorni ho ripreso un vecchio post del blog: Tutorial Arduino – IR con TSOP31238 e mi sono chiesto se fosse possibile da un altro Arduino inviare dei segnali IR al primo, magari con la stessa libreria IRremote.h, ebbene è possibile.

Arduino telecomando IR

Puoi utilizzare la libreria IRremote sia per decodificare i segnali provenineti da un sensore IR ( TSOP31238 o equivalente) sia per inviare i segnali IR al tuo televisore.

Gli sketch in questo caso sono 2, il primo serve a inviare i segnali, lo andari a caricare sull’Arduino di destra (vedi figura sopra); il secondo li riceve e decodifica, lo andrai a caricare nmell’Arduino di sinistra.

Primo Sketch – invia segnali IR

Premesse: l’esempio utilizza sia per la codifica sia per la decodifica segnali di tipo Sony, ogni telecomando e apparecchio ricevente sono configurati per codificare/decodificare secondo una base comune, la libreria IR prevede alcune codifiche standard: (Sony, Nec, RC5, RC6) e dei metodi di codifica/decodifica di tipo raw, generici con cui puoi codificare e decodificare quello che ti occorre.
inoltre la libreria ad oggi non ti permette di variare il pin di Arduino utilizzabile per pilotare il led IR, devi sempre utilizzare il pin 3 come mostrato in figura.

Ecco lo sketch di codifica o invio:

#include <IRremote.h>

IRsend irsend;

void setup() { }

void loop() {
  for (int i = 0; i < 3; i++) {
    irsend.sendSony(0xa90, 12); // Sony TV power code
    delay(100);
  }
}

Analizziamo lo sketch linea per linea:

linea 01: includi la libreria IRremote.h, la libreria dovrà essere presente nella stessa dir in cui metterai lo sketch, altrimenti l’IDE potrebbe darti errore perchè non la trova;

linea 03: inizializza l’oggetto irsend come istanza della classe IRsend, che ti consentirà di inviare i codici IR;

linea 05: definisci la funzione setup() in questo caso vuota, ricorda che le funzioni setup() e loop() devono sempre esistere in uno sketch e se non devono eseguire compiti puoi dichiararle vuote, come in questo caso;

linea 07: definisci una funzione loop() in questo caso l’unica ad eseguire qualcosa nel nostro sketch;

linea 08: definisci un ciclo di 3 step (0,1 e 2) in cui per ciascuno step invii il codice definito sotto;

linea 09: invia il codice a90 in standard Sony, per farlo utilizza il metodo sendSony( data, nbit ) in cui data è il valore da inviare e nbit la lunghezza della stringa. Esistono altri metodi di codifica, come dicevo sendNEC, sendRC5 e sendRC6 o sendRaw per l’invio di codifiche differenti;

linea 10: imposta un tempo di attesa di 100 millisecondi tra un invio ed il successivo, in questo modo i codici inviati non sono percepiti dal ricevitore  come un unico treno di segnali che potrebbe compromettere la decodifica corretta.

Secondo sketch – ricevi segnali IR

Passiamo ora allo sketch che ricevendo un segnale dal TSOP31238 lo converte nalla stringa decodificata:

#include <IRremote.h>

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }
}

linea 01: includi la stessa libreria vista sopra IRremote.h, che in questa situazione utilizzerai per decodificare il segnale proveniente dal trasmettitore IR;

linea 03: contrariamente a quanto avviene per la parte di invio quando utilizzi la libreria IRremote come ricevitore puoi decidere a quale pin connettere il sensore, in questo esempio collegalo al pin 11 e definisci la variabile di tipo intero RECV_PIN con valore 11 (il pin a cui hai collegato il sensore TSOP31238);

linea 05: inizializza un oggetto irrecv come istanza della classe IRrecv, passandogli la variabile RECV_PIN che imposta il pin su cui attendere il segnale di decodifica;

linea 07: definisci una variabile results in cui saranno inseriti i risultati della decondifica eseguiti dalla IRremote;

linea 09: definisci la funzione setup() in questo caso ha delle operazioni ben precise da eseguire inizializzare la comunicazione con il monitor seriale e attivare la ricezione;

line a 11: inizializza una comunicazione di tipo seriale a 9600 baud con il cpmpure a cui Arduino è connesso;

linea 12: con il metodo enableIRIn() abilita la comunicazione seriale, da questo momento tutti i segnali percepiti dal ricevitore IR saranno decodificati da Arduino;

linea 15: definisci la funzione loop();

linea 16: inserisci una condizione di controllo basandola sul metodo decode() dell’oggetto irrecv, tale metodo ritorna un valore true in presenza di un segnale valido di decodifica. La variabile results contiene il valore da decodificare;

linea 17: una volta decodificato il valore inviato puoi utilizzarlo per le tue applicazioni, in questo esempio utilizzando il metodo println() della Serial tale valore sarà scritto sul monitor seriale, siccome quello inviato è un codice esadecimale, utilizzia una opzione del metodo println() che ti consente di convertire il valore da scrivere già nella codifica corretta (HEX = Esadecimale);

linea 18: utilizza il metodo resume() della irrecv per rimettere il ricevitore nella condizione di attesa del segnale successivo;

Procedura di upload

Solitamente questa parte non la descrivo perchè ampiamente documentata sia sul sito ufficiale sia su questo stesso blog, tuttavia in questo caso quello che ti invito a fare è seguire i due semplici passi successivi per non crearti confuzione durante l’upload:

  1. definisci quale Arduino utilizzerai per l’invio e quale per la ricezione;
  2. prendi prima l’arduino che ha deciso di utilizzare per l’invio e collegalo alla USB;
  3. esegui l’upload del primo sketch;
  4. terminata l’operazione 3, scollega l’arduino e collega alla usb quello destinato a fare da ricevitore;
  5. esegui l’upload del secondo sketch;
  6. non scollegare l’arduino, poni led e ricevitore uno difronte all’altro come in figura;
  7. alimenta con una batteria da 9v o simile l’arduino di destra;
  8. apri il monitor seriale e guarda il codice pintato a video.
Arduino telecomando IR

Posizione dei 2 Arduino

Un piccolo trucco:

Siccome stai utilizzando infrarossi non ti sarà possibile vederli, sono invisibili all’ocio umano, per cui se non leggi alcun valore sul monitor seriale potrebbe essere dovuto alla completa mancanza di invio da parte del led, per verificarlo utilizza una comune macchina fotografica digitale, va benissimo anche quella del telefonino o la webcam del computer, inquadra il led e la fotocamera ti mostrerà se è acceso o spento, dovresti vederlo lampeggiare con una sequenza di segnali ogni 100 millisecondi.

Buon divertimento

Permalink link a questo articolo: http://www.mauroalfieri.it/elettronica/tutorial-arduino-come-trasmettitore-ir-o-come-telecomando.html

73 comments

Vai al modulo dei commenti

  1. fabrizio

    Ciao volevo sapere , è possibile inserire questo sketch in altri tipi di sketch?Se si come si può fare?
    Ti spiego se io ho già degli sketch che mi accendono relè via web e volevo creare un telecomando sempre web per poter accendere la tv, ma quando inserisco questo sketch l’ide mi genera errori…
    Sapresti aiutarmi?
    Grazie
    Fabrizio Bianchi

    1. Mauro Alfieri

      Ciao Fabrizio,
      con gli sketch puoi fare molte cose e puoi integrarli, in linea generale, senza problemi.
      Ci sono alcune librerie che risultano incompatibili con delle altre a causa dell’utilizzo dei medesimi pin o di comandi particolari, ma non puoi saperlo prima di averle provate.

      Per aiutarti dovrei conoscere quali librerie stai usando e i primi due errori che ti escono, ti prego di non incollare tutto lo sketch e tutti gli errori xchè non riuscirei a comprendere nulla.

      Mauro

  2. andrea

    Ciao Mauro,
    ho la necessità di accendere e spegnere un piccolo media-player che non possiede tasti ma puo essere pilotato solo con il telecomando. La mia intenzione è collegare elettricamente arduino ai fili del sensore di ricezione bypassando il led IR del trasmettitore. Se collego ad arduino un led trasmettitore IR tutto funziona perfettamente ma io volevo evitare l’uso del led e riuscire a comunicare direttamente con i fili del sensore ricevente. Che modifiche occorrono?

    grazie e complimenti!!

    Andrea

    1. Mauro Alfieri

      Ciao Andrea,
      la tua idea è molto interessante.
      Per realizzarla devi conoscere lo schema del Media Player, il tipo di segnali che il ricevitore IR invia all’apparato quando riceve il segnale di accensione, sarà una sequenza di qualche tipo, e programmare arduino per ripetere quella sequenza quando vuoi che sia accesso il media player.

      Senza gli schemi ed i segnali è impossibile ottenere quello che desideri, considerando anche il fatto che vorrai non rimuovere il ricevitore per poter impartire i comandi anche con il telecomando.

      Mauro

  3. Carmelo

    Ciao Mauro,
    Volevo creare un emettitore ir che inviasse il segnale per cambiare canale al mio televisore. Il problema è che non viene inviato niente. ti mando lo sketch:

    #include

    int RECV_PIN = 11;

    IRrecv irrecv(RECV_PIN);
    IRsend irsend;

    decode_results results;
    unsigned int buffer[68]={46653, 180, 88, 11, 11, 13……};

    void setup()
    {
    Serial.begin(9600);
    irrecv.enableIRIn(); // Start the receiver
    }

    void loop() {
    if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
    }

    for (int i = 0; i < 3; i++) {
    irsend.sendRaw(uno,4,38);
    delay(200);
    }
    }

    Ho provato anche a mettere nell'array "buffer" a inserire valori appresi usando il comando results.value e anteponendo 0x (0xB33B4597, 0xB33B4594, 0x1004849, 0xDE4306F1…).

    Al posto del led ir ne ho inserito uno normale e lampeggia, con il led ir però non viene inviato nessun segnale. Quale potrebbe essere il problema?

    1. Mauro Alfieri

      Ciao Carmelo,
      io inizierei con il creare uno sketch che faccia una sola operazione, send o recv, non due nello sesso sketch come hai fatto.
      Non mi è chiara la stringa: irsend.sendRaw(uno,4,38); dove usi buffer?

      Mauro

  4. Carmelo

    al posto di uno dovrebbe esserci scritto buffer:

    irsend.sendRaw(buffer,68,38); //stringa corretta

    avevo creato vari array con i codici dei vari comandi, ma sarebbe stato inutile postarli tutti, così ne ho lasciato solo uno chiamato buffer a titolo di esempio e ho dimenticato di cambiare il nome in quella stringa.

    Ho creato uno sketch che si occupa solo di inviare il segnale ma persiste il problema. Pensavo che la causa potesse esseere il led ir usato così, dopo aver testato il funzionamento di un telecomando di un vecchio lettore dvd, ne ho staccato il led e ho sostituito quello impiegato in precedenza, senza ottenere alcun risultato.

    I componenti sono stati collegati ad arduino nel modo da te indicato nello schema.

    Lo sketch viene compilato correttamente non riseco a capire quale sia il problema.
    Come ho già scritto ho sostituito il led ir con uno normale e lo si vede lampeggiare (chiaramente non invia nessun segnale), quindi il tutto credo che funzioni, con il led ir però non succcede niente, non viene cambiato canale.

    1. Mauro Alfieri

      Ciao Carmelo,
      da quanto scrivi sebra tutto corretto, prova a verificare con un altro arduino ed un IRreciver se ciò che invii dal primo è correttamete compreso dal secodo.
      I problemi che riscontri potrebbero essere dovuti ad una non corretta interpretazione del codice inviato.
      Se risolvi rendici partecipi, mi farebbe piacere sapere che sei riuscito nell’intento.

      Mauro

  5. stefano

    Buona sera

    Vorrei sapere se questo script funziona con arduino mega 2560 e con la stessa porta 3 ho fatto delle prove e non riesco a farlo funzionare non mi invia nessuna segnale

    grazie

    1. Mauro Alfieri

      Ciao Stefano,
      non l’ho ma provato su un’arduino Mega, tuttavia il linguaggio di programmazione è il medesimo tra Uno e Mega cambiano numero di pin e utilizzo delle porte.
      Probabilmente dovrai adattarlo.

      Mauro

  6. Marino

    Ciao 😉
    volevo chiederti una cosa che non ho capito :
    tu dici che “la libreria IR prevede alcune codifiche standard: (Sony, Nec, RC5, RC6) e dei metodi di codifica/decodifica di tipo raw” ma io avendo un televisore LG cosa devo usare e sopratutto come devo modificare la script : irsend.sendSony(dati, nbit );
    e in fine non ho capito che significa nbit in base a cosa ha i scelto 12 per inviare a90??
    GRAZIE IN ANTICIPO 😀

    1. Mauro Alfieri

      Ciao Marino,
      ogni produttore di telecomandi usa una sua codifica, a volte differente anche da modello a modello.
      La libreria IR ha già per impostate una serie di codifiche e ti mette a disposizione dei metodi tipo sendSony per usare le per codifiche inserite.

      Se hai un telecomando LG e non rientra in nessuna codifica già impostata puoi utilizzare i metodi Row ( send() e read() ) per inviare e leggere i codici del tuo telecomando, ma dovrai scrivermi tu la codifica, io l’ho fatto per i tasti 0-9 del mio Samsung.

      Nell’articolo c’é scritto come fare.

      Mauro

  7. davide

    Ciao! :) intanto complimenti per il blog. hai sempre molti articoli interessanti e ben fatti! vorrei chiederti una cosa. ho visto che in commercio ci sono molti ricevitori ir. sono tutti utilizzabili con questa libreria o solo quello che hai indicato tu funziona? e il trasmettitore? va be un qualsiasi led ir?
    grazie in anticipo!

    1. Mauro Alfieri

      Ciao Davide,
      io ho provato solo con i due ricevitori IR descritti nell’articolo.
      Dovresti consultare il datasheet del ricevitore che hai, in internet si trovano, e verificare che il tipo di segnale in uscita sia compatibile.

      In alternativa puoi modificare la libreria IR o trovare una libreria IR per il tuo ricevitore.

      Mauro

  8. Domenico

    Ciao Mauro, ho provato il tuo sketch sotto riportato.
    Ma non capisco qual’è la porta di uscita alla quale collegare il led infrarosso visto che 12 è nbit della stringa inviata………….?

    #include
    IRsend irsend;
    void setup() { }
    void loop()
    {
    for (int i = 0; i < 3; i++)
    {
    irsend.sendSony(0xa90, 12); // Sony TV power code delay(100);
    }
    }

    1. Mauro Alfieri

      Ciao Domenico,
      trovi il pin a cui collegare il led IR nello schema in alto, iPod pin 3 tramite resistenza apposita.
      Il in non puoi sceglierlo nello sketch é fissato nella libreria.
      Se volessi cambiario devi farlo nella libreria IRremote.

      Mauro

  9. Domenico

    E’ possibile, o troppo difficile, usando per TX Arduino, farsi una propria codifica personale di nbit e quindi di
    conseguenza una decodifica complementare sull’ Arduino RX?
    Dove si potrebbe trovare del materiale didattico per farer questo?
    In questo modo, acquisendo una temperatura(diciamo a 8 bit) la si potrebbe trasmettere ad un ricevitore
    utilizzando la trasmissione infrarosso.

    1. Mauro Alfieri

      Ciao Domenico,
      bella idea !!!
      io ti consiglio di studiare i protocolli di comunicazione e le codifiche IR, probabilmente è da li che devi partire per realizzare la tua codifica personale.

      Mauro

  10. alessio

    ciao mauro, io ho scaricato la libreria iRremote, la libreria che permette di far comunicare due arduino attraverso il tuo progetto qui sopra.
    Volevo farti una domanda: io sto utilizzando IR con TSOP2236, quindi cambia qualcosa nello svolgimento dell’esperimento? inoltre quando apro IRsendDemo dalla libreria e provo a compilarla, eccola qui di seguito:

    #include

    IRsend irsend;

    void setup()
    {
    Serial.begin(9600);
    }

    void loop() {
    if (Serial.read() != -1) {
    for (int i = 0; i < 3; i++) {
    irsend.sendSony(0xa90, 12); // Sony TV power code
    delay(300);
    }
    }
    }

    mi dà questo errore e non riesco a capire cosa fare. Per caso potrebbe essere un problema con la libreria che non è stata implementata bene? io l'ho messa nella directory dove metto tutti gli sketch, continuando a darmi questo errore

    IRsendDemo:11: error: 'IRsend' does not name a type
    IRsendDemo.ino: In function 'void loop()':
    IRsendDemo:21: error: 'irsend' was not declared in this scope

    Ti ringrazio per l'aiuto
    Alessio

    1. Mauro Alfieri

      Ciao Alessio,
      la libreria mi sembra sia stata scritta per l’IDE 0022 di Arduino, potrebbe non funzionare su versioni successive dell’IDE.
      L’errore che mi invii potrebbe essere causato sia dalla versione dell’IDE sia dall’installazione errata della libreria nel tuo IDE.

      Prova a controllare la compatibilità della libreria con il tuo IDE e leggere un tutorial su come installare una libreria in Arduino.

      Mauro

  11. alessio

    ciao mauro, siccome non sono riuscito a risolvere questo problema, volevo chiederti se conosci un codice che mi permetta di far comunicare due arduini tramite infrarosso e ricevitore come in figura senza sfruttare la libreria IRremote! ti ringrazio!

    1. Mauro Alfieri

      Ciao Alessio,
      le librerie ti aiutano tanto, se non le usi devi scriverti tutto da 0 e francamente mi sembra molto complesso rispetto al semplice utilizzo di una libreria.

      Se questa non fa l caso tuo puoi ricercare un’altra che controlli Tx ed Rx via IR

      Mauro

  12. alessio

    ciao mauro, allora intanto grazie per le risposte e ti dico che ho risolto fortunatamente e ne sono felicissimo. allora ho provato il tuo progetto qui sopra e funziona alla grande, una domanda ti vorrei fare:
    Se io volessi utilizzare più di un led infrarosso per inviare segnali infrarossi e quindi più di un ricevitore per poterli leggere e ricevere, come cambierebbero i collegamenti? cioè a quali pin potrei collegarli? il codice come potrei modificarlo??? ti ringrazio anticipatamente
    alessio

    1. Mauro Alfieri

      Ciao Alessio,
      non ho mai provato a collegare più led con invio codici differenti e il tuo esperimento è interessante.
      Ho il dubbio che la libreria IRRemote non permetta di controllare contemporaneamente più emettitori.

      Se fai un test mi piacerebbe condividerlo e pubblicarne il risultato.

      Mauro

      1. alessio

        ciao mauro, guarda in serata provo a connettere più led infrarossi ma avendo un solo ricevitore. comunque si la libreria permette di usare un solo pin, ossia il pin 3! ora vediamo quello che riesco a fare. Una domanda.
        Quando collego i due arduini e apro il monitor seriale dell’arduino che riceve, io vedo su schermo dei codici numerici che cambiano in base alla distanza. Mettendo uno di fronte all’altro il led che invia e il ricevitore che riceve ad una distanza di pochi centimetri, ieri mi è capitato che come risultato sul monitor seriale mi usciva il risultato in codice numerico A90 in maniera costante. E’ normale che sia cosi? perché parlando con il mio professore universitario con cui sto facendo il tirocinio(su arduino appunto) mi dice che potrebbe essere un errore di comunicazione e di controllare se nel protocollo utilizzato ci sia un qualche controllo che prevede parità CRC o qualcosa di simile! mmm che ne pensi?

        1. Mauro Alfieri

          Ciao Alessio,
          io non sono professore e penso che il tuo docente possa aver ragione, un’altra ipotesi che mi viene in mente é che l’influenza della luce ambiente influenzi lo scambio dei codici.

          Prova a effettuare un test con luce naturale o al massimo senza lampade al neon o risparmio energetico.

          Mauro

  13. alessio

    scusa mauro un’altra cosa, ho notato che oltre i 15 centimetri il mio ricevitore poi non capta più i segnali infrarossi. C’è un modo per aumentare o la potenza del segnale o comuqne la distanza di trasmissione? almeno per arrivare a 2-3 metri?

    1. Mauro Alfieri

      Ciao Alessio,
      i telecomandi delle Tv per aumentare il raggio utilizzano più led emettitori in parallelo, di solito due.
      Se li metti devi anche pensare ad un circuito di alimentazione adatto, perché più led potrebbero assorbire troppo per i pin arduino.

      Mauro

  14. alessio

    Ciao mauro, per il problema delle distanze ho risolto mettendo una resistenza più piccola nel progetto dell’arduino che invia segnali, ossia ho comprato una resistenza di 20 ohm e il risultato è stato che ora posso tranquillamente allontanarmi di 5-6 metri e il mio ricevitore capta il segnale senza problema. Ora testerò quel problema sulle distanze, ossia del codice numerico che mi da valori costanti soltanto quando sono attaccati. ti faccio sapere. grazie ancora per l’aiiuto

    1. Mauro Alfieri

      Ciao Alessio,
      ottima idea ridurre la resistenza, valuta bene il valore in funzione dalla tensione di alimentazione del diodo led e dei volt applicati per non rischiare col tempo di bruciare il led emettitore :-)

      Mauro

  15. Alex

    Ciao Mauro,
    Ho realizzato e sperimentato lo sketch e funziona tutto, anche col televisore. Ma.. non sono in grado di farne un uso pratico per queste ragioni.
    L’emissione del segnale avviene appena si alimenta il circuito mentre sarebbe necessario innescarlo con un input (pulsante o altro input analogico). Inoltre l’emettitore ripete il segnale senza soluzione di continuità. Sui televisori Sony il comando A90 ha valore ON ma anche OFF per cui il televisore si accende e si spegne continuamente.
    Da questo avrai già dedotto i miei limiti in fatto di programmazione.
    Se non è troppo ti chiederei cortesemente se puoi darmi suggerimenti per ovviare al problema, magari inserendo la possibilità di usare un paio di ulteriori tasti per avere più comandi.
    Ti ringrazio intanto per tutto quello che ho appreso fin qui dal tuo blog e anche per quello che potrai rispondermi in merito a questi quesiti.
    Con ammirazione
    Alex

    1. Mauro Alfieri

      Ciao Alex,
      ti consiglio di leggere qualche articolo sull’uso dei pulsanti e vedrai che aggiungere un controllo con dei pulsanti è alquanto semplice.

      Mauro

  16. Gianni

    Salve ho qualche domanda…
    Ho decodificato il telecomando con i raw code..
    per l’emitter infrarossi,

    1. Ho comprato l’IR emitter (trasmettitore) ma la resistenza da quanti watt? e quanti ohm?
    2. Devo per forza collegare l’IR emitter su un pin specifico?
    GRAZIE!!

    1. Mauro Alfieri

      Ciao Gianni,
      io ho usato una resistenza da 470ohm, come vedi dai colori nella figura.
      Per il pin arduino, se non ricordo male, la libreria IRremote usa il pin 3 come emettitore e non consente di scegliere il pin.

      Mauro

      1. Gianni

        Grazie per avermi risposto… ma ho un problemone…
        ho decodificato il telecomando per il condizionatore ariston. Non scrivo tutto, sai se potresti aiutarmi? ecco qua..
        http://forum.arduino.cc/index.php?topic=187145.msg1395966#msg1395966

        1. Mauro Alfieri

          Ciao Gianni,
          prova ad eseguire più volte la decodifica dal telecomando originale e verificare che i codici siano sempre identici.

          Mauro

      2. Gianni

        Scusa il doppio commento ma mi viene il dubbio della luminosità del led perche quando io vado a controllare con la fotocamera, il led del telecomando si illumina di piu mentre quello di arduino di meno… (credo… non vorrei dire una cavolata)
        poi quello di arduino quando manda il segnale sta mezzo secondo mentre il telecomando uno.. e il led si spegne…consigli??

        1. Mauro Alfieri

          Ciao Gianni,
          la luminosità del led identifica solo la distanza coperta dal segnale e la qualità dell’impulso percepita dal condizionatore.

          Puoi variare l’intensitá luminosa abbassando la resistenza di connessione, se il tuo led ha delle specifiche di alimentazione note, non sempre le hai, puoi calcolare la resistenza con la legge di Ohm.

          Mauro

          1. Gianni

            Ciao grazie per avermi risposto… il problema seguente è questo… lo sketch dovrebbe essere ok, prendendo una fotocamera riesco a vedere che il led ir trasmette… l’unica cosa è che non succede niente.. il led dal condizionatore dista un metro e mezzo circa.. ho provato a metterlo anche a 50 cm ma niente…

            ho un led con una resistenza da 470 ohm come hai detto tu..

            Non so che fare… l’unico dubbio è il seguente:

            Quando provo ad accendere il condizionatore con il telecomando, il led rimane fisso per un secondo… mentre quando provo con arduino rimane fisso per mezzo secondo… non so se dipende da quello… sapresti dirmi qualche cosa a riguardo?

          2. Mauro Alfieri

            Ciao Gianni,
            prova ad appoggiare l’emettitore al condizionatore così eviterai anche la possibile corruzione del segnale da parte di luci o lampade esterne al tuo progetto.

            Mauro

  17. Gianni

    Ciao e grazie.. allora forse ho scoperto il problema…
    se guardi in questa foto: http://imagebin.org/271373

    c’è il codice
    8587774C
    Unknown encoding: 8587774C (32 bits)

    il primo con l’ultimo… ma tutti i numeri in serie sono diversi… ho fatto sempre.. ON – OFF.. ON OFF..
    soluzioni?

  18. Gianni

    il problema è che mi da ogni volta raw code diversi quando vado a leggerli con recvDump… e non riesco giustamente a farlo andare…

    soluzioni?

    1. Mauro Alfieri

      Lo so Gianni, é la parte più difficile quella del riconoscimento dei codici.
      L’unica tecnica eh conosco é provare e riprovare fino a individuare i codici più simili e ricorrenti.

      Mauro

  19. Gianni

    Beh ho provato ad accendere una tv samsung sia in rawcode che sendSamsung() e funziona, ma il condizionatore non ne vuole sapere… non so se sbaglio la frequenza… trasmetto a 38Khz… hai qualche consiglio da darmi?

    1. Mauro Alfieri

      Ciao Gianni,
      il tuo test con un televisore Samsung e la codifica corretta dimostra che il circuito e lo sketch funziona.
      Il condizionatore potrebbe non funzionare a 38Hz o la codifica non é corretta.

      Mauro

      1. Gianni

        ciao anch’io presuppongo che la codifica sia sbagliata… a quanto potrebbe essere?
        ho provato 12 poi dai 34 a 40

        1. Mauro Alfieri

          Ciao Gianni,
          purtroppo non sono numeri che si possono indovinare, sono solo frutto di test e test fino a comprendere la corretta sequenza.

          Mauro

          1. Gianni

            Ciao e per vedere a che frequenza lavora hai una guida?
            Da quanto può oscillare la frequenza? non credo fino a 330mhz :\ cosi evito di provarli tutti

          2. Mauro Alfieri

            Ciao Gianni,
            purtroppo non ho una guida da suggerirti.

            Mauro

  20. alessio

    Ciao mauro, Sono alessio, ho già scritto in precedenza in questo blog. vorrei chiederti una cosa: Io devo mandare dei messaggi ( testuali, usando anche un array) dal mio arduino TX ( che trasmette il segnale attravers led infrarossi) al mio secondo arduino RX (ho un ricevitore TSOP che riceve questi segnali infrarossi). Come posso fare? gli arduino che sto utilizzando sono entrambi Arduino Uno. Ho implementato una libreria per il controllo di parità degli errori, La libreria CRC però non so come risolvere il problema di invio messaggio da un arduino all’altro. ossia se io scrivo un ”ciao” sul primo arduino, il secondo lo deve leggere nel suo monitor seriale.
    Ti ringrazio per l’aiuto
    Alessio

    ecco qui il commento come da te richiesto

    1. Mauro Alfieri

      Ciao Alessio,
      la libreria che hai implementato gestisce l’invio di stringhe di testo attraverso l’IR?

      Mauro

      1. alessio

        ciao mauro, allora la libreria CRC è stata creata da un utente e credo gestisca l’invio delle stringhe tramite IR. Ma la libreria IRremote di per se non lo permette di farlo? in quanto la libreria CRC mi servirebbe soltanto per gestire gli errori durante la trasmissione. guarda ho trovato questo codice sul blog di arduino, e te lo metto qui in descrizione, l’ho provato ma sembra non funzionare. Riesci a capirne il motivo? ti linko direttamente la pagina senza copiare tutto il codice.

        http://forum.arduino.cc/index.php/topic,10555.0.html

        ecco qui.
        Spero di risolvere questo problema! a presto
        alessio

        1. Mauro Alfieri

          Ciao Alessio,
          che io sappia la IRRemote non è in grado di inviare stringhe, si limita a codificare segnali IR per i più comuni telecomandi.
          Per lo sketch che hai trovato ti invito a scrivere sul forum che errori incontri.

          Sicuramente l’autore potrà aiutarti ed ha maggiori competenze sul suo programma.

          Mauro

  21. Nicola

    Ciao Mauro, mi sono addentrato da poco nel mondo dei segnali IR con Arduino.Ho creato un piccolo sistema con un ricevitore TSOP4838 , il quale riceve segnali da un telecomando Sony . Il sistema è veramente basilare, ovvero riceve il segnale , lo decodifica in Hex e lo mostra sul monitor seriale, in pratica è solo la parte di Ricezione del progetto qui sopra.. Tuttavia ho notato che con la pressione ” usuale” di un tasto, ovvero la stessa che imprimo per cambiare un canale TV, il sistema mostra in uscita più volte il valore corrispondente. Ho pensato di realizzare una specie di Debouncer per il valore letto , in quanto avrei necessità di inserire delle sequenze da 3 cifre, tuttavia non so se è possibile realizzarlo sfruttando solo i metodi della libreria IRremote o se devo spostare il lavoro su un altro piano ( ad esempio inserire un piccolo delay nella lettura del segnale). Puoi darmi qualche consiglio?

    1. Mauro Alfieri

      Ciao Nicola,
      come avrai letto o sperimentato i segnali IR sono dei “treni d’onda” ossia la sequenza di codici di ciascun tasto viene inviata a ripetizione per tutto il tempo in cui mantieni il pulsante premuto.
      Nel tuo telecomando probabilmente la pressione del pulsante genera più volte l’invio del segnale.

      Dovrai di certo implementare un sistema di controllo lato sketch.

      Mauro

  22. marco

    complimenti per l’articolo, sono un ragazzo alle prime armi con arduino e non capisco perchè nel primo sketch mi generi questi errori:
    sketch_mar12a:5: error: ‘IRrecv’ does not name a type
    sketch_mar12a:7: error: ‘decode_results’ does not name a type
    sketch_mar12a.ino: In function ‘void setup()':
    sketch_mar12a:12: error: ‘irrecv’ was not declared in this scope
    sketch_mar12a.ino: In function ‘void loop()':
    sketch_mar12a:16: error: ‘irrecv’ was not declared in this scope
    sketch_mar12a:16: error: ‘results’ was not declared in this scope
    probabilmente sono errori banali, ma non riesco a trovare la soluzione.
    grazie

    1. Mauro Alfieri

      Ciao Marco,
      se leggi bene l’articolo troverai descritto che la libreria IRRemote devi scaricarla dal Web e installarla su Arduino.
      Nota che potresti non trovare la versione della IRRemote per l’IDE 1.0 o superiore e dovrai modificarla per adattarla alla tua versione dell’IDE.

  23. guy

    Ciao Mauro,
    volevo chiederti una cosa,
    con questo processo( intento schema e sketch ) sia possibile creare un apparecchio evidentemente con arduino che potesse inviare codici ricevuti nel comando via infrarossi per comandare tv e altro?

    1. Mauro Alfieri

      Ciao Guy, non ho capito la richiesta.

  24. Yaxit

    Ciao, trovo utilissima la tua guida, ma ho un problema: il ricevitore mi segnala codici HEX diversi ogni volta, anche se premo lo stesso pulsante del telecomando… Ora, siccome avrei esigenza di avere segnali uguali per creare un telecomando per macchinina telecomandata, hai qualche idea di come si possa risolvere?
    PS: ho messo una resistenza da 2000 ohm tra il 5v e il sensore, che sia questa? Non vorrei bruciarlo che è l’ultimo che mi rimane.
    Ciao e grazie 1000!

    1. Mauro Alfieri

      Ciao Yaxit,
      sei certo di utilizzare un telecomando compatibile con la libreria IRemote?
      A volte problemi simili sono dovuti ad un errata interpretazione dei codici emessi dal telecomando.

      Considera anche che il segnale IR è costituito da un treno di impulsi e questi possono causare delle letture anomale.

      1. Yaxit

        Effettivamente il problema era causato dalla resistenza. Confermo che non va messa e funziona benisismo sul 5V!
        Arrivederci!

        1. Mauro Alfieri

          Grazie Yaxit per la conferma.

  25. Matteo

    Ciao! Volevo farti una domanda.. ho realizzato questo circuito ma la portata del LED è davvero irrisoria (1 m circa) a questo punto mi è venuto in mente che avrei potuto pilotarlo tramite transistor così da far attraversa una corrente di 80mA circa sul LED ma una volta arrivato alla messa in opera del progetto mi sono accordo che la libreria pilota l’ir tramite PWM e il transistor invece viene collegato a un pin digitale qualsiasi di Arduino!
    Come posso risolvere questo? Grazie in anticipo!

    1. Mauro Alfieri

      Ciao Matteo,
      potresti sostituire il transistor con un mosfet o altro tipo di driver per led in modo che usi il PWM per modulare il segnale e fornisca 80mA necessari al tuo led.

  26. AntonioG

    Buonasera Mauro, ottima guida, ma ho qualche domanda da fare, per modificare leggermente lo scopo della trasmissione ir.
    In pratica ho la necessità di utlizzare dei sensori e trasmettitori ir (led e fototransistor, esattamente il TCRT5000L), come pulsanti, ma ansichè analizzare lo stato alto o basso (che potrebbe creare ambiguità in un progetto reale, per non escludere il guasto di un sensore) vorrei trasmettere un treno di bit in seriale (basterebbero anche 2 byte) da far leggere ad un altro arduino che possiede il ricevitore (ma se riuscissi a far leggere il dato allo stesso arduino sarebbe anche meglio) in pratica una sorta di trasmissione irda telecomando-ricevitore ma senza modulazioni.
    E’ possibilile tuttociò senza grosse difficoltà?
    Grazie, attendo tue risposte.

    1. Mauro Alfieri

      Ciao Antonio, non ho mai sperimentato questa tecnica, dovresti provare. Se lo fi mi piacerebbe condividere il tuo esperimento con altri appassionati del blog.

  27. marco

    Buongiorno,
    ho preso arduino perchè sono affascinato dall’elettronica nonostante la mia ignoranza in materia.
    Grazie a internet e al suo blog sono riuscito a comandare una scheda relè con un telecomando a IR, ora, venendo al punto, la mia domanda è la seguente: la mia intenzione è accendere e spegnere il relè “X” con lo stesso pulsante del telecomando e tutti assieme con un’altro pulsante, ma se nello sketch utilizzando lo stesso codice sia per HIGH che per LOW la scheda si blocca, perciò volevo sapere se esiste la possibilità di fare questa operazione oppure devo “sprecare” due pulsanti per accendere o spegnere il relè.
    Grazie per l’attenzione
    Furlan Marco

    1. Mauro Alfieri

      Ciao Marco,
      è fattibile con un unico pulsante.
      Se si blocca è perché hai commesso qualche errore nel codice.
      Tuttavia io ti consiglio di usare 2 pulsanti in quanto potresti ottenere che con il medesimo pulsante, essendo l’IR un treno d’onda, la luce si accenda e si spenga continuamente non riuscendo a funzionare in modo corretto.

  28. MatteoC

    Ciao Marco,
    ho un amplificatore a valvole con la regolazione di volume manuale e vorrei poterla telecomandare, in modo da evitarmi di alzarmi ogni volta dalla poltrona per regolare il volume :-).
    Per fare questo ho pensato di controllare, tramite un telecomando ad infrarossi, un motore passo-passo che, tramite un ingranaggio/puleggia, mi farebbe ruotare meccanicamente la manopola del volume.
    Sul telecomando vorrei mettere un potenziometro che, quando viene ruotato, m’invii il comando di rotazione al motore.
    Il potenziometro però mi esce con i valori di resistenza da 0 a 1023.
    Come mi suggerisci di codificarli per poterli poi trasmettere via infrarossi al ricevitore e quindi al motore passo-passo?
    Ho cercato un po’ in giro ma non ho trovato progetti simili già esistenti, hai delle indicazioni da darmi?
    Grazie in anticipo,
    Matteo

    1. Mauro Alfieri

      Ciao Matteo,
      innanzitutto se dovessi realizzare io un sistema di controllo come il tuo penserei di usare soli due tasti del telecomando + e – del volume per controllare il volume dell’amplificatore anche in funzione del tipo movimento della manopola presente sull’amplificatore che probabilmente é un encoder ( a rotazione continua ) mentre il potenziometro è limitato su un arco definito dal produttore.

      1. MatteoC

        Ciao Mauro,
        sì avevo già pensato di fare come suggerisci, è più semplice e lineare.
        Mi piacerebbe però simulare sul telecomando proprio la manopola del potenziometro del volume dell’amplificatore, che comunque ha un fine corsa di minimo e di massimo.
        Quello che non riesco a capire è come far corrispondere a ciascun valore del potenziometro del telecomando un codice di trasmissione infrarosso.
        Sai suggerirmi qualcosa?
        Grazie mille,
        Matteo

        1. Mauro Alfieri

          Ciao Matteo,
          puoi rimappare il valore 0-1023 a tipo di spostamento che vuoi ottenere sul motore passo-passo, il problema in questo caso è che il motore passo-passo non è il più adatto per un lavoro di questo tipo per 2 motivi:

          1. non puoi sapere dove si trova solo contando i passi perchè se ti si resetta arduino ( ricevitore ) hai perso il conteggio
          2. il motore passo-passo fa di solito 200 passi giro ossia 1,8° al passo per cui se vuoi minor spostamento devi calcolarti le riduzioni di passo per fare quello che ti serve

          Io propenderei per un servo che almeno ha un feedback per cui se lo imposti a 30° va a 30° e puoi mapparlo 1 ad 1 con il potenziometro, trovi molti esempi sul blog.

Lascia una risposta

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati *

Puoi usare i seguenti tag ed attributi HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>