17 Mayıs 2016 Salı

Intel Galileo Gen 2 ile İnternet Üzerinden Çekilen Hava Durumu Datasının LCD’de Gösterimi

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.      




Ros2 çalışmaları

 1) Her saniye yazı yazdırma. Eklediğim kod öncelikle Hello Cpp Node yazdıracak ardınca Hello ekleyecek. benim .cpp dosyamın adı my_first_no...