Operácie

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 - '''Meno Priezvisko'''
+
Záverečný projekt predmetu MIPS / LS2023 - '''Filip Viest'''
  
  
 
== Zadanie ==
 
== Zadanie ==
  
Sem príde text zadania, ak bolo len voľne formulované, rozpíšte ho podrobnejšie
+
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:ard.jpg|400px|thumb|center|Vývojová doska ACROB.]]
+
[[Obrázok:ViestOBRArduino.jpg|400px|thumb|center|Doska Arduino UNO R3.]]
  
 
'''Literatúra:'''  
 
'''Literatúra:'''  
* [http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description Dokumentácia k doske Acrob]
+
* [https://docs.arduino.cc/resources/datasheets/A000066-datasheet.pdf Dokumentácia k doske Arduino UNO R3]
* [http://www.humanbenchmark.com/tests/reactiontime/index.php Vyskúšajte si zmerať reakciu on-line]
 
  
  
Riadok 17: Riadok 16:
 
== Analýza  a opis riešenia ==
 
== Analýza  a opis riešenia ==
  
Opíšte sem čo a ako ste spravili, ak treba, doplňte obrázkami...
+
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:ledRGB.jpg|400px|thumb|center|RGB LED.]]
+
[[Súbor:ViestOBRklavesnica.jpg|400px|thumb|center|Klávesnica 2x3.]]
  
Nezabudnite doplniť schému zapojenia!
+
Schéma zapojenia
  
[[Súbor:schd.png|400px|thumb|center|Schéma zapojenia LCD displeja.]]
+
[[Súbor:ViestOBRschema.jpg|400px|thumb|center|Schéma zapojenia.]]
  
  
 
=== Algoritmus a program ===
 
=== Algoritmus a program ===
  
Algoritmus programu je....
+
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"
  
int main(void)
+
#include <stdio.h>
{
+
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE);
  unsigned int measuredValue;
+
 
 +
// Definovanie tlacidok na piny formou matice
 +
const uint8_t button_pins[2][3] = {
 +
    {2, 3, 4}, // Rad 1
 +
    {5, 6, 7}  // Rad 2
 +
};
  
  while (1)
+
#define LED_PIN PB5 // Definovanie pinu PB5 na vnutornu LEDku
  {
 
    /*  relax  */
 
  }
 
  
  return(0);
+
// 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
 
}
 
}
  
</source></tab>
+
// Funkcia na citanie stlaceneho tlacidka
<tab name="filename.h"><source lang="c++" style="background: LightYellow;">
+
char scan_buttons() {
#include <avr/io.h>
+
    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 adc_init(void);                                   // A/D converter initialization
+
                             
 
+
int main(void)
unsigned int adc_read(char a_pin);
+
{
 +
  // 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>  
  
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á:ViestFilipMIPSprojekt.zip|zdrojaky.zip]]
 
 
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]
 
  
  
 
=== Overenie ===
 
=== Overenie ===
  
Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia.
 
Na konci uvádzame fotku záverečnej obrazovky pred resetom. Vypísaný je tu priemerný čas a najlepší čas.
 
 
[[Súbor:fotka.jpg|400px|thumb|center|Aplikácia.]]
 
  
 
'''Video:'''
 
'''Video:'''
<center><youtube>_l02MBu41n0</youtube></center>
+
<center><youtube>https://youtu.be/1kezqjxdfJQ</youtube></center>  
 
 
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.
 
  
 
[[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

Doska Arduino UNO R3.

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.

Klávesnica 2x3.

Schéma zapojenia

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: