Costruisci un telecomando tv con Arduino!

Questo post è stato scritto per permetterti di realizzare un telecomando per il tuo televisore.



Ecco come realizzarlo:


Guarda il video di quello che ho fatto io:



Prima di tutto prendi il tuo Arduino (uno qualsiasi) e collegaci un ricevitore IR.
Ti consiglio di procurarti un sensore ad infrarosso TSOP31328 o equivalente.


NOTA: Se devi costruire un telecomando Sony, LG o Inno-Hit, puoi saltare questo passaggio, in fondo troverai gli sketch già pronti da caricare per questi telecomandi.

Ecco come fare il collegamento:






Scarica la libreria IRremote di Ken Shirriff e copia i file nella cartella 
\arduino-1.0.5\libraries\IRremote\

Ora collega Arduino e carica questo sketch:


  1. /*
  2.  * IRremote: IRrecvDump - dump details of IR codes with IRrecv
  3.  * An IR detector/demodulator must be connected to the input RECV_PIN.
  4.  * Version 0.1 July, 2009
  5.  * Copyright 2009 Ken Shirriff
  6.  * http://arcfn.com
  7.  * JVC and Panasonic protocol added by Kristian Lauszus (Thanks to zenwheel and other people at the original blog post)
  8.  */
  9. #include <IRremote.h>
  10. int RECV_PIN = 11;
  11. IRrecv irrecv(RECV_PIN);
  12. decode_results results;
  13. void setup()
  14. {
  15.   Serial.begin(9600);
  16.   irrecv.enableIRIn(); // Start the receiver
  17. }
  18. // Dumps out the decode_results structure.
  19. // Call this after IRrecv::decode()
  20. // void * to work around compiler issue
  21. //void dump(void *v) {
  22. //  decode_results *results = (decode_results *)v
  23. void dump(decode_results *results) {
  24.   int count = results->rawlen;
  25.   if (results->decode_type == UNKNOWN) {
  26.     Serial.print("Unknown encoding: ");
  27.   }
  28.   else if (results->decode_type == NEC) {
  29.     Serial.print("Decoded NEC: ");
  30.   }
  31.   else if (results->decode_type == SONY) {
  32.     Serial.print("Decoded SONY: ");
  33.   }
  34.   else if (results->decode_type == RC5) {
  35.     Serial.print("Decoded RC5: ");
  36.   }
  37.   else if (results->decode_type == RC6) {
  38.     Serial.print("Decoded RC6: ");
  39.   }
  40.   else if (results->decode_type == PANASONIC) {
  41.     Serial.print("Decoded PANASONIC - Address: ");
  42.     Serial.print(results->panasonicAddress,HEX);
  43.     Serial.print(" Value: ");
  44.   }
  45.   else if (results->decode_type == JVC) {
  46.      Serial.print("Decoded JVC: ");
  47.   }
  48.   Serial.print(results->value, HEX);
  49.   Serial.print(" (");
  50.   Serial.print(results->bits, DEC);
  51.   Serial.println(" bits)");
  52.   Serial.print("Raw (");
  53.   Serial.print(count, DEC);
  54.   Serial.print("): ");
  55.   for (int i = 0; i < count; i++) {
  56.     if ((i % 2) == 1) {
  57.       Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
  58.     }
  59.     else {
  60.       Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
  61.     }
  62.     Serial.print(" ");
  63.   }
  64.   Serial.println("");
  65. }
  66. void loop() {
  67.   if (irrecv.decode(&results)) {
  68.     Serial.println(results.value, HEX);
  69.     dump(&results);
  70.     irrecv.resume(); // Receive the next value
  71.   }
  72. }

Ora apri il monitor seriale, premi un pulsante sul tuo telecomando del televisore e leggi cosa viene fuori.
Appuntati il tipo di codifica (sony, nec, rc5 o rc6) il codice e il numero di bit della codifica.

es: Decoded RC5: 41 (12 bits) 
RC5 è il tipo di codifica, 41 è il codice del pulsante premuto e 12 è il numero di bit.

Ripeti questo procedimento per ogni pulsante che desideri mettere nel tuo telecomando autocostruito.
Quando hai tutti i dati costruisci il tuo telecomando. Così:



Questo è il collegamento usando un Atmega328 stand alone che ho utilizzato per far stare tutto su una breadboard, ma puoi tranquillamente realizzare questo circuito con il tuo Arduino Uno o simili, ti basta collegare direttamente i pulsanti e il led ai pin di Arduino.
Sui pulsanti non servono resistenze, perchè ho abilitato nello sketch le resistenze di pull-up interne al microcontrollore.



Ora guarda questo skech.

Questo nello specifico è per un telecomando sony, ma ti basta sostituire i dati con quelli ricavati dal tuo telecomando.
Ad esempio al rigo 85 (comando pulsante 1) se il telecomando che vuoi fare è un inno-hit, devi sostituire la riga esistente con questa:
irsend.sendRC5(0x41, 12);
Ovviamente devi fare la procedura anche per tutti gli altri pulsanti che vuoi usare.

Sketch per telecomando Sony:



  1. #include <IRremote.h>
  2. IRsend irsend;
  3. const int but1 = 2;
  4. const int but2 = 4;
  5. const int but3 = 5;
  6. const int but4 = 6;
  7. const int but5 = 7;
  8. const int but6 = 8;
  9. const int but7 = 9;
  10. const int but8 = 10;
  11. const int but9 = 11;
  12. const int but0 = 12;
  13. const int butvolup = 14;
  14. const int butvoldw = 15;
  15. const int butpow = 16;
  16. int statebut1 = 0;
  17. int statebut2 = 0;
  18. int statebut3 = 0;
  19. int statebut4 = 0;
  20. int statebut5 = 0;
  21. int statebut6 = 0;
  22. int statebut7 = 0;
  23. int statebut8 = 0;
  24. int statebut9 = 0;
  25. int statebut0 = 0;
  26. int statebutvolup = 0;
  27. int statebutvoldw = 0;
  28. int statebutpow = 0;
  29. void setup()
  30. {
  31.   Serial.begin(9600);
  32.   pinMode(but1, INPUT);
  33.   pinMode(but2, INPUT);
  34.   pinMode(but3, INPUT);
  35.   pinMode(but4, INPUT);
  36.   pinMode(but5, INPUT);
  37.   pinMode(but6, INPUT);
  38.   pinMode(but7, INPUT);
  39.   pinMode(but8, INPUT);
  40.   pinMode(but9, INPUT);
  41.   pinMode(but0, INPUT);
  42.   pinMode(butvolup, INPUT);
  43.   pinMode(butvoldw, INPUT);
  44.   pinMode(butpow, INPUT);
  45.   digitalWrite(2, HIGH);
  46.   digitalWrite(4, HIGH);
  47.   digitalWrite(5, HIGH);
  48.   digitalWrite(6, HIGH);
  49.   digitalWrite(7, HIGH);
  50.   digitalWrite(8, HIGH);
  51.   digitalWrite(9, HIGH);
  52.   digitalWrite(10, HIGH);
  53.   digitalWrite(11, HIGH);
  54.   digitalWrite(12, HIGH);
  55.   digitalWrite(14, HIGH);  
  56.   digitalWrite(15, HIGH);
  57.   digitalWrite(16, HIGH);
  58. }
  59. void loop() {
  60.  statebut1 = digitalRead(but1);
  61.  statebut2 = digitalRead(but2);
  62.  statebut3 = digitalRead(but3);
  63.  statebut4 = digitalRead(but4);
  64.  statebut5 = digitalRead(but5);
  65.  statebut6 = digitalRead(but6);
  66.  statebut7 = digitalRead(but7);
  67.  statebut8 = digitalRead(but8);
  68.  statebut9 = digitalRead(but9);
  69.  statebut0 = digitalRead(but0);
  70.  statebutvolup = digitalRead(butvolup);
  71.  statebutvoldw = digitalRead(butvoldw);
  72.  statebutpow = digitalRead(butpow);
  73.  if (statebut1 == LOW) {
  74.       for (int i = 0; i < 3; i++) {
  75.       irsend.sendSony(0x10, 12);  
  76.       delay(40);}}
  77.      
  78.  if (statebut2 == LOW) {
  79.       for (int i = 0; i < 3; i++) {
  80.       irsend.sendSony(0x810, 12);  
  81.       delay(40);}}
  82.  if (statebut3 == LOW) {
  83.       for (int i = 0; i < 3; i++) {
  84.       irsend.sendSony(0x410, 12);  
  85.       delay(40);}}
  86.      
  87.  if (statebut4 == LOW) {
  88.       for (int i = 0; i < 3; i++) {
  89.       irsend.sendSony(0xc10, 12);  
  90.       delay(40);}}
  91.      
  92.  if (statebut5 == LOW) {
  93.       for (int i = 0; i < 3; i++) {
  94.       irsend.sendSony(0x210, 12);  
  95.       delay(40);}}
  96.      
  97.  if (statebut6 == LOW) {
  98.       for (int i = 0; i < 3; i++) {
  99.       irsend.sendSony(0xa10, 12);  
  100.       delay(40);}}
  101.      
  102.  if (statebut7 == LOW) {
  103.       for (int i = 0; i < 3; i++) {
  104.       irsend.sendSony(0x610, 12);  
  105.       delay(40);}}
  106.      
  107.  if (statebut8 == LOW) {
  108.       for (int i = 0; i < 3; i++) {
  109.       irsend.sendSony(0xe10, 12);  
  110.       delay(40);}}
  111.      
  112.  if (statebut9 == LOW) {
  113.       for (int i = 0; i < 3; i++) {
  114.       irsend.sendSony(0x110, 12);  
  115.       delay(40);}}
  116.      
  117.  if (statebut0 == LOW) {
  118.       for (int i = 0; i < 3; i++) {
  119.       irsend.sendSony(0x910, 12);  
  120.       delay(40);}}
  121.      
  122.  if (statebutvolup == LOW) {
  123.       for (int i = 0; i < 3; i++) {
  124.       irsend.sendSony(0x490, 12);  
  125.       delay(40);}}
  126.      
  127.  if (statebutvoldw == LOW) {
  128.       for (int i = 0; i < 3; i++) {      
  129.       irsend.sendSony(0xc90, 12);  
  130.       delay(40);}}
  131.      
  132.  if (statebutpow == LOW) {
  133.       for (int i = 0; i < 3; i++) {
  134.       irsend.sendSony(0xa90, 12);  
  135.       delay(40);}}
  136. }


Sketch per telecomando Inno-Hit


  1. #include <IRremote.h>
  2. IRsend irsend;
  3. const int but1 = 2;
  4. const int but2 = 4;
  5. const int but3 = 5;
  6. const int but4 = 6;
  7. const int but5 = 7;
  8. const int but6 = 8;
  9. const int but7 = 9;
  10. const int but8 = 10;
  11. const int but9 = 11;
  12. const int but0 = 12;
  13. const int butvolup = 14;
  14. const int butvoldw = 15;
  15. const int butpow = 16;
  16. int statebut1 = 0;
  17. int statebut2 = 0;
  18. int statebut3 = 0;
  19. int statebut4 = 0;
  20. int statebut5 = 0;
  21. int statebut6 = 0;
  22. int statebut7 = 0;
  23. int statebut8 = 0;
  24. int statebut9 = 0;
  25. int statebut0 = 0;
  26. int statebutvolup = 0;
  27. int statebutvoldw = 0;
  28. int statebutpow = 0;
  29. void setup()
  30. {
  31.   Serial.begin(9600);
  32.   pinMode(but1, INPUT);
  33.   pinMode(but2, INPUT);
  34.   pinMode(but3, INPUT);
  35.   pinMode(but4, INPUT);
  36.   pinMode(but5, INPUT);
  37.   pinMode(but6, INPUT);
  38.   pinMode(but7, INPUT);
  39.   pinMode(but8, INPUT);
  40.   pinMode(but9, INPUT);
  41.   pinMode(but0, INPUT);
  42.   pinMode(butvolup, INPUT);
  43.   pinMode(butvoldw, INPUT);
  44.   pinMode(butpow, INPUT);
  45.   digitalWrite(2, HIGH);
  46.   digitalWrite(4, HIGH);
  47.   digitalWrite(5, HIGH);
  48.   digitalWrite(6, HIGH);
  49.   digitalWrite(7, HIGH);
  50.   digitalWrite(8, HIGH);
  51.   digitalWrite(9, HIGH);
  52.   digitalWrite(10, HIGH);
  53.   digitalWrite(11, HIGH);
  54.   digitalWrite(12, HIGH);
  55.   digitalWrite(14, HIGH);  
  56.   digitalWrite(15, HIGH);
  57.   digitalWrite(16, HIGH);
  58. }
  59. void loop() {
  60.  statebut1 = digitalRead(but1);
  61.  statebut2 = digitalRead(but2);
  62.  statebut3 = digitalRead(but3);
  63.  statebut4 = digitalRead(but4);
  64.  statebut5 = digitalRead(but5);
  65.  statebut6 = digitalRead(but6);
  66.  statebut7 = digitalRead(but7);
  67.  statebut8 = digitalRead(but8);
  68.  statebut9 = digitalRead(but9);
  69.  statebut0 = digitalRead(but0);
  70.  statebutvolup = digitalRead(butvolup);
  71.  statebutvoldw = digitalRead(butvoldw);
  72.  statebutpow = digitalRead(butpow);
  73.  if (statebut1 == LOW) {
  74.       for (int i = 0; i < 3; i++) {
  75.       irsend.sendRC5(0x41, 12);  
  76.       delay(40);}}
  77.      
  78.  if (statebut2 == LOW) {
  79.       for (int i = 0; i < 3; i++) {
  80.       irsend.sendRC5(0x42, 12);  
  81.       delay(40);}}
  82.  if (statebut3 == LOW) {
  83.       for (int i = 0; i < 3; i++) {
  84.       irsend.sendRC5(0x43, 12);  
  85.       delay(40);}}
  86.      
  87.  if (statebut4 == LOW) {
  88.       for (int i = 0; i < 3; i++) {
  89.       irsend.sendRC5(0x44, 12);  
  90.       delay(40);}}
  91.      
  92.  if (statebut5 == LOW) {
  93.       for (int i = 0; i < 3; i++) {
  94.       irsend.sendRC5(0x45, 12);  
  95.       delay(40);}}
  96.      
  97.  if (statebut6 == LOW) {
  98.       for (int i = 0; i < 3; i++) {
  99.       irsend.sendRC5(0x46, 12);  
  100.       delay(40);}}
  101.      
  102.  if (statebut7 == LOW) {
  103.       for (int i = 0; i < 3; i++) {
  104.       irsend.sendRC5(0x47, 12);  
  105.       delay(40);}}
  106.      
  107.  if (statebut8 == LOW) {
  108.       for (int i = 0; i < 3; i++) {
  109.       irsend.sendRC5(0x48, 12);  
  110.       delay(40);}}
  111.      
  112.  if (statebut9 == LOW) {
  113.       for (int i = 0; i < 3; i++) {
  114.       irsend.sendRC5(0x49, 12);  
  115.       delay(40);}}
  116.      
  117.  if (statebut0 == LOW) {
  118.       for (int i = 0; i < 3; i++) {
  119.       irsend.sendRC5(0x40, 12);  
  120.       delay(40);}}
  121.      
  122.  if (statebutvolup == LOW) {
  123.       for (int i = 0; i < 3; i++) {
  124.       irsend.sendRC5(0x50, 12);  
  125.       delay(40);}}
  126.      
  127.  if (statebutvoldw == LOW) {
  128.       for (int i = 0; i < 3; i++) {      
  129.       irsend.sendRC5(0x51, 12);  
  130.       delay(40);}}
  131.      
  132.  if (statebutpow == LOW) {
  133.       for (int i = 0; i < 3; i++) {
  134.       irsend.sendRC5(0x4c, 12);  
  135.       delay(40);}}
  136. }


Sketch per costruire telecomando LG.
Questo è leggermente diverso dagli altri 2, 
perchè è necessario inviare il codice una sola volta anzichè 3 come negli altri sketch.


  1. #include <IRremote.h>
  2. IRsend irsend;
  3. const int but1 = 2;
  4. const int but2 = 4;
  5. const int but3 = 5;
  6. const int but4 = 6;
  7. const int but5 = 7;
  8. const int but6 = 8;
  9. const int but7 = 9;
  10. const int but8 = 10;
  11. const int but9 = 11;
  12. const int but0 = 12;
  13. const int butvolup = 14;
  14. const int butvoldw = 15;
  15. const int butpow = 16;
  16. int statebut1 = 0;
  17. int statebut2 = 0;
  18. int statebut3 = 0;
  19. int statebut4 = 0;
  20. int statebut5 = 0;
  21. int statebut6 = 0;
  22. int statebut7 = 0;
  23. int statebut8 = 0;
  24. int statebut9 = 0;
  25. int statebut0 = 0;
  26. int statebutvolup = 0;
  27. int statebutvoldw = 0;
  28. int statebutpow = 0;
  29. void setup()
  30. {
  31.   Serial.begin(9600);
  32.   pinMode(but1, INPUT);
  33.   pinMode(but2, INPUT);
  34.   pinMode(but3, INPUT);
  35.   pinMode(but4, INPUT);
  36.   pinMode(but5, INPUT);
  37.   pinMode(but6, INPUT);
  38.   pinMode(but7, INPUT);
  39.   pinMode(but8, INPUT);
  40.   pinMode(but9, INPUT);
  41.   pinMode(but0, INPUT);
  42.   pinMode(butvolup, INPUT);
  43.   pinMode(butvoldw, INPUT);
  44.   pinMode(butpow, INPUT);
  45.   digitalWrite(2, HIGH);
  46.   digitalWrite(4, HIGH);
  47.   digitalWrite(5, HIGH);
  48.   digitalWrite(6, HIGH);
  49.   digitalWrite(7, HIGH);
  50.   digitalWrite(8, HIGH);
  51.   digitalWrite(9, HIGH);
  52.   digitalWrite(10, HIGH);
  53.   digitalWrite(11, HIGH);
  54.   digitalWrite(12, HIGH);
  55.   digitalWrite(14, HIGH);  
  56.   digitalWrite(15, HIGH);
  57.   digitalWrite(16, HIGH);
  58. }
  59. void loop() {
  60.  statebut1 = digitalRead(but1);
  61.  statebut2 = digitalRead(but2);
  62.  statebut3 = digitalRead(but3);
  63.  statebut4 = digitalRead(but4);
  64.  statebut5 = digitalRead(but5);
  65.  statebut6 = digitalRead(but6);
  66.  statebut7 = digitalRead(but7);
  67.  statebut8 = digitalRead(but8);
  68.  statebut9 = digitalRead(but9);
  69.  statebut0 = digitalRead(but0);
  70.  statebutvolup = digitalRead(butvolup);
  71.  statebutvoldw = digitalRead(butvoldw);
  72.  statebutpow = digitalRead(butpow);
  73.  if (statebut1 == LOW) {
  74.       irsend.sendNEC(0x20DF8877 , 32);  
  75.       delay(200);}
  76.      
  77.  if (statebut2 == LOW) {
  78.       irsend.sendNEC(0x20DF48B7, 32);  
  79.       delay(200);}
  80.  if (statebut3 == LOW) {
  81.       irsend.sendNEC(0x20DFC837, 32);  
  82.       delay(200);}
  83.      
  84.  if (statebut4 == LOW) {
  85.       irsend.sendNEC(0x20DF28D7, 32);  
  86.       delay(200);}
  87.      
  88.  if (statebut5 == LOW) {
  89.       irsend.sendNEC(0x20DFA857, 32);  
  90.       delay(200);}
  91.      
  92.  if (statebut6 == LOW) {
  93.       irsend.sendNEC(0x20DF6897, 32);  
  94.       delay(200);}
  95.      
  96.  if (statebut7 == LOW) {
  97.       irsend.sendNEC(0x20DFE817, 32);  
  98.       delay(200);}
  99.      
  100.  if (statebut8 == LOW) {
  101.       irsend.sendNEC(0x20DF18E7, 32);  
  102.       delay(200);}
  103.      
  104.  if (statebut9 == LOW) {
  105.       irsend.sendNEC(0x20DF9867, 32);  
  106.       delay(200);}
  107.      
  108.  if (statebut0 == LOW) {
  109.       irsend.sendNEC(0x20DF08F7, 32);  
  110.       delay(200);}
  111.      
  112.  if (statebutvolup == LOW) {
  113.       irsend.sendNEC(0x20DF40BF, 32);  
  114.       delay(200);}
  115.      
  116.  if (statebutvoldw == LOW) {      
  117.       irsend.sendNEC(0x20DFC03F, 32);  
  118.       delay(200);}
  119.      
  120.  if (statebutpow == LOW) {
  121.       irsend.sendNEC(0x20DF10EF, 32);  
  122.       delay(200);}
  123. }


Ti lascio con un consiglio.
Dato che la luce ir è invisibile all'occhio umano, puoi verificare che tutto funzioni inquadrando il led con una fotocamera (quella del cellulare va benissimo)
Accendendo il led, e guardandolo attraverso lo schermo del cellulare, lo vedrai emettere una luce bianca.

Segui Daniele Alberti su Google+

11 commenti:

  1. Ho un dubbio, ho realizzato un telecomando dalla tua guida e funziona perfettamente, ma il consumo di batteria continua anche quando non premi alcun tasto. come posso preservare la pila?...Grazie

    RispondiElimina
    Risposte
    1. Ciao, la prima cosa che mi viene in mente è cambiare tipo di batteria, metti 4 ministilo in serie, dovrebbero durare molto di più!

      Elimina
  2. Ciao e grazie per la tempestiva risposta!, sull'assorbimento a vuoto, nonostante ho messo la funzione sleep a riposo consuma costantemente 0,3mA "misura fatta con alimentazione diretta 5V" se passo attraverso lm7805 e 9V, il tutto sale abbastanza.
    Per ovviare a questo problema avrei pensato di mettere un'autoritenuta, cioe' attraverso il pulsante sleep per risvegliare il micro vado a eccitare un micro rele che si autoinnescherà tramite un pin output di arduino, non appena passati i 5 secondi arduino disinnesca il rele lasciando la batteria totalmente scollegata. che ne dici? inoltre questo meccanisco di autoritenuta posso ottenerlo con un bc337? che ne dici?

    RispondiElimina
    Risposte
    1. Ciao, esiste anche una funzione per mettere in sleep l'arduino, io non l'ho mai usata però prova a guardare qui
      http://playground.arduino.cc/Learning/ArduinoSleepCode
      Questo dovrebbe consentirti di ridurre notevolmente i consumi senza dover utilizzare relè e transistor. Ciao!

      Elimina
  3. Ciao, infatti ho messo gia' questa funzione che si attiva dopo 5 secondi che non premo nulla, per poi risvegliarsi tramite un pulsante.ecc. ma restano sempre 0,3mA fissi rispetto a 12 mA di prima..la pila si scaricherà secondo me dopo 2 giorni. rendendo poco affidabile il progetto.

    RispondiElimina
    Risposte
    1. Se l'assorbimento è 0.3mA dovrebbe durarti circa 1000 ore, con una batteria da 9v 500mah

      Elimina
  4. Si ma questo consumo a vuoto lo voglio ridurre ancora di molto o addirittura eliminare, e questo secondo me si potrà farlo solo in 2 modi;
    1) mettere un pulsante che accenda il telecomando nel momento che serve, quindi dando alimentazione tenendolo premuto e premendo il pulsante del canale per poi lasciarlo.
    2) mettere un micro rele che si autoinnesca con un pin output, non appena passa il tempo prestabilito dello sleep, questo pin si porta basso interrompendo il rele e isolerebbe la pila dal telecomando. che ne pensi?

    RispondiElimina
    Risposte
    1. Potresti anche mettere un semplice interruttore sul positivo della batteria!

      Elimina
  5. La schermata seriale mi da impulsi alfanumerici.... cosa faccio?

    RispondiElimina
    Risposte
    1. Credo che in questo caso il telecomando non sia stato riconosciuto dal programma, prova con un'altro per conferma.

      Elimina
  6. Ciao ho letto il tuo progetto e sono rimasto molto interessato ti volevo chiedere se è possibile utilizzarlo con un telecomando di un climatizzatore grazie

    Il clima è un Aermec

    RispondiElimina

Lascia un commento qui sotto, ti risponderò il prima possibile!

Related Posts Plugin for WordPress, Blogger...