Arduino Uçak Oyunu

Arduino Uno, HC-SR04 Ultrasonik Sensör ve Processing programı kullanılarak yapılmış etkileşimli bir oyun. Özellikle çocuklar için güzel bir uygulama.

Arduino ve Processing programlarının ortaklaşa çalışması söz konusu. projehocam sitesinde görüp çok ilgimi çeken bu uygulamayı yapmaya karar verdim. .ino dosyasını hiç değiştirmedim, .pde dosyasında oynadım. Bu arada dosya içindeki Proje Hocam ifadelerini de silmedim. Çünkü yapılmış bir uygulamaya biraz değişiklik ve açıklamalar getirdim.

Devreyi kurdum ve çalıştırdım. Daha sonra program kodlarını inceleyerek gerekli açıklamaları türkçe olarak program içinde (.pde dosyasında) yazdım. Oyun Arduino'ya bağlı  HC-SR04 ultrasonic sensörü ile hareket ediyor. Arduinomuz da usb kablo ile pc'ye bağlı. Elimizi ultrasonik sensöre yakınlaştırdıkça uçak alçalıyor, uzaklaştırdıkça uçak yükseliyor. Kodlar ile oynandığında (içinde açıklama satırı var) fare ile de oynanabiliyor. 

Oyun geliştirilmeye oldukça açık. Oyundaki nesneleri değiştirebilirsiniz. Kullanacağınız resimleri .png uzantılı ve arka planları şeffaf olarak kullanın. Hangi nesnenin, hangi özelliğinin ne olduğunu kodlar içinde belirttim.

Öncelikle processing programını indirin.

İşlem Basamakları:
1- Ultrasonik sensörümüzü Arduino'ya bağlıyoruz.
2- USB kablosu ile Arduinomuzu bilgisayara bağlanıyoruz.
3- Arduino Ide programını açıp ucakoyunu.ino dosyasını Arduino'ya yüklüyoruz.
4- processing.exe programını çalıştırıyoruz.
5- processing proagramı menüsünden dosya > aç'a tıklayıp ucak.pde dosyasını bulup tamamı seçerek aç'a tıklıyoruz.
6- Çalıştır düğmesine tıklayıp oyunu başlatıyoruz.

processing programı üzerinden ucak.pde dosyamızda değişiklikler/oynamalar yapabiliriz.
Renklerle oynamak için   w3schools.com daki  HTML Color Picker sayfasını kullanarak renklerin RGB kodlarını değiştirebilirsiniz.

# processing referanslarına buradan ulaşabilirsiniz. Komutların nasıl kullanıldığını görmek için.
# processin tutoriallerine buradan ulaşabilirsiniz. Öğretici örnekler var.
# processing indirme sayfasına buradan ulaşabilirsiniz.
# Proje Hocam sayfasına buradan ulaşabilirsiniz.


Devre Şeması:

HC-SR04 Ultrasonik Sensör

 Arduino Uno

Arduino IDE Kodları:

ucakoyunu.ino dosyası

//Uçak Oyunu - Proje Hocam

int echoPin= 11;
int triggerPin= 12;
unsigned long pulsetime = 0;
unsigned distance =0;
unsigned OldDistance =0;

void setup (){
  pinMode (echoPin, INPUT);
  pinMode (triggerPin, OUTPUT);
  Serial.begin(9600);  
}

void loop(){

  //compute the distance. Thanks for the ready-made code examples !!
  digitalWrite(triggerPin, LOW);
  delayMicroseconds(100);
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(100);
  digitalWrite(triggerPin, LOW);
  pulsetime = pulseIn(echoPin, HIGH);
  distance = pulsetime / 58;
  delay(10);


  //sent the value only if it's a new value
  if (OldDistance != distance) {

    Serial.println(distance); 

    OldDistance = distance;
  }

  delay(50);  // wait 0.1 s between each measure

//dosya sonu

Processing Kodları:

ucak.pde dosyası

// Uçak Oyunu
// Ana Kaynak: Proje Hocam
// Düzenlenleme kodlagitsin.blogspot.com
int i, j; 

float Hauteur; //en Y
float Angle;
int DistanceUltra;
int IncomingDistance;
//float Pas; //pour deplacements X

float MiniUcakX;
float MiniUcakY;

float HelicopterX;
float HelicopterY;

String DataIn; //  gelen veri

//5 a 32 cm


float [] BulutX = new float[6];
float [] BulutY = new float[6];

PImage Bulut;
PImage MiniUcak;
PImage Helicopter;

//seri port yapılandırması
import processing.serial.*; 
Serial myPort;    



// hazırlık
void setup() 
{

    myPort = new Serial(this, Serial.list()[0], 9600); 

    myPort.bufferUntil(10);   // Bir satırbaşı algıladığında alımı sonlandırın

    frameRate(30); 

    size(800, 600);
    rectMode(CORNERS) ; // köşelere koordinatlar veriyoruz
    noCursor(); //  neden olmasın ?
    textSize(20);  // yazı büyüklüğü
    
    //  yazı rengi otların rengiyle aynı, otların rengini değiştirince yazı rengi dedeğişiyor.

    Hauteur = 300; //  başlangıç düzlemi değeri-- uçağın ilk başladığı yükseklik...değeri küçülttükçe daha yukarıdan başlar

   //kullanacağımız resimleri okutma
      Bulut = loadImage("Bulut.png");  
      MiniUcak = loadImage("MiniUcak.png");  
      Helicopter = loadImage("Helicopter.png");  
      
    //bulutların pozisyonu
    for  (int i = 1; i <= 5; i = i+1) {
        BulutX[i]=random(1000);
        BulutY[i]=random(400);
    }
}

// seri bağlantı noktasından gelen veri olayı
void serialEvent(Serial p) { 
    DataIn = p.readString(); 
    // println(DataIn);

    IncomingDistance = int(trim(DataIn)); //  dizeden tam sayıya dönüşüm

    println(IncomingDistance); //  kontrol
    
    if (IncomingDistance>1  && IncomingDistance<100 ) {
        DistanceUltra = IncomingDistance; //  değeri yalnızca 1 ila 100 aralığındaysa kaydet
    }
}


//  ana döngümüz
void draw() 
{
    background(0, 0, 0);
    Ciel();
    fill(51,204, 51);  //otların rengi

    rect(0, 575, 800, 600); // otlar

    text(Angle, 10, 30); //     sol üst köşedeki açı değeri (angle,soldan,yukardan)
    text(Hauteur, 10, 60);//    sol üst köşedeki yükseklik değeri (angle,soldan,yukardan)


    //Angle = mouseY-300; // fare ile oynamak istiyorsanız bu satırı açınız ve bir sonrakini yorumlayınız.
    Angle = (18- DistanceUltra)*4;  //  4 değerini artırabilirsiniz ...

    Hauteur = Hauteur + sin(radians(Angle))*10; //  dikey pozisyonu hesaplar

    // düzlemi ekranda tutmak için yükseklik aralığını kontrol edin
    if (Hauteur < 0) {
        Hauteur=0;
    }

   
    if (Hauteur > 600) {
        Hauteur=600;
    }

    TraceUcak(Hauteur, Angle);   //ana uçağımızı oluştur

    MiniUcakX =   MiniUcakX -  cos(radians(Angle))*15;   //sondaki 15 rakamı hızını etkiliyor. artırdıkça hızlanıyor

    if (MiniUcakX < -30) {
        MiniUcakX=900;
        MiniUcakY = random(600);
    }

    // bulutları çiz ve hareket ettir
    for  (int i = 1; i <= 5; i = i+1) {
        BulutX[i] =   BulutX[i] -  cos(radians(Angle))*(10+2*i);

        image(Bulut, BulutX[i], BulutY[i], 200, 150);

        if (BulutX[i] < -300) {
            BulutX[i]=1000;
            BulutY[i] = random(400);
        }
    }

    image(MiniUcak, MiniUcakX, MiniUcakY, 200, 150); // Mini Ucak resmimizi gösterme
  
  
  HelicopterX =HelicopterX -  cos(radians(Angle))*10;  //sondaki 10 rakamı hızını etkiliyor. artırdıkça hızlanıyor

    if (HelicopterX < 60) {
        HelicopterX=900;
        HelicopterY = random(600);
    }
    image(Helicopter, HelicopterX, HelicopterY, 120, 60); // Helikopter resmimizi gösterme
    
}


void Ciel() {
    // Gökyüzünü çiziyoruz

    noStroke();
    rectMode(CORNERS);

    for  (int i = 1; i < 600; i = i+10) {
    fill( 49    +i*0.165, 118   +i*0.118, 181  + i*0.075   );   // gökyüzü ana rengi
   rect(0, i, 800, i+10); //gökyüzü renk değişimi yukarıdan aşağı gradyan
    }
}


void TraceUcak(float Y, float AngleInclinaison) {
    //düzlemi verilen pozisyon ve açıda çizmek

    //noStroke();
    pushMatrix();
    translate(400, Y);
    rotate(radians(AngleInclinaison)); // derece olarak!

    /*
    çizim
     
     |\___o__
     ________>     
     
     */

    scale(0.4);  //0.2 pas mal  ...  uçağın büykülüğü ... 0.5 ideal
    fill(255,51,204);      // uçak rengi  RGB
    stroke(102, 0, 51);    // uçak, tekerlek, pervane kenar çizgileri rengi
    strokeWeight(10);      // pervane  ve tekerlek kalınlığı
    ellipse(292-228, 151-85, 45, 45);      // tekerlek
    line(373-228, 145-85, 373-228, 20-85); // pervane  
    strokeWeight(7);      // uçağın kenar çizgileri kalınlığı


    beginShape();
    //  ana uçağımızı çiziyoruz
    vertex(214, 120);
    vertex(32, 82);
    vertex(32, 76 );
    vertex(15, 71);
    vertex(35, 69);
    vertex(35, 21);
    vertex(49, 21);
    vertex(57, 24);
    vertex(70, 30);
    vertex(79, 43);
    vertex(81, 58);
    vertex(95, 68);
    vertex(161, 62);
    vertex(187, 59);
    vertex(239, 59);
    vertex(242, 42);
    vertex(296, 40);
    vertex(297, 58);
    vertex(351, 59);
    vertex(365, 67);
    vertex(373, 82);
    vertex(364, 98);
    vertex(339, 109);
    vertex(305, 118);
    vertex(273, 133);

    translate(-228, -85); //  merkezleme

    endShape(CLOSE);
        fill(0, 0, 0);

    fill(255, 128, 0);
    popMatrix();
}

//dosya sonu


KULLANILAN PROGRAMLAYICI: Arduino 1.8.10 , Processing3





Yorumlar