Maticový displej 8x8 s driverom MAX7219
Zo stránky SensorWiki
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.
![](/sensorwiki/images/thumb/0/0e/Nano-pinnout.jpg/400px-Nano-pinnout.jpg)
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.
- 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.
- Princíp fungovania SPI komunikácie:
- 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.
- 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.
![](/sensorwiki/images/thumb/d/d7/8x8.jpg/400px-8x8.jpg)
Schéma zapojenia
![](/sensorwiki/images/thumb/9/93/SchemaNagy.png/400px-SchemaNagy.png)
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.
![](/sensorwiki/images/thumb/f/f4/Fotka.jpg/400px-Fotka.jpg)
Video:
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.