Skip to content

Citire senzor IR TSOP4836

1. Cuvant inainte

Continuare din pagina “Transformarea in Sanguino“. Cautand pe net, am gasit o biblioteca pentru emisie/receptie cod in infrarosu foarte buna. Suporta protocoalele NEC, SONY, RC5 si RC6. Totusi, cu telecomenzile cu protocol RC5 am avut ceva probleme. Nu totdeauna obtineam exact codul tastei apasate. In imaginea de mai jos, veti vedea ca la apasarea tastelor 2 si 5, obtineam pe langa codul corect, si alte valori:

Clic pe imagine pentru marire

Mai multe detalii ale problemei gasiti in pagina mea in engleza. Nu am incercat sa scormonesc prin sursele bibliotecii pentru ca eram nou venit in lumea AVR-urilor, asa ca am hotarat sa tratez problema la nivelul aplicatiei care avea sa foloseasca codurile protocolului RC5:

if (results->value >= 0x800){
  results->value = results->value - 0x800;
}

Dupa folosirea acestui mic truc, totul a mers fara eroare. Va amintiti desigur ca unul din obiectivele fixate a fost acela de a „reface” aplicatia demonstrativa initiala, care venea impreuna cu placa.

2. Setare placa

Faceti conexiunile ca in tabelul de mai jos:

Conexiuni fire
 Pini ATmega
Periferice  Alias
 Digital 0 unul din LED-uri
Boot LED
 Digital 1 IR receiver
 Digital 13 unul din LED-uri
D13 LED

Conectam cablul USB si lansam Arduino IDE in executie.

3. Schita

/*
 * IR decode: receive a signal, decode and display the type and code,
 * Support NEC, SONY, RC5, RC6 code type.  
 * An IR detector/demodulator must be connected to the input RECV_PIN.
 * An IR LED must be connected to the output PWM pin 3.
 * A visible LED can be connected to STATUS_PIN to provide status.
 *
 * The logic is:
 * If an IR code is received, decode and display it.
 *
 * Version 0.11 September, 2009
 * Copyright 2009 Ken Shirriff
 * http://arcfn.com
 */

#include <IRremote.h>

int RECV_PIN = 1;
int STATUS_PIN = 13;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  pinMode(STATUS_PIN, OUTPUT);
  digitalWrite(0, LOW);
}

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

void showCode(decode_results *results) {
  codeType = results->decode_type;
  int count = results->rawlen;
  if (codeType == UNKNOWN) {
    Serial.println("Received unknown code!");
    codeLen = results->rawlen - 1;
  }
  else {
    if (codeType == NEC) {
      Serial.print("Received NEC: ");
      if (results->value == REPEAT) {
        // Don't print 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("");
    }
    // the workaround
    if (results->value >= 0x800) {
      results->value = results->value - 0x800;
    }
    // end workaround
    Serial.println(results->value, HEX);
    codeValue = results->value;
    codeLen = results->bits;
  }
}

void loop() {
  digitalWrite(STATUS_PIN, HIGH); //switch off the LED on our board (common anode)
  if (irrecv.decode(&results)) {
    digitalWrite(STATUS_PIN, LOW);
    showCode(&results);
    irrecv.resume(); // resume receiver
  }
}

Conectati cablul USB si urcati programul pe placa. Porniti terminalul (monitorul din Arduino IDE).

4. Rezultate

Pai, nimic special. Codurile emise de telecomanda sunt trimise catre fereastra terminal de pe PC. Puteti vedea asta in imaginea de mai sus (exceptand erorile) sau in filmuletul de mai jos, pe care l-am facut cand testam telecomenzi cu protocoale diferite (protocolul NEC in cazul de fata). Ma amuza faptul ca obiectivul foto reusea sa captureze fasciculul in infrarosu (da-i copilului o jucarie care-i place si nu se mai satura de ea). Tineam telecomanda in dreptul buzzer-ului ca sa vad si reactia LED-ului, insa receptorul infrarosu era ceva mai jos.

Lasă un comentariu

Va rog, nu folositi limbaj de messenger. Multumesc!

Completează mai jos detaliile despre tine sau dă clic pe un icon pentru autentificare:

Logo WordPress.com

Comentezi folosind contul tău WordPress.com. Dezautentificare / Schimbă )

Poză Twitter

Comentezi folosind contul tău Twitter. Dezautentificare / Schimbă )

Fotografie Facebook

Comentezi folosind contul tău Facebook. Dezautentificare / Schimbă )

Fotografie Google+

Comentezi folosind contul tău Google+. Dezautentificare / Schimbă )

Conectare la %s

%d blogeri au apreciat asta: