Pages: [1]   Go Down
Author Topic: decoder encoder telecomando IR [risolto] prototipo funzionante  (Read 1105 times)
0 Members and 1 Guest are viewing this topic.
BG (I)
Offline Offline
Full Member
***
Karma: 0
Posts: 202
Usus plura docet
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

 smiley-sad 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:
Code:
/*
 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:
Code:
/*
 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
« Last Edit: January 31, 2013, 12:38:17 pm by amario57 » Logged

Genova
Offline Offline
Faraday Member
**
Karma: 38
Posts: 3283
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: January 26, 2013, 12:42:30 pm by pablos » Logged

no comment

0
Online Online
Faraday Member
**
Karma: 45
Posts: 5790
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ?
Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

BG (I)
Offline Offline
Full Member
***
Karma: 0
Posts: 202
Usus plura docet
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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
 smiley-sad

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

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 8
Posts: 2955
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

prova ad inserire un piccolo ritardo fra ricezione e trasmissione
Logged

BG (I)
Offline Offline
Full Member
***
Karma: 0
Posts: 202
Usus plura docet
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 !!!
Logged

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 8
Posts: 2955
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Genova
Offline Offline
Faraday Member
**
Karma: 38
Posts: 3283
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: January 26, 2013, 04:36:40 pm by pablos » Logged

no comment

BG (I)
Offline Offline
Full Member
***
Karma: 0
Posts: 202
Usus plura docet
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie ai vostri suggerimenti e un po' di esperimenti ho risolto così:
Code:
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.    smiley-mr-green
« Last Edit: January 27, 2013, 06:01:45 am by amario57 » Logged

BG (I)
Offline Offline
Full Member
***
Karma: 0
Posts: 202
Usus plura docet
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ??
Logged

0
Online Online
Faraday Member
**
Karma: 45
Posts: 5790
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

BG (I)
Offline Offline
Full Member
***
Karma: 0
Posts: 202
Usus plura docet
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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   smiley-sad
« Last Edit: January 28, 2013, 04:12:29 am by amario57 » Logged

0
Online Online
Faraday Member
**
Karma: 45
Posts: 5790
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

BG (I)
Offline Offline
Full Member
***
Karma: 0
Posts: 202
Usus plura docet
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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



ho recuperato un 328 con alcuni pin andati
« Last Edit: January 31, 2013, 01:14:06 pm by amario57 » Logged

Pages: [1]   Go Up
Jump to: