Raspberry Pi GPIO ile C++ ve Python Kullanımı

Merhaba arkadaşlar, bu yazımda sizlerle rPi’nin belkide asıl üretilme amacı olan GPIO kullanımından ve dolayısıyla programlamasından bahsedeceğim. GPIO, genel amaçlı giriş çıkış olarak Türkçeye çevrilmektedir ve projelerimizde kod yazarken donanımsal olarak kullandığımız pinlerdir. Bir programlama kartı üzerindeki pinler için bu kadar söze ne gerek var diyebilirsiniz. Fakat rPi’de bulunan GPIO’lar normal kart pinlerinden çok farklıdır. Bununda temel sebebi rPi’nin C++ ve Python programlama dilleri ile çalışmaya izin vermesi. Bu sebepten ötürü GPIO’ların sıralaması kullandığınız programlama diline göre değişmektedir ve bu da yazmış olduğunuz kodlar için hayati önem taşımaktadır. Dilerseniz lafı fazla uzatmadan kurulum ve uygulamalara geçelim.

1. C++ ve Python  Kütüphane Kurulumu

1.1. C++ Kütüphane Kurulumu

C++ ile programlama yapabilmemiz için wiringPi kütüphanesini kurmamız gerekmektedir. Terminali açtıktan sonra sırasıyla aşağıdaki kodları yazmaya başlıyoruz.

  • Git yükleme komutunu yazarak başlıyoruz
     sudo apt-get install git-core
  • Temel update ve upgrade sorgularımızı yapıyoruz. Güncelleme yok ise zaten herhangi bir çıktı olmayacaktır.
    sudo apt-get update 
    sudo apt-get upgrade
    sudo apt-get dist-upgrade
    
  • wiringPi kütüphanesini indiriyoruz
    git clone git://git.drogon.net/wiringPi
  • wiringPi dizinini açıyoruz
    cd wiringPi
  • root izni ile kurulumu yapıyoruz.
    sudo ./build
  • Buraya kadar herhangi bir sorun yaşamadıysanız aşağıdaki kodu yazarak kurulumu test ediyoruz. Çıktı olarak GPIO versiyonu ve kısa bir bilgi metni gözükmesi gerekiyor.
    sudo gpio -v

C++ ve dolayısıyla wiringPi kütüphanesi ile programlama yapabilmek için en kritik nokta pin yapılarını bilmektedir. Bunun için gerekli kod ve çıktıyı uygulama kısmında vereceğim.

1.2. Python Kütüphane Kurulumu

Bildiğiniz gibi Python programlama dili, Linux dağıtımları içerisine gömülü bir şekilde gelmektedir. Dolayısıyla rPi’de de python gömülüdür. Fakat, GPIO üzerinden donanım kontrollü programlama yapacağımız için bir kaç ufak yükleme yapmamız gerekiyor.

  • Yine temel update ve upgrade kontrollerimizi yaparak işe başlıyoruz.
    sudo apt-get update
    sudo apt-get upgrade
    sudo apt-get dist-upgrade
    
  • Python2 veya Python3 için gerekli paketleri kuruyoruz.
    sudo apt-get install python-rpi.gpio //Python2 için gerekli olan kurulum 
    sudo apt-get install python3-rpi.gpio //Python3 için gerekli olan kurulum 
  • Buraya kadar herhangi bir sorun yaşamadıysanız, kurulumları test edebilirsiniz.
    sudo python //terminalde bu kodu yazarak python shell'i açıyoruz
    import RPi.GPIO as GPIO
    GPIO.VERSION //bu kodları ise açılan shell içerisinde sırasıyla yazıyoruz.
    
  • Çıktı olarak aşağıdaki gibi 0.5.5 veya üzeri bir versiyon değeri görmemiz gerekiyor.

    py_yukleme_sonuc

Her iki programlama dili için de kurulumları başarılı bir şekilde yaptıktan sonra artık temel led yakıp söndürme uygulamasına geçebiliriz.

2. C++ ve Python  Led Uygulaması

Uygulamasını yapacağımız devrenin şeması aşağıda verilmiştir. Bu şemaya göre C++ ve Python dilleri ile ayrı ayrı program yazacağız.

Untitled Sketch_bb

 

 

 

 

 

 

 

2.1. C++ ile Led Uygulaması

Öncelikle yukarıda bahsettiğim gibi wiringPi’ye özel pin yapılarını öğrenmemiz gerekiyor.

  • Terminali açarak aşağıdaki komutu yazıyoruz ve karşımıza wiringPi’nin pin dizilimi hakkında bilgi veren bir çıktı geliyor.
    gpio readall

    c_yukleme_sonuc

  • Ledimizi bağladığımız yer fiziksel olarak 12. , Python için GPIO.1 ve wringPi için de 1. pin olarak gözükmektedir. C++ ile kodlarımızı yazarken bu çıktıda wPi sütununa göre hareket etmemiz gerekiyor. Artık programlamaya başlayabiliriz.
  • Aşağıdaki kodları yazarak uygulamaya dosyamızı oluşturuyoruz.
    ls //bulunduğumuz dizindeki dosyaları görüntülüyoruz
    mkdir projeler //örnek bir dizin oluşturuyoruz
    cd projeler //oluşturduğumuz dizinin içerisine giriyoruz
    nano led1.c //.c uzantılı bir dosya oluşturuyoruz ve karşımıza metin düzenleme aracı geliyor 
  • Açılan GNU Nano editörü içerisine aşağıdaki kodları yazıyoruz. CTRL+X ve ardından Y tuşuna basarak kaydedip, çıkıyoruz.
     #include < wiringPi.h >
    int main(void)
    {
       wiringPiSetup();  
       pinMode(1,OUTPUT);  //wiringPi'ye göre 1. pini çıkış olarak atıyoruz
       for(;;)  //sonsuz döngü
         {
           digitalWrite(1,HIGH); //lojik 1
           delay(400); //0.4 sn gecikme
           digitalWrite(1,LOW); //lojik 0
           delay(400);
          }
       return 0;
    }
    
  • Yazdığımız kodlar led1.c adlı dosya içerisinde fakat bunu direkt çalıştırmadan önce son bir adım olarak derleme işlemi yapmamız gerekiyor
    g++ led1.c -o led1 -lwiringPi
  • Ve sıra geldi uygulamamızı çalıştırmaya. Aşağıdaki kodu yazarak led’in yanıp sönmeye başladığınız görebilirsiniz (:
    sudo ./led1

2.2. Python ile Led Uygulaması

Python’ın linux dağıtımları ile birlikte geldiğini söylemiştik. Bu kelime üzeriden bile python dilinin rPi üzerinde bazı avantajları olduğunu tahmin edebilirsiniz. Dilerseniz aynı led uygulamamızı şimdi de python ile yapmaya başlayalım.

  • wiringPi’de olduğu gibi herhangi bir GPIO dizilimi çıktısı almamıza gerek yok sadece kod satırında bahsedeceğim BCM ve BOARD kullanımına dikkat etmemiz gerek.
  • Yukarıda anlattığım dosya oluşturma adımlarını takip ederek python dosyamızı oluşturuyoruz. Tekrar baştan alacak olursak;
    ls //bulunduğumuz dizindeki dosyaları görüntülüyoruz
    mkdir projeler //örnek bir dizin oluşturuyoruz
    cd projeler //oluşturduğumuz dizinin içerisine giriyoruz
    nano led1.py //.py uzantılı bir python dosyası oluşturuyoruz ve karşımıza metin düzenleme aracı geliyor 
  • Açışan GNU Nano editörü içerisine aşağıdaki kodları yazıyoruz. Burada BCM ve BOARD kullanımı için iki tip kod yazcağım. İşlemler bittikten sonra CTRL+X ve ardından Y tuşuna basarak kaydedip, çıkıyoruz.
     import RPi.GPIO as GPIO //gpio kütüphanesini ekliyoruz
    import time //zamanlama kütüphanesini ekliyoruz
    
    GPIO.setmode(GPIO.BOARD) //pin dizilimini board'a göre ayarlıyoruz
    led=12 //board'a göre pin numaramız
    GPIO.setup(led, GPIO.OUT)
         while 1: //sonsuz döngü
              GPIO.output(led, 1) //lojik 1
              time.sleep(0.5) //0.5 sn gecikme
              GPIO.output(led, 0) //lojik 0
              time.sleep(0.5)
              GPIO.cleanup //pin sıfırlama
    
     import RPi.GPIO as GPIO
    import time
    
    GPIO.setmode(GPIO.BCM) //pin dizilimini sisteme göre ayarlıyoruz
    led=18 //sisteme göre pin numaramız
    GPIO.setup(led, GPIO.OUT)
         while 1:
              GPIO.output(led, 1)
              time.sleep(0.5)
              GPIO.output(led, 0)
              time.sleep(0.5)
              GPIO.cleanup
    

    BCM ve BOARD arasındaki fark burada açıklanmış.

  • Artık uygulamamızı çalıştırmaya hazırız. Evet, herhangi bir ekstra derleme yapmadan direkt kodumuzu çalıştırabiliyoruz (:
    sudo python led1.py

Uzun fakat yararlı olabileceğini düşündüğüm bir yazı oldu. rPi üzerinde GPIO’lar ile uygulama yapmak istediğimizde C++ ve Python dilleri karşımıza çıkmaktadır. Her iki dilinde kendine göre avantaj ve dezavantajları vardır. Kod yazarken keyif alınan bir dilin kullanılmasının çok önemli olduğunu düşünüyorum. Fakat bence C++’ın rPi üzerinde uygulama geliştirirken bazı yorucu adımları mevcut. Tabi ki bu da kişisel bir düşüncedir. Okuduğunuz için teşekkür ederim.

Bir sonraki yazımda görüşmek dileğiyle hoşçakalın. Sorularınızı konuyu cevaplayarak veya mail atarak sorabilirsiniz.

*İnternet üzerinde her iki dil ile ilgili “led blink” videoları olduğu için tekrardan bir video çekme gereği duymadım.

5 Comments

  • Oguzhan Kulhan Cevapla

    Merhaba Eren Kardeş,
    WirinPi ile 24cxx eepromlara okuma ve yazma işlemleriyle ilgili bir bilginiz varmı.
    Eger varsa paylaşmayı düşünürmüsün 🙂

    Kolaygelsin.

    • Eren Uyanık Cevapla

      Merhabalar,

      Bahsettiğiniz konu ilgimi çekti. İnternette ufak bir araştırma yaptım. İlerleyen dönem için yazacağım konular arasına ekledim.

      Teşekkürler.
      Kolay gelsin

  • Kürşat ALTAN Cevapla

    Paylaşım için teşekkür ederim eline sağlık güzel makale olmuş.

  • Kağan Ayanoğlu Cevapla

    Elinize sağlık teşekkür ederim.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir