Yazılardaki ürünleri komponentci.net'te inceleyebilir, hemen sipariş verebilirsiniz.komponentci.net →
KomponentciBlog Mağaza
Blog  ›  Projeler

Yılan Oyunu Projesi: MAX7219 LED Matris ve Joystick

Yılan Oyunu Projesi: MAX7219 LED Matris ve Joystick
Kısa cevap

Yılan oyunu; MAX7219 sürücülü LED matris, joystick modülü ve Arduino Uno ile yapılır. Joystick yılanın yönünü belirler, Arduino yılanın her parçasının koordinatını bir dizide tutar ve her adımda matrisi günceller. 4'lü MAX7219 modülüyle 32x8 noktalık bir oyun alanı elde edilir; proje bilgisayarın USB'siyle çalışır.

Eski cep telefonlarından tanıdığımız yılan oyununu kendi elinizle kurmak, kodlamayı öğrenmenin en eğlenceli yollarından biridir. Bu yazıda MAX7219 sürücülü LED matris, joystick modülü ve Arduino Uno ile oynanabilir bir yılan oyunu yapıyoruz. Ortaokul ve lise öğrencileri için malzeme listesi, adım adım bağlantı, açıklamalı kod, güvenlik notları ve TÜBİTAK 4006 sergisi için sunum önerileri yazıda yer alıyor.

Yılan oyunu projesi nedir?

Yılan oyunu projesi, bir LED matris üzerinde ilerleyen yılanı joystick ile yönlendirip yemleri toplattığınız, Arduino ile programlanan küçük bir oyun konsoludur. Yılan her yem yediğinde bir nokta uzar ve biraz hızlanır. Kendi gövdesine çarparsa oyun biter.

Proje üç temel programlama fikrini somut olarak gösterir: diziler (yılanın parçaları), koordinatlar (her LED'in x ve y adresi) ve oyun döngüsü (oku, hesapla, çiz, bekle). Bu yüzden bilişim teknolojileri dersleri için de uygun bir ödevdir.

Hangi malzemeler gerekir?

Bir Arduino Uno, 4'lü MAX7219 LED matris modülü, joystick modülü, isteğe bağlı bir buzzer modülü ve jumper kablolar yeterlidir. Lehim gerekmez; tüm bağlantılar dişi-erkek jumper kabloyla yapılır.

Malzeme listesi

MalzemeAdetNe işe yarar?
Arduino Uno R3 (CH340, USB kablolu)1Oyunun kurallarını çalıştırır
MAX7219 4'lü 8x8 nokta matris modülü (kırmızı)132x8 noktalık oyun ekranı
XY joystick modülü1Yılanın yönünü seçer, düğmesi oyunu yeniden başlatır
KY-012 buzzer modülü1Yem yenince ve oyun bitince ses verir (isteğe bağlı)
Erkek-dişi jumper kablo1 setModülleri Arduino'ya bağlar

Kırmızı modül yerine mavi 4'lü MAX7219 modülü de kullanılabilir; bağlantı ve kod aynıdır. Matrisin çalışma mantığı için MAX7219 LED matris yazımıza bakabilirsiniz.

Tek 8x8 modül mü, 4'lü modül mü seçilmeli?

Daha uzun ve keyifli bir oyun için 4'lü modül seçilmelidir; tek 8x8 modülde yılan birkaç yemden sonra ekranı doldurur. Kod iki modülle de çalışır, yalnızca modül sayısını belirten sabit değişir.

ÖzellikTek 8x8 modül4'lü MAX7219 modülü
Oyun alanı8 x 8 = 64 nokta32 x 8 = 256 nokta
Koddaki ayarMODUL = 1MODUL = 4
OynanışKısa, hızlı biten turlarYılan uzayabilir, tur uzun sürer
Bağlantı5 kablo5 kablo (zincir modülün içinde)

Devre nasıl bağlanır?

MAX7219 modülünün DIN ucu D11'e, CS ucu D10'a, CLK ucu D13'e; joystick'in VRx ucu A0'a, VRy ucu A1'e, SW ucu D2'ye bağlanır. Buzzer modülünün sinyal ucu D3'e gider. Bağlantıları USB kablosu çıkarılmışken yapın.

  1. MAX7219 modülünün giriş tarafındaki (DIN yazan) pinleri bağlayın: VCC → 5V, GND → GND, DIN → D11, CS → D10, CLK → D13.
  2. Joystick modülünü bağlayın: +5V → 5V, GND → GND, VRx → A0, VRy → A1, SW → D2.
  3. Buzzer modülünü bağlayın: S → D3, orta pin (+) → 5V, − → GND. Arduino'da tek 5V pini olduğu için 5V ve GND hatlarını breadboard üzerinden çoğaltabilirsiniz.
  4. Bağlantıları kontrol ettikten sonra USB kablosunu takın.
  5. Arduino IDE'de Kütüphane Yöneticisi'nden "MD_MAX72XX" kütüphanesini kurun ve aşağıdaki kodu yükleyin.
Yılan oyunu bağlantı şeması: MAX7219 4'lü 8x8 LED matris modülünün DIN ucu Arduino Uno D11 pinine, CS ucu D10'a, CLK ucu D13'e bağlı, VCC ve GND uçları 5V ve GND'ye; KY-012 buzzer modülünün S ucu D3'e; joystick modülünün VRx ucu A0'a, VRy ucu A1'e, SW ucu D2'ye bağlı; matriste üç kırmızı noktadan oluşan yılan (4,3), (3,3), (2,3) koordinatlarında ve sarı bir yem görünüyor; altta oyunun 300 ms adımla başladığı, her yemde 10 ms hızlandığı ve 100 ms'de sabitlendiği notu
MAX7219 DIN → D11, CS → D10, CLK → D13; joystick VRx → A0, VRy → A1, SW → D2; buzzer D3'e bağlanır.
#include <MD_MAX72xx.h>
#include <SPI.h>

const byte MODUL = 4, CS_PIN = 10;          // DIN=D11, CLK=D13
MD_MAX72XX mx(MD_MAX72XX::FC16_HW, CS_PIN, MODUL);
const byte GEN = MODUL * 8, YUK = 8;        // 32 x 8 oyun alani
const byte JX = A0, JY = A1, BUTON = 2, BUZZER = 3;
const int MAKS = 100;                       // en uzun yilan
byte yx[MAKS], yy[MAKS];                    // yx[0], yy[0] = bas
int boy, bekleme;
byte yon, istek, ex, ey;                    // 0 sag, 1 sol, 2 yukari, 3 asagi
bool bitti;
unsigned long sonAdim;

void nokta(byte x, byte y, bool yak) { mx.setPoint(y, GEN - 1 - x, yak); }

void bip(int ms) { digitalWrite(BUZZER, HIGH); delay(ms); digitalWrite(BUZZER, LOW); }

void yemKoy() {
  bool bos;
  do {
    ex = random(GEN); ey = random(YUK); bos = true;
    for (int i = 0; i < boy; i++) if (yx[i] == ex && yy[i] == ey) bos = false;
  } while (!bos);
  nokta(ex, ey, true);
}

void basla() {
  mx.clear();
  boy = 3; yon = istek = 0; bekleme = 300; bitti = false;
  for (int i = 0; i < boy; i++) { yx[i] = 4 - i; yy[i] = 3; nokta(yx[i], yy[i], true); }
  yemKoy();
}

void setup() {
  Serial.begin(9600);
  mx.begin();
  mx.control(MD_MAX72XX::INTENSITY, 2);    // parlaklik 0-15
  pinMode(BUTON, INPUT_PULLUP);
  pinMode(BUZZER, OUTPUT);
  randomSeed(analogRead(A3));               // bos pin: her oyunda farkli yem
  basla();
}

void loop() {
  if (bitti) {                              // joystick'e basinca yeniden basla
    if (digitalRead(BUTON) == LOW) { delay(300); basla(); }
    return;
  }
  int x = analogRead(JX), y = analogRead(JY);
  if (x < 300 && yon != 0) istek = 1;
  else if (x > 700 && yon != 1) istek = 0;
  else if (y < 300 && yon != 3) istek = 2;
  else if (y > 700 && yon != 2) istek = 3;

  if (millis() - sonAdim < bekleme) return;
  sonAdim = millis();
  yon = istek;
  int nx = yx[0], ny = yy[0];
  if (yon == 0) nx++; else if (yon == 1) nx--; else if (yon == 2) ny--; else ny++;
  nx = (nx + GEN) % GEN; ny = (ny + YUK) % YUK;   // kenardan karsiya gecer

  bool yedi = (nx == ex && ny == ey);
  bool buyu = yedi && boy < MAKS;
  for (int i = 0; i < (buyu ? boy : boy - 1); i++)
    if (yx[i] == nx && yy[i] == ny) {      // kendine carpti
      bitti = true; bip(600);
      Serial.print(F("Oyun bitti, skor: ")); Serial.println(boy - 3);
      return;
    }
  if (buyu) boy++; else nokta(yx[boy - 1], yy[boy - 1], false);  // kuyrugu sil
  for (int i = boy - 1; i > 0; i--) { yx[i] = yx[i - 1]; yy[i] = yy[i - 1]; }
  yx[0] = nx; yy[0] = ny;
  nokta(nx, ny, true);
  if (yedi) { bip(30); bekleme = max(100, bekleme - 10); yemKoy(); }
}

Kod nasıl çalışır?

Kod, yılanın her parçasının x ve y koordinatını iki dizide tutar ve her adımda başı bir kare ilerletip kuyruğu siler. Yem yenirse kuyruk silinmez; böylece yılan bir nokta uzar.

  • Joystick okuma: Joystick ortadayken analogRead yaklaşık 512 verir. 300'ün altı ya da 700'ün üstü bir yön seçimi sayılır. Yılan ters yöne dönemez; aksi halde kendi boynuna çarpardı.
  • Hız: Oyun adım başına 300 ms ile başlar. Her yemde bekleme 10 ms kısalır ve 100 ms'de sabitlenir; yani 20. yemden sonra yılan en yüksek hızına ulaşır.
  • Kenarlar: Yılan sağ kenardan çıkınca sol kenardan girer. Duvara çarpınca oyunun bitmesini isterseniz % satırını bir sınır kontrolüyle değiştirebilirsiniz.
  • Skor: Başlangıçtaki 3 parçanın üstündeki her parça bir puandır. Skor, oyun bitince Seri Monitör'de (9600 baud) görünür.

Joystick'in eksenleri modülün nasıl tutulduğuna göre değişir. Yılan siz sağa ittiğinizde yukarı gidiyorsa modülü 90° çevirin ya da kodda JX ile JY değerlerini yer değiştirin. Joystick'in iç yapısı için joystick modülü Arduino bağlantısı yazısını okuyabilirsiniz.

Hangi güvenlik kurallarına dikkat edilmeli?

Proje yalnızca USB'nin 5V gerilimiyle çalışır; prize doğrudan bağlanan hiçbir parça yoktur.

  • Kablo değiştirirken USB kablosunu çıkarın; 5V ile GND'yi kısa devre etmeyin.
  • Parlaklığı 2-4 arasında tutun. LED matrise uzun süre yakından ve tam parlaklıkta bakmak gözü yorar.
  • Dizüstü bilgisayar yerine ayrı bir güç kaynağı kullanacaksanız 7-12V bir adaptör seçin ve prize bir yetişkin taksın.
  • Sergide kabloları bir kutunun içine toplayın; ziyaretçiler joystick'i çekiştirdiğinde bağlantı kopmasın.

Projeyi nasıl sunarsınız?

Projeyi, ziyaretçilere oynatıp oyunun arkasındaki dizi ve koordinat mantığını bir afişle anlatarak sunabilirsiniz. İnsanlar oynarken "bu nasıl çalışıyor" sorusu kendiliğinden gelir.

  • Afiş: 32x8'lik bir ızgara çizin, yılanın üç parçasını (4,3), (3,3), (2,3) koordinatlarıyla işaretleyin ve bir adım sonra dizinin nasıl kaydığını gösterin.
  • Akış şeması: "Joystick'i oku → bekleme doldu mu → başı ilerlet → çarpma var mı → yem var mı → kuyruğu sil" döngüsünü kutularla çizin.
  • Skor tablosu: Sergi boyunca oynayanların skorlarını yazın; en yüksek skoru tahtada gösterin.
  • Geliştirme fikirleri: Duvar modu, zorluk seçimi ya da iki oyunculu sürüm.

Sık sorulan sorular

Matriste görüntü ters ya da karışık çıkıyorsa ne yapmalıyım?

Modülünüzün donanım türü koddakinden farklıdır. FC16_HW yerine sırayla PAROLA_HW, GENERIC_HW ve ICSTATION_HW deneyin. Görüntü yalnızca yatayda ayna gibi ters ise nokta() fonksiyonundaki GEN - 1 - x ifadesini x yapmanız yeterlidir. Kabloların modülün DIN yazan giriş tarafına takıldığını da kontrol edin.

Tek bir 8x8 MAX7219 modülüyle oyun çalışır mı?

Evet, tek bir 8x8 modülle de çalışır. Koddaki MODUL sabitini 1 yapmanız yeterlidir; oyun alanı 8x8 olur. Bu durumda başlangıç konumu ekranın içinde kalır, ancak alan küçük olduğu için yılan birkaç yemden sonra ekranı doldurur. Daha uzun oyun için 4'lü modül önerilir.

Yılan joystick'e geç tepki veriyorsa ne yapmalıyım?

Yılan yalnızca bir sonraki adımda döner; ilk adımlarda bu bekleme 300 ms'dir. Daha çabuk tepki için başlangıçtaki bekleme = 300 değerini 200 yapın. Joystick'i tam kenara itmeden de yön seçilmesini istiyorsanız 300 ve 700 eşiklerini 400 ve 620 yapabilirsiniz.

Ekran bazen rastgele yanıp sönüyorsa sorun nedir?

Genellikle gevşek bir CLK ya da DIN kablosu veya yetersiz GND bağlantısı bu duruma yol açar. Jumper kabloları kısa tutun ve matrisin GND ucunu doğrudan Arduino'nun GND pinine bağlayın. Parlaklığı yükseltmek de besleme gerilimini düşürüp titremeye neden olabilir; 2-4 arası bir değer kullanın.

Özet

  • Yılan oyunu; MAX7219 LED matris, joystick modülü ve Arduino Uno ile lehimsiz kurulur.
  • Matris DIN → D11, CS → D10, CLK → D13; joystick VRx → A0, VRy → A1, SW → D2; buzzer D3'e bağlanır.
  • 4'lü modül 32x8 = 256 noktalık alan sunar; tek modül için MODUL = 1 yapılır.
  • Oyun 300 ms adımla başlar, her yemde 10 ms hızlanır, 100 ms'de sabitlenir.
  • Proje USB'nin 5V gerilimiyle çalışır; sunumda dizi ve koordinat mantığı afişle anlatılır.

Bu yazıdaki ürünler

Diğer yazılar

11 Kasım 20266 dk okuma

Pense Çeşitleri: Yan Keski, Kargaburun ve Kombine Pense

Pense çeşitleri arasında seçim işe göre yapılır: tel ve komponent bacağı kesmek için yan keski, dar alanda tutmak ve bükmek için kargaburun,...

Devamını oku →
11 Kasım 20267 dk okuma

Işık Takip Eden Robot Yapımı: Arduino, LDR ve L298N

Işık takip eden robot, önüne takılan iki LDR ile hangi tarafın daha aydınlık olduğunu ölçüp tekerleklerini o yöne süren bir Arduino projesid...

Devamını oku →
11 Kasım 20266 dk okuma

İzoleli Tornavida ve 1000V VDE El Aletleri Nedir?

İzoleli tornavida, IEC 60900 (EN 60900) standardına göre 1000V AC ve 1500V DC gerilime kadar yalıtım için test edilmiş ve üzerinde çift üçge...

Devamını oku →
11 Kasım 20267 dk okuma

ESP8266 Hava Durumu Ekranı: NodeMCU, OLED ve Open-Meteo

ESP8266 hava durumu ekranı, NodeMCU kartının Wi-Fi ile internete bağlanıp Open-Meteo servisinden anlık sıcaklık, nem, rüzgâr ve hava durumu...

Devamını oku →
11 Kasım 20266 dk okuma

Havya Ucu Çeşitleri ve Bakımı: Konik, Keski, Bıçak

Havya ucu, lehimlenecek noktanın boyutuna göre seçilir: ince SMD ve sık bacaklar için konik (I), genel THT lehim için keski (D) ya da eğik k...

Devamını oku →
11 Kasım 20266 dk okuma

Ultrasonik Theremin Projesi: HC-SR04 ile Elle Müzik

Ultrasonik theremin, HC-SR04 sensörüyle elinizin uzaklığını ölçüp bu mesafeyi ses frekansına çeviren bir Arduino projesidir. El sensöre yakl...

Devamını oku →