Çoklu android kontrol (ESP8266-01 ve Bluetooth Server)

Bu konumuzda 2 kişilik oyun kontrolünü, android cihazlarımız ile nasıl yapabileceğimizi göreceğiz. Oyun programı olarak TV PONG GAME denilen nostaljik bir tv oyunu üzerinde deneyeceğiz.  Bu oyunda kontrol potansiyometre ile kablolu olarak sağlanıyordu. Biz ise bunu ESP8266-01 (nodemcu modunda) + Bluetooth haberleşmesi ile yapacağız.
( HC-05 Hc-06 gibi Bluetooth modül kullanmadan 2 android arası gerçekleştireceğiz.)

Öncelikle şunu söylemeliyim. Bu oyunu aldığım site kapandı. Oyunu yazan kişinin, sayfalarını daha önce kayıt ettiğim için çevrimdışı inceleyebileceksiniz. Oyun nostaljik bir oyundur. TV üzerinde çalışır. Bunun yanısıra arduino nano 328p kartına uyumlu hale getirilmiştir. Kütüphanesi program içine gömülüp değişiklikler yapılmıştır. ( Gerekli dosyaları tüm dosyaların verildiği linkten temin edebilirsiniz. )

Ben burada oyunun kontrol mantığını, Potansiyometre yerine koyduğum PWM sisteminden ( ki bunu yavaş kaldığı için iptal ettim.), R2R Dijital analog dönüştürme sistemini, 2 android cihazın bluetooth üzerinden haberleşmesi, bilgiler toplandığında 1. android cihaz, WI-FI üzerinden  ESP8266-01 modülüne, socket mimarisi kullanılarak gönderilmesi, bir de bu bilgilerin alınıp işleneceği PIC16F1827 kontrol entegresinin kullanımını anlatacağım. 

PIC16F1827 içindeki programı TXT editor ile açarak kolaylıkla aynı mantığı kullanıp ARDUINO ya çevirebilirsiniz. Mantık çok basittir.  PORTA ve PORTB deki 4 bitlik bilgileri sizler dijital pimler ile oluşturabilirsiniz. Fakat bunu kullanmak için normal dijital pim gibi kullanmayıp 4 bitlik işlem yapmalısınız. 

Öncelikle oyundan bahsedelim. Bu oyun 1970 lerde çıkmaya başladı. Sonrasında tek entegreye oturtularak atari gibi sistemlerde kullanılmaya başladı. Kendi zamanının en iyisiydi. Bir entegrede birden fazla oyun oluşturulmuştu ve televizyonda oynanabiliyordu. Tabii ki o zamanlar mikrokontrol entegreleri bu kadar yaygınlaşmamıştı. Şimdi ise isterseniz bu tip oyunları kendi cihazlarınız için kendiniz de kolaylıkla yapabilirsiniz.
Eski oyun sistemleri hakkında ayrıntılı bilgi almak isteyenler bu siteden başlayabilirler.
Ayrıca PONG tipi oyunların tarihçesi için bu siteye bakabilirler.

Şimdi ise konumuza dönüp pong tv şemasıyla başlayalım.
Ayrıca bu bağlantılar entegre üzerinde işaretlendiği için bu bağlantıların arduino nano ya da uno  bağlantı noktalarına denk getirmek için aşağıdaki PINOUT denilen şemalardan faydalanabilirsiniz.
1. resim yukarıdaki şemanın entegreye bağlantısını gösterir. bazı isimleri net okumanız için.
2. resim de ise entegre bağlantıları ve arduino nano veya uno bağlantılarını içerir.Buna göre eşleştirme yapıp bağlantıları yapabilirsiniz.


Yukarıdaki devrede 2 pot oyundaki hareketi kontrol ediyor. ( 2 oyuncu için.) Game reset skoru sıfırlıyor oyunu başlatıyor. Game select çeşitli oyun tiplerini seçiyor. Paddle size hareketli çubuğun boyutunu değiştiriyor. Speed topu 2 farklı hızda çalıştırıyor. ( Program içerisinde top hızı çok hızlandığında hıza ayak uydurmak zor olabilir. Yarı hız ve Tam hız var.) Angles ise topun 20 derece açıyla ya da 20/40 açıyla hareket etmesini sağlıyor.

Tüm bu kontroller PIC 16F1827 entegresine bağlı ESP8266-01 üzerinden gelen bilgi ile kontrol ediliyor.

Android programları 2 tanedir.
1. program birinci oyuncu ve ana kontrollerin tamamını içeriyor. RESET vs.
2. program ise 2. android cihazın, bluetooth server üzerinden 1. android cihaza bağlanıp, 2. oyuncunun çubuk hareket bilgisini iletiyor.
Birinci android program toplam bilgiyi 200ms de bir esp8266-01 e gönderiyor. Bu bilgilerin tamamı HEX olarak iletiliyor. Nedeni ise desimal olarak gönderilirse 100 dediğinizde ASCII olarak 49 48 48 yani 1 0 0 olarak 3 byte geliyordu. HEX olarak gönderildiğinde direkt olarak gelmesi sağlandı.15 denildiğinde 1 byte olarak 0xFF kodu gelmektedir.

GELEN BİLGİ :   ESP 1P 2P RESET GAME SELECT PADDLE SIZE SPEED ANGELS
ESP 13 7 1 1 1 1 1 gibi bilgi gelir ve PIC kontrolcü bu bilgiyi parçalayıp portlara gönderir.
ESP bir ön bilgidir. Aynı zamanda seri haberleşmede Uyandırma sinyalidir.
Bu ESP kelimesini yakalarsa arkasındaki bilgiyi alır. Yakalayamazsa bilgiyi almadan kesmeden çıkar.

Aşağıdakiler ise Seri port üzerinden alınan bilgilerdir. 
(ESP 4 0 1 1 1 0 1)(ESP 4 0 1 1 1 0 1)(ESP 4 0 1 1 1 0 1)
Ayrıca HEX  olarak görmek istediğinizde bu şekildedir. 1 byte olarak gönderilir.
28 45 53 50 20 34 20 30 20 31 20 31 20 31 20 30 20 31 29
28 ve 29 baştaki ve sondaki parantezlerdir.
Geri kalanı da ASCII tablosundan çözdüğünüzde ESP ile başlayan satır olduğunu göreceksiniz. 

Android programda, oyunun hareketini 0-15 arası ayarlayan bir slider kullandım.  Fakat slider Android 6 ve üzerinde genişleyemediği için incecik çizgi üzerinde elimizi kaydırmak zor olacağından, genişlik ayarlarını rahat yapabileceğim CANVAS çizim aletini kullandım. Bu şekilde geniş bir yüzey elde ettim. Buradaki ayarlar ise Android program üzerinde görünmektedir.
CANVAS piksel olarak çalıştığından 0-255 arası değer alır. Bunu 0-15 yapmak için 16 ya böldüm. Bu şekilde toplam hareket 0-15 arası oldu.
NEDEN böyle bir hareket gerçekleştirdim. 
Çünkü PIC16F1827 nin port sayısını daha uygun şekilde kullanmam gerekti. 4 bit ile çalışacak bir R2R dijital analog çevirici devrem vardı. 0-16 arasını 0-5V olarak ayarlayabilecektim. Potansiyometrenin yaptığı da bu. Dikkat ederseniz potansiyometreler, analog girişlere bağlanmış ve 0-5V arası değerin program içerisinde işlenmesiyle hareket sağlanmış.
( Ayrıca hareket eden bloklar sınırlara fazla gitmesin diye 2-13 arası sınırladım. Kolay oynanabilsin diye )

R2R devresi aşağıdaki şekilde dizayn edilir. Bu devrede 1. oyuncu için PORTA nın A1,A2,A3,A4 uçları kullanıldı. 2. oyuncu için, PORTB nin B4,B5,B6,B7 uçları kullanıldı. 2 adet R2R devrsi, 2 oyuncu için de ayrı olarak yapıldı. R2R çevirici hakkında daha fazla bilgi için bu sayfaya bakabilirsiniz. 
Bu devre ile potansiyometrenin hareketini kablosuz olarak taklit etmiş olduk.  Diğer butonları da android üzerinden bilgi gönderdiğimiz için diğer Portlara paylaştırdım. RESET ve GAME SELECT basbırak butonları, devamlı HIGH  pozisyonda bulunmalı, bunları bilgi gönderirken kısa bir süre LOW yapıp sonrasında yeniden HIGH olarak gönderdim. Diğer butonlar ise Toggle olarak çalıştı. Yani basıldığında devamlı HIGH bir daha basılırsa LOW olacak şekilde.
PIC kontrolcü sadece esp8266-01 den bilgiyi alıp oyun için gerekli olan mekanik kontrolleri sağlar. Arduino programına karışmaz.

Arduino programını da programlar arasında bulabilirsiniz. Arduino programının içine kütüphane yerleştirilmiş ve gerekli değişiklikler yapılmıştır.
Aşağıda ise PIC 16F1827 ile yapılan kontrol devresi bulunmaktadır. Çizimde gördüğünüz gibi üstteki R2R devresinde bütün girişler HIGH olduğunda çıkıştaki gerilim 5V civarında, alttaki R2R devresinde tüm girişler LOW olduğundan çıkış 0V tur. Buradaki buton çıkışlarını arduino üzerindeki anahtarların bağlı bulunduğu yerlere bağlarsanız buton olarak çalışacaktır.
Ben pcb üzerinde RESET ve GAME SELECT butonlarını ayrıca kullandım. Yani pcb üzerinden de kontrol yapabilirsiniz. Butonları PIC entegresinden gelen bilgilerle paralel olarak düşünün herhangi birine basılsa görevini yapar. 

Gerçek devre. :

Android programların ekran görüntüleri bu şekildedir.
Birinci oyuncu ekranı _1. yarı ve 2. yarı: Android programı kaynak dosyası 1. oyuncu.


İkinci oyuncu ekranı :
  Android programı kaynak dosyası 2. oyuncu. 

Çalışması ise şu şekildedir. 1. program için 1. android cihazdan, karta enerji verildiğinde ortaya çıkan  ESP8266 wifi sunucusunu seçin. ( Şifresi: 12345678 ) Sonrasında en altta bulunan Connect  butonuna basarsanız 1. oyuncu bilgi göndermeye başlar. Yukarıdaki butonlardan oyunu ayarlaya bilirsiniz ve kaydırma çubuğu ile hareketi sağlarsınız.
2. oyuncuyu dahil etmek için bluetooth aktif etmelisiniz.
Zaten programa girdiğinizde Bluetooth aktif etmemişseniz sizi uyaracaktır.
2. oyuncunun cihazına bağlı programda bluetooth aktif edip, bağlantıya izin ver butonuna basın.
Bunu yaptığınızda 2. oyuncu cihazı bluetooth server olarak bağlanacak ve diğer cihazların kendisine bağlanmasına izin verecek.
Artık diğer cihazlar sizin bluetooth sunucunuza bağlanabilecektir.
1. oyuncunun ekranında BLUE ON butonuna basıp gelen ekrandan 2. oyuncu android cihazını seçtiğinizde, bağlantı sağlanacak ve her iki telefonda da CONNECTION OK yeşil olarak çıkacak. Sonrasında, 2. oyuncu 1. oyuncunun telefonuna kendi hareket bilgisini yollayabilecektir. Kaydırma çubuğu hareket ettiğinde değil, 50ms de bir gönderim olacaktır. Bundan dolayı elinizi çok hızlı gezdirseniz de 50ms de bir kontrol ettiği değeri karşı tarafa yollayacaktır.
Ayrıca ekranda elinizi kaydırdığınızda kaydırma çubuğu üzerinde gönderdiğiniz değer yazmaktadır. Program daha hızlı olsun isterseniz bu yazılan bilgi bloklarını kaldırabilirsiniz.
Birinci oyuncu ekranında ise BLUE ON butonunun altında, 2. oyuncudan gelen bilgi de görünmektedir.
Bu hız cihazınızın hızıyla doğru orantılıdır. Eski telefonlarda hareket yavaş olarak hissedilse de yeni tip telefonlarda problemsiz çalışmaktadır. Bu zamanlamaları daha aşağı düşürebilirsiniz daha hızlı bilgi akışı olacaktır.

Tek dikkat etmeniz gereken 2. oyuncu cihazı gönderim hızının 1. oyuncu alım hızından daha büyük olması. Çünkü tam tersi olduğunda 2. oyuncu bolca bilgi gönderir ve buffer (tampon) doldurur. Gönderemediği için kilitlenme oluşacaktır. 1. android cihaz ise gerçek değer yerine buffer içindeki değerlerle uğraşacağından hareket istediğiniz gibi sonuçlanmayacaktır. 

NOT: 1. oyuncu cihazında hem CANVAS hem de Slider bulunmakta. Aradaki farkı görmek isterseniz diye bıraktım. İkisi de aynı bilgiyi verecektir, fakat sliderda elinizi kaydırırken gözünüz oyunda olduğundan, slider çubuğuna dokunmanız zor olabilecektir. 

Aşağıdaki program ise PIC 16F1827 içindeki programdır. PICBASIC ile yapılmıştır.
PBP3.0 ve yukarısı kullanıyorsanız bu şekilde kullanabilirsiniz. Daha alt versiyon kullanıyorsanız CONFIG yazan satırların içindeki sigorta ayarlarını kendi bildiğiniz şekilde değiştirin.
PIC BASIC kullanmayanlar ise verilen HEX dosyasını entegreye programlayıcı vasıtasıyla gönderebilirler.
Ya da sadece arduino kullanıyorsanız benzer mantıkla programı arduinoya çevirip ikinci bir arduino nano yu kullanabilirsiniz ya da arduino mini yi. Oyun programı için UNO veya NANO değişiklik yapmadan kullanılabilir. 

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2019 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 26.08.2019                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
#config
  __config _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_ON & _CPD_ON & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF
  __config _CONFIG2, _WRT_ALL & _PLLEN_OFF & _STVREN_OFF & _LVP_OFF & _BORV_LO & _LVP_OFF
#ENDCONFIG

; 32mhz OSC  _________________________
DEFINE OSC 32
OSCCON= %11110000 
;_______________________________________

ANSELA=0
ANSELB=0
 APFCON1=%00000000   
                    
 APFCON0=%00000000
WPUB=255
WPUA=255
;DACCON0=0
adcon0=0
adcon1=0
;LATA.5=1
OPTION_REG.7=0
TRISA=%00000000
TRISB=%00000010     ' PORTB.1 RX UCU İNPUT YAPILDI

   ; ****   başka programdan dönüştürüldüğü için bazı değişkenler
   ;  kullanılmıyor silebilirsiniz.  **************************
   
SL  VAR BYTE                      ; spbrgh low byte
SH  VAR BYTE                      ; spbrgh HIGH byte
mode    var     byte              ; mode ayar durumu haberleşme hızı
yeni    var     byte              ; ayar moduna girildi mi.
duty    var     word     ; 0-1000 ARASINDA PWM MİN MAX ARASINDA OLACAK
dd  var byte[47]
don var byte
temp    var byte
;say     var byte
sat     var byte
sut     var byte
sut1    var byte
;yaz     var byte
start  var byte
ready   var byte
temp1   var byte
temp2   var byte
hatatemp    var word
dondur  var byte

 duty=500

; ********  32 mhz de   9600 baud 8 N 1 ****************
DEFINE HSER_RCSTA 90h ; Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ;' Enable transmit, BRGH = 0
DEFINE HSER_CLROERR 1 ;' Clear overflow automatically
DEFINE HSER_SPBRGH 3
DEFINE HSER_SPBRG 64         ;++++++++++++  SPBRG  L olmalı +++++++++++++++++++++
BAUDCON= %01001000         ' Enable 16 bit baudrate generator

SYMBOL  GIE  =INTCON.7  
SYMBOL  PEIE =INTCON.6  
SYMBOL  RCIE =PIE1.5    
SYMBOL  RCIF =PIR1.5
;hserout ["LCD H"]

;BACKLED:     ****** PWM kısmı yavaş olduğundan iptal edildi. *********

; DEFINE CCP1_REG PORTB
;  DEFINE CCP1_BIT 3    
;   DEFINE CCP2_REG PORTA
;  DEFINE CCP2_BIT 7  
;  CCPTMRS=%11110100
;  PR2=249
;  PR4=249
; CCP1CON=$0C
; CCP2CON=$0C
;  T2CON=%00000110        'Prescaller / 16, Timer2 ON  
;   T4CON=%00000110


 dd[1]=0
 dd[2]=0
 don=0
 
 ; hserout ["LCD hhhhhhhhH"]
RCIE=1
PEIE=1
GIE=1

ON INTERRUPT GOTO KESME 
 disable
baslaa:
  ;don=1
if don=1 then
 
   temp1= dd[1]
   
  temp1=temp1 & %00001111
 porta=porta & %11110000
  porta=porta | temp1

   temp1=dd[2]
    
  temp1=temp1 & %00001111
   ;hserout [" deger port b ",dec3 temp1,"   ",dec3 portb,"   ",dec3 dd[2],10,13] 
   temp1=temp1 << 4
   ;hserout [" deger port b1 ",dec3 temp1,"   ",dec3 dd[2],10,13]
   
    
 portb=portb & %00001111
  portb=portb | temp1 
  ;hserout [" deger port bbbb ",dec3 temp1,"   ",dec3 portb,"   ",dec3 dd[2],10,13]     
 
    
    
    don=0
; RESET butonu    0=reset   1= normal çalışma
  portb.3=dd[3]
; GAME SELECT butonu   0=seç 1 normal
  portb.0=dd[4]
; PADDLE SIZE 0=BIG  1=SMALL
  porta.4=dd[5]
;SPEED     0=FAST    1= Slow  
  porta.6=dd[6]
;ANGELS     0=20/40 derece    1= 20 derece 
  porta.7=dd[7]  
endif

bekle:        ;ESP den bilgi gelesiye kadar sadece burada kontrol edecek gelince kesmeye gidecek. 
   enable
   if don=1 then 
   disable
   goto baslaa
   endif
goto bekle   


DISABLE
KESME:  ; SERİ PORT KESMESİ

GIE=0
don=0

 HSERIN 2,atla2, [WAIT("ESP"),hex2 dd[1],hex2 dd[2],hex2 dd[3],hex2 dd[4],hex2 dd[5],hex2 dd[6],hex2 dd[7]]
 ; hserout ["bilgiler ",dec2 dd[1],"   ",dec2 dd[2],"   ",dec1 dd[3],dec1 dd[4],dec1 dd[5],dec1 dd[6],dec1 dd[7],10,13]

ATLA:
   ; don sadece dd1 dolu ise boş ise don=0 olacak. esp ye doğru bilgi gelmemiştir. 
don=1  

atla2:
  ;hserout ["1.oyuncu  :  ",dec3 dd[1],10,13] 
  ;hserout ["2.oyuncu  :  ",dec3 dd[2],10,13] 

TEMP=RCREG
GIE=1

return
;enable


 end

Yukarıdaki program Gerçek devrede kullanılacaktır.
Proteus programıyla kullanılacak olan dosya adı : 16f1827_pong_esp_R_2R_3_ent_1_proteus.pbp

Gerçek devre PIC 16F1827  picbasic program adı:
 16f1827_pong_esp_R_2R_3_ent_1.pbp

ESP8266-01 Programı : 
Öncelikle elinizde ESP8266-01 modülünüz varsa bu sayfadan yararlanarak onu nodemcu moduna geçirmeniz gerekiyor.
Nodemcuya çevirme için Bu yazıma bakınız. 
ESP8266-01 modülünü Nodemcu ya çevirip sonra SDK( AT komutlarının kullanıldığı) Şekline çevirmek için Bu yazıma bakınız.

Daha sonra ise yine aynı sayfadan faydalanarak tcp_bridge.lua programını yükleyin.
Bu program, WI-FI üzerinden gelen bilgileri otomatik olarak seri port’a aktarır. Bu bilgiler SOKET mimarisi kullanılarak gönderilmektedir. MIT APP INVENTOR 2 de 2 tip Wi-Fi kullanımı vardır. Soket tipi için bir uzantıya ihtiyacınız var. Bu uzantı şu anda program içinde mevcuttur. Soket demek, Gelen bilgiler, internetten gelen bilgi katarı gibi değildir. Http gibi bilgiler olmadan direkt olarak sadece bilgilerinizi gönderir.

Gelen bilgileri Proteus kullanma beceriniz varsa kolaylıkla verdiğim proteus dosyası ile USB seri çevirici ( 3.3V seçeneği olmasına dikkat edin.) ve ESP8266-01 modülünü kullanarak görebilirsiniz. Android programlarını proteus üzerinde deneyebilirsiniz.
Şayet Proteus bilgim yok diyorsanız 2. videoda gösterildiği gibi, seri port programlarından biriyle de görebilirsiniz.

Aşağıdaki resimde esp ve usb seri çevirici bağlantısını görüyorsunuz. Bu bağlantı ile PC üzerinde proteus ya da seri terminal programı kullanarak, Android programdan gelen bilgiyi görebilirsiniz.

NOT : Burada ESP8266-01 Nodemcu modunda kullanılıyor. Fakat SDK modunda da kullanılabilecektir. ( SDK mode : AT komut setinin kullanıldığı bir mode dur. ) Bu şekilde kullanmak isterseniz her oyuncu kendi bilgisini direkt göndereceğinden Bluetooth bağlantısına gerek olmayacaktır ve 2 den fazla oyuncu da olabilecektir diye düşünüyorum. Bu şekilde kullanım denenmedi. Fakat PC ortamında deneyerek video çektim. 3. videoda bu farkı ve nasıl yapacağınızı göstermeye çalıştım. Ayrıca bu videoda wifi iletiminin soket ve http metotlarının farkını görebileceksiniz. 

TÜM DOSYALARA BURADAN ULAŞABİLİRSİNİZ

Gerçek devre videosu : 

Proteus ve seri terminal üzerinde androidden gelen bilgileri görebilme. 

ESP iletiminde ÇOKLU bağlantı ve Soket ve Http bağlantıları : 

Konu hakkındaki sorularınızı veya yorumlarınızı yorum kısmına bırakabilirsiniz. En kısa zamanda dönüş yapılacaktır.

Ayrıca youtube kanalıma üye olursanız, konu daha yayınlanmadan, videolarını seyretmeniz mümkün olacaktır.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.