Infračervený vypínač s ATtiny45: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
|||
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. | |||
<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.

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:

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

Ako prijimač som si zvolil rele:

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č


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ť).

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