Hracia kocka s LED: Rozdiel medzi revíziami
Zo stránky SensorWiki
 Vytvorená stránka „Záverečný projekt predmetu MIPS / LS2025 - '''Meno Priezvisko'''   == Zadanie ==  Sem príde text zadania, ak bolo len voľne formulované, rozpíšte ho podrobnejšie  400px|thumb|center|Vývojová doska ACROB.  '''Literatúra:'''  * [http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description Dokumentácia k doske Acrob] * [http://www.humanbenchmark.com/tests/reactiontime/index.php Vyskúšajte si zmerať reakciu on-line]…“  | 
				|||
| (19 medziľahlých úprav od rovnakého používateľa nie je zobrazených.) | |||
| Riadok 1: | Riadok 1: | ||
Záverečný projekt predmetu MIPS / LS2025 - '''  | Záverečný projekt predmetu MIPS / LS2025 - '''Ilona Baihildina'''  | ||
== Zadanie ==  | == Zadanie ==  | ||
V tomto projekte používam mikrokontrolér ATmega328P, ku ktorému je pripojených 7 LED diód a jedno tlačidlo. LED diódy sú pripojené k portom B a D. Po stlačení tlačidla sa vygeneruje náhodné číslo od 1 do 6 a podľa toho sa rozsvietia presne definované kombinácie LED diód.  | |||
Po zapnutí zariadenia a stlačení tlačidla sa zobrazí nové náhodné číslo prostredníctvom svietenia konkrétnych LED diód. Každé číslo má vlastnú unikátnu kombináciu svietiacich diód. Projekt demonštruje prácu s náhodnými číslami, digitálnymi výstupmi a čítaním stavu tlačidla v jazyku C v prostredí AVR Studio.  | |||
[[Obrázok:ard.jpg|400px|thumb|center|Vývojová doska ACROB.]]  | [[Obrázok:ard.jpg|400px|thumb|center|Vývojová doska ACROB.]]  | ||
| Riadok 16: | Riadok 17: | ||
== Analýza  a opis riešenia ==  | == Analýza  a opis riešenia ==  | ||
 • LED diódy sú nakonfigurované ako výstupné piny pomocou DDRx registrov.  | |||
 • Tlačidlo je pripojené na vstupný pin PD0, so zapnutým vnútorným pull-up rezistorom.  | |||
 • Kód využíva funkciu srand() na inicializáciu generovania náhodných hodnôt a rand() na výber čísla.  | |||
 • Každé číslo je ošetrené cez switch-case, kde sa podľa hodnoty nastavujú výstupné stavy na jednotlivé piny.  | |||
 • Pridaný je aj jednoduchý anti-drebezgový delay (200 ms) po každom stlačení tlačidla.  | |||
Použité komponenty   | |||
 • 1× mikrokontrolér ATmega328P   | |||
 • 7× LED dióda (ľubovoľnej farby)  | |||
 • 7× rezistor 220–330 Ω (zapojené v sérii s LED diódami)  | |||
 • 1× tlačidlo (spínač, push-button)  | |||
 • 1× doska s prepojeniami (breadboard) – nepájivé pole  | |||
 • Prepojovacie vodiče (jumper wires) – muž–muž  | |||
 • Zdroj napájania (napr. cez USB alebo externý 5V adaptér)  | |||
 • (voliteľne) Kondenzátor a externý oscilátor 16 MHz – ak nepoužívaš Arduino Uno a máš čistý čip  | |||
[[Súbor:Photo_2025-06-24_02-02-30.jpg|400px|thumb|center|Aplikácia.]]  | |||
Každá LED dióda je zapojená cez rezistor do výstupného pinu mikrokontroléra a druhou stranou do GND. Tlačidlo je zapojené medzi pin PD0 a GND, pričom v kóde je aktivovaný interný pull-up rezistor.  | |||
=== Algoritmus a program ===  | === Algoritmus a program ===  | ||
<tabs>  | <tabs>  | ||
<tab name="AVR C-code"><syntaxhighlight  lang="c++" style="background: LightYellow;">  | <tab name="AVR C-code"><syntaxhighlight  lang="c++" style="background: LightYellow;">  | ||
#define F_CPU 16000000UL  | |||
#include <avr/io.h>  | #include <avr/io.h>  | ||
#include <util/delay.h>  | |||
#include <stdlib.h>  | |||
void setup() {  | |||
    DDRB |= (1 << PB5) | (1 << PB4) | (1 << PB3) | (1 << PB0);  | |||
    DDRD |= (1 << PD7) | (1 << PD6) | (1 << PD5);  | |||
    DDRD &= ~(1 << PD4);     // PD0 ??? ????  | |||
    PORTD |= (1 << PD4);     // ???????? ????????  | |||
    srand(ADC);  // ????????????? ?????????? ????????? ?????  | |||
}  | |||
void clear_leds() {  | |||
    PORTB &= ~((1 << PB5) | (1 << PB4) | (1 << PB3) | (1 << PB0));  | |||
    PORTD &= ~((1 << PD7) | (1 << PD6) | (1 << PD5));  | |||
}  | |||
int main(void)  | void set_leds(uint8_t number) {  | ||
{  |     clear_leds();  | ||
    switch (number) {  | |||
        case 1:  | |||
            PORTD |= (1 << PD6);  | |||
            break;  | |||
        case 2:  | |||
            PORTB |= (1 << PB5);  | |||
            PORTD |= (1 << PD5);  | |||
            break;  | |||
        case 3:  | |||
            PORTB |= (1 << PB0) | (1 << PB3);  | |||
            PORTD |= (1 << PD6);  | |||
            break;  | |||
        case 4:  | |||
            PORTB |= (1 << PB5) | (1 << PB3) | (1 << PB0);  | |||
            PORTD |= (1 << PD5);  | |||
            break;  | |||
        case 5:  | |||
            PORTB |= (1 << PB5) | (1 << PB3) | (1 << PB0);  | |||
            PORTD |= (1 << PD5) | (1 << PD6);  | |||
            break;  | |||
        case 6:  | |||
            PORTB |= (1 << PB5) | (1 << PB4) | (1 << PB3) | (1 << PB0);  | |||
            PORTD |= (1 << PD5) | (1 << PD7);  | |||
            break;  | |||
        default:  | |||
            break;  | |||
    }  | |||
}  | |||
int main(void) {  | |||
    setup();  | |||
    uint8_t last_button = 1;  | |||
    while (1) {  | |||
        uint8_t button_state = (PIND & (1 << PD4)) == 0;  | |||
        if (button_state && last_button) {  | |||
            uint8_t rand_num = (rand() % 6) + 1;  // ?? 1 ?? 6  | |||
            set_leds(rand_num);  | |||
            _delay_ms(200);  // ???????????  | |||
        }  | |||
        last_button = button_state;  | |||
    }  | |||
}  | }  | ||
</syntaxhighlight ></tab>  | |||
<tab name="uart.h"><syntaxhighlight  lang="c++" style="background: LightYellow;">  | |||
#ifndef UART_H  | |||
#define UART_H  | |||
void uart_init(void);  | |||
void uart_putc(char c);  | |||
void uart_puts(const char *s);  | |||
char uart_getc(void);  | |||
#endif // UART_H  | |||
</syntaxhighlight ></tab>  | </syntaxhighlight ></tab>  | ||
<tab name="  | <tab name="uart.c"><syntaxhighlight  lang="c++" style="background: LightYellow;">  | ||
#include <avr/io.h>  | #include <avr/io.h>  | ||
#include <util/setbaud.h>  | |||
#include "uart.h"  | |||
void uart_init(void)   | |||
{  | |||
    UBRR0H = UBRRH_VALUE;  | |||
    UBRR0L = UBRRL_VALUE;  | |||
#if USE_2X  | |||
    UCSR0A |= _BV(U2X0);  | |||
#else  | |||
    UCSR0A &= ~(_BV(U2X0));  | |||
#endif  | |||
    UCSR0C = _BV(UCSZ01) | _BV(UCSZ00); /* 8-bit data */  | |||
    UCSR0B = _BV(RXEN0) | _BV(TXEN0);   /* Enable RX and TX */  | |||
}  | |||
void   | void uart_putc(char c)   | ||
{  | |||
    if (c == '\n')   | |||
    {  | |||
        uart_putc('\r');  | |||
    }  | |||
    loop_until_bit_is_set(UCSR0A, UDRE0); /* Wait until data register empty. */  | |||
    UDR0 = c;  | |||
}  | |||
void uart_puts(const char *s)  | |||
{  | |||
    while (*s) {  | |||
        uart_putc(*s);  | |||
        s++;  | |||
    }  | |||
}  | |||
char uart_getc(void)   | |||
{  | |||
    loop_until_bit_is_set(UCSR0A, RXC0); /* Wait until data exists. */  | |||
    return UDR0;  | |||
}  | |||
</syntaxhighlight ></tab>  | </syntaxhighlight ></tab>  | ||
</tabs>  | </tabs>  | ||
Zdrojový kód: [[Médiá:  | Zdrojový kód: [[Médiá:Proj ilona.atsln.zip|Proj ilona.atsln.zip]]  | ||
=== Overenie ===  | === Overenie ===  | ||
Po nahratí programu do mikrokontroléra som otestovala správnu funkciu systému pomocou opakovaného stláčania tlačidla. Pri každom stlačení sa mal zobraziť nový náhodný výsledok — číslo od 1 do 6 — ktorý sa zobrazuje ako určitá kombinácia svietiacich LED diód.  | |||
Každé číslo je zobrazené špecifickým spôsobom, ktorý vizuálne pripomína usporiadanie bodiek na klasickej hracej kocke. Napríklad:  | |||
 • 1 → stredná LED  | |||
 • 2 → dve diagonálne LED  | |||
 • 3 → stredná + diagonály  | |||
 • 4, 5, 6 → ako na skutočnej kocke – LED rozmiestnené symetricky  | |||
Opakovane som testovala stláčanie tlačidla, pričom som pozorovala, či zvolený počet a umiestnenie LED diód zodpovedá správnemu číslu. Projekt fungoval podľa očakávania a každé číslo malo svoju správnu kombináciu svetiel.  | |||
'''Video:'''  | '''Video:'''  | ||
<center><youtube>  | <center><youtube>https://youtu.be/bHsVtmPYXk0</youtube></center>  | ||
Aktuálna revízia z 10:13, 24. jún 2025
Záverečný projekt predmetu MIPS / LS2025 - Ilona Baihildina
Zadanie
V tomto projekte používam mikrokontrolér ATmega328P, ku ktorému je pripojených 7 LED diód a jedno tlačidlo. LED diódy sú pripojené k portom B a D. Po stlačení tlačidla sa vygeneruje náhodné číslo od 1 do 6 a podľa toho sa rozsvietia presne definované kombinácie LED diód. Po zapnutí zariadenia a stlačení tlačidla sa zobrazí nové náhodné číslo prostredníctvom svietenia konkrétnych LED diód. Každé číslo má vlastnú unikátnu kombináciu svietiacich diód. Projekt demonštruje prácu s náhodnými číslami, digitálnymi výstupmi a čítaním stavu tlačidla v jazyku C v prostredí AVR Studio.

Literatúra:
Analýza a opis riešenia
• LED diódy sú nakonfigurované ako výstupné piny pomocou DDRx registrov. • Tlačidlo je pripojené na vstupný pin PD0, so zapnutým vnútorným pull-up rezistorom. • Kód využíva funkciu srand() na inicializáciu generovania náhodných hodnôt a rand() na výber čísla. • Každé číslo je ošetrené cez switch-case, kde sa podľa hodnoty nastavujú výstupné stavy na jednotlivé piny. • Pridaný je aj jednoduchý anti-drebezgový delay (200 ms) po každom stlačení tlačidla.
Použité komponenty 
• 1× mikrokontrolér ATmega328P • 7× LED dióda (ľubovoľnej farby) • 7× rezistor 220–330 Ω (zapojené v sérii s LED diódami) • 1× tlačidlo (spínač, push-button) • 1× doska s prepojeniami (breadboard) – nepájivé pole • Prepojovacie vodiče (jumper wires) – muž–muž • Zdroj napájania (napr. cez USB alebo externý 5V adaptér) • (voliteľne) Kondenzátor a externý oscilátor 16 MHz – ak nepoužívaš Arduino Uno a máš čistý čip

Každá LED dióda je zapojená cez rezistor do výstupného pinu mikrokontroléra a druhou stranou do GND. Tlačidlo je zapojené medzi pin PD0 a GND, pričom v kóde je aktivovaný interný pull-up rezistor.
Algoritmus a program
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
void setup() {
    DDRB |= (1 << PB5) | (1 << PB4) | (1 << PB3) | (1 << PB0);
    DDRD |= (1 << PD7) | (1 << PD6) | (1 << PD5);
    DDRD &= ~(1 << PD4);     // PD0 ??? ????
    PORTD |= (1 << PD4);     // ???????? ????????
    srand(ADC);  // ????????????? ?????????? ????????? ?????
}
void clear_leds() {
    PORTB &= ~((1 << PB5) | (1 << PB4) | (1 << PB3) | (1 << PB0));
    PORTD &= ~((1 << PD7) | (1 << PD6) | (1 << PD5));
}
void set_leds(uint8_t number) {
    clear_leds();
    switch (number) {
        case 1:
            PORTD |= (1 << PD6);
            break;
        case 2:
            PORTB |= (1 << PB5);
            PORTD |= (1 << PD5);
            break;
        case 3:
            PORTB |= (1 << PB0) | (1 << PB3);
            PORTD |= (1 << PD6);
            break;
        case 4:
            PORTB |= (1 << PB5) | (1 << PB3) | (1 << PB0);
            PORTD |= (1 << PD5);
            break;
        case 5:
            PORTB |= (1 << PB5) | (1 << PB3) | (1 << PB0);
            PORTD |= (1 << PD5) | (1 << PD6);
            break;
        case 6:
            PORTB |= (1 << PB5) | (1 << PB4) | (1 << PB3) | (1 << PB0);
            PORTD |= (1 << PD5) | (1 << PD7);
            break;
        default:
            break;
    }
}
int main(void) {
    setup();
    uint8_t last_button = 1;
    while (1) {
        uint8_t button_state = (PIND & (1 << PD4)) == 0;
        if (button_state && last_button) {
            uint8_t rand_num = (rand() % 6) + 1;  // ?? 1 ?? 6
            set_leds(rand_num);
            _delay_ms(200);  // ???????????
        }
        last_button = button_state;
    }
}
#ifndef UART_H
#define UART_H
void uart_init(void);
void uart_putc(char c);
void uart_puts(const char *s);
char uart_getc(void);
#endif // UART_H
#include <avr/io.h>
#include <util/setbaud.h>
#include "uart.h"
void uart_init(void) 
{
    UBRR0H = UBRRH_VALUE;
    UBRR0L = UBRRL_VALUE;
#if USE_2X
    UCSR0A |= _BV(U2X0);
#else
    UCSR0A &= ~(_BV(U2X0));
#endif
    UCSR0C = _BV(UCSZ01) | _BV(UCSZ00); /* 8-bit data */
    UCSR0B = _BV(RXEN0) | _BV(TXEN0);   /* Enable RX and TX */
}
void uart_putc(char c) 
{
    if (c == '\n') 
    {
        uart_putc('\r');
    }
    loop_until_bit_is_set(UCSR0A, UDRE0); /* Wait until data register empty. */
    UDR0 = c;
}
void uart_puts(const char *s)
{
    while (*s) {
        uart_putc(*s);
        s++;
    }
}
char uart_getc(void) 
{
    loop_until_bit_is_set(UCSR0A, RXC0); /* Wait until data exists. */
    return UDR0;
}
 
Zdrojový kód: Proj ilona.atsln.zip
Overenie
Po nahratí programu do mikrokontroléra som otestovala správnu funkciu systému pomocou opakovaného stláčania tlačidla. Pri každom stlačení sa mal zobraziť nový náhodný výsledok — číslo od 1 do 6 — ktorý sa zobrazuje ako určitá kombinácia svietiacich LED diód.
Každé číslo je zobrazené špecifickým spôsobom, ktorý vizuálne pripomína usporiadanie bodiek na klasickej hracej kocke. Napríklad:
• 1 → stredná LED • 2 → dve diagonálne LED • 3 → stredná + diagonály • 4, 5, 6 → ako na skutočnej kocke – LED rozmiestnené symetricky
Opakovane som testovala stláčanie tlačidla, pričom som pozorovala, či zvolený počet a umiestnenie LED diód zodpovedá správnemu číslu. Projekt fungoval podľa očakávania a každé číslo malo svoju správnu kombináciu svetiel.
Video:
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.