Klávesnica 2x3: Rozdiel medzi revíziami
Z SensorWiki
(Vytvorená stránka „Záverečný projekt predmetu MIPS / LS2023 - '''Meno Priezvisko''' == Zadanie == Sem príde text zadania, ak bolo len voľne formulované, rozpíšte ho podrobnejši…“) |
|||
Riadok 1: | Riadok 1: | ||
− | Záverečný projekt predmetu MIPS / LS2023 - ''' | + | Záverečný projekt predmetu MIPS / LS2023 - '''Filip Viest''' |
== Zadanie == | == Zadanie == | ||
− | + | Cielom zadania je pripojiť 2x3 klávesnicu na dosku Arudino UNO R3, s funkciou zapnutia built-in LED dioódy pomoocu stlačenia jedného tlačídka | |
− | [[Obrázok: | + | [[Obrázok:ViestOBRArduino.jpg|400px|thumb|center|Doska Arduino UNO R3.]] |
'''Literatúra:''' | '''Literatúra:''' | ||
− | * [ | + | * [https://docs.arduino.cc/resources/datasheets/A000066-datasheet.pdf Dokumentácia k doske Arduino UNO R3] |
− | |||
Riadok 17: | Riadok 16: | ||
== Analýza a opis riešenia == | == Analýza a opis riešenia == | ||
− | + | Každý pin klávesnice som pripojil na samostatný pin dosky PD2 až PD7 + GND pin. Ku klávesnici nebola dostupná žiadna dokumentácia, takže pre priradeníe pinu k tlačídku som musel použiť multimeter. | |
− | [[Súbor: | + | [[Súbor:ViestOBRklavesnica.jpg|400px|thumb|center|Klávesnica 2x3.]] |
− | + | Schéma zapojenia | |
− | [[Súbor: | + | [[Súbor:ViestOBRschema.jpg|400px|thumb|center|Schéma zapojenia.]] |
=== Algoritmus a program === | === Algoritmus a program === | ||
− | + | Na projekt som nepoužil dodatočné knižnice (len avr/io a uart). Do premennej const uint8_t button_pins somm vložil použité piny vo forme matice. Funkcia void init_buttons má za úlohu definovať piny ako výstupné. scan_buttons má za úlohu čítať piny ako maticu a identifikovať, ktoré tlačídko je stlačené. Samotné vypisovanie do Serial je zabezpečené vo while v main, tu je aj podmienka pre zapnutie LED diódy v prípade stlačenia tlačídka "1". delay(170) slúži na debouncenutie tlačídka, je to nastavené na práve 170 milisekúnd lebo pri takom čase som našiel, že tlačídko sa vpíše práve jedenkrát. | |
<tabs> | <tabs> | ||
<tab name="AVR C-code"><source lang="c++" style="background: LightYellow;"> | <tab name="AVR C-code"><source lang="c++" style="background: LightYellow;"> | ||
+ | // Zahrnutie kniznic | ||
#include <avr/io.h> | #include <avr/io.h> | ||
+ | #include "uart.h" | ||
− | + | #include <stdio.h> | |
− | { | + | FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE); |
− | + | ||
+ | // Definovanie tlacidok na piny formou matice | ||
+ | const uint8_t button_pins[2][3] = { | ||
+ | {2, 3, 4}, // Rad 1 | ||
+ | {5, 6, 7} // Rad 2 | ||
+ | }; | ||
− | + | #define LED_PIN PB5 // Definovanie pinu PB5 na vnutornu LEDku | |
− | |||
− | |||
− | |||
− | + | // Inicializacia pinov ako vstupy, pull-up resistor zapnuty | |
+ | void init_buttons() { | ||
+ | for (int i = 0; i < 2; i++) { // Citanie pinov formou matice | ||
+ | for (int j = 0; j < 3; j++) { | ||
+ | DDRD &= ~(1 << button_pins[i][j]); | ||
+ | PORTD |= (1 << button_pins[i][j]); | ||
+ | } | ||
+ | } | ||
+ | DDRB |= (1 << LED_PIN); // Nastav LED pin ako output | ||
} | } | ||
− | </ | + | // Funkcia na citanie stlaceneho tlacidka |
− | < | + | char scan_buttons() { |
− | + | static char last_button = '\0'; // Zapamataj si naposledy stlacene tlacidko | |
+ | if (!(PIND & (1 << button_pins[0][0]))){ // Pri stlaceni 1 vrat 1 | ||
+ | return '1'; | ||
+ | } | ||
+ | |||
+ | // Skenuj kazde tlacidko dokym nenajdes jedno stlacene | ||
+ | for (int i = 0; i < 2; i++) { | ||
+ | for (int j = 0; j < 3; j++) { | ||
+ | if (!(PIND & (1 << button_pins[i][j]))) { | ||
+ | // Nasiel stlacene tlacidko | ||
+ | char button = '1' + i*3 + j; // Vypocet cisla tlacidka podla pinu | ||
+ | if (last_button != button) { | ||
+ | last_button = button; | ||
+ | return last_button; // Ak sa naposledy stlacene tlacidko nerovna momentalne stlacenemu, prepis to | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Ziadne tlacidko nebolo stlacene, zresetuj last_button a vrat '\0' | ||
+ | last_button = '\0'; | ||
+ | |||
+ | return '\0'; | ||
+ | } | ||
− | void | + | |
− | + | int main(void) | |
− | + | { | |
+ | // Inicializacia kniznic | ||
+ | hw_init(); | ||
+ | uart_init(); | ||
+ | |||
+ | init_buttons(); | ||
+ | |||
+ | stdout = &mystdout; | ||
+ | |||
+ | while (1) { | ||
+ | char button = scan_buttons(); // Skenuj stlacenie tlacidok v nekonecnej slucke a zapis do button | ||
+ | if (button == '1') { // Ked identifikoval 1, zapni LED | ||
+ | PORTB |= (1 << LED_PIN); | ||
+ | } | ||
+ | else { | ||
+ | PORTB &= ~(1 << LED_PIN); // Ak nie je stlacena 1, vypni LED | ||
+ | } | ||
+ | if (button != '\0'){ // Ak je nejake tlacidko stlacene, vypis jeho cislo do Serial | ||
+ | printf("%c\n", button); | ||
+ | delay(170); // Delay na debouncenutie tlacidka | ||
+ | } | ||
+ | } | ||
+ | |||
+ | return(0); | ||
+ | } | ||
</source></tab> | </source></tab> | ||
− | </tabs> | + | </tabs> |
− | + | Zdrojový kód: [[Médiá:ViestFilipMIPSprojekt.zip|zdrojaky.zip]] | |
− | |||
− | Zdrojový kód: [[Médiá: | ||
=== Overenie === | === Overenie === | ||
− | |||
− | |||
− | |||
− | |||
'''Video:''' | '''Video:''' | ||
− | <center><youtube> | + | <center><youtube>https://youtu.be/1kezqjxdfJQ</youtube></center> |
− | |||
− | |||
[[Category:AVR]] [[Category:MIPS]] | [[Category:AVR]] [[Category:MIPS]] |
Aktuálna revízia z 15:35, 19. máj 2024
Záverečný projekt predmetu MIPS / LS2023 - Filip Viest
Zadanie
Cielom zadania je pripojiť 2x3 klávesnicu na dosku Arudino UNO R3, s funkciou zapnutia built-in LED dioódy pomoocu stlačenia jedného tlačídka
Literatúra:
Analýza a opis riešenia
Každý pin klávesnice som pripojil na samostatný pin dosky PD2 až PD7 + GND pin. Ku klávesnici nebola dostupná žiadna dokumentácia, takže pre priradeníe pinu k tlačídku som musel použiť multimeter.
Schéma zapojenia
Algoritmus a program
Na projekt som nepoužil dodatočné knižnice (len avr/io a uart). Do premennej const uint8_t button_pins somm vložil použité piny vo forme matice. Funkcia void init_buttons má za úlohu definovať piny ako výstupné. scan_buttons má za úlohu čítať piny ako maticu a identifikovať, ktoré tlačídko je stlačené. Samotné vypisovanie do Serial je zabezpečené vo while v main, tu je aj podmienka pre zapnutie LED diódy v prípade stlačenia tlačídka "1". delay(170) slúži na debouncenutie tlačídka, je to nastavené na práve 170 milisekúnd lebo pri takom čase som našiel, že tlačídko sa vpíše práve jedenkrát.
// Zahrnutie kniznic
#include <avr/io.h>
#include "uart.h"
#include <stdio.h>
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE);
// Definovanie tlacidok na piny formou matice
const uint8_t button_pins[2][3] = {
{2, 3, 4}, // Rad 1
{5, 6, 7} // Rad 2
};
#define LED_PIN PB5 // Definovanie pinu PB5 na vnutornu LEDku
// Inicializacia pinov ako vstupy, pull-up resistor zapnuty
void init_buttons() {
for (int i = 0; i < 2; i++) { // Citanie pinov formou matice
for (int j = 0; j < 3; j++) {
DDRD &= ~(1 << button_pins[i][j]);
PORTD |= (1 << button_pins[i][j]);
}
}
DDRB |= (1 << LED_PIN); // Nastav LED pin ako output
}
// Funkcia na citanie stlaceneho tlacidka
char scan_buttons() {
static char last_button = '\0'; // Zapamataj si naposledy stlacene tlacidko
if (!(PIND & (1 << button_pins[0][0]))){ // Pri stlaceni 1 vrat 1
return '1';
}
// Skenuj kazde tlacidko dokym nenajdes jedno stlacene
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
if (!(PIND & (1 << button_pins[i][j]))) {
// Nasiel stlacene tlacidko
char button = '1' + i*3 + j; // Vypocet cisla tlacidka podla pinu
if (last_button != button) {
last_button = button;
return last_button; // Ak sa naposledy stlacene tlacidko nerovna momentalne stlacenemu, prepis to
}
}
}
}
// Ziadne tlacidko nebolo stlacene, zresetuj last_button a vrat '\0'
last_button = '\0';
return '\0';
}
int main(void)
{
// Inicializacia kniznic
hw_init();
uart_init();
init_buttons();
stdout = &mystdout;
while (1) {
char button = scan_buttons(); // Skenuj stlacenie tlacidok v nekonecnej slucke a zapis do button
if (button == '1') { // Ked identifikoval 1, zapni LED
PORTB |= (1 << LED_PIN);
}
else {
PORTB &= ~(1 << LED_PIN); // Ak nie je stlacena 1, vypni LED
}
if (button != '\0'){ // Ak je nejake tlacidko stlacene, vypis jeho cislo do Serial
printf("%c\n", button);
delay(170); // Delay na debouncenutie tlacidka
}
}
return(0);
}
Zdrojový kód: zdrojaky.zip
Overenie
Video: