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
| Malzeme | Adet | Ne işe yarar? |
|---|---|---|
| Arduino Uno R3 (CH340, USB kablolu) | 1 | Oyunun kurallarını çalıştırır |
| MAX7219 4'lü 8x8 nokta matris modülü (kırmızı) | 1 | 32x8 noktalık oyun ekranı |
| XY joystick modülü | 1 | Yılanın yönünü seçer, düğmesi oyunu yeniden başlatır |
| KY-012 buzzer modülü | 1 | Yem yenince ve oyun bitince ses verir (isteğe bağlı) |
| Erkek-dişi jumper kablo | 1 set | Modü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.
| Özellik | Tek 8x8 modül | 4'lü MAX7219 modülü |
|---|---|---|
| Oyun alanı | 8 x 8 = 64 nokta | 32 x 8 = 256 nokta |
| Koddaki ayar | MODUL = 1 | MODUL = 4 |
| Oynanış | Kısa, hızlı biten turlar | Yılan uzayabilir, tur uzun sürer |
| Bağlantı | 5 kablo | 5 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.
- MAX7219 modülünün giriş tarafındaki (DIN yazan) pinleri bağlayın: VCC → 5V, GND → GND, DIN → D11, CS → D10, CLK → D13.
- Joystick modülünü bağlayın: +5V → 5V, GND → GND, VRx → A0, VRy → A1, SW → D2.
- 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.
- Bağlantıları kontrol ettikten sonra USB kablosunu takın.
- Arduino IDE'de Kütüphane Yöneticisi'nden "MD_MAX72XX" kütüphanesini kurun ve aşağıdaki kodu yükleyin.
#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
analogReadyaklaşı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 = 1yapı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.
