Pages: [1]   Go Down
Author Topic: TSOP 1738 e TSOP 31238  (Read 1672 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 6
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salve volevo realizzare questo esempio ComandareArduinoConUnTelecomandoqualsiasi (non riesco a postare il link al playground) non riesco a trovare il TSOP 1738 e volevo sapere se il TSOP 31238 è uguale. Poi una domanda da ignorante (mi sono avvicinato all'elettronica da poco), perchè questo tipo di componenti ha 3 pin?. Grazie mille
Logged

Fidenza, Parma
Offline Offline
God Member
*****
Karma: 9
Posts: 783
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Se vuoi comandare l'arduino con un telecomando da TV ti serve un ricevitore IR 38kHz poi per il resto penso siano tutti uguali, il ricevitore che uso io l'ho tolto da un videoregistratore.
Ha 3 pin perchè un è il +, l'altro il - e il terzo è per i dati!

Ciao!
Logged

ArduMAP: Mappa degli utenti che utilizzano Arduino.
http://www.guglio.net/ArduMAP

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 53
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Per le differenze tra i due ricevitori puoi confrontare i relativi datasheet: TSOP1738, TSOP31238.

Un altro esempio di utilizzo può essere questo:

immagine schema
dove
R1: 10K[ch937]
R2, R3: 220[ch937]

Sketch:
Code:
/*
 * Controllo di due led tramite telecomando IR.
 */

#include <IRremote.h>

int RECV_PIN = 3;         //Pin su cui è connesso il ricevitore IR
int RED_LED_PIN = 9;      //Pin del led rosso
int GREEN_LED_PIN = 8;    //Pin del led verde
int BUTTON_PIN = 2;       //Pin del bottone

int STATUS_RED = LOW;     //Stato del led rosso
int STATUS_GREEN = LOW;   //Stato del led verde

int RED_IR_CODE = 0xFFFF9867;  //Codice per comandare il led rosso
int GREEN_IR_CODE = 0x58A7;    //Codice per comandare il led verde

IRrecv irrecv(RECV_PIN);   //Inizializza il pin del ricevitore IR

decode_results results;    //Comando ricevuto dal ricevitore IR

/*
 * Switcha lo stato "ledStatus" del led "ledpin", "count" volte,
 * con una pausa, tra uno stato ed il successivo, "pause" millisecondi.
 * Ritorna l'ultimo stato del led.
 */
int blinkled(int ledpin, int count, int ledStatus, int pause){
  for (; count > 0; --count){
    if(ledStatus == LOW)
      ledStatus = HIGH;
    else
      ledStatus = LOW;
    digitalWrite(ledpin, ledStatus);
    delay(pause);
 }
  return ledStatus;
}

void setup()
{
  Serial.begin(9600);
  
  //Impostazione modalità dei pin
  pinMode(RED_LED_PIN, OUTPUT);
  pinMode(GREEN_LED_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT);
  
  //Blink dei led
  STATUS_RED = blinkled(RED_LED_PIN, 14, LOW, 50);
  STATUS_GREEN = blinkled(GREEN_LED_PIN, 14, LOW, 50);
  
  //Avvio della ricezione IR
  irrecv.enableIRIn();
}

/*
 * Riceve e ritorna il codice IR da associare al led "ledpin".
 */
int recIRCode(int ledpin){
  int code = 0;    //Codice ricevuto dal ricevitore IR
  int statusLed;   //Stato del led
  
  //Accende il led ed esegue un blink
  statusLed = blinkled(ledpin, 1, LOW, 0);
  statusLed = blinkled(ledpin, 4, statusLed, 50);
  
  while(code == 0)  //Fin quando il codice ricevuto non è valido (0)
   if (irrecv.decode(&results)){  //Riceve e decodifica il codice IR
     //Se il codice è decodificabile dalla libreria ed il codice non è quello di REPEAT
     if (results.decode_type != -1 && results.value != REPEAT){
      code = results.value;        //Codice ricevuto
      Serial.print("rec code: ");
      Serial.print(code, HEX);
      Serial.print(" -> pin ");
      Serial.println(ledpin);
      statusLed = blinkled(ledpin, 5, statusLed, 50);  //Blink del led
     }
     irrecv.resume(); //Riceve il valore successivo dall'IR
   }
  statusLed = blinkled(ledpin, 1, HIGH, 0);  //Spegne il led
  return code;  //Ritorna il codice ricevuto
}

void loop() {
  int code;        //Codice IR ricevuto
  
  //Se il pulsante di registrazione dei codice è stato premuto...
  if (digitalRead(BUTTON_PIN) == HIGH){
    //Spegne i led
    STATUS_RED = blinkled(RED_LED_PIN, 1, HIGH, 0);
    STATUS_GREEN = blinkled(GREEN_LED_PIN, 1, HIGH, 0);
    //Rivece e memorizza i codici per il led rosso e verde
    RED_IR_CODE = recIRCode(RED_LED_PIN);
    GREEN_IR_CODE = recIRCode(GREEN_LED_PIN);
  }
  //Se è disponibile un segnale IR
  if (irrecv.decode(&results)) {
    code = results.value;        //Memorizza il codice ricevuto
    Serial.print(code, HEX);
    if (code == REPEAT)          //Codice relativo ad un bottone non ancora rilasciato
      Serial.print(" [repeat code]");
    if (code == RED_IR_CODE){    //Codice associato al led rosso
      Serial.print(": switch red led : pin ");
      Serial.print(RED_LED_PIN);
      STATUS_RED =  blinkled(RED_LED_PIN, 1, STATUS_RED, 0);  //Switcha lo stato del led rosso
    }
    //senza else consente di usare un bottone per più led
    if (code == GREEN_IR_CODE){  //Codice associato al led verde
      Serial.print(": switch green led : pin ");
      Serial.print(GREEN_LED_PIN);
      STATUS_GREEN = blinkled(GREEN_LED_PIN, 1, STATUS_GREEN, 0); //Switcha lo stato del led verde
    }
    if(results.decode_type == -1){  //Codice non decodificabile dalla libreria
      //Mostra il codice raw su serial
      unsigned int rawCodes[RAWBUF];
      Serial.println(": UNKNOW code");
      Serial.print("\traw len: ");
      Serial.print(results.rawlen);
      Serial.print("\n\traw buf: ");
      int codeLen = results.rawlen - 1;
      for (int i = 1; i <= codeLen; i++) {
        if (i % 2) {
          // Mark
          rawCodes[i - 1] = results.rawbuf[i]*USECPERTICK - MARK_EXCESS;
          Serial.print(" m");
        }
        else {
          // Space
          rawCodes[i - 1] = results.rawbuf[i]*USECPERTICK + MARK_EXCESS;
          Serial.print(" s");
        }
        Serial.print(rawCodes[i - 1], DEC);
       }
       Serial.println("");
    }
    irrecv.resume(); //Riceve il prossimo valore IR
    Serial.println();
  }
}

Il bottone è usato per avviare le associazioni dei tasti del telecomando ai led.
E' possibile associare anche lo stesso tasto ad entrambi i led.
« Last Edit: January 10, 2011, 07:39:03 pm by vanacore.paolo » Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 6
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie mille. Ancora una cosa i dati che mando e ricevo sono in analogico?
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 53
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ricevitore IR ed eventuale led IR in digitale.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 6
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Scusate se insisto ma voglio essere sicuro di quello che acquisto. su rs components cercando tsop1738 mi dice che non è disponibile e mi offre come alternativa il TSOP 31238, la cosa che non mi quadra è che sulla descrizione dice Emettitore IR oscill 38kHz TSOP31238. Ho visto i due datasheets e a me sembrano uguali, ma come ripeto è solo un mesetto che gioco con Arduino e l'elettronica. Grazie. il link di rs components:
http://it.rs-online.com/web/2861419.html?cm_mmc=IT-PPC-_-google-_-3_EEM-MPN-_-tsop1738_Broad
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 6
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

AIUTOOOOOOOOOOOOO
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 53
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

credo sia ok.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 6
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

te cosa mi consigli?? perchè dicono Emettitore IR ?? al massimo lascio perdere con questo modello e ne prendo uno dove in modo esplicito c'è scritto ricevitore. L'importante è che sia a 38 khz
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 53
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Se ti vendono il TSOP31238 sicuro è un ricevitore... se poi ti mandano un led ir non so ;D
Non so perché in quella pag. dica emettitore.
Qui e nel relativo datasheet la descrizione è corretta.
Io lo prenderei.
« Last Edit: January 10, 2011, 07:37:10 pm by vanacore.paolo » Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 6
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bene ho acquistato il tsop31238 fatto il circuito uploadato il codice e tutto sembra funzionare nel senso che dopo aver digitato un pulsante del telecomando sul Serial monitor vedo comparire delle cose. Ora mi chiedo che significato hanno quelle informazioni? Possono essere utili per capire il tasto premuto (penso di si). Cosa vuol dire Mark e Space? Ci sarebbe qualcuno un poco paziente che mi spiega le basi in modo tale da codificare i pulsanti del mio telecomando Samsung. Vi posto il codice preso da un esempio e commentando ciò che non mi serviva e qualche output del serial monitor
Code:
#include <IRremote.h>

#define led1 9
#define led2 10
#define led3 6

int RECV_PIN = 7;
/*int BUTTON_PIN = 5;
int STATUS_PIN = 13;*/
int r = 0;
int g = 0;
int b = 0;
IRrecv irrecv(RECV_PIN);
IRsend irsend;


int fading = 0; // se = 1 effetti luminosi

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  /*pinMode(BUTTON_PIN, INPUT);
  pinMode(STATUS_PIN, OUTPUT);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);*/
}

// Storage for the recorded code
int codeType = -1; // The type of code
unsigned long codeValue; // The code value if not raw
unsigned int rawCodes[RAWBUF]; // The durations if raw
int codeLen; // The length of the code
int toggle = 0; // The RC5/6 toggle state

// Stores the code for later playback
// Most of this code is just logging
void storeCode(decode_results *results) {
  codeType = results->decode_type;
  int count = results->rawlen;
  if (codeType == UNKNOWN) {
    Serial.println("Received unknown code, saving as raw");
    codeLen = results->rawlen - 1;
    // To store raw codes:
    // Drop first value (gap)
    // Convert from ticks to microseconds
    // Tweak marks shorter, and spaces longer to cancel out IR receiver distortion
    for (int i = 1; i <= codeLen; i++) {
      if (i % 2) {
        // Mark
        rawCodes[i - 1] = results->rawbuf[i]*USECPERTICK - MARK_EXCESS;
        Serial.print(" m");
      }
      else {
        // Space
        rawCodes[i - 1] = results->rawbuf[i]*USECPERTICK + MARK_EXCESS;
        Serial.print(" s");
      }
      Serial.print(rawCodes[i - 1], DEC);
    }
    Serial.println("");
  }
  else {
    if (codeType == NEC) {
      Serial.print("Received NEC: ");
      if (results->value == REPEAT) {
        // Don't record a NEC repeat value as that's useless.
        Serial.println("repeat; ignoring.");
        return;
      }
    }
    else if (codeType == SONY) {
      Serial.print("Received SONY: ");
    }
    else if (codeType == RC5) {
      Serial.print("Received RC5: ");
    }
    else if (codeType == RC6) {
      Serial.print("Received RC6: ");
    }
    else {
      Serial.print("Unexpected codeType ");
      Serial.print(codeType, DEC);
      Serial.println("");
    }
    Serial.println(results->value, HEX);
    codeValue = results->value;
    codeLen = results->bits;
  }
}

int lastButtonState;

void loop() {
  if (fading == 1) {
      /*analogWrite(led1,r);
      r=r+random(5);      
        r=r-random(5);
      delay(10);
      analogWrite(led2,g);
       g=g+random(5);
           g=g-random(5);
      delay(15);    
      analogWrite(led3,b);
       b=b+random(5);
           b=b-random(5);
      delay(5);
      Serial.println("random");*/


  }



  if (irrecv.decode(&results)) {
    
    //digitalWrite(STATUS_PIN, HIGH);
    storeCode(&results);
    //Serial.println(results->value,HEX);
    if (codeValue == 0xA16EC03F) {
      //analogWrite(led1,0);
      //analogWrite(led2,0);
      //analogWrite(led3,0);
      Serial.println("spento");
    }
    if (codeValue == 0xA16E34CB) {
      fading = 0;
      //analogWrite(led1,255);
      //analogWrite(led2,0);
      //analogWrite(led3,0);
      Serial.println("r");
    }
    if (codeValue == 0xA16ED42B) {
      fading = 0;
      //analogWrite(led1,0);
      //analogWrite(led2,255);
      //analogWrite(led3,0);
      Serial.println("g");
    }
    if (codeValue == 0xA16E54AB) {
      fading = 0;
      //analogWrite(led1,0);
      //analogWrite(led2,0);
      //analogWrite(led3,255);
      Serial.println("b");
    }
     if (codeValue == 0xA16E0CF3) {
        fading = 1- fading;
    }

    irrecv.resume(); // resume receiver
    //digitalWrite(STATUS_PIN, LOW);
  }

}


Digitando 1 ricevo:
Received unknown code, saving as raw
 m4400 s4500 m500 s1700 m500 s1750 m500 s1700 m500 s650 m450 s650 m500 s600 m500 s600 m500 s650 m500 s1700 m500 s1750 m450 s1750 m500 s600 m500 s650 m450 s650 m500 s600 m500 s600 m500 s650 m500 s600 m500 s1700 m500 s650 m500 s600 m500 s600 m500 s650 m450 s650 m500 s1700 m500 s1750 m500 s600 m500 s1700 m500 s1750 m500 s1700 m500 s1750 m450 s1750 m500


Digitando 2:
Received unknown code, saving as raw
 m4400 s4500 m550 s1700 m500 s1700 m500 s1750 m450 s650 m500 s600 m500 s600 m500 s650 m500 s600 m500 s1700 m500 s1750 m500 s1700 m550 s600 m500 s600 m550 s550 m550 s550 m550 s600 m550 s1650 m550 s550 m550 s1700 m550 s550 m550 s550 m550 s600 m550 s550 m550 s550 m550 s600 m450 s1750 m500 s600 m500 s1750 m500 s1700 m500 s1750 m450 s1750 m500 s1700 m500

Grazie


Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 53
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

La trasmissione del codice (identificativo) di un tasto del telecomando consiste in una serie di impulsi emessi in successione, ognuno con una determinata durata, dal led IR del telecomando.
Questi impulsi costituiscono un segnale modulato (credo, per i telecomandi delle tv, sempre modulazioni di un certo tipo sulla portante di 38kHz) che viene rilevato dal ricevitore IR (il tuo tsop31238).
Uno degli scopi della libreria è quindi decodificare il segnale ricevuto dal fotodiodo IR e, per far questo, è necessario che "conosca" la codifica utilizzata.

Esistono diverse codifiche per la trasmissione dati nei telecomandi IR.
Alcune di esse (NEC, Sony SIRC, Philips RC5, Philips RC6) sono direttamente supportate dalla libreria IRremote di Ken Shirriff.
Questo significa che, per ogni tasto del telecomando, la libreria, se conosce la codifica, è in grado di decodificare il relativo segnale e ti dà come risultato un codice numerico (unsigned long) che puoi usare per identificare univocamente il tasto premuto.

Il formato raw rappresenta, invece, il segnale così come è stato rilevato dal ricevitore, quindi, non decodificato.
In questo formato il segnale è rappresentato come una successione di livelli logici alti e bassi (mark-space) specificando, per ognuno di essi, la durata (in microsecondi).

Per tutti i segnali ricevuti, per i quali la libreria ne riconosce la codifica, hai a disposizione il codice decodificato (unsigned long) e il raw.
Per i segnali ricevuti per i quali la libreria non ne riconosce la codifica hai a disposizione il solo raw (il tuo caso con il samsung).

Se il tuo scopo fosse replicare, tramite un led IR, i codici raw rilevati dal tsop31238, potresti far riferimento al metodo sendRaw della classe IRsend.

Spero di non aver detto inesattezze... aspetta comunque conferme.
« Last Edit: January 16, 2011, 08:57:35 pm by vanacore.paolo » Logged

Pages: [1]   Go Up
Jump to: