T.C.
Marmara Üniversitesi
Mekatronik Mühendisliği
İlişik Sistemler Proje Çalışması -
2
Intel Galileo Gen 2 ile İnternet
Üzerinden Çekilen Hava Durumu Datasının LCD’de Gösterimi
Proje
Yürütücüsü: Caner
EZEROĞLU
GENEL BİLGİLER
1.1.
PROJE BAŞLIĞI:
Intel Galileo Gen 2 ile İnternet
Üzerinden Çekilen Hava Durumu Datasının LCD’de Gösterimi
|
1.2.
PROJE YÜRÜTÜCÜSÜ:
Adı ve Soyadı
|
Caner Ezeroğlu
|
Üniversite
|
Marmara
Üniversitesi
|
Fakülte, Enstitü
veya Y.O.
|
Teknoloji Fakültesi
|
Bölümü
|
Mekatronik
Mühendisliği
|
1.3.
PROJENİN TEMATİK ALANI
Internet of Things
|
2.
MOTİVASYON
2.1.Projenin Amacı
Şekil
1: Ürün
Görünümü
İnsanlar günlük aktivitelerini
yerine getirmeden önce planlama yapmaları gerekmektedir. Ama her ne kadar
günlük planlarımız detaylı bir şekilde düşünülmüş olsa da gün içindeki ani
değişmelerle planlananlar etkilenebilir. Planların değişimi genelde dış
etmenlerden dolayı gerçekleşir. Bu dış etmenlerden biri de gün içinde ani
değişimlere uğrayabilen hava durumu değişiklikleridir. Günlük hayatın rahat
bir şekilde devam edip düşünülen planlamaları daha kolay gerçekleştirebilmek
amacıyla geliştirdiğim projemde kişilerin bu ani değişiklere uygun
davranabilmesini sağlamak amaçlanmıştır. Günümüzde iş yaşamında iletişimin
çok üst seviyelerde kullanılmasıyla, çalışanlar gün içinde seyahat etmesi
önemli bir ihtiyaç halini almıştır. İş insanları satış, antlaşma, reklam gibi
işlemlerini yerine getirebilmeleri kimi zaman hava durumunun ani değişimleri
nedeniyle zor bir duruma girebilmektedir. Akıllı sistemlerle entegre edilerek
oluşturulmuş bu projemde, kişilerin kendilerinin rahat bir şekilde sosyal
yaşamlarını sürdürebilmesini sağlayacaktır. Bu ürünlerde kullanılan
elektronik parçalar, sistemi karmaşık ve pahalı bir yapı haline getirirler.
Bu nedenle yabancı kaynaklı firmalardan çok pahalıya bulabildiğimiz bu hava
durumu ölçerleri, ülkemizde kendi imkanlarımızla üretim çalışmalarını gerçekleştirilmesi
istenmektedir.
Oluşturacağımız hava durumu ölçer kolay
kontrol edilebilir, hafif ve maliyeti düşük olacaktır. Sistem karmaşıklığı en
aza indirilecektir.
|
2.2.Çalışma Adımları
Şekil 2: Sistem Blok Diyagramı
Bu
proje mekanik, elektronik, kontrol ve yazılım disiplinlerinin bir arada
içerdiğinden projenin izleyebileceği bir plan oluşturulmuştur. Proje de giriş
ve çıkışların Galileo üzerinde belirtilmesinin ardından,
·
Hava
durumunu alabilmek için yapılması gereken hava durumu datasının bir adresten
çekilmesi,
·
Galileoda
bulunan Arduino alt yapısı ile cihaza IP atayarak sistemin kolay bir şekilde
teşhis edilmesinin sağlanması,
·
Hava
durumu datasını çekebilmemiz için gerekli olan algoritmaların belirlenmesi,
İşlemleri gerçekleştirilecektir. Bu süreçte
yapılan sistem tasarımının ardından,
·
Projenin
isterlerine ve Galileo alt sistemine uygun LCD ekranın belirlenmesi,
·
Galileo
için LCD bağlantısının karta uygun şekilde gerçekleştirilmesi, Arduino ve
Galileo arasındaki entegrasyonun sağlanması,
·
Kontrol
ve data işleme algoritmasının çıkartılması,
·
Kontrol
ve data işleme algoritmasının Galileo işlemcisine entegre edilmesi,
Gömülü sistemin oluşturulması sürecinin
ardından, mekanik sistemin tasarlanması ve kontrolcünün gömülü sistemle
entegrasyonun gerçekleşmesi gerekmektedir. Bu süreçte,
·
Projenin
isterlerini karşılayan pinlerin belirlenmesi,
·
Pinlerle
uyumlu çalışan algoritmanın yazılması
·
Elektronik
ve mekanik sistem entegrasyonunun tamamlanıp kontrolcünün dataya ve butona
verdiği tepkilerin doğrulanması,
·
Mekanik
ve elektronik sistemin uyum içinde çalışmasının ardından denemeler yapılması
ve parametrelerin iyileştirilmesi,
|
3.
PROJENİN
İÇERDİĞİ YENİLİK UNSURU
Bu proje
kapsamında gerçekleştirilecek akıllı kontrol sisteminin kullanımını
araştırmak için kullanılabilecek hem de çeşitli sensörler kullanılarak
kontrolcü tasarımlarının denemelerinin internet üzerinden yapılabileceği bir
sistem olacaktır.
Proje konusu ülkemizde üretimi ve kullanımı olmaması
sebebiyle ulusal yenilik kategorisine girmektedir. Çalışan insan sayısının
fazla olması, global yaşamın getirdiği sorunlar güncel bir problem olması
sebebiyle proje konusunun ülkemiz adına katkısı ortadadır.
Projede geliştirilecek sistem ve yöntemler birçok
yeniliği beraberinde getireceğinden üretilecek sistemin faydalı model alma
potansiyeli yüksektir.
|
4.
PROJEDE
SEÇİLEN KONTROLÖR
Şekil 3: Galileo Gen 2
Intel® Galileo Gen 2, üzerinde yüksek işlem gücüne sahip 32-bit Pentium®
sınıfından, Intel®'in Quark SoC X1000 barındıran Arduino platformlarını ve
çeşitli Arduino shieldlerini destekleyen bir geliştirme platformudur. ARM
temelli yüksek işlem kapasitesine sahip Raspberry Pi, BeagleBone gibi kartlara
alternatif olarak Intel ve Arduino iş birliği ile ortaya çıkarılan Galileo
elektronik, robotik, Ar-Ge ve hobi uygulamalarında rahatlıkla
kullanılabilir.
Galileo, düşük işlem kapasitesine sahip, ancak çevre birimleri bakımından
oldukça zengin olan Arduino platformunu bir üst sınıfa taşıyarak 32-bitlik
işlem gücüne kavuşturmuştur. Pin yapısı Arduino Uno R3 pin yapısı ile aynı olan
Galileo üzerinde 14 adet giriş/çıkış pini bulunmaktadır. Bu pinlerin 6 tanesi
PWM çıkışı olarak kullanabilmektedir. 6 tane ise analog giriş pini bulunmaktadır.
Pinlerle ilgili ayrıntılı bilgiye dokümanlar kısmından ulaşılabilir.
İşletim sistemi farketmeksizin bilgisayarınıza kuracak olduğunuz Arduino
IDE'si ile tüm giriş/çıkışları kontrol edebilecek, microSD kart yuvası ile
karta çeşitli datalar yazılıp okunabilecek, ethernet girişi ile internet
bağlantısı sağlanabilecektir. Bu özelliklerin yanında USB host ve USB Client
portları da bulunmaktadır.
Galileo üzerindeki Quark SoC X1000 Intel tarafından geliştirilmiş olan tek
çekirdekli, 400 MHz hızında, 32-bit ve 16 KB'lık ön belleği bulunan yüksek
işlem kapasitesine sahip bir işlemcidir. Bununla beraber kart üzerinde 256
Mb'lık SRAM ve 8 Mb'lık SPI flash bulunmaktadır.
5.
PROJEDE
KULLANILAN DISPLAY
LCD(Liquid Crystal Display) yazı ve sayıları görüntülemek için
kullanabileceğiniz bir sistemdir. LCD
ekranın bağlantı kabloları dikkatlice takılmalıdır. Genellikle LCD
uygulamalarında yapılan en büyük hata yanlış veya eksik takılan kablolardır.
LCD üzerindeki pin sıralaması üretici firmaya göre değişiklik gösterebilir. Bu
yüzden devre kurulumundan sonra LCD bağlantıları bir kere daha kontrol
edilmelidir.
LCD
ekran 5 volt ile çalışmaktadır. VCC ve GND bağlantıları buna göre yapılmalıdır.
LCD'nin Vo bağlantısı, ekran üzerinde oluşacak karakterlerin görünürlüğünü
ayarlamaktadır. Bu ayar ortama ve üretici firmaya göre değiştiği için Vo pini
potansiyometreye bağlanır. Potansiyometrenin diğer iki ucu 5 volt ve GND'ye
bağlanır. Böylece potansiyometre ile yazıların görünürlüğü ayarlanabilir. Eğer
bu bağlantı düzgün bir şekilde yapılmaz ise ekran üzerinde görüntü
oluşmayacaktır.
1)
GND
2)5V
3)
Potansiyometrenin orta bacağı
4)
Dijital pin 12
5)
GND
6) Dijital pin 11
7)
Bağlantı yok
8)
Bağlantı yok
9)
Bağlantı yok
10)
Bağlantı yok
11)
dijital pin 5
12)
dijital pin 4
13)
dijital pin 3
14)
dijital pin 2
15)
5V
16)
GND
Şekil
4: Bağlantı Şeması
Yukarıdaki
şemaya göre devrenizi dikkatlice kurduktan sonra programlama kısmına
geçebilirsiniz. LCD ekrana yazı yazabilmeniz için kullanacağınız karakterler,
daha önce Arduino geliştiricileri tarafından tanımlanmıştır. Tanımlanmış
karakterleri kullanabilmeniz için öncelikle LCD kütüphanesini 'LiquidCrystal.h'
projenize eklemelisiniz. Kütüphane eklendikten sonra LCD'ye bağlanan Arduino
pinleri programda belirtilmelidir. Setup fonksiyonu içerisinde LCD türünü de
belirttikten sonra LCD ekran kullanıma hazırdır.
6.
PROJE
ALGORİTMASI
Projede amacımız
bir butona basıldığında Galileo'nun internette bulunan bir siteye bağlanarak
bugünün hava durumunun çekilmesi ve sonrasında LCD ekrana yazılmasıdır.
Yazdığımız C
kodunun setup ve loop adında iki methodu bulunuyor. Bu methodlardan
"setup" kodun ilk çalışması anında çalıştırılırken "loop"
methodu setup sonrası sürekli olarak çalıştırılmaktadır. Genel olarak
"setup" methodunda internet ve bağlantı ayarlarını yaparken, loop
methodunda butona basılma sonrası siteye bağlanma ve LCD'ye veriyi yazma
işlemlerini gerçekleştireceğiz.
## SETUP
"setup"
methodunda öncelikle seri porta bağlantıyı gerçekleştiriyoruz. Bunu yapma
amacımız kodun ilerleyen bölümlerinde seri porta logları yazarak kodun
çalışırlığını kontrol etmek.
Serial.begin(9600);
Seri porta
bağlantı sonrası network ayarlarını yapıyoruz.
if (Ethernet.begin(mac) == 0)
{
Serial.println("Failed
to configure Ethernet using DHCP");
Serial.println("Attempting
to configure Ethernet using Static IP");
Ethernet.begin(mac,
ip);
}
system("telnetd -l /bin/sh");
system("ifconfig eth0 192.168.1.30 netmask
255.255.0.0 up");
Yukarıdaki kodlar
sayesinde Galileo'nun network erişimi aktif hale getirerek eth0 interfaceine
192.168.1.30 ip'sini veriyoruz. Aynı zamanda Galileo içinde bulunan ssh
sunucusunu da aktif hale getiriyoruz, bu sayede cihazımıza puty gibi bir ssh
aracıyla da ulaşarak komutlar yazabiliyoruz.
system("route
add default gw 192.168.1.1 eth0");
system("echo
\"nameserver 8.8.8.8\" > /etc/resolv.conf");
Galileo'unun ip
alması internete bağlanması için yeterli değildir. Galileonun internete
bağlanıp hava durumu bilgisini alabilmesi için bir default route ve bir dns
kaydı gerekmektedir. "Default route" cihaz bulunduğu network dışında
herhangi bir networke erişmek istediğinde çıkış kapısı olarak kullanılacak
makineyi göstermektedir. DNS ise alan adından ip dönüşümünü sağlayan sunucunun
bilgisidir. Biz çalışmamızda google dns'i kullandık ( 8.8.8.8 ).
## LOOP
Loop methodu
içinde öncelikle LiquidCrystal kütüphanesinde bulunan digitalRead methodu
yardımıyla butonun mevcut state'ini okuyoruz. Buton 0 ya da 1 değerlerini
alabiliyor.
int
buttonState = digitalRead(pushButton);
Butonun mevcut
statüsünü ve bir önceki statüsünü buttonState ve prevState adlı iki değişkende
tutuyoruz. Bu sayede digitalRead ile state'i her okuduğumuzda bir önceki state
ile karşılaştırarak butona basıldığını ya da butondan el çekildiğini anlayabiliyoruz.
if ( buttonState != prevState) {
if ( buttonState == 0 ) {
prevState = buttonState ;
lcd.setCursor(0,
0);
lcd.print("Buton kaldirildi");
delay(1);
} else {
// butona basıldığında bu else bloğuna
girilir. Bizim internete bağlanacağımız kodu buraya yazacağız.
}
Butona
basıldığında weather.gov sitesine bağlarak ABD'de yer alan Raleigh-Durham için
hava durumu bilgisini alacağız.
client.println("GET /xml/current_obs/KRDU.xml HTTP/1.1");
client.println("Host: w1.weather.gov");
client.println("User-Agent: arduino-ethernet");
client.println("Connection: close");
client.println();
Hava durumu
bilgisini alabilmek için EthernetClient ile ilgili host'a get requesti
yapıyoruz (yukarıda). Get requestinin başarılı olabilmesi için user-agent
bilgisi de gerekiyor, bu yüzden arduino-ethernet olarak da user-agent bilgisini
giriyoruz.
Bu aşamadan sonra
client.available() methoduyla client'ın durumunu kontrol ediyoruz. Elimizde
hala düzgün bir client olduğu için get requestinin cevabını serialEvent()
methodu içinde okumak üzere ilgili methodu çağırıyoruz.
while (client.available()) {
serialEvent();
}
serialEvent
methodunda client.read ile gelen cevaptaki herbir karakteri teker teker
okuyoruz. Dönen sonuç xml formatında olduğu için xml'i anlamlandırmamız
gerekiyor. Bu yüzden ilk karakterden itibaren karakterleri okuyoruz;
"<" karakterini gördüğümüzde gelecek karakterler bir tag'in
parçası olacaktırı belirtmek için tagFlag'i true'ya set ediyoruz. Bu aşamadan
sonra ">" karakterini görene kadarki tüm karakterleri tag'e
ekleyerek gidiyoruz. Bu sayede "<" ve ">" arasındaki
tag'i bulmuş oluyoruz.
void serialEvent() {
char
inChar = client.read();
if (inChar == '<') {
addChar(inChar, tmpStr);
tagFlag = true;
dataFlag = false;
} else if (inChar == '>') {
addChar(inChar, tmpStr);
if (tagFlag) {
strncpy(tagStr, tmpStr,
strlen(tmpStr)+1);
}
clearStr(tmpStr);
tagFlag = false;
dataFlag = true;
} else if (inChar != 10) {
if (tagFlag) {
addChar(inChar, tmpStr);
if ( tagFlag && strcmp(tmpStr,
endTag)
== 0 ) {
clearStr(tmpStr);
tagFlag = false;
dataFlag = false;
}
}
if (dataFlag) {
// Add data char to string
addChar(inChar, dataStr);
}
}
Bizim ihtiyacımız
olan sıcaklık bilgisi <temp_c> taginde bulunuyor. Bu yüzden temp_c
bulunduğunda ilgili veriyi LCD ekranına yazdırıyoruz. LCD'ye yazdırmak için
LiquidCrystal'ın lcd methodunu kullanıyoruz. Öncelike lcd.clear ile ekranı
temizliyoruz; sonra cursor'ü yani yazının yazılacağı yeri belirten belirteci 0.
satır ve 0. sütuna getiriyoruz lcd.setCursor(0,0) ile; lcd.print("Hava
Sicakligi") methodunu kullanarak ilk satıra "Hava Sicakligi"
yazıyoruz. Benzer şekilde lcd.setCursor(0,1) yaparak belirteçi 2. satıra
geçiriyoruz ve bu satıra sıcaklığı yazıyoruz.
if (inChar == 10 ) {
if (matchTag("<temp_c>")) {
Serial.print(dataStr);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Hava Sicakligi");
lcd.setCursor(0, 1);
lcd.print(dataStr);
}
clearStr(tmpStr);
clearStr(tagStr);
clearStr(dataStr);
// Clear Flags
tagFlag = false;
dataFlag = false;
}
LİTERATÜR TARAMASI
Bu çalışma
sırasında Google, IEEE explore, Science Direct ve YÖK Tez Arşivi veri
tabanlarında çeşitli anahtar kelimelerle arama yapılmıştır,
·
Stackoverflow
·
Geleceği
Yazanlar LCD
·
Weather
Data
·
Intel
Galileo Gen 2
·
Instructables
·
Putty
·
Galileoo
Gen 2 Gpio Control Using Linux
Bu çalışmada; internet ile
iletişimini kurduğumuz Galileo Gen 2’yi kullanarak hava durumu datasına sahip
verinin LCD ekrandan gösterilmesi amaçlanmıştır. Tasarlanan sistem hava durumunu doğru göstermekle
birlikte maliyeti de düşürülecektir.
|
7.