2012-04-07

Projekent ve Piezo Python

Geçtiğimiz üç gün itü ieee kulübü Projekent etkinliğini düzenledi. Biz de kulübün laboratuvarı olarak Miniprojekent kısmını çıkarttık. Yarışma ve sergilere doymuş bir insan olarak benim için amaç beni geliştirecek bir şeylerle uğraşıyor olmak. Ama madem arkadaşlar bu etkinlik için hazırlanıyorlar, ben de üzerinde çalıştığım projeyi buraya mal edeyim dedim.

Oyun oynamayı sevmem, fakat garip bir şekilde oyun yaratmayı seven bir insan olarak çıktım!..
İlk oyunum geçen zamanlarda sizinle paylaştığım pişti oyunuydu. C'de yazılmış, hiçbir görselliği olmayan ve ders için yazılmış bir koddu, (yine de epey cambazlık istemişti). Şimdiki daha farklı.

Geçen dönem C'de kendimi aştıktan sonra Python'a bir geri dönüş yapayım dedim. Birkaç sene önce öğrendiğim her şeyi bir bir hatırladım ve ardından hemen pitonun grafik programlamasına girdim. Yok top yarattım, yok onu hareket ettirdim derken, bu iş benim çok hoşuma gitti ve her zaman yaptığım gibi kendime proje uydurdum.



Dedik ki, piezo sensörle oluşturduğumuz sinyali bilgisayara gönderelim; sonra seri portla onu okuyup arayüz programına topun y yönündeki hız bileşeni olarak girelim. Piezodan gelen sinyalleri okuma ve analog işareti dijitale çevirerek bilgisayara posta etme gibi donanım işlerini Emin üstlendi. Ben de pitonda arayüz geliştirmeye başladım. Yukarıdaki fotoğraf oyunumdan bir sahne. Sensörü çekip ittiğiniz zaman bilgisayarda top yaratıyorsunuz ve bu toplar atlaya zıplaya sağdaki duvara çarpıyor (ya da çarpmıyor). Çarptıkları yere göre puan alıyorlar, eğer üzerinden aşarlarsa puan getirmiyorlar. Onun yerine diğer taraftan uzaya karışıyorlar. Benzer şekilde toplar duvara çarpıp geri dönüyorlar ve yol bittikten sonra aşağı düşüp uzaya karışıyorlar. Süreniz bir dakika ve azalan zamanınızı sol taraftaki gösterge çizgisinde görebiliyorsunuz. Diyalog kutusu ise size topların çarptığı yere göre yönlendirme yapıyor.

Oldukça basit bir oyun, fakat ilk grafik programım olduğu düşünülürse, ben idare eder demeyi seçiyorum. Gelelim programlama kısmına. Tahmin edersiniz ki benim için en kolay çıkan kısmı fiziksel kurallara göre topun hareketini yazma kısmıydı. Top çarpsın, seksin, aşağı düşsün, yukarı fırlasın. Bunlar işin pür kod kısmıydı. Seri port modülünü eklemek Emin'in C'deki seri port tecrübeleri sayesinde sanıyorum 10-15 dakikamızı aldı. Sonra geldi iki önemli ve bana gerçekten bir şeyler öğreten nokta. Birincisi, programda threading modülü kullanmamdı. Yazdığım fonksiyon sadece tek bir top çıkartıyor ve hareketini tayin ediyor. Diğer topun çıkması için ilkinin kaybolması gerekiyordu, çünkü fonksiyon orada sona eriyordu. Benim bu durumda gerçekçiliği yakalamak için birden fazla topu art arda çıkartabilmem lazımdı. Diğer bir deyişle bir fonksiyonu bir diğeri bitmeden çağırabilmeliydim. C'de buna benzer bir şey öğrenmemiştim, nitekim bu özellik bi'nevi multitasking yapabilmek.
Hem Türker hocamın hem de Emin'in birkaç tavsiyesiyle farklı konuları araştırmaya başladım ve sonunda pitonun threading modülünün işe yarayacağına kanaat getirip kodu düzenledim. Sonuç, başarılıydı. Threadler işleri bitince kayboluyor, çağrıldıklarında yaratılıyorlardı. Bu tarz bir kodu programıma yerleştirmem de düşündüğümden oldukça az zaman aldı.



Ardından programın görselliğiyle ilgilenmeye başladım. İsteğim programa o çok sevdiğim uzaydan fotoğraflar yerleştirebilmekti. PIL modülüyle uğraşmak daha kolay geldi ve bu sefer onun üzerine gittim. Programa fotoğraf ekleyebilmek için pitonun sample kodlarını çalıştım falan derken sonunda çıkan şey uzayda oynanan bir top oyunu oldu. Şu sanki kraterli bir yüzey gibi duran yol ve duvarın yapısı ise tamamen deneme aşamasında mermer yapısını seçmemle ortaya çıktı. Yarattığım havaya oldukça uyuyordu. Threading modülü içerisindeki timer kodunu çağırdığınız zaman da programın süreyle ilgili problemlerini çözebiliyorsunuz. Kodun o kısmında hazır yazılmış bir kod eklemem gerekti. Onu da aşağıda belirttim.

#Kodu bir pencereye yerleştirip buraya eklemek istedim, ama nasıl yapacağımı bilmediğim için simple copy-paste yapıyorum, affınıza sığınarak. Bilen varsa paylaşmaktan çekinmesin, çünkü daha burada yazdığım bazı nümerik algoritmaları paylaşmayı planlıyorum.# [öğrenildi].

KOD:





Son karşılaştığım problem ise arayüzü projeksiyonla yansıtma zamanında ortaya çıkıverdi. Ne yazık ki çözünürlük değişince ve program da çözünürlükle parametrik olarak yazılmadığı için ekranda duruşu hoş olmadı. Bundan sonraki boş bir vaktimde programı çözünürlükte parametreli bir hale getirip program girişinde çözünürlük bilgisi almayı planlıyorum.

5 yorum:

  1. Uzun zamandır böyle eğlenceli bir çalışmada bulunmamıştım. İlgilenen olursa PIC ile ilgili kodları da paylaşabilirim ki burada zaten önemli kısım Python ile görsel arayüz tasarımıydı ve Ceren kısacık sürede muhteşem bir iş çıkardı. Çok daha ilginç çalışmalarda beraberce çalışmak ümidiyle :D...

    YanıtlaSil
  2. bu kodları matlab koduna dönüştürebilir miyiz?

    YanıtlaSil
  3. Merhaba, Matlab'te Python'daki gibi bir arayüz tasarlanabiliyor mu emin değilim. Matlab nümerik bir dil (python gibi), programdaki bilimsel hesaplamaları rahatça yapar, fakat Python'un fazlası web tasarımını destekliyor da olması. Dolayısıyla GUI tasarlayabiliyorsun Python ile. Matlab'te seri port kodu yazılabiliyor diye biliyorum ayrıca.

    YanıtlaSil
  4. Teşekkür ederim.(paylaşımlarınız ilgi çekici olmakla beraber oldukça öğretici ve bireyi yönlendirici olması da diğer önemli bir artısı.)

    YanıtlaSil
  5. Teşekkürler yorumlarınız için.

    YanıtlaSil