«

»

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. 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

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.

  7. 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.

  8. 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=""> <strike> <strong>