LinkedIn YouTube Facebook
Szukaj

Newsletter

Proszę czekać.

Dziękujemy za zgłoszenie!

Wstecz
SoM / SBC

[PROJEKT] Elektroniczna kostka do gry – Arduino, czujnik wibracji oraz wyświetlacz modMAX7219

W artykule przedstawiono projekt prostej kostki elektronicznej zrealizowany na Arduino. Kostka losuje liczbę oczek z przedziału od 1 do 6. Wyświetlana jest ona na niewielkim wyświetlaczu matrycowym LED. Do wyzwolenia „rzutu” kostki służy niewielki czujnik wibracji.

Do realizacji projektu będą potrzebne:

Rysunek 1. Czujnik wibracji użyty w projekcie 

W projekcie użyto czujnika wibracji w postaci modułu modVIBRATION_DET. Pozwala on na wykrywanie wibracji niezależnie od ich kierunku. Oprócz samego czujnika, moduł ma wbudowany komparator LM393. Na płytce zamontowano również potencjometr precyzyjny, który pozwala na regulację czułości. Wyjściem modułu jest sygnał cyfrowy. Czujnik powinien być zasilany napięciem z zakresu 3…5V.

Rysunek 2. Wyświetlacz matrycowy LED 8×8

Ilość wylosowanych oczek będzie pokazywana na wyświetlaczu matrycowy LED o wielkości 8×8 (64 punkty). Został on wyposażony w popularny sterownik MAX7219. Diody LED mają barwę czerwoną. Napięcie zasilania wynosi 5 V.

Wyświetlacz matrycowy LED 8×8 należy podłączyć do płytki KAmduino UNO zgodnie z tabelą poniżej:

Pin KAmduino UNO Pin wyświetlacza matrycowego LED
5 V VCC
GND GND
7 DIN
5 CS
6 CLK

Natomiast czujnik wibracji podłączamy zgodnie z tabelą poniżej:

Pin KAmduino UNO Pin czujnika wibracji
5 V +
GND
2 Dout
5 CS
6 CLK

Zmontowany układ prezentuje się następująco:

Rys 3. Zmontowany układ

Po odpowiednim podłączeniu komponentów, można przejść do napisania programu na platformę Arduino. Gdy czujnik wibracji wykryje ruch (wibracje), na pinie wyjściowym Dout pojawi się stan wysoki, który ma uruchomić obsługę przerwania z pinu 2 płytki KAmduino UNO. W funkcji przerwania zostanie wylosowana liczba oczek, a w zależności od wylosowanej wartości na wyświetlaczu pojawi się odpowiedni obraz symbolizujący wylosowana liczbę.

Do obsługi wyświetlacza matrycowego LED wykorzystano bibliotekę max7219-master. Można ją pobrać ze strony twórcy. Została ona również dołączona do tego artykułu – sekcja do pobrania na końcu. Po pobraniu biblioteki należy ją rozpakować, a następnie umieścić w folderze, gdzie znajdują się inne biblioteki programu Arduino (domyślna ścieżka: C:\Program Files (x86)\Arduino\libraries).

Teraz można przejść do pisania programu. Najpierw dołączamy bibliotekę, następnie deklarujemy piny, do których będzie podłączony wyświetlacz matrycowy LED (DIN, CLK oraz CS). Kolejnym krokiem jest deklaracja działania biblioteki.

#include <MaxMatrix.h>
int DIN = 7;   // DIN pin of MAX7219 module
int CLK = 6;   // CLK pin of MAX7219 module
int CS = 5;    // CS pin of MAX7219 module
MaxMatrix m(DIN, CS, CLK, 1);

Teraz należy opisać znaki (wyświetlane na wyświetlaczu) odpowiadające ilości wyrzuconych oczek. Tworzymy zmienne typu Char Rzut_1 do Rzut_6. Będą one miały rozmiar 5 na 8 punktów. Aby stworzyć znaki, należy w odpowiednim miejscu tabeli wpisać „1”. Opisując znak należy patrzeć od prawej strony (przykład na rysunku 4).

Rys 4. Stworzona zmienna Rzut_6 oraz sposób jej wyświetlania na ekranie

Następnie w funkcji Setup() uruchamiane jest działanie wyświetlacza. Ustalany jest też poziom jasności świecenia diod LED w matrycy (w zakresie 0-15) oraz definiowana jest obsługa przerwania na pinie 2, do którego podłączone jest wyjście czujnika wibracji. Przerwanie jest wyzwalane, gdy na pinie 2 pojawi się zbocze narastające (zmiana z stanu niskiego na wysoki). Aktywowane jest wtedy działanie funkcji RZUT_KOSTKA().

void setup() {
  m.init(); // inicjalizacja  MAX7219 
  m.setIntensity(8); // inicjalizacja jasności świecenia matrycy LED, 0-15

  attachInterrupt(digitalPinToInterrupt(2), RZUT_KOSTKA, RISING);
}

Pętla programu loop() zostaje pusta, a następnie definiowana jest funkcja void RZUT_KOSTKA(). W kodzie deklarowana jest zmienna int liczba_oczek, w której będzie przechowywana wylosowana wartość. Następnie do zmiennej zapisywana jest wylosowana za pomocą funkcji Random() liczba zakresu od 1 do 6. Jako parametr funkcji przekazywana jest liczba 7, gdyż jest to wartość maksymalna z wyłączeniem podanej wartości (więcej na ten temat w opisie funkcji).

void RZUT_KOSTKA()
{
  int liczba_oczek=0;

  liczba_oczek = random(1, 7);

  if (liczba_oczek== 1)
  {
     m.clear(); 
     m.writeSprite(2, 0, Rzut_1);
  }

  if (liczba_oczek== 2)
  {
     m.clear(); // Clears the display
     m.writeSprite(2, 0, Rzut_2);
  }

  if (liczba_oczek== 3)
  {
     m.clear(); // Clears the display
     m.writeSprite(2, 0, Rzut_3);
  }

  if (liczba_oczek== 4)
  {
     m.clear(); // Clears the display
     m.writeSprite(2, 0, Rzut_4);
  }

  if (liczba_oczek== 5)
  {
     m.clear(); // Clears the display
     m.writeSprite(2, 0, Rzut_5);
  }

  if (liczba_oczek== 6)
  {
     m.clear(); // Clears the display
     m.writeSprite(2, 0, Rzut_6);
  }

  
}

Działanie programu zostało przedstawione na poniższym materiale wideo:

Autor: Patryk Mądry