Operácie

Infračervený vypínač s ATtiny45: Rozdiel medzi revíziami

Zo stránky SensorWiki

StudentMIPS (diskusia | príspevky)
Bez shrnutí editace
StudentMIPS (diskusia | príspevky)
Riadok 30: Riadok 30:


=== Algoritmus a program ===
=== Algoritmus a program ===
 
Na začiatku zadefinujeme vystupy pre tlacidlo  (PD2), zabudovanu LED diodu (PB5), IR diodu PD3, kvôli tomu, že je to pin pre PWM signal. Ďalej zadafinujeme časové konštanty pre NEC protokol, ktore urcuje trvanie vysielania signalu. Ďalej funkcia mark zapína/vypína pin, ktorý simuluje 38khz signal, funkcia doba po ktoru je led dioda, sendNEC vysiela 32 bitovy IR kod v NEC formate. Následne v maine nastavime vsetky piny ako vystup a privolanie zadefinovanych funkcii.  
Algoritmus programu využíva toto a toto, základné funkcie sú takéto a voláma ich tuto...
Výpis kódu je nižšie...
 


<tabs>
<tabs>

Verzia z 22:35, 12. jún 2025

Záverečný projekt predmetu MIPS / LS2025 - Meno Priezvisko


Zadanie

Cieľom môjho zadania bolo vytvoriť program, ktorý umožní vysielať špecialny kód, ktorý budeme vysielať pomocou IR diody.


Infračerveny ovladač s ATtiny45

Literatúra:


Analýza a opis riešenia

Najdôležitejšou ulohou pri tomto zadaní bolo vygenerovať NEC protokol taky pomocou, ktorého vieme ovladať ľubovoľné zariadenie pomocou IR signálu. NEC protokol je jeden z najrozšírenejších IR diaľkových protokolov používaných na ovládanie spotrebičov Využíva 38 kHz nosnú a pulznú moduláciu na kódovanie binárnych dát. Tento signal vytvorime pomocou IR diody:

IR dioda

Na to aby sme mohli niečo ovládať potrebujeme poslať 32 bitovy kod, ktorý ma napr. takyto tvar (0xBF40 FF00) kde 0xBF je adressa prijimacieho zariadenia 0x40 bitova negacia(kontrola) 0xFF prikaz, ktorý ma zariadenia vykonať 0x00 ďalšia kontrola. Spolu to tvorí 32-bitový kód. Dvojitá kontrola zabezpečí, že prijímač rozpozná chybu, ak sa nezhodujú (napr. z poruchy alebo rušenia).

NEC IR protokol

Ako prijimač som si zvolil rele:

IR rele ON/OFF 5V

Pre zistenie kodu sme použili program putty, ktorý po odoslaní kodu z pribaleneho ovladača prečital daný kod (0xBF40FF00). Požili sme na to IR prijimač

IR prijímač AX-1838HS
Schéma zapojenia.


Algoritmus a program

Na začiatku zadefinujeme vystupy pre tlacidlo (PD2), zabudovanu LED diodu (PB5), IR diodu PD3, kvôli tomu, že je to pin pre PWM signal. Ďalej zadafinujeme časové konštanty pre NEC protokol, ktore urcuje trvanie vysielania signalu. Ďalej funkcia mark zapína/vypína pin, ktorý simuluje 38khz signal, funkcia doba po ktoru je led dioda, sendNEC vysiela 32 bitovy IR kod v NEC formate. Následne v maine nastavime vsetky piny ako vystup a privolanie zadefinovanych funkcii.

/*
Simple NEC IR sender with button on ATmega328P (Arduino Uno hardware) in AVR C
Wiring:
  - IR LED anode via 100? resistor to PD3, cathode to GND
  - Pushbutton: one side to PD2, other to GND (use internal pull-up)
  - Indicator LED anode via 330? resistor to PB5 (Arduino pin 13), cathode to GND
  - F_CPU = 16 MHz
*/

#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>

// --- Definícia pinov ---
#define IR_DDR   DDRD
#define IR_PORT  PORTD
#define IR_PIN   3       // PD3 pre IR LED

#define BTN_DDR   DDRD
#define BTN_PORT  PORTD
#define BTN_PINR  PIND
#define BTN_PIN   2      // PD2 pre tlačidlo

#define LED_DDR   DDRB
#define LED_PORT  PORTB
#define LED_PIN   5      // PB5 (Arduino pin 13) pre indikáciu

// Časovania protokolu NEC (v mikrosekundách)
#define NEC_HDR_MARK  9000
#define NEC_HDR_SPACE 4500
#define NEC_BIT_MARK   562
#define NEC_ONE_SPACE 1688
#define NEC_ZERO_SPACE 562
#define NEC_RPT_SPACE 2250

// 32-bitový kód, ktorý sa bude odosielať
#define MY_CODE 0xBF40FF00

// Funkcia na vyslanie "mark" (38 kHz nosnej) po dobu "us" µs
static void mark(uint16_t us) {
    // kmitočet ~38 kHz: perioda ~26 µs, polperióda ~13 µs
    uint16_t cycles = us / 26;
    while (cycles--) {
        IR_PORT |= (1 << IR_PIN);
        _delay_us(13);
        IR_PORT &= ~(1 << IR_PIN);
        _delay_us(13);
    }
}

// Funkcia na vyslanie "space" (vypnutá LED) po dobu "us" µs
static void space(uint16_t us) {
    IR_PORT &= ~(1 << IR_PIN);
    while (us--) {
        _delay_us(1);
    }
}

// Funkcia na odoslanie 32-bitového NEC kódu
static void sendNEC(uint32_t code) {
    // úvodný rámec (header)
    mark(NEC_HDR_MARK);
    space(NEC_HDR_SPACE);
    // odosielanie bitov LSB ako prvé
    for (uint8_t i = 0; i < 32; i++) {
        mark(NEC_BIT_MARK);
        if (code & 1) {
            space(NEC_ONE_SPACE);
        } else {
            space(NEC_ZERO_SPACE);
        }
        code >>= 1;
    }
    // záverečný "mark"
    mark(NEC_BIT_MARK);
    IR_PORT &= ~(1 << IR_PIN);
}

int main(void) {
    // nastavenie GPIO: IR LED výstup
    IR_DDR |= (1 << IR_PIN);
    // tlačidlo vstup s interným pull-up
    BTN_DDR &= ~(1 << BTN_PIN);
    BTN_PORT |= (1 << BTN_PIN);
    // indikácia LED výstup
    LED_DDR |= (1 << LED_PIN);
    LED_PORT &= ~(1 << LED_PIN);

    while (1) {
        // čakanie na stlačenie tlačidla (aktívne LOW)
        if (!(BTN_PINR & (1 << BTN_PIN))) {
            _delay_ms(50);  // eliminácia odrazu (debounce)
            if (!(BTN_PINR & (1 << BTN_PIN))) {
                // odoslanie NEC kódu
                sendNEC(MY_CODE);
                // krátke zobrazenie výsledku na LED
                LED_PORT |= (1 << LED_PIN);
                _delay_ms(200);
                LED_PORT &= ~(1 << LED_PIN);
                // počkaj na uvoľnenie tlačidla
                while (!(BTN_PINR & (1 << BTN_PIN)));
                _delay_ms(50);
            }
        }
    }
    return 0;
}

Zdrojovz kod projektu: Zdrojový kód: zdrojaky.zip

Overenie

Pre overenie funkcionality som pripojili tlacidlo na PD2 pomocou, ktorého ovládame IR diodu. Ako dalsie sme pripojili testovacie rele na napajanie 5V. Pomocou tlacidla vysleme kod, ktory zopina rele. Ďalej sme to testovali na Arduino Uno pretože ATtiny45 nedisponuje funkciou nahravania programu do pamäte (je potrebné ho napáliť).

Realne zapojenie obvodu

Video:



Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.