Operácie

Projekt: Infračervené ovládanie: Rozdiel medzi revíziami

Z SensorWiki

Riadok 36: Riadok 36:
 
<source lang="c">
 
<source lang="c">
  
#include <IRremote.h>                // kniznica pre IR ovladace
+
#include <IRremote.h>                // knižnica pre IR ovládače
 
#include <LiquidCrystal.h>            // knižnica pre display
 
#include <LiquidCrystal.h>            // knižnica pre display
// initialize the library with the numbers of the interface pins
+
                                      // initialize the library with the numbers of the interface pins
//  LiquidCrystal(RS, RW, EN, D4, D5, D6, D7) // konkretne piny displaya
+
                                      //  LiquidCrystal(RS, RW, EN, D4, D5, D6, D7) // konkretne piny displaya
LiquidCrystal lcd( 3,  2,  1,  4,  5,  6,  7);  // piny na ktore sa pripaja display
+
LiquidCrystal lcd( 3,  2,  1,  4,  5,  6,  7);   
 +
                                      // piny na ktoré sa pripája display
  
 
</source>
 
</source>
Riadok 48: Riadok 49:
 
<source lang="c">
 
<source lang="c">
  
long int Button_1 = 1634762879;          // kody konkretnych tlacitok v desiatkovej sustave ovladaca ORANGE
+
long int Button_1 = 1634762879;          // kódy konkrétnych tlačítok v desiatkovej sústave ovládača ORANGE
long int Button_2 = 1634746559;          // musi to byt typ long lebo int bol kratky  
+
long int Button_2 = 1634746559;          // musí to byť typ long pretože typ int bol krátky  
 
long int Button_3 = 1634779199;
 
long int Button_3 = 1634779199;
 
long int Button_4 = 1634738399;
 
long int Button_4 = 1634738399;
Riadok 67: Riadok 68:
  
 
<source lang="c">
 
<source lang="c">
int count = 0;            // premena pocitadka, kontrola ci uz je display zapnyty = 0 a ked vypnuty je 1
+
int count = 0;            // premenná počítadla, kontrola či už je display zapnutý = 0 a keď vypnutý je 1
  
int LED = 13;            // pin na ktorom je zlta ledka
+
int LED = 13;            // pin na ktorom je žltá ledka
int RECV_PIN = 8;        // pin na ktorom je zapojeny infra prijimac
+
int RECV_PIN = 8;        // pin na ktorom je zapojený infra príjimač
IRrecv irrecv(RECV_PIN);  // toto je trieda v kotrej je aj funkcia na primanie signalu, nastavi primanie na ten pin teda na 8
+
IRrecv irrecv(RECV_PIN);  // toto je trieda v kotrej je aj funkcia na príjmanie signálu, nastaví príjmanie na ten pin teda na 8
decode_results results;  // meno premenej do ktorej sa bude ukladat vysledok dekodovania
+
decode_results results;  // meno premenej do ktorej sa bude ukladať výsledok dekódovania
long int incomming;      // premnna do ktorej sa uklada hodnota signalu z dialkoveho v desiatkovej sustave
+
long int incomming;      // premnná do ktorej sa ukladá hodnota signálu z ďiaľkového v desiatkovej sústave
  
 
</source>
 
</source>
  
Seriova komunikácia - teraz uz sa nepouživa slúžila len na odlaďovanie programu keď nefungoval displej.
+
Sériova komunikácia - teraz uz sa nepouživa slúžila len na odlaďovanie programu keď nefungoval displej.
  
Inicializacia primania s IR primača, inicializacia LCD + výpis úvodnej obrazovky.
+
Inicializácia príjmania z IR prijímača, inicializácia LCD + výpis úvodnej obrazovky.
  
 
<source lang="c">
 
<source lang="c">
  
void setup()              // tu zacina finkcia kotra zbehne iba raz ked sa zapne arduino  
+
void setup()              // tu začína funkcia ktorá zbehne iba raz keď sa zapne arduino  
 
{
 
{
   //Serial.begin(9600);  // musi byt zakomentovane aby fungoval display, AK je odkomentovany tak NEFUNGUJE display
+
   //Serial.begin(9600);  // musí byť zakomentované aby fungoval display, ak je odkomentovaný tak NEFUNGUJE
   irrecv.enableIRIn();    // Start the receiver
+
   irrecv.enableIRIn();    // štart príjímača
   Serial.println("ZADAJ VOLBU :"); // vypis na seriovu linku - ked nieje použitý displej
+
   Serial.println("ZADAJ VOLBU :"); // výpis na sériovu linku - ked nieje použitý displej
 
   pinMode(LED,OUTPUT);    //  
 
   pinMode(LED,OUTPUT);    //  
 
    
 
    
 
     // set up the LCD's number of columns and rows:  
 
     // set up the LCD's number of columns and rows:  
   lcd.begin(8, 2);        // inicializuje komunikaciu s LCD na 8 strplcov a 2 riadky
+
   lcd.begin(8, 2);        // inicializuje komunikáciu s LCD na 8 stĺpcov a 2 riadky
   lcd.clear();            // vymaze
+
   lcd.clear();            // vymaže display
   delay(500);            // po vymazani pocka 0.5s
+
   delay(500);            // po vymazaní počká 0.5s
  // Print a message to the LCD.
+
   lcd.print("Cakam...");  // potom inicializ. vypise cakam ...
+
   lcd.print("Cakam...");  // potom inicializ. vypíše "Cakam ..."
 
}
 
}
 
</source>
 
</source>
  
Hlavna slucka programu - načitavanie prijatej hodnoty a jej porovnanie so zadefinovanými kódmi tlačidiel a následne vypísanie kódu tlačidla s popisom na LCD displej. Pri tlačidle OK je pridana funkcia rozsvecujuca LED, ledku nasledne zhasneme tlacidlom EXIT. Na tlačidlo Power na ovládaci je nastavené zapínanie a vypínanie LCD displeja.
+
Hlavná slučka programu - načitavanie prijatej hodnoty a jej porovnanie so zadefinovanými kódmi tlačidiel a následné vypísanie kódu tlačidla s popisom na LCD displej. Pri tlačidle OK je pridaná funkcia rozsvecujúca LED. Ledku následne zhasneme tlačídlom EXIT. Na tlačídlo Power na ovládači je nastavené zapínanie a vypínanie LCD displeja.
  
 
<source lang="c">
 
<source lang="c">
  
void loop()              // hlavny program
+
void loop()              // hlavný program
 
{
 
{
 
   if (irrecv.decode(&results))  
 
   if (irrecv.decode(&results))  
Riadok 111: Riadok 112:
 
      
 
      
 
     delay(500);
 
     delay(500);
     irrecv.resume();    // Receive the next value
+
     irrecv.resume();     
 
   }  
 
   }  
 
   
 
   
switch (incomming) {   // porovnavanie hodnoty z incommingu na zaklade ktorej sa urcuje ktora akcia sa ma vykonat
+
switch (incomming) {                 // porovnávanie hodnoty z incommingu na základe ktorej sa určuje, ktorá akcia sa má vykonať
  
     case 1634762879:   //kod signalu v decimalnej hodnote pre button 1 (teda ak bol stlaceny)
+
     case 1634762879:                 // kód signálu v decimálnej hodnote pre button 1 (teda ak bol stlačený)
       Serial.println("Stlacil si 1"); // kontrolny vypis na seriovu linku ked este nefungoval display
+
       Serial.println("Stlacil si 1"); // kontrolný výpis na sériovu linku keď ešte nefungoval display
 
       lcd.clear();                    // vymazanie  
 
       lcd.clear();                    // vymazanie  
       lcd.setCursor(0, 0);            //nastavenie kurzora na poziciu 0, 0
+
       lcd.setCursor(0, 0);            // nastavenie kurzora na pozíciu 0, 0
       lcd.print("Button 1");          // vypis na display Button 1
+
       lcd.print("Button 1");          // výpis na display Button 1
       lcd.setCursor(0, 1);            //nastavenie kurzora na poziciu 0, 1
+
       lcd.setCursor(0, 1);            // nastavenie kurzora na pozíciu 0, 1
       lcd.print(Button_1,HEX);        // vypis hodnoty kodu sihanlu ktory posiela ovladat ale v HEXa tvare pretoze display ma malo miesta na to aby  
+
       lcd.print(Button_1,HEX);        // výpis hodnoty kódu signálu ktorý posiela ovládač ale v HEX-a tvare pretože display ma málo miesta na to aby  
                                  zobrazil pozadoavne cislo v decimalnom ci dokonca v binarnom tvare
+
                                        zobrazil požadoavne číslo v decimalnom či dokonca v binarnom tvare
 
       break;
 
       break;
  
     case 1634746559:                  // ostatne sa uz opakuje len sa deju ine funkcie
+
     case 1634746559:                  // ostatné sa opakuje len sa dejú iné funkcie
 
       Serial.println("Stlacil si 2");
 
       Serial.println("Stlacil si 2");
 
       lcd.clear();
 
       lcd.clear();
Riadok 228: Riadok 229:
  
 
     case 1634748599:      //(POWER tlacitko)
 
     case 1634748599:      //(POWER tlacitko)
     switch(count){        // funkcia zapina alebo vypina displej - meni sa hodnota count bud na 0 alebo na 1   
+
     switch(count){        // funkcia zapína alebo vypína displej - mení sa hodnota count buď na 0 alebo na 1   
 
         case 0:
 
         case 0:
 
           lcd.noDisplay();
 
           lcd.noDisplay();
Riadok 243: Riadok 244:
 
     case 0:
 
     case 0:
  
     break; // ak je stlacene ine tlacitko ktore nie je v zozname tak akcia nie je ziadna akurat display vypise UNKNOWN a vypise aj  
+
     break;         // ak je stlačené iné tlačídlo ktoré nieje v zozname, display vypise UNKNOWN a vypise aj hodnotu kódu v HEX-a
              hodnotu kodu v HEXa
 
 
      
 
      
 
       default:
 
       default:
Riadok 255: Riadok 255:
 
       break;
 
       break;
 
   }  
 
   }  
   incomming = 0; // stara hodnota siganlu ovladaca sa vynuluje
+
   incomming = 0;   // stará hodnota signálu ovládača sa vynuluje
 
}
 
}
  
Riadok 261: Riadok 261:
  
 
== Popis funkcie + fotodokumentacia ==
 
== Popis funkcie + fotodokumentacia ==
Na obrazku je nahlad displeja: vlavo je to úvodna obrazovka pred stlačenim niektorého tlačidla, uprostred je chybové hlásenie pri stlačeni tlačidla ktoré nie je medzi zadefinovanými tlačidlami, v druhom riadku je zobrazený hexa kod tlačidla (pre maly počet znakov displeja ho nebolo možne zobraziť v  desiatkovej sustave). V pravo je displej pri stlačeni tlačidla "0" a jeho hexa kód.
+
Na obrazku je náhľad displeja: vľavo je to úvodna obrazovka pred stlačenim niektorého tlačídla, uprostred je chybové hlásenie pri stlačeni tlačídla ktoré nieje medzi zadefinovanými tlačídlami, v druhom riadku je zobrazený HEX-a kód tlačídla (pre malý počet znakov displeja ho nebolo možne zobraziť v  desiatkovej sustave). V pravo je displej pri stlačeni tlačidla "0" a jeho HEX-a kód.
 
[[Súbor:1.jpeg|700px]]
 
[[Súbor:1.jpeg|700px]]
  

Verzia zo dňa a času 19:53, 3. február 2013

  • Vypracovali:
Bc. Martin Lacko
Bc. Andrej Pecho
  • Študijný odbor: Aplikovaná mechatronika
  • Ročník: 2. Ing.


Zadanie:

  • Naprogramujte prijímač infračerveného (IR) diaľkového (DO) ovládania.
  • Vypracujte dokumentáciu (schéma zapojenia, zapojenie konektorov, popis funkcie obvodov, pripojenie k procesoru,...).
  • Demonštrujte pochopenie funkcie jednoduchým programom: Po stlačení klávesy na DO zobrazíte jej hodnotu na displeji. Na niektoré tlačidlá pripojte aj inú funkciu - ovládanie LED, bzučiak, príp. ovládanie mobilného robota.

ParallaxIR receiver.jpg

Použitý IR príjimač PNA4601M

Zapojenie

Zapojenie je jednoduché keďže k doske pripájame len IR prijimač. Jeho pin č. 2 pripojíme na zem GND, pin č.3 na napájacie napätie 5V. Prvý pin slúži ako výstupný, pripojíme ho na pin procesora, ktorý nastavíme ako vstupný.

1.jpg

Keďže sme nemali originálny ovladač použili sme ovladač "ORANGE" od Set-top Boxu.

Program

Jednotlivé príkazy sú v programe okomentované, preto sa budem venovať funkčným blokom kódu.


Na začiatku programu sú vložené potrebne knižnice pre infračervený prijímač a LCD displej a inicializácia použitých pinov displeja pre 4-bitovú komunikáciu.

#include <IRremote.h>                 // knižnica pre IR ovládače
#include <LiquidCrystal.h>            // knižnica pre display
                                      // initialize the library with the numbers of the interface pins
                                      //  LiquidCrystal(RS, RW, EN, D4, D5, D6, D7) // konkretne piny displaya
LiquidCrystal lcd( 3,  2,  1,  4,  5,  6,  7);  
                                      // piny na ktoré sa pripája display

Následuje "definovanie" kódov jednotlivých tlačidiel obladača. Kedže sme pri odlaďovaní programu nemali originálny ovládač použili sme ovladač "ORANGE" od Set-Top Boxu, ktorý je na obrázku v kapitole Zapojenie. Použili sme premennú typu long pretože kódy tlačidiel boli príliš dlhé pre použitie int.

long int Button_1 = 1634762879;          // kódy konkrétnych tlačítok v desiatkovej sústave ovládača ORANGE
long int Button_2 = 1634746559;          // musí to byť typ long pretože typ int bol krátky  
long int Button_3 = 1634779199;
long int Button_4 = 1634738399;
long int Button_5 = 1634771039;
long int Button_6 = 1634754719;
long int Button_7 = 1634787359;
long int Button_8 = 1634734319;
long int Button_9 = 1634766959;
long int Button_0 = 1634730239;
long int Button_OK = 1634773079;
long int Button_EXIT = 1634764919;
long int Button_OFF = 1634748599;

Definovanie použitých pinov a pomocných premenných.

int count = 0;            // premenná počítadla, kontrola či už je display zapnutý = 0 a keď vypnutý je 1

int LED = 13;             // pin na ktorom je žltá ledka
int RECV_PIN = 8;         // pin na ktorom je zapojený infra príjimač
IRrecv irrecv(RECV_PIN);  // toto je trieda v kotrej je aj funkcia na príjmanie signálu, nastaví príjmanie na ten pin teda na 8
decode_results results;   // meno premenej do ktorej sa bude ukladať výsledok dekódovania
long int incomming;       // premnná do ktorej sa ukladá hodnota signálu z ďiaľkového v desiatkovej sústave

Sériova komunikácia - teraz uz sa nepouživa slúžila len na odlaďovanie programu keď nefungoval displej.

Inicializácia príjmania z IR prijímača, inicializácia LCD + výpis úvodnej obrazovky.

void setup()              // tu začína funkcia ktorá zbehne iba raz keď sa zapne arduino 
{
  //Serial.begin(9600);   // musí byť zakomentované aby fungoval display, ak je odkomentovaný tak NEFUNGUJE
  irrecv.enableIRIn();    // štart príjímača 
  Serial.println("ZADAJ VOLBU :"); // výpis na sériovu linku - ked nieje použitý displej
  pinMode(LED,OUTPUT);    // 
  
    // set up the LCD's number of columns and rows: 
  lcd.begin(8, 2);        // inicializuje komunikáciu s LCD na 8 stĺpcov a 2 riadky
  lcd.clear();            // vymaže display
  delay(500);             // po vymazaní počká 0.5s
 
  lcd.print("Cakam...");  // potom inicializ. vypíše "Cakam ..."
}

Hlavná slučka programu - načitavanie prijatej hodnoty a jej porovnanie so zadefinovanými kódmi tlačidiel a následné vypísanie kódu tlačidla s popisom na LCD displej. Pri tlačidle OK je pridaná funkcia rozsvecujúca LED. Ledku následne zhasneme tlačídlom EXIT. Na tlačídlo Power na ovládači je nastavené zapínanie a vypínanie LCD displeja.

void loop()              // hlavný program
{
  if (irrecv.decode(&results)) 
  {
    Serial.println(results.value);
    incomming = (results.value);
    
    delay(500);
    irrecv.resume();    
  } 
 
switch (incomming) {                  // porovnávanie hodnoty z incommingu na základe ktorej sa určuje, ktorá akcia sa má vykonať

    case 1634762879:                  // kód signálu v decimálnej hodnote pre button 1 (teda ak bol stlačený)
      Serial.println("Stlacil si 1"); // kontrolný výpis na sériovu linku keď ešte nefungoval display
      lcd.clear();                    // vymazanie 
      lcd.setCursor(0, 0);            // nastavenie kurzora na pozíciu 0, 0
      lcd.print("Button 1");          // výpis na display Button 1
      lcd.setCursor(0, 1);            // nastavenie kurzora na pozíciu 0, 1
      lcd.print(Button_1,HEX);        // výpis hodnoty kódu signálu ktorý posiela ovládač ale v HEX-a tvare pretože display ma málo miesta na to aby 
                                         zobrazil požadoavne číslo v decimalnom či dokonca v binarnom tvare
      break;

    case 1634746559:                  // ostatné sa už opakuje len sa dejú iné funkcie
      Serial.println("Stlacil si 2");
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Button 2");
      lcd.setCursor(0, 1);
      lcd.print(Button_2,HEX);
      break;

    case 1634779199:
      Serial.println("Stlacil si 3");
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Button 3");
      lcd.setCursor(0, 1);
      lcd.print(Button_3,HEX);
      break;

    case 1634738399:
      Serial.println("Stlacil si 4");
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Button 4");
      lcd.setCursor(0, 1);
      lcd.print(Button_4,HEX);
      break;      

    case 1634771039:
      Serial.println("Stlacil si 5");
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Button 5");
      lcd.setCursor(0, 1);
      lcd.print(Button_5,HEX);
      break;

    case 1634754719:
      Serial.println("Stlacil si 6");
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Button 6");
      lcd.setCursor(0, 1);
      lcd.print(Button_6,HEX);
      break;

    case 1634787359:
      Serial.println("Stlacil si 7");
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Button 7");
      lcd.setCursor(0, 1);
      lcd.print(Button_7,HEX);
      break;

    case 1634734319:
      Serial.println("Stlacil si 8");
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Button 8");
      lcd.setCursor(0, 1);
      lcd.print(Button_8,HEX);
      break;

    case 1634766959:
      Serial.println("Stlacil si 9");
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Button 9");
      lcd.setCursor(0, 1);
      lcd.print(Button_9,HEX);
      break;      

    case 1634730239:
      Serial.println("Stlacil si 0");
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Button 0");
      lcd.setCursor(0, 1);
      lcd.print(Button_0,HEX);
      break;  

    case 1634773079:
      Serial.println("Stlacil si OK");
      digitalWrite(LED,HIGH);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("LED ON"); // led on
      lcd.setCursor(0, 1);
      lcd.print(Button_OK,HEX);
      break;

    case 1634764919:
      Serial.println("Stlacil si EXIT");
      digitalWrite(LED,LOW);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("LED OFF"); // led off
      lcd.setCursor(0, 1);
      lcd.print(Button_EXIT,HEX);
      break;

    case 1634748599:       //(POWER tlacitko)
     switch(count){        // funkcia zapína alebo vypína displej - mení sa hodnota count buď na 0 alebo na 1  
        case 0:
          lcd.noDisplay();
          count++;    
        break;
        case 1:
          lcd.display();
          count--; 
        break;
      }
      break;
        
      
    case 0:

    break;          // ak je stlačené iné tlačídlo ktoré nieje v zozname, display vypise UNKNOWN a vypise aj hodnotu kódu v HEX-a
    
      default:
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("UNKNOWN");
      lcd.setCursor(0, 1);
      lcd.print(incomming,HEX);
      Serial.println("Stlacil si EXIT");
      break;
  } 
  incomming = 0;    // stará hodnota signálu ovládača sa vynuluje
}

Popis funkcie + fotodokumentacia

Na obrazku je náhľad displeja: vľavo je to úvodna obrazovka pred stlačenim niektorého tlačídla, uprostred je chybové hlásenie pri stlačeni tlačídla ktoré nieje medzi zadefinovanými tlačídlami, v druhom riadku je zobrazený HEX-a kód tlačídla (pre malý počet znakov displeja ho nebolo možne zobraziť v desiatkovej sustave). V pravo je displej pri stlačeni tlačidla "0" a jeho HEX-a kód. 1.jpeg


Zobrazenie na displeji pre stlačené tlačidlá 1 - 9.


B1.jpg

B2.jpg

B3.jpg

Rozsvietenie Led tlacidlom "OK".

Led on.jpg

Led zhasneme tlacidlom "EXIT".

Led off.jpg