KOCAELİ ÜNİVERSİTESİ
MÜHENDİSLİK FAKÜLTESİ
BEAGLEBONE BLACK EĞİTİM KİTİ UYGULAMASI
NESNE YÖNELİMLİ PROGRAMLAMA DERS PROJESİ
Gökhan TARIM
Bölümü: Elektronik ve Haberleşme Mühendisliği
Danışman: Yard. Doç . Dr. Mehmet Yakut
KOCAELİ, 2014
İÇİNDEKİLER
İÇİNDEKİLER ................................................................................................................... 1
1. GİRİŞ ...................................................................................................................... 1
2. PROJENİN YAPISI .................................................................................................... 2
2.1 Proje Dökümanları ............................................................................................... 2
2.1.1
BBB Proje Dökümanları ................................................................................... 2
2.1.1.1
Giriş ............................................................................................................. 2
2.1.1.2
Yazılım Mimarisi .......................................................................................... 3
2.1.2
Android Proje Dökümanları ........................................................................... 20
2.1.2.1
Giriş ........................................................................................................... 20
2.1.2.2
Algoritmalar .............................................................................................. 23
1.
GİRİŞ
Bu projenin amacı Beaglebone Black’in kullanılabilir hazır pinlerini mobil platform
üzerinden basit eğitim amaçlı olarak kontrol etmektir. Projede hedef olarak
uygulamasını breadboardda tasarımını yapıp çalıştırmak ve projeyi genişleterek
kontrol kartının şematik olarak tasarımını yapmayı hedeflemektedir.
Projede başlangıç olarak IO , ADC ve PWM yapıları eklenmesi hedeflenmektedir.
Başlangıç olarak 23 adet IO (Input/Output) , 5 adet PWM , 7 adet ADC kanalı
oluşturulmuştur. IO’lara bağlı olarak çıkış bazlı olarak LED , giriş bazlı olarak butonlar
konumlandırılmıştır. Butonlara pull-up , pull-down yapı donanımları eklenmiştir. Tüm
bu donanımsal aygıtlar Android mobil platform tarafından desteklenen bir yazılımla
kontrol edilmesi sağlanmaktadır.
İleriki sürümlerinde UART , SPI , I2C ve Command line gibi özellikler eklenmesi
hedeflenmektedir.
1
2.
PROJENİN YAPISI
Proje ortamı Android mobil platform tarafından desteklenmektedir. Bu platform
Beaglebone Black için tasarlanan Education Board’ı kontrol etmektedir ve giriş
seviyesindeki son kullanıcılar için gömülü sistemlere geliştiriciyi adapte etmeyi
hedeflemektedir.
2.1
Proje Dökümanları
Proje dökümanları iki kısımda toparlanmıştır. Android ve Beaglebone Black için
tasarlanan yapılar olmak üzere ve bu yapılarda kullanılan algoritmalar , yazılımlar ve
donanımsal yapılar aşağıda belirtilmiştir.
2.1.1
BBB Proje Dökümanları
2.1.1.1 Giriş
Beaglebone Black’te mevcut bulunan işletim sistemi olan Angstrom işletim sistemi
yerine Ubuntu kullanılmıştır. Bu yapı kullanıcıya serbest bırakılmaktadır. Bunun
2
sebebi yazılımsal olarak tüm işletim sistemlerinde çalışabilir olan JAVA tercih
edilmesinden dolayı geliştiricilere büyük olanak sağlamaktadır.
Sistemin çalıştırılabilinmesi için öncelikli olarak Java Jdk (Complier) ve Java Jre’nin
yüklenmesi gerekmektedir. Bunlar için kullanılan işletim sisteminde istenilen açık
kaynak kodlu Java derleyicisinin kurulması önerilmektedir.
2.1.1.2 Yazılım Mimarisi
Beaglebone tarafında sistem tam olarak , Beaglebone Black kısmında bir Multi-Socket
Server oluşturularak kullanıcı kabul edilene kadar beklemeyi ardından soketten gelen
verileri izlemeye odaklanmaktadır.
2.1.1.2.1 Yazılım Altyapısı
Yazılımda 2 adet class kullanılmıştır. Bunlardan 1.si Def.java diğeri MainClass.java
olmaktadır. Sistemdeki tüm tanımlamalar Def.java içerisinde tanımlanmış olup tüm iş
yükü MainClass’a yüklenmiştir.
Def.java içerisinde öncelikli olarak 3 kısımda yapılar oluşturulmuştur. Bunlar genel
tanımlamalar ( defination ) , sınıflar ( classes ) ve durumlardır ( states ). Tanımlamalar
altında genel yerel değişkenler tanımlanmış olup , bu değişkenler MainClass
tarafından çağırılmaktadır. Yeri geldiğinde içine yazılmakta ve kontrol edilmektedir.
Sınıflar bölümünde ise statik olarak soketten veri okuma , sokete veri yazma ,
command line’da işlem yaptırmak gibi işler yüklenen anahtarlar ( nesneler )
tanımlanmıştır. Durumlar kısmında ise ADC ve PWM ‘ler için genel state machine’ler ,
Tanımlanan pinler (IO’s) için ise tüm durumları için state machine’ler eklenmiştir.
MainClass’ta genel olarak PWM’i , ADC’yi ve IO’ları kontrol eden fonksiyonlar
bulunmakta ve tüm bu fonksiyonlar soketten okunan verilere göre şekillenmektedir.
3
Yani tam olarak sistemi gidişatını kullanıcı sağlamaktadır. Örneğin bir yandan IO’ları
kontrol ederken bi anda PWM’i kontrol etmek isteyip geri dönüp ADC’yi kontrol
edebilmektedir.
Yazılımda 2 adet Thread kullanılmaktadır. Bu thread’ların ortak olarak kullanılma
amaçları donanımdan sürekli alınan bilgilerin soketten belirli kurallar boyunca tekrar
geri basılmasıdır.
2.1.1.2.2 Algoritmalar
Öncelikli olarak kullanıcı için bir adet Server Socket 8000. porttan açılmaktadır.
Kullanıcı girişi yapılana kadar beklenilmektedir. Kullanıcı geldiğinde kullanıcıdan
gelecek veri kontrol edilir öncelikli olarak kullanıcının Adc , Pwm ve IO gibi
4
donanımlardan hangisi hakkında bilgi istediği yada bilgi gönderdiği belirlenir. Bu
veriler proje yazılırken hazırlanmış verilerdir. Belirli bir formatta gönderilir ve tek bir
veri göndererek kullanıcının tüm istekleri bu veride bulunmaktadır.
Ön işlemden sonra artık kullanıcının isteği doğrultusunda işlemler yapılır ve işlem
bittiğinde veri geriye gönderilir. Böylelikle bağlanan kullanıcı bu veriyi teyit etme
olanağıyla işleminin tamamlanmasını anlayabilir. Yazılım tam anlamıyla geliştirilmesi
doğrultusunda istenilirse belirli bir timeout değerinden sonra cevap gelmez ise
kullanıcı soketten düşmek isteme gibi olanaklar geliştiriciye bırakılmıştır.
Burada önemli hususlardan biri verinin ayrıştırılma kısımıdır. Line.split(“_”) gelen
veride bulunan tüm “ _ “ lere göre bölme işlemi yapıp string array’a aktarmaktadır.
Veri gönderilirken bilgiler bu formata dönüştürülüp gönderilmektedir. Bu yöntem
tüm proje boyunca geçerlidir. Örnek yapı olarak State_pinNumber_Substate şeklinde
oluşmaktadır.
5
Soketten veri basma işlemleri için
yazılmaktadır. Bu satırda sokete gidecek verileri öncelikle string’ten 8lilere (byte’lara)
çevirir ve ardından soketten gönderilir. Bu işlemler yapılırken autoflush aktif edilir ki
biriktirilen veriler gönderilmeye başlanılsın.
Bu işlemin neredeyse aynısı olan soketten veri okuma işlemi
şeklinde yapılmaktadır.
2.1.1.2.2.1 Stateler
2.1.1.2.2.1.1 Pin State
Socketten gelecek verinin dizisinin 0. Elemanını “pin” olması gerekmektedir.
1.elemanı pinNumber 2.elemanı yapılacak aksiyondur. Örneğin 60 numaralı pini aktif
etmek ve 1sn sonra pasif
edilmesi
isteniyor. Soketten gelecek veriler
“pin_60_export” ve 1 sn sonra “pin_60_unexport” olacaktır. Bu şekilde export ,
6
unexport , in , out , 1 ve 0 gibi subStateler oluşturulmuştur. Bu subStatelerde
bazılarında istisnalar bulunmaktadır. 1 ve 0 sadece Out geldiğinde çalışabilmektedir.
Anlamlarıda çıkış pinine 1 ve 0 (High , Low) yazmayı hedeflemektedir. “in” ise bir
thread yapısına sahiptir. Export yapılması ile in state aktif edilmektedir. Bunun sebebi
normal şartlarda da export işlemi sonunda pinin giriş tanımlanmasıdır. Bu state’te bir
bayrak yapısına benzer bir yapı bulunmaktadır ve kontrol işlemlerini yaparak sadece
pin level değişimlerinde soketten veri basmaktadır. “in” state’i unxport ve out
statelerinde durdurulmaktadır.
2.1.1.2.2.1.1.1 SubStateler
Export , out , 1 ve 0 subStatelerinde kullanılan yapı aşağıdaki gibidir. Öncelikli olarak
bir dosya okuyucusu tanımlanmakta dosya uzantasına giden okuyucu dosyadan
okunan verinin pinState’e yani subState’e eşit olduğunu anladığında soketten bu
veriyi basıp okuyucuyu kapatmaktadır ve bu sırada subState’i set etmektedir.
“in” state için ise yazılım biraz daha karışıktır. Blok diyagram ile “in” state’in yapısını
gösterecek olursak ;
7
Program rutinindeyken birden kullanıcı tarafından gelen Input state değişimiyle yeni
bir thInput sınıfından Thread oluşturulmaktadır. Bu anda işlemler normalde devam
eder kullanıcı tarafında ve kullanıcı tekrar müdahale edebilmektedir. Bir önceki
konuda anlatıldığı üzere sürekli sadece durum değişimi farkedilmesi önemsendiği için
yazılımında küçük özellikler eklenmiştir.
Öncelikli olarak okunması için bir ilk bir son durum eklenmiştir. Bu durumlar bool
değişkenler olarak saklanmaktadır. Değişken sadece farklı yani true ise false , false ise
true ise soketten veriyi basmakta ve bu boolean’ı değiştiren şey soketten okunan
veridir. Tabiki yine her işlem tamamlandığında tekrar while’a dönüldüğünde state
kontrolü yapılmaktadır. Bu işlemler olurken kullanıcı aniden substate değiştirebilir.
Burada oluşabilecek hataları engellemek için konulmuştur.
8
Her kontrol aşamasından ve veri basılmasından sonra okuyucular kapatılmakta ve
olası tüm hatalar engellenmektedir.
2.1.1.2.2.1.2 Adc State
Bu state ‘tin blok şeması aşağıda verilmiş olup , ADC arabiriminin Beaglebone Black’te
nasıl çalıştığı anlatılmaktadır. Bu state’e girmeden önce ADC ayarlarının yapıldığı
adcInit() fonksiyonu çağırılır ve soket’ten gelen data’nın ADC datası olana kadar
beklenmektedir.
9
Eğer data adcState ‘ine girebilme şemasına ( adc_pinnumber_substate ) sahipse
thAdc Thread’ı çalıştırılır ve sürekli olarak 7 ADC kanalından da alınan bilgiler bir
string’e sığdırılıp tüm veri tek seferde gönderilmektedir. Bu işlemler sırasında her
seferinde adcState durumu kontrol edilmektedir. Kullanıcıdan deActive durumu
gelinceye
kadar
sonsuza
dek
AdcInit konusunu daha detaylandırmak gerekirse ;
10
kontrol
etmektedir.
Adc’yi aktif etmek için “/sys/devices/bone_capemgr.9/slots” klasörleri altındaki
dosyaya “cape-bone-iio” yazmak gerekmektedir. Bunu burada dosyaya veri yazan
nesnelerle yapılmaktadır. Dosya ya yazma işlemi bittikten sonra yazıcılar
kapatılmaktadır.
Main altında gelen datanın kontrolünü yapan kısımı açıklanacak olursa ;
Değinildiği üzere lineArray dizisi Android tarafından soketten gelen bilgilerin belirli bir
formatla gönderilmiş ve bu verinin parçalara ayrılmış haliydi. Burada okunan verinin
uzunluğu kontrol edilmektedir. Bunun sebebi diğer durumlarda (örn: PWM datası )
oldukça uzun gelmekte olduğu için veri tipine uygun uzunlukta olması ve gelen
verinin gerçekten “adc” verisi olduğu kontrol edilmektedir. Devamında Def class’ı
altındaki adcStatus ( ADC’nin durumu ) set edilmektedir. Burada gelen verinin
2.array’inin “active” olup olmadığı kontrol edilmektedir. Bu işlem doğru bulunduğu
taktirde adcInit() çağırılarak ADC aktif edilmektedir ve yeni bir thAdc Thread nesnesi
oluşturularak bunun çalıştırılması istenmektedir.
thAdc Thread’ında ise durum diğer yapılardan pek farklı olmamaktadır.
11
Soketten yazacak olan bir yazıcı tanımlanır ve datayı otomatik sekizli akışına
göndermesi için auto flush özelliği eklenmektedir. Ardından kullanıcı normal şartlarda
bu anda Thread’da olunduğu için müdahale edebilir. Bu tip boşlukları kontrol etmek
için adc state’inin adc_active’de olması her döngü bitiminde kontrol edilir böylece
adc’deki state deşimleri farkedilebilinmektedir.
Devmaında sırasıyla ADC datalarının yazıldığı dosyaları okuyan okuyucular
tanımlanmaktadır. Ve ard arda bu dosyalardan veri okunulmaktadır. Burada işlem
hızını azaltma anlamı her seferinde tanımlanmasından dolayı akılda kalıcı olabilir.
Ancak bu işlem olası dosya kapalılığında oluşacak hataları yakalamakta ve bir sonraki
döngüde haber etmektedir.
Devamında ise okuyucular kapatılmakta ve tek satırda gönderilecek olan bütün ADC
datası String olarak sıraya dizilmektedir. Ardından önceden tanımlanmış soket
yazıcısına aktarılıp veri Android platformuna gönderilmektedir.
12
2.1.1.2.2.1.3 Pwm State
Bu state’te öncelikli olarak diğer state’lerde olduğu gibi yine kullanıcıdan gelen
(soketten) data okunmakta ve işlenerek belirli substate’lere gidilmektedir. Buralarda
gerekli işlemler yapılmaktadır ve bir sonraki işlemler beklenilmektedir.
Başlıca stateler active , set , run , notrun ve deactive’dir. Birönceki statelerden farklı
bir yapı kullanılmakta beraber bazı yapıları oldukça benzer olmaktadır. Bununla
beraber sürekli bir kontrol mekanizması geliştirilmiştir.
Blok şeması aşağıdaki gibidir.
13
14
Kullanıcıdan gelen verinin pwm state’te olduğunu öncelikli olarak kontrol
edilmektedir. Devamında kullanıcıdan gelen substate bilgisi diğer statelerde olduğu
gibi bu state’de sorgulanmaktadır.
Bu aşamadan sonra active olmadan diğer subState’lere girmesi engellenmesi
amacıyla her subState’te active mi? Sorgusu sorulmaktadır. Ardından set edilip
gerekli işlem yapılıp soketten işlem tamamlanma mesajı gönderilmektedir.
2.1.1.2.2.1.3.1 Activate SubState
Bu subState’te çağırılan pwmActivate() fonksiyonu ; bir dosya yazısı bulunmakta ve
“/sys/devices/bone_capemgr.9/slots” altındaki dosyaya erişim “am33xx_pwm”
diyerek Pwm’i aktif etmektedir.
Devamında pwm durumu pwm active ile set edilmekte ve bu soketten pwm aktif
edilmesi istenilen pinin aktif edildiği bilgisi gönderilmektedir.
15
2.1.1.2.2.1.3.2 Run SubState
Bu state’te pwm’i çalıştırılmak istenilen pin’in konfigürasyonları ele alınmaktadır.
Öncelikli olarak kullanıcıdan gelen pwmState’in run’da olduğu kontrol edilmektedir.
Devamında daha öncesinde aktif edilip edilmediği kontrol edilmektedir. Bu
subState’te ele alınacak olan iki fonksiyon ; findPWMFolder ve runnerPWM .
findPWMFolder() kullanım amacı PWM aktif edildiğinde Beaglebone Black’te sıra ile
aktif edilen pinlerin kontrol edecek olunursa klasör isimleri arasında farklılıklar
olmakta ve kullanıcı hangi sıra ile aktif ettiğini bilmek oldukça zor buda pwm
değerlerini ( duty ve frekansı ) ve run etmeye olanak sağlamamaktadır. Bunun için bu
fonksiyon
öncelikli
olarak
denemeler
sonucunda
pwm
aktif
edildiğinde
“/sys/devices/ocp.3/pwm_test_PINNUMBER.X” altındaki X in 14’ten 25’e kadar
değerler aldığı görülmekteydi ve bir döngüde 14 ile 25 değerleri arasında bu pinin
hangisinde aktif olduğu öğrenilmektedir.
16
runnerPWM() fonksiyonunda ise diğer yapılardan hiç farkı olmayan bir yazıcı
tanımlanır ve yazılacak şey fonksiyonla beraber gönderildiği için kullanıcı tarafından
bilinmektedir. Buda yazılımı kolaylaştırmaktadır.
2.1.1.2.2.1.3.3 Set SubState
Bu state’te belkide tekrara düşünüldüğü düşünülsede yine aynı fonksiyon yapıları
kullanılacaktır. Kullanıcıdan gelen verinin pwmState üzerinden kontrol edilerek “set”
17
durumunda olup olmadığı kontrol edilmektedir. Devamında kullanıcı daha öncesinde
pwm’i aktif edip etmediği kontrol edilmektedir.
Ardından gelen veriden periyot ve duty set edilmektedir. Bu bilgiler soketten 8li
(binary)
ardından
String’e
dönüştürüldüğü
için
buradanda
int
değerlere
dönüştürülmektedir.
Görüldüğü
üzere
controlPeriodPWM
ve
controlDutyPWM
fonksiyonları
bulunmaktadır. Bu fonksiyonlar Duty ve Periyodu kontrol eden fonksiyonlardır.
18
Beaglebone üzerinde
bulunan işletim sistemindeki dosya sistemi periyot
değiştirmeden önce duty’nin en az periot’a kadar yüksek olması gerekmektedir. Bu
yüzden Duty Periyot-1 ‘e çekilir ardından periyot ayarlanır. Devamında Duty bu
periyot değerine göre ayarlanmaktadır. Bu işlemler tamamlandıktan sonra soketten
set edildiği bilgisi gönderilmektedir.
Dikkat edilecek olursa bu işlemler bittikten sonra soket hiç kapatılmamaktadır. Bunun
avantajı hatta kalan kullanıcılara ayrı ayrı kontrol olanağı ve sürekli iletim olanağı
sağlamaktadır. Dezavantajı ise hattan düşen kullanıcı tarafından bir exception
alınabilmesi ve o kullanıcı tarafından alınan soket nesnesinin kaybolmamasına ve
bellekte boş bi yer tutmasına sebep olmaktadır. Bu işlemlerde genellikle kullanıcının
kodun neresinde çıkacağı belli olmamaktadır. Bunu belirli koşullara ( if , while ) yada
kodun uzun süre bulunduğu fonksiyonlara belirli koşullar konularak kötüde olsa bu
tip problemlerin önüne geçilebilinmektedir. Ekstra olarak try catch yapısını kullanarak
bu exception’ı tanımladıktan sonra o hata için yapılacaklar bu exceptionlar altına
yazılabilinmektedir.
Örnek bir Exception gösterecek olursak ;
19
Görüldüğü üzere IOException ve InterruptedException tanımlanmış ve bu
IOException dosyadan okuma problemlerinde kod akışı buraya atlamaktadır.
2.1.2
Android Proje Dökümanları
2.1.2.1 Giriş
Android platformunda yazılım yazabilmek için öncelikli olarak Android SDK’ye ve Java
JDK’ya ihtiyaç duyulmaktadır. Bunlar derleme , debug , run gibi işlemleri yapabilen bir
complier için alt yapı sağlamaktadır. Java JDK tek başına bir derleyicidir. Java JDK
içerisinde JRE özellikleri bulunduran ( Run özellikleri ) paketlerde bulunmaktadır.
Konsoldan java diliyle yazılan bir kod dizinini derleyebilinmektedir. Bu durumun
benzeri Beaglebone Black’te yapılmış idi. Ancak Android’de kısmen bir Java kullanımı
bulunmaktadır.
Derleyicisi
bir
java
derleyicisi
değildir.
Dalvik
derleyicisi
kullanmaktadır. Aşağıdaki şekilde tam olarak nasıl oluştuğunu bu yapının
gösterilmektedir.
20
Android SDK problemi halledildiğine göre Android tarafında proje hakkındaki
açıklamalar algoritmalar aşağıda yer almaktadır.
Öncelikli olarak 4 adet arayüz tasarlanmıştır. Bu arayüzler için controller’dan alınacak
bilgilerin saklanıldığı ve genel define’lar ( tanımlamalar ) için bir class oluşturulmuş
olup her arayüz için bir sayfa tasarlanmıştır. Bu arayüzler için bir ana menülerin
bulunduğu arayüz ve sırasıyla IO , PWM , ADC’için tasarlanmış arayüzler
bulunmaktadır.
-
Ana Menü
21
-
Pinler
-
ADC
22
-
Pwm
2.1.2.2 Algoritmalar
2.1.2.2.1 Interface’lerin Yazılım Mimarileri
2.1.2.2.1.1 MainActivity
Uygulama açıldığında öncelikli olarak Network’te serbestçe gezebilmesi için izinler
alınır ve View’da tanıtılan (activity_main.xml’de) buton , textView , editText gibi
görsel öğelerin controller tarafından işaretlenmiş değerlerine MainActivity tarafından
nesnelere bu öğeler yüklenmektedir. Ardından görsel butonlar soket’e bağlanılıncaya
kadar gizlenmektedir.
23
Disconnected butonuna basıldığında tButtonConn nesnesi aktif olur ve listener
çağırılır buradan negatiften pozitife (toggle) geçen buton olduğu için bilgi isChecked
için true döndürür böylelikle Connect işleminin alt yapısı sağlanmış olur. Ardından
editText’e girilen bağlanılacak değer Def class’I altındaki BBBIP değişkenine
atanmaktadır. Devamında socketConnect() fonksiyonu çağırılır ve bu fonksiyonda
BBBIP değişkeninde saklı Ip’ye ve PORT değişkeninde saklı port bilgisine erişilip soket
açılır. Soket aktif olup olmama bilgisi socketConnection_status’ta saklanıp , geri
döndürülmektedir.
24
Böylece sokete bağlanılıp bağlanılmadığı control edilmiş olmaktadır. Ayrıca
bağlanılamadığı zaman server bulunamadı bilgisi kullanıcıya döndürülmektedir. Bu
durumun aksi olanı yani Connected (bağlı) iken bağlantı koparılacağı zaman
socketDisconnect fonksiyonu çağırılmaktadır. Bu fonksiyonda ise bağlı olan bağlantı
koparılmaktadır.
Her ikisi için ortak olan bir husus ise bağlantı sağlandığında butonlar aktif olmakta
tam tersi bağlantı koparılacağı zaman butonlar gizlenmektedir. Bu işlemi o butonlara
bağlanmış nesneler sayesinde yapılmaktadır.
25
Diğer butonlar diğer Modal’lara dalanmaktadır. Butona basılıp basılmadığını kontrol
eden arka planda çalışan sınıflardan oluşmaktadır.
2.1.2.2.1.2 IO
Soket’ten bağlana kullanıcı , IO’lara bağlanıp belirli kontroller yapabilmek için ya da
doğrudan erişimi kullanmak amacıyla bu arayüzü kullanmaktadır.
Öncelikli olarak View’da tanıtılan nesneler tamamen bu modal’da da tanıtılmaktadır.
Devamında sadece export pinleri açık kalacak şekilde diğer butonlar invisible
edilmektedir. Ardından her buton için clickListener’lar ayarlanmaktadır. Burada
26
alışılmışın dışında bir yapı kullanılmaktadır. Öncelikli olarak bir butonu dinleyen
Listener sınıfı tanımlanır ve bu nesne OnCheckedChangeListener sınıfına implement
edilmektedir.
Böylece
doğrudan
yeni
bir
sınıf
oluşturulmuş
olup
OnCheckedChangeListener sınıfının tüm özelliklerini kullanabilir hale getirilmiş
özel bir sınıf oluşturulmuştur.
Yeni oluşturulan bu sınıfta öncelikli olarak yazıcı ve okuyucu birimler oluşturulur.
Pin durumunu alınabilinmesi için pinState , pin numarasının öğrenilmesi için
pinNumber eklenmektedir. Buna ek olarak dışarıdan gelen her buton için tanımlanan
OnCheckedListener nesnesine bağlanabilmesi için boşta bir ToggleButton nesnesi
oluşturulmaktadır.
Soketten veri yazılıp very alınabilinmesi için soket yazıcısı ve okuyucusu
tanımlanmaktadır. Buna ek olarak kullanıcı tarafından gönderilen pinNumber ve
pinState set edilmektedir.
27
Implement edilen sınıfın tüm özelliklerinin kullanabilmesi için bu sınıfta yapılan
işlemlerden bir diğeri Override işlemidir. Aynı özellikteki yeni bir fonksiyon
tanımlanmakta ve bu fonksiyon sınıfın isteklerini yerine getirmektedir.Burada
kullanıcıdan gelen verinin export , unexport , out , in ve çıkış işlemi için 1 ve 0 (
High and Low ) işlemleri için controller yapmakta ve sokketden bu butonları aktif
(visible) ettikten sonra soketten gelen veriyi basmaktadır.
28
Bu sınıf içerisinde oluşturulan diğer bir sınıf ise in olarak oluşturulan bir pinin
Beaglebone Black’ten gelecek verileri an an Toggle butonun durumuna yazacak olan
sınıftır. Bu sınıf aslında bir Thread’dır. Thread’ın tüm özelliklerini kullanmaktadır.
29
2.1.2.2.1.3 ADC
Bu arayüzde tamamen Beaglebone Black tarafından ADC’sinden elde edilen bilgileri
an an arayüzde belirlenen text’lere yazarak an an görmemizi sağlamaktadır.
View tarafından ADC’yi aktif edilebilmesini sağlayan toggle buton eklenildikten
sonra bu toggle buton Modal tarafından tanımlanmakta ve toggle butona butona
basıldığını belirleyen Listener bağlanmaktadır. Öncelikli olarak yapılan tüm textler
aktif edilmektedir ve soketten aktif edilme verisi gönderilmektedir. Bu anda soketen
veri alabilmek için yapılan ADC thread’ına bağlanılmakdır. Aksi durumu için
deAktif edilmektedir.
Gelecek veri blirli bir yapıya sahiptir. Tüm adclerden alınan bilgi Beaglebone Black
tarafından belirli bir yapıya sokulup soketten gönderilmektedir. Bunun için öncelikli
olarak soketten gelen veri her “_” verisine bölünmekte ve her adc için gelen data
ayırılmış olunabilinmektedir.
30
Böylece tüm datayı tek seferde an an aktarılmış olmaktadır. Gelen datayı sırayla 6
adc’için arraydan çekerek View’daki textView’lara yazılmaktadır. Diğer tüm init
işlemleri diğer arayüzlerdekilerden farklı olmamaktadır.
2.1.2.2.1.4 PWM
Bu arayüzde kullanıcı aktif edene kadar tüm diğer pinler deAktif ( Set ve Run )
durumundadır. Bunun için init anında bu butonlar invisible edilmekte , kullanıcıdan (
soketten) gelebilecek verilerden dolayı soket yazıcı ve okuyucuları tanımlanmakta ve
başlangıç olarak kullanıcı için oluşturulup tanıtılan seekBar’lar ile oynaması
durumundaki değişim düzenlenmektedir. PWM için ayarlanan arayüzde kullanıcıdan
duty ve period bilgilerini girmesi istenilmektedir. Aksi durumda Set ve Run
buttonları aktif olmamaktadır. Kullanıcı diğer tüm arayüzlerdeki gibi öncelikli olarak
istenilen toggleButtona basmakta ve bu toggleButona bağlı belirli formattaki bilgiler
Set ve Run bilgileri soket üzerinden gönderilmektedir.
31
Set işleminde Period editText’inden veri alınmakta gönderilecek değişkene set
edilmektedir. Aynı şekilde duty bilgisi de periodun belili bir yüzdesi alınarak
hesaplanmaktadır. Bu iki bilgi set edilecek bilgi formatında soket üzerinden
gönderilmektedir.
32
2.1.3
PCB Şematik
33
Download

KOCAELİ ÜNİVERSİTESİ*FEN BİLİMLERİ ENSTİTÜSÜ