Operácie

Maticový displej 8x8 s driverom MAX7219: Rozdiel medzi revíziami

Zo stránky SensorWiki

StudentMIPS (diskusia | príspevky)
Bez shrnutí editace
StudentMIPS (diskusia | príspevky)
Riadok 50: Riadok 50:
<tabs>
<tabs>
<tab name="AVR C-code"><source lang="c++" style="background: LightYellow;">
<tab name="AVR C-code"><source lang="c++" style="background: LightYellow;">
#define F_CPU 16000000UL
#define BAUDRATE      9600
#include <avr/io.h>
#include <avr/io.h>
#include <util/delay.h>
#include "uart.h"
#include "SPIinit.h"


int main(void)
#define switchL  PD3
{
#define switchR   PD2
   unsigned int measuredValue;


  while (1)
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE);
  {
    /*  relax  */ 
  }


  return(0);
enum states { Off, Down, On, Up }; // Stavy tlačítok
volatile enum states buttonL = Off;
volatile enum states buttonR = Off;
 
 
int main(void) {
uart_init();
stdout = &mystdout; // printf() funkcia je zapnutá
    SPI_init(); // Inicializácia SPI
    MAX7219_init(); // Inicializácia MAX7219
    // Nastavenie tlačidiel ako vstupov a povolenie interných pull-up rezistorov
    DDRD &= ~((1 << switchL) | (1 << switchR));
    PORTD |= (1 << switchL) | (1 << switchR);
clearDisp();
smileAnimation();
clearDisp();
printf("Smer sipok sa da menit tlacitkami na nepajivom poli.\n");
   
    while (1) {
if ( (buttonL == Off) &&  bit_is_clear(PIND, switchL)  )
  {
delay(15);               
if ( bit_is_clear(PIND, switchL) )
buttonL = Down;            
  }
  else if ( (buttonL == Down) &&  bit_is_clear(PIND, switchL)  )
  {
  buttonL = On;
  }
  else if  ( (buttonL == On) &&  bit_is_clear(PIND, switchL) )  
  { 
buttonL = Up;
  }
  else if (  (buttonL == Up) &&  bit_is_clear(PIND, switchL) )
  {
delay(15);               
if ( bit_is_clear(PIND, switchL) )
buttonL = Off;
  }
 
 
  if ( (buttonR == Off) &&  bit_is_clear(PIND, switchR)  )
  {
delay(15);               
if ( bit_is_clear(PIND, switchR) )
buttonR = Down;            
  }
  else if ( (buttonR == Down) &&  bit_is_clear(PIND, switchR)  )
  {
  buttonR = On;
  }
  else if  ( (buttonR == On) &&  bit_is_clear(PIND, switchR) )  
  { 
buttonR = Up;
  }
  else if (  (buttonR == Up) &&  bit_is_clear(PIND, switchR) )
  {
delay(15);               
if ( bit_is_clear(PIND, switchR) )
buttonR = Off;
  }
 
        if (buttonL == Down) { 
printf("Smer sipok: <--\r");
vlavo();
buttonL = Up; // Nastav stav tlačidlo L na Up po animácii
}
        if (buttonR == Down) {
printf("Smer sipok: -->\r"); 
vpravo();
buttonR = Up; // Nastav stav tlačidlo R na Up po animácii
}
    }
}
}


</source></tab>
</source></tab>
Riadok 77: Riadok 153:


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


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

Verzia z 21:57, 2. máj 2024

Záverečný projekt predmetu MIPS / LS2024 - Ladislav Nagy


Zadanie

Zostrojte animáciu pohyblivéj šípky, na spôsob smerovky. Pri stlačení tlačidla do prava, alebo do ľava sa vytvorí animácia ukazujúca smer.

Vývojová doska Arduino Nano.

Literatúra:


Analýza a opis riešenia

V projekte som využil maticový diplej so 64 LED diódami usporiadanými do matice 8x8, na displej je pripojený radič MAX7219, ktorý zjednodušuje komunikáciu s Arduinom. Celý modul sa pripájal pomocu 5-tich pinov:

  • VCC - napájanie 5V
  • GND - uzemnenie
  • DIN(data in, pin 11) - MOSI(master out slave in) pin použtý na odosielanie dát z mastera (Arduino Nano) do slave zariadenia ( displeja s radicom MAX7219)
  • CS(chip select, pin 10) - slúži na vybratie konkrétneho slave zariadenia, s ktorým má master (Arduino Nano) komunikovať
  • CLK(alebo SCK - serial clock, pin 13) - je signál generovaný masterom, ktorý určuje synchronizačnú frekvenciu pre prenos dát medzi masterom a slave zariadením

Displej funguje na princípe multiplexingu, teda sa prepína jeden riadok displeja v ktorom rozsvedsuje len tie diódy, ktoré chceme aby svietili. Potom prejdem na ďalší riadok a urobí to isté. Tento proces sa opakuje pre všetky riadky na displeji. Ak to robí dostatočne rýchlo (viac ako 100 krát za sekundu), naše oči to vnímajú ako stabilné svetlo, aj keď sa v skutočnosti každý riadok zapína a vypína postupne. Týmto spôsobom môžeme teda zobraziť rôzne informácie na displeji.

  1. Prvým krokom v projekte bolo pripojenie displeja s radičom ku Arduinu, pomocou SPI(Serial Peripheral Interface) zbernice.
SPI zbernica - je sériová synchrónna komunikačná zbernica, ktorá sa používa na prenos dát medzi mikrokontrolérmi a rôznymi zariadeniami.
Princíp fungovania SPI komunikácie:
  • Synchrónnu komunikáciu zabezpečuje synchronizačný signál, ktorý určuje kedy majú byť odosielané a prijímané dáta.
  • Využíva Master-Slave komunikáciu, čo znamená, že v tejto komunikácií existuje zvyčajne jeden master(nadriadený) a viacero slave(podriadený) prvkov. Master teda zodpovedná za riadenie komunikácie a slaves reagujú na jeho príkazy.
  • Uplatňuje sa full duplex komunikácia, teda umožňuje plný obojsmerný prenos dát, čo znamená, že master môže posielať dáta slave zariadeniu a súčasne prijímať dáta od neho.
  1. Druhým krokom bolo vytvorenie programovéj časti projektu, v ktoréj bolo potrebné inicializovať komunikáciu, vyvoriť funkciu na odosieľanie dát z Arduina, nastavenie displeja pomocou registrov a vytvorenie funkcií, ktoré zobrazovali animáciu šípok.
8x8 maticový displej s radičom MAX7219.

Schéma zapojenia

Schéma zapojenia LCD displeja.


Algoritmus a program

Algoritmus programu je....


#define F_CPU 16000000UL
#define BAUDRATE       9600
#include <avr/io.h>
#include <util/delay.h>
#include "uart.h"
#include "SPIinit.h"

#define switchL   PD3
#define switchR   PD2

FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE);

enum states { Off, Down, On, Up }; // Stavy tlačítok
volatile enum states buttonL = Off;
volatile enum states buttonR = Off;


int main(void) {
	uart_init();
	stdout = &mystdout; // printf() funkcia je zapnutá
    SPI_init(); // Inicializácia SPI
    MAX7219_init(); // Inicializácia MAX7219
	
    // Nastavenie tlačidiel ako vstupov a povolenie interných pull-up rezistorov
    DDRD &= ~((1 << switchL) | (1 << switchR));
    PORTD |= (1 << switchL) | (1 << switchR);
	
	clearDisp();
	smileAnimation();
	clearDisp();
	printf("Smer sipok sa da menit tlacitkami na nepajivom poli.\n");
    
    while (1) {
		if ( (buttonL == Off) &&  bit_is_clear(PIND, switchL)  )
	  {
		 delay(15);                 
		 if ( bit_is_clear(PIND, switchL) ) 
		 buttonL = Down;	            
	  }
	  else if ( (buttonL == Down) &&  bit_is_clear(PIND, switchL)  )
	  { 
  		 buttonL = On;
	  }
	  else if  ( (buttonL == On) &&  bit_is_clear(PIND, switchL) ) 	  
	  {  
		 buttonL = Up;
	  }
	  else if (  (buttonL == Up) &&  bit_is_clear(PIND, switchL) )
	  {
		 delay(15);                 
		 if ( bit_is_clear(PIND, switchL) ) 
		 buttonL = Off;
	  }
	  
	  
	  if ( (buttonR == Off) &&  bit_is_clear(PIND, switchR)  )
	  {
		 delay(15);                 
		 if ( bit_is_clear(PIND, switchR) ) 
		 buttonR = Down;	            
	  }
	  else if ( (buttonR == Down) &&  bit_is_clear(PIND, switchR)  )
	  { 
  		 buttonR = On;
	  }
	  else if  ( (buttonR == On) &&  bit_is_clear(PIND, switchR) ) 	  
	  {  
		 buttonR = Up;
	  }
	  else if (  (buttonR == Up) &&  bit_is_clear(PIND, switchR) )
	  {
		 delay(15);                 
		 if ( bit_is_clear(PIND, switchR) ) 
		 buttonR = Off;
	  }
	  
        if (buttonL == Down) {  
			printf("Smer sipok: <--\r");
			vlavo(); 
			buttonL = Up; // Nastav stav tlačidlo L na Up po animácii
		}
        if (buttonR == Down) {
			printf("Smer sipok: -->\r");  
			vpravo(); 
			buttonR = Up; // Nastav stav tlačidlo R na Up po animácii
		}
    }
}
#include <avr/io.h>

void adc_init(void);                                   // A/D converter initialization

unsigned int adc_read(char a_pin);

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: zdrojaky.zip

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.

Aplikácia.

Video:

Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.