Pretraži kod

Dekodiranje crnih ili bijelih daljinskih upravljača s Arduinom

Dekodiranje crnih ili bijelih daljinskih upravljača s Arduinom

U ovom tutorijalu naučit ćemo kako dekodirati tipke s crno-bijelih infracrvenih daljinskih upravljača koristeći Arduino i IR prijemnik. Na kraju ovog projekta moći ćete odrediti koja je tipka pritisnuta na daljinskom upravljaču i prikazati te informacije na serijskom monitoru. Ovo može biti korisno za upravljanje uređajima s bilo kojim daljinskim upravljačem koji imate, poput televizora ili drugih aparata (u videu na 01:00).

Deconding-IR-remote-main

Koristit ćemo jednostavnu postavku koja uključuje Arduino, modul infracrvenog prijemnika i potreban kod za dekodiranje signala. Infracrveni prijemnik će uhvatiti signale s daljinskog upravljača, a Arduino će interpretirati te signale kako bi odredio koje je dugme pritisnuto. Ovaj projekt je jednostavan i može se prilagoditi za različite daljinske upravljače.

Deconding-IR-remote-main-2

Objašnjenje hardvera

Primarne komponente za ovaj projekt uključuju Arduino ploču i modul IR prijemnika, obično označen kao VS1838B. Arduino će služiti kao glavni kontroler, izvršavajući kod koji obrađuje signale primljene s daljinskog upravljača. IR prijemnik hvata infracrvene signale koje emitira daljinski upravljač i pretvara ih u format koji Arduino može razumjeti.

IR remote receiver VS1838B pins
IR remote receiver VS1838B pins

VS1838B radi u rasponu napona od 2.7V do 5.5V, što ga čini kompatibilnim s većinom Arduino ploča. Može detektirati signale s udaljenosti od 10 do 15 metara, ovisno o uvjetima. Infracrveni prijemnik izlazi digitalni signal koji označava koje je dugme na daljinskom upravljaču pritisnuto, omogućavajući Arduinu da reagira u skladu s tim.

Detalji iz podatkovne tablice

Proizvođač VS1838B
Broj dijela VS1838B
Logički/IO napon 2.7–5.5 V
Napon napajanja 5 V
Izlazna struja (po kanalu) 1.5 mA
Udaljenost prijema 10–15 m
Ulazna frekvencija 38 kHz
Struja mirovanja 0.8 mA (tip.)
Ugao rada 70 stepeni
Paket TO-220

 

  • Osigurajte ispravan napon napajanja kako biste izbjegli oštećenje IR prijemnika.
  • Držite modul prijemnika podalje od direktne sunčeve svjetlosti ili jakih infracrvenih izvora.
  • Koristite pull-up otpornike ako je potrebno za stabilizaciju očitavanja signala.
  • Priključci žica trebaju biti sigurni kako bi se spriječili povremeni signali.
  • Testirajte različite daljinske upravljače da vidite koliko dobro rade s postavkom.
  • Deconding-IR-remote-main-1

Upute za povezivanje

Za povezivanje IR prijemnika na Arduino, prvo spojite VCC pin IR prijemnika na 5V pin na Arduinu. Zatim spojite GND pin prijemnika na jedan od GND pinova na Arduinu. Na kraju, spojite signalni pin (često označen kao SIG ili OUT) IR prijemnika na digitalni pin 11 na Arduinu.

Provjerite da su priključci sigurni, jer labavi priključci mogu dovesti do nedosljednih očitavanja. Ako koristite PCB verziju IR prijemnika ili goli modul, povezivanje ostaje isto; samo provjerite da ispravno identificirate pinove prema oznakama modula (u videu na 03:15).

Instalacija IRremote biblioteke

Pokrenite Arduino IDE. (možete ga dobiti s Arduino.cc besplatno) Kliknite na ikonu biblioteke s lijeve strane i potražite    IRremote i kliknite na "Install" da je instalirate. 

#include <IRremote.h>

Primjeri koda i objašnjenje

int RECV_PIN = 11;
const char type ='W'; // W za bijeli, B za crni
const boolean PCB = 0; // 1 za PCB, 0 za goli modul
IRrecv irrecv(RECV_PIN);

U ovom odlomku definiramo broj pina za IR prijemnik s RECV_PIN postavljenim na 11. Također specificiramo tip daljinskog upravljača koji se koristi s varijablom type, gdje 'W' označava bijeli daljinski upravljač, a 'B' crni. Varijabla PCB razlikuje korištenje PCB verzije prijemnika od golog modula.

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn(); // Pokreni prijemnik
}

U funkciji setup() inicijaliziramo serijsku komunikaciju na 9600 bauda i pokrećemo IR prijemnik. Ovo je ključno za praćenje izlaza na serijskom monitoru, omogućavajući nam da vidimo koja je tipka pritisnuta.

void loop() {
  if (irrecv.decode(&results)) {
    robojaxValidateCode(results.value); // Validiraj primljeni kod
    irrecv.resume(); // Primaj sljedeću vrijednost
  }
  delay(100);
}

Glavna loop() funkcija provjerava da li je IR prijemnik dekodirao signal. Ako jeste, poziva funkciju robojaxValidateCode da obradi primljenu vrijednost, a zatim nastavlja sa slušanjem sljedećeg signala. delay(100) osigurava da se petlja ne izvršava prebrzo, što može pomoći pri obradi signala.

Demonstracija / Šta očekivati

Kada je sve podešeno i kod je uploadovan, otvorite serijski monitor da vidite izlaz. Kada pritisnete tipku na daljinskom upravljaču, trebali biste vidjeti odgovarajuće ime tipke prikazano na monitoru. Ako tipka nije prepoznata, prikazat će se "Key unknown." Pobrinite se da pritiskate tipke čvrsto, jer labavi spojevi mogu uzrokovati pogrešna očitanja (u videu na 05:40).

Ako pritisnete tipku neprekidno, izlaz može prikazati ponovljene vrijednosti ili heksadecimalne kodove. Ovo ponašanje je normalno, a kod možete modificirati da filtrirate ove kontinuirane signale ako želite. Također, možete prilagoditi kod da izvršava radnje na osnovu specifičnih pritisaka tipki, kao što je uključivanje svjetala ili upravljanje drugim uređajima.

Vremenske oznake videa

  • 00:00 Početak
  • 00:56 Hardver je objašnjen
  • 04:26 Povezivanje je objašnjeno
  • 05:20 Kod je objašnjen
  • 12:27 Demonstracija dekodiranja koda

Slike

Decoding any black remote or white remote with Arduino
Decoding Any Black remote or White remote with Arduino
IR remote receiver VS1838B pins
IR remote receiver VS1838B pins
Deconding-IR-remote-main
Deconding-IR-remote-main
Deconding-IR-remote-main-1
Deconding-IR-remote-main-1
Deconding-IR-remote-main-2
Deconding-IR-remote-main-2
137-Source code for decoding infrared remote controllers using Arduino
Jezik: C++
/*
 * Original code and library from - http://arcfn.com
 * 
 * This code decodes keys of Black IR remote and White IR remote
 * sold on eBay for Arduino. 
 * You have to select the type of your remote as Black or White in the code below
 * and also select your receiver 1838 either as PCB or bare module. See video for details
 * 
 * Modified/Written by Ahmad Shamshiri
 * on July 28, 2018 at 22:48 in Ajax, Ontario, Canada
 * for Robojax.com
 * Watch video instruction for this code:https://youtu.be/muAkBQb24NI
 * Get other Arduino codes from Robojax.com
 * 
 */

#include <IRremote.h>

int RECV_PIN = 11;

const char type ='W';// W for white, B for black. Must keep single quotes like 'B' or 'W'
const boolean PCB = 0;// if receiver is PCB set to 1, if not set to 0. See video for details

IRrecv irrecv(RECV_PIN);

// this is array holding codes for White Remote when used with PCB version of receiver
unsigned int whiteRemotePCB[] ={
            0xE318261B, // CH-
            0x511DBB,   // CH
            0xEE886D7F,  // CH+

            0x52A3D41F, // |<<
            0xD7E84B1B, // >>|
            0x20FE4DBB, // >||          

            0xF076C13B, // -
            0xA3C8EDDB, // +
            0x12CEA6E6, // EQ

            0xC101E57B, // 0
            0x97483BFB, // 100+
            0xF0C41643, // 200+

            0x9716BE3F, // 1
            0x3D9AE3F7, // 2
            0x6182021B, // 3           

            0x8C22657B, // 4 
            0x488F3CBB, // 5
            0x449E79F,  // 6

            0x32C6FDF7, // 7
            0x1BC0157B, // 8
            0x3EC3FC1B  // 9                          
            };

// this is array holding codes for White Remote when used with non-PCB version of receiver            
unsigned int whiteRemote[] ={
            0xFFA25D, // CH-
            0xFF629D,   // CH
            0xFFE21D,  // CH+

            0xFF22DD, // |<<
            0xFF02FD, // >>|
            0xFFC23D, // >||          

            0xFFE01F, // -
            0xFFA857, // +
            0xFF906F, // EQ

            0xFF6897, // 0
            0xFF9867, // 100+
            0xFFB04F, // 200+

            0xFF30CF, // 1
            0xFF18E7, // 2
            0xFF7A85, // 3           

            0xFF10EF, // 4 
            0xFF38C7, // 5
            0xFF5AA5,  // 6

            0xFF42BD, // 7
            0xFF4AB5, // 8
            0xFF52AD  // 9                          
            };
// key labels of white remote
String whiteRemoteKey[] ={
            "CH-",
            "CH",
            "CH+",

            "|<<",
            ">>|",
            ">||",

            "-",
            "+",
            "EQ",

            "0",
            "100+",
            "200+",

            "1",
            "2",
            "3",

            "4",
            "5",
            "6",

            "7",
            "8",
            "9"
            };

// this is array holding codes for Black Remote when used with non-PCB version of receiver
 unsigned int blackRemote[] ={
            0xFF629D, // ^
            0xFF22DD,   // <
            0xFF02FD,  // OK
            0xFFC23D, // >
            0xFFA857, // v

            0xFF6897, // 1
            0xFF9867, // 2
            0xF0C41643, // 3           

            0xFF30CF, // 4 
            0xFF18E7, // 5
            0xFF7A85,  // 6

            0xFF10EF, // 7
            0xFF38C7, // 8
            0xFF5AA5,  // 9 

            0xFF42BD, // *
            0xFF4AB5, // 0
            0xFF52AD  // #                                      
            };

// this is array holding codes for Black Remote when used with PCB version of receiver
 unsigned int blackRemotePCB[] ={
            0x511DBB, // ^
            0x52A3D41F,   // <
            0xD7E84B1B,  // OK
            0x20FE4DBB, // >
            0xA3C8EDDB, // v


            0xC101E57B, // 1
            0x97483BFB, // 2
            0xF0C41643, // 3           

            0x9716BE3F, // 4 
            0x3D9AE3F7, // 5
            0x6182021B,  // 6

            0x8C22657B, // 7
            0x488F3CBB, // 8
            0x449E79F,  // 9 

            0x32C6FDF7, // *
            0x1BC0157B, // 0
            0x3EC3FC1B  // #                                      
            };

// Black remote key names
String blackRemoteKey[] ={
            "^",
            "<",
            "OK",
            ">",
            "v",

            "1",
            "2",
            "3",

            "4",
            "5",
            "6",

            "7",
            "8",
            "9",
            
            "*",
            "0",
            "#"
            };

decode_results results;


void setup()
{
  Serial.begin(9600);
  // In case the interrupt driver crashes on setup, give a clue
  // to the user what's going on.
  Serial.println("Robojax Remote Decoder");
  irrecv.enableIRIn(); // Start the receiver

}

void loop() {

  if (irrecv.decode(&results)) {
     //Serial.println(results.value, HEX);
    robojaxValidateCode(results.value);// used the "robojaxValidateCode" below
    irrecv.resume(); // Receive the next value
  }
  delay(100);
}

/*
 * function: robojaxValidateCode
 * validates the remote code and prints correct key name
 * cd is code passed from the loop
 * Written by A. S. for Robojax
 */
void robojaxValidateCode(int cd)
{

  // Robojax IR Remote decoder
  int found=0;

 if(type =='W' && !PCB)
 {
    // Robojax IR White Remote decoder
    // if type is set to 'W' (white remote) and PCB=0 then check Black remote code
      for(int i=0; i< sizeof(whiteRemote)/sizeof(int); i++)
      {
        if(whiteRemote[i] ==cd)
        {
          
          Serial.print("Key pressed:");
          Serial.println(whiteRemoteKey[i]);
    
          found=1;
        }// if matched
      }// for
 }else if(type =='W' && PCB){
    // Robojax IR White Remote decoder
    // if type is set to 'W' (white remote) and PCB=1 then check Black remote code
      for(int i=0; i< sizeof(whiteRemotePCB)/sizeof(int); i++)
      {
        if(whiteRemotePCB[i] ==cd)
        {
          
          Serial.print("Key pressed:");
          Serial.println(whiteRemoteKey[i]);
    
          found=1;
        }// if matched
      }// for  
 }else if(type =='B' && PCB){
    // Robojax IR White Remote decoder
       // if type is set to 'B' (black remote) and PCB=1 then check Black remote code
       for(int i=0; i< sizeof(blackRemotePCB)/sizeof(int); i++)
      {
        // Robojax IR black Remote decoder
        if(blackRemotePCB[i] ==cd)
        {

          Serial.print("Key pressed:");
          Serial.println(blackRemoteKey[i]);
    
          found=1;
        }// if matched
      }// for   
 }else{

      // if type is set to 'B' (black remote) and PCB =0 then check Black remote code
       for(int i=0; i< sizeof(blackRemote)/sizeof(int); i++)
      {
        // Robojax IR black Remote decoder
        if(blackRemote[i] ==cd)
        {
          if(blackRemoteKey[i] == "OK"){
            digitalWrite(9,HIGH);
          }
          Serial.print("Key pressed:");
          Serial.println(blackRemoteKey[i]);
    
          found=1;
        }// if matched
      }// for  
 }// else
  if(!found){
    if(cd !=0xFFFFFFFF)
      {
    Serial.println("Key unknown");
      }
  }// found
}

Stvari koje bi vam mogle zatrebati

Resursi i reference

Još nema resursa.

Datoteke📁

Nema dostupnih datoteka.