Operácie

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

Zo stránky SensorWiki

StudentDVPS (diskusia | príspevky)
StudentDVPS (diskusia | príspevky)
Riadok 61: Riadok 61:
</source>
</source>


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


<source lang="c">
<source lang="c">
Riadok 69: Riadok 70:
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 primanie signalu, nastavi primanie 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 ukladat vysledok dekodovania
long int incomming; // premnna do ktorej sa uklada hodnota PWM signalu z dialkoveho v desiatkovej sustave
long int incomming; // premnna do ktorej sa uklada hodnota signalu z dialkoveho v desiatkovej sustave


</source>
</source>


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


<source lang="c">
<source lang="c">
Riadok 81: Riadok 82:
{
{
   //Serial.begin(9600); // musi byt zakomentovane aby fungoval display, AK je odkomentovany tak NEFUNGUJE display
   //Serial.begin(9600); // musi byt zakomentovane aby fungoval display, AK je odkomentovany tak NEFUNGUJE display
   irrecv.enableIRIn(); // Start the receiver = inicializuje prijimanie signalu
   irrecv.enableIRIn(); // Start the receiver  
   Serial.println("ZADAJ VOLBU :"); // vypis na seriovu linku
   Serial.println("ZADAJ VOLBU :"); // vypis na seriovu linku - ked nieje použitý displej
   pinMode(LED,OUTPUT); // to je jasne
   pinMode(LED,OUTPUT); //  
    
    
     // set up the LCD's number of columns and rows:  
     // set up the LCD's number of columns and rows:  
Riadok 94: Riadok 95:
</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.
 


<source lang="c">
<source lang="c">


void loop() // hlavna slucka resp hlavny program
void loop() // hlavny program
{
{
   if (irrecv.decode(&results))  
   if (irrecv.decode(&results))  
Riadok 111: Riadok 111:
   
   
switch (incomming) { // porovnavanie hodnoty z incommingu na zaklade ktorej sa urcuje ktora akcia sa ma vykonat
switch (incomming) { // porovnavanie hodnoty z incommingu na zaklade ktorej sa urcuje ktora akcia sa ma vykonat
     case 1634762879: //kod signalu v decimalnej hodnote pre button 1 (teda ak bol stlaceny)
     case 1634762879: //kod signalu v decimalnej hodnote pre button 1 (teda ak bol stlaceny)
       Serial.println("Stlacil si 1"); // kontrolny vypis na seriovu linku ked este nefungoval display, teraz nefunguje pretoze na zaciatku je riadok Serial.begin(9600); zakomentovany
       Serial.println("Stlacil si 1"); // kontrolny vypis na seriovu linku ked este 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 poziciu 0, 0
       lcd.print("Button 1"); // vypis na display Button 1
       lcd.print("Button 1"); // vypis na display Button 1
       lcd.setCursor(0, 1);  //nastavenie kurzora na poziciu 0, 1
       lcd.setCursor(0, 1);  //nastavenie kurzora na poziciu 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 zobrazil pozadoavne cislo v decimalnom ci dokonca v binarnom tvare
       lcd.print(Button_1,HEX); // vypis hodnoty kodu sihanlu ktory posiela ovladat ale v HEXa tvare pretoze display ma malo miesta na to aby  
                                  zobrazil pozadoavne cislo v decimalnom ci dokonca v binarnom tvare
       break;
       break;
     case 1634746559:  // ostatne sa uz opakuje len sa deju ine funkcie
     case 1634746559:  // ostatne sa uz opakuje len sa deju ine funkcie
       Serial.println("Stlacil si 2");
       Serial.println("Stlacil si 2");
Riadok 127: Riadok 130:
       lcd.print(Button_2,HEX);
       lcd.print(Button_2,HEX);
       break;
       break;
     case 1634779199:
     case 1634779199:
       Serial.println("Stlacil si 3");
       Serial.println("Stlacil si 3");
Riadok 135: Riadok 139:
       lcd.print(Button_3,HEX);
       lcd.print(Button_3,HEX);
       break;
       break;
     case 1634738399:
     case 1634738399:
       Serial.println("Stlacil si 4");
       Serial.println("Stlacil si 4");
Riadok 143: Riadok 148:
       lcd.print(Button_4,HEX);
       lcd.print(Button_4,HEX);
       break;       
       break;       
     case 1634771039:
     case 1634771039:
       Serial.println("Stlacil si 5");
       Serial.println("Stlacil si 5");
Riadok 151: Riadok 157:
       lcd.print(Button_5,HEX);
       lcd.print(Button_5,HEX);
       break;
       break;
     case 1634754719:
     case 1634754719:
       Serial.println("Stlacil si 6");
       Serial.println("Stlacil si 6");
Riadok 159: Riadok 166:
       lcd.print(Button_6,HEX);
       lcd.print(Button_6,HEX);
       break;
       break;
     case 1634787359:
     case 1634787359:
       Serial.println("Stlacil si 7");
       Serial.println("Stlacil si 7");
Riadok 167: Riadok 175:
       lcd.print(Button_7,HEX);
       lcd.print(Button_7,HEX);
       break;
       break;
     case 1634734319:
     case 1634734319:
       Serial.println("Stlacil si 8");
       Serial.println("Stlacil si 8");
Riadok 175: Riadok 184:
       lcd.print(Button_8,HEX);
       lcd.print(Button_8,HEX);
       break;
       break;
     case 1634766959:
     case 1634766959:
       Serial.println("Stlacil si 9");
       Serial.println("Stlacil si 9");
Riadok 183: Riadok 193:
       lcd.print(Button_9,HEX);
       lcd.print(Button_9,HEX);
       break;       
       break;       
     case 1634730239:
     case 1634730239:
       Serial.println("Stlacil si 0");
       Serial.println("Stlacil si 0");
Riadok 191: Riadok 202:
       lcd.print(Button_0,HEX);
       lcd.print(Button_0,HEX);
       break;   
       break;   
     case 1634773079:
     case 1634773079:
       Serial.println("Stlacil si OK");
       Serial.println("Stlacil si OK");
Riadok 200: Riadok 212:
       lcd.print(Button_OK,HEX);
       lcd.print(Button_OK,HEX);
       break;
       break;
     case 1634764919:
     case 1634764919:
       Serial.println("Stlacil si EXIT");
       Serial.println("Stlacil si EXIT");
Riadok 209: Riadok 222:
       lcd.print(Button_EXIT,HEX);
       lcd.print(Button_EXIT,HEX);
       break;
       break;
     case 1634748599:
     case 1634748599:
       switch(count){ // tu je akcia ktora zapina alebo vypina display, teda meni sa hodnota count bud na 0 alebo na 1 (POWER tlacitko)
       switch(count){ // tu je akcia ktora zapina alebo vypina display, teda meni sa hodnota count bud na 0 alebo na 1 (POWER tlacitko)
Riadok 225: Riadok 239:
     case 0:
     case 0:
     //do nothing
     //do nothing
     break; // ak je stlacene ine tlacitko ktore sa nenachadza hore v zozname tak akcia nie je ziadna akurat display vypise UNKNOWN a vypise aj hodnotu kodu v HEXa
     break; // ak je stlacene ine tlacitko ktore sa nenachadza hore v zozname tak akcia nie je ziadna akurat display vypise UNKNOWN a vypise aj  
     default:
              hodnotu kodu v HEXa
      
default:
       lcd.clear();
       lcd.clear();
       lcd.setCursor(0, 0);
       lcd.setCursor(0, 0);

Verzia z 09:08, 1. 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.

Obr. Použitý IR príjimač PNA4601M

Zapojenie

Zapojenie je jednoduche keďže k doske pripájame len IR prijimač. Jeho pin č. 2 pripojime na GND pin č.3 na napajacie napätie 5V. Prvy pin slúži ako vystupný, pripojime ho na pin procesora, ktory nastavime ako vstupny.

Program

TU BY BOLO DOBRE NAPISAT PRECO ARDUINO...

Jednotlivé príkazy sú v programe okomentované preto sa budem venovať funkčným blokom kódu. Na začiatku programu sú "include-nuté" 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>                 // kniznica pre IR ovladace
#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 ktore sa pripaja display

Nasleduje "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 obrazku v kapitole Zapojenie. Použili sme long lebo kódy tlačidiel boli príliš dlhé pre použitie int.

long int Button_1 = 1634762879;          // kody konkretnych tlacitok v desiatkovej sustave ovladaca ORANGE
long int Button_2 = 1634746559;          // musi to byt typ long lebo int bol kratky  
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;       // premena pocitadka, kontrola ci uz je display zapnyty = 0 a ked vypnuty je 1

int LED = 13;   // pin na ktorom je zlta ledka
int RECV_PIN = 8; // pin na ktorom je zapojeny infra prijimac
IRrecv irrecv(RECV_PIN); // toto je trieda v kotrej je aj funkcia na primanie signalu, nastavi primanie na ten pin teda na 8
decode_results results; // meno premenej do ktorej sa bude ukladat vysledok dekodovania
long int incomming; // premnna do ktorej sa uklada hodnota signalu z dialkoveho v desiatkovej sustave

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

void setup() // tu zacina finkcia kotra zbehne iba raz ked sa zapne arduino 
{
  //Serial.begin(9600); // musi byt zakomentovane aby fungoval display, AK je odkomentovany tak NEFUNGUJE display
  irrecv.enableIRIn(); // Start the receiver 
  Serial.println("ZADAJ VOLBU :"); // vypis na seriovu linku - ked nieje použitý displej
  pinMode(LED,OUTPUT); // 
  
    // 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.clear();  // vymaze
  delay(500); // po vymazani pocka 0.5s
  // Print a message to the LCD.
  lcd.print("Cakam..."); // potom inicializ. vypise cakam ...
}

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.

void loop() // hlavny program
{
  if (irrecv.decode(&results)) 
  {
    Serial.println(results.value);
    incomming = (results.value);
    
    delay(500);
    irrecv.resume(); // Receive the next value
  } 
 
switch (incomming) { // porovnavanie hodnoty z incommingu na zaklade ktorej sa urcuje ktora akcia sa ma vykonat

    case 1634762879: //kod signalu v decimalnej hodnote pre button 1 (teda ak bol stlaceny)
      Serial.println("Stlacil si 1"); // kontrolny vypis na seriovu linku ked este nefungoval display
      lcd.clear(); // vymazanie 
      lcd.setCursor(0, 0); //nastavenie kurzora na poziciu 0, 0
      lcd.print("Button 1"); // vypis na display Button 1
      lcd.setCursor(0, 1);  //nastavenie kurzora na poziciu 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 
                                  zobrazil pozadoavne cislo v decimalnom ci dokonca v binarnom tvare
      break;

    case 1634746559:  // ostatne sa uz opakuje len sa deju ine 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"); // tu je akcia na viac, ktora zapne zltu ledku
      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"); // tu je akcia na viac, ktora vypne zltu ledku
      lcd.setCursor(0, 1);
      lcd.print(Button_EXIT,HEX);
      break;

    case 1634748599:
      switch(count){ // tu je akcia ktora zapina alebo vypina display, teda meni sa hodnota count bud na 0 alebo na 1 (POWER tlacitko)
        case 0:
          lcd.noDisplay();
          count++;    // count je teraz 1
        break;
        case 1:
          lcd.display();
          count--; // count sa zmeni z 1 na 0
        break;
      }
      break;
        
      
    case 0:
    //do nothing
    break; // ak je stlacene ine tlacitko ktore sa nenachadza hore v zozname tak akcia nie je ziadna akurat display vypise UNKNOWN a vypise aj 
              hodnotu kodu v HEXa
    
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; // na konci slucky sa stara hodnota siganlu ovladaca vynuluje
}

Popis funkcie + fotodokumentacia

Obr.

Na Obr. 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 "1" a jeho hexa kód.