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.