decoder encoder telecomando IR [risolto] prototipo funzionante

:frowning: Forse il titolo risulta un po' strano, ma non è nient'altro che usare Arduino per trasmettere comandi ad una periferica, una soundbar, usando un solo telecomando, quello del TV.
In pratica voglio alzare e abbassare il volume e mettere in mute, la soundbar, usando il solo telecomando del tv, usando i tasti Mute, Vol+ e Vol-.
Usando la libreria Irremote di Ken Shirriff, ho codificato i comandi provenienti dal tv, che sono stati riconosciuti come tipo Nec, ho poi registrato la sequenza di impulsi provenienti dal telecomando della soundbar dei rispettivi comandi e tutto va bene, provando le singole trasmissioni di impulsi, la soundbar risponde.
Infatti con questo semplice sketch:

/*
 IR decoder encoder con tastiera pc
 */

#include <IRremote.h>

int RECV_PIN = 2;
IRrecv irrecv(RECV_PIN);
IRsend irsend;
decode_results results;

unsigned int mute[68]={
  4550,4350,650,450,650,450,650,1550,700,1550,650,450,650,1550,
  700,400,700,450,650,450,650,450,650,1550,700,1550,650,450,650,1550,650,450,700,450,650,
  1550,700,1500,700,1550,650,1550,650,1550,700,450,650,450,650,450,650,450,650,450,650,
  450,700,450,650,450,650,1550,650,1550,700,1550,650};

unsigned int Volpiu[68]={
  4600,4300,650,450,650,450,700,1550,650,1550,650,450,650,1600,
  650,450,650,450,650,450,650,450,650,1600,650,1550,650,450,650,1600,650,450,650,450,650,
  1550,650,1600,650,1550,650,450,650,1550,700,450,650,450,650,450,650,450,650,450,700,400,
  700,1550,650,450,650,1550,700,1550,650,1550,650};

unsigned int Volmeno[68]={
  4600,4300,650,450,700,400,650,1600,650,1550,650,450,700,1500,
  700,450,650,450,700,400,650,450,700,1550,650,1550,650,450,700,1500,700,450,650,450,650,
  450,700,1500,700,1550,650,450,700,1500,650,450,700,450,650,450,650,1550,650,450,700,400,
  700,1550,650,450,700,1500,700,1550,650,1550,650};

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

void loop() {
  char ch = Serial.read();
  switch(ch){
    case('*' ):
    { 
      irsend.sendRaw(mute,68,38);
      delay(100);
    }
    break;
    case('+' ):
    {
      irsend.sendRaw(Volpiu,68,38);
      delay(100);
    }
    break;
    case('-' ):
    {
      irsend.sendRaw(Volmeno,68,38);
      delay(100);
    }
    break;
   }
}

tutto funziona usando i comandi da tastiera + - e * senza blocchi alcuni.

Il problema si crea quando invece uso il telecomando del tv e devo riconoscere il comando ricevuto e trasmetto il rispettivo comando secondo il seguente sketch:

/*
 IR decoder encoder
 riceve una codifica da un telecomandoe trasmette una codifica diversa per una periferica 
 
 */

#include <IRremote.h>

int RECV_PIN = 2;
IRrecv irrecv(RECV_PIN);
IRsend irsend;
decode_results results;

unsigned int mute[68]={4550,4350,650,450,650,450,650,1550,700,1550,650,450,650,1550,
700,400,700,450,650,450,650,450,650,1550,700,1550,650,450,650,1550,650,450,700,450,650,
1550,700,1500,700,1550,650,1550,650,1550,700,450,650,450,650,450,650,450,650,450,650,
450,700,450,650,450,650,1550,650,1550,700,1550,650};

unsigned int Volpiu[68]={4600,4300,650,450,650,450,700,1550,650,1550,650,450,650,1600,
650,450,650,450,650,450,650,450,650,1600,650,1550,650,450,650,1600,650,450,650,450,650,
1550,650,1600,650,1550,650,450,650,1550,700,450,650,450,650,450,650,450,650,450,700,400,
700,1550,650,450,650,1550,700,1550,650,1550,650};

unsigned int Volmeno[68]={4600,4300,650,450,700,400,650,1600,650,1550,650,450,700,1500,
700,450,650,450,700,400,650,450,700,1550,650,1550,650,450,700,1500,700,450,650,450,650,
450,700,1500,700,1550,650,450,700,1500,650,450,700,450,650,450,650,1550,650,450,700,400,
700,1550,650,450,700,1500,700,1550,650,1550,650};

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

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    if (results.value == 0x20df906f) {
      Serial.println ("Mute");
      irsend.sendRaw(mute,68,38);
      delay(100);

    }
    if (results.value == 0x20df40bf) {
      Serial.println ("Vol+");
      irsend.sendRaw(Volpiu,68,38);
      delay(100);

    }
    if (results.value == 0x20dfc03f) {
      Serial.println ("Vol-");
      irsend.sendRaw(Volmeno,68,38);
      delay(100);

    }
    irrecv.resume(); // Receive the next value
  }
}

si blocca quando riceve uno dei comandi da trasmettere, quindi quando premo Mute, si blocca tutto, senza ricevere più comandi, come frizzato, solo quando chiudo la console e la riapro tutto riparte senza problemi, ma non devo premere i tre comandi incriminati.
Ho provato a cambiare i pin di ricezione e trasmissione, ma niente, si blocca sempre.
Se qualcuno ha già provato questa libreria può avere qualche idea per risolvere il problema ??
Grazie

Dovresti fare uno storage prima di inviare, la libreria è impegnata a ricevere, mentre riceve gli dici di spedire quando non ha ancora chiuso la funzione di ricezione.

if (irrecv.decode(&results))
//se il codice è quello che mi interessa ...memorizza il codice ricevuto
irrecv.resume(); // chiudo la sessione di ricezione e mi rimetto in stand-by
vado a impegnare la libIR a trasmettere irsend.sendRaw(......

con solo i tasti funziona perchè impegni solo il send

prova così
ciao

bella idea, e bella anche la soluzione di pablo,

queste soundbar, non le conosco, sono a se stanti o sono connesse al tv ? nel tuo caso quando alzi la voce si alza sia il volume degli altoparlanti tv che degli altoparlanti soundbar ?

Grazie Pablos per la risposta, ho inserito come tu hai suggerito:

if (results.value == 0x20df906f) {
      irrecv.resume(); 
      Serial.println ("Mute");
      irsend.sendRaw(mute,68,38);
      delay(100);
    }

se non ho interpretato male, ma fa lo stesso problema di prima si blocca quando riceve uno dei tre comandi da interpretare
:frowning:

per rispondere a Testato, le soundbar sostituiscono gli altoparlanti del TV e sono collegati tramite un cavo a fibra ottica, naturalmente gli altoparlanti del tv sono disabilitati.

prova ad inserire un piccolo ritardo fra ricezione e trasmissione

Grazie Brain, ho provato ad inserire un delay(200) subito dopo irrecv.resume(); ma niente fa sempre il blocco, ma lo strano è che come già detto, se chiudo e riapro il terminale si sblocca, senza resettare !!!

commenta la trasmissione ir e scrivi su seriale quello che ricevi quando usi il telecomando della tv, controlla che così non fzizzi

allora non ti resta che usare irrecv.enableIRIn(); dopo aver acquisito il segnale che riattiva la lib, però è un pagliativo che poi va risolto.
Tra i miei esperimenti ho avuto anch'io dei blocchi della ricezione come te, che ho risolto temporaneamente con il restart sopracitato della lib, scoperto poi un conflitto tra i Timer del micro tra la Swrtc di Leo e la IR lib, non credo sia il tuo caso, è solo per capire quali passaggi tentare prima.

ciao

Grazie ai vostri suggerimenti e un po' di esperimenti ho risolto così:

void loop() {
  if (irrecv.decode(&results)) {
  //  Serial.println(results.value, HEX);
    if (results.value == 0x20df906f) {
    //  Serial.println ("Mute");
      delay(100);
      irsend.sendRaw(mute,68,38);
      delay(100);
      irrecv.enableIRIn();
    }
    if (results.value == 0x20df40bf) {
      //Serial.println ("Vol+");
      delay(100);
      irsend.sendRaw(Volpiu,68,38);
      delay(100);
      irrecv.enableIRIn();
    }
    if (results.value == 0x20dfc03f) {
      //Serial.println ("Vol-");
      delay(100);
      irsend.sendRaw(Volmeno,68,38);
      delay(100);
      irrecv.enableIRIn();
    }
    irrecv.resume(); // Receive the next value
  }
}

ho messo un ritardo prima del send, oltre a irrecv.enableIRIn(); dopo il send.
Ci sono ancora dei piccoli ritardi nel send, per quanto riguarda il riconoscimento del comando da parte della soundbar, ma credo siano risolvibili con un po' di piccoli ritocchi.
Ora mi appresterò a creare il circuito in standalone, usando l'alimentazione da usb della soundbar.
Stay tuned
Grazie ragazzi. :grin:

Cercando in giro ho trovato questo progetto con Attiny85:
http://blog.tkjelectronics.dk/2012/03/attinyremote/#more-2070
infatti lo sketch che uso adesso non è compatibile con Attiny, ma sarebbe l'ideale, per quello che io voglio fare, secondo voi è possibile la conversione ??

non credo ci siano rpoblemi, almenoche' tu non abbia bisogno di piu' pin,
ma onestamente io seguirei un altra strada, usare direttamente quel progetto, c'e' addirittura il kit gia' pronto in modo da non dovber mettere mano all'acido

Infatti il progetto è buono e farebbe al caso mio, tra l'altro a livello hardware ho già tutto, attiny compreso, ma adattare le mie esigenze al software è abbastanza arduo, perché le codifiche che usano le mie periferiche sono diverse da quelle proposte, ecco il listato:
https://raw.github.com/TKJElectronics/ATtinyRemote/master/ATtinyRemoteVer2/ATtinyRemoteVer2.ino
mi sembra abbastanza incasinato :frowning:

e' a piu' basso livello rispetto ad arduino, vengono messi in gioco porte, registri, molto utile come studio :slight_smile:

Prototipo funzionante in standalone su breadbord alimentato dalla usb del tv:

ho recuperato un 328 con alcuni pin andati