Operácie

Hracia kocka s LED: Rozdiel medzi revíziami

Zo stránky SensorWiki

StudentMIPS (diskusia | príspevky)
StudentMIPS (diskusia | príspevky)
 
(17 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 - '''Meno Priezvisko'''
Záverečný projekt predmetu MIPS / LS2025 - '''Ilona Baihildina'''




Riadok 5: Riadok 5:


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


Opíšte sem čo a ako ste spravili, ak treba, doplňte obrázkami...
Podrobne opíšte použité komponenty (okrem základnej dosky s ATmega328P procesorom), pridajte linky na datasheety alebo opis obvodu.


[[Súbor:GeminiAI-image3.jpg|400px|thumb|center|Celkový pohľad na zariadenie.]]
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


Nezabudnite doplniť schému zapojenia! V texte by ste mali opísať základné veci zo zapojenia, samotná schéma nie je dostačujúci opis.
[[Súbor:Photo_2025-06-24_02-02-30.jpg|400px|thumb|center|Aplikácia.]]


[[Súbor:GeminiAI-image2.jpg|400px|thumb|center|Schéma zapojenia.]]
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 ===
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>
<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();
  unsigned int measuredValue;
 
    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;


  while (1)
        if (button_state && last_button) {
  {
            uint8_t rand_num = (rand() % 6) + 1;  // ?? 1 ?? 6
    /*  relax  */
            set_leds(rand_num);
  }
            _delay_ms(200);  // ???????????
        }


  return(0);
        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="filename.h"><syntaxhighlight  lang="c++" style="background: LightYellow;">
<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 adc_init(void);                                   // A/D converter initialization
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;
}


unsigned int adc_read(char a_pin);
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>


Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x ''zdrojaky.zip'':


Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]
Zdrojový kód: [[Médiá:Proj ilona.atsln.zip|Proj ilona.atsln.zip]]


=== Overenie ===
=== Overenie ===


Ako ste overili funkciu, napríklad... Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia.  
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.
Na konci uvádzame fotku hotového zariadenia.
 
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.
 


[[Súbor:GeminiAI-image1.jpg|400px|thumb|center|Aplikácia.]]


'''Video:'''
'''Video:'''

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.

Vývojová doska ACROB.

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

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