9 Temmuz 2018 Pazartesi

ORANGE PI PYTHON İLE BUTON KONTROLÜ VE UYGULAMASI

Orange Pi Python ile Buton Kontrolü ve Uygulaması 

Bir önceki yazımızda Orange pi üzerinde Python' ı nasıl kullanacağımızdan ve giriş çıkış pinlerini(gpio) Python ile nasıl kontrol edebileceğimizden bahsetmiştim. O yazıda led örneği ile pini çıkış konumuna getirip ve pine değer yazmayı gördük. Bu yazımızda ise bir pini buton bağlayıp bu pini giriş yapacağız. Daha sonra bu pinden bir değer okuyup (1/0) ledi kontrol edeceğiz. Bu yaptığımız uygulamalar genel olarak basit birer  gpio programlama uygulamalarıdır.

Gpio pinlerini kontrol etmek için indirdiğimiz kütüphane içinde buton ile ilgili bir örnek kod var. "/orangepi_PC_gpio_pyH3/examples " dizinine bakarsak eğer "read_button.py" adlı bir dosyamız var. 

Burada pinlerin isimlendirildiği satıra bakıyoruz.

led  = connector.gpio0p0

button=connector.gpio3p40 

Burada farklı bir pin isimlendirmesi ile karşılaşıyoruz. Varsayalım ki  bu isimlendirmenin ne anlama geldiğini  bilmiyoruz. Burada bize kod yapısı ile ilgili bilgiler veren /orangepi_PC_gpio_pyH3 dizinindeki "README.txt"dosyasına bakıyoruz.


Bu dosyada nelerden bahsettiğine bir bakalım. İkinci satırda yazana göre bu paket A-20 OlinuXino-MICRO kartı için yazılmış fakat diğer kartlarla da kullanılabilir. Fakat burada diğer kartlarla kullanıldığında paketin düzgün çalıştığının garantisini vermiyorlar.


Bahsedilen kart ve pin haritası bu şekilde. Burada karta baktığımızda birden fazla pin yuvası olduğunu ve bunlardan giriş çıkış pinlerinin sayısı fazla olduğundan gpio1, gpio2 diye isimlendirildiğini görüyoruz. 

Yazının devamında belli fonksiyonların anlamından bahsediyor ve ardından gpio, i2c ve spi ile ilgili örnekler yapıyor. Biz gpio ile olan örneğe kadar olan kısma bakalım. Önümüzdeki yazılarda i2c ve spi örneklerine de bakacağız.

  • init() = Modülü başlatır. Her zaman ilk önce çağrılmalı.
  • getcfg() = Gpio' nun o anki durumunu(yapılandırmasını-giriş/çıkış) okur.
  • setcfg() = Gpio' yu yapılandırır(giriş/çıkış)
  • input() = Gpio' nun güncel değerini döndürür.
  • output() = Gpio' a bir değer ayarlar.
  • pullup() = Pull up/down ayarlamasını yapar.
Bu fonksiyonlarda ;
  • HIGH->1
  • LOW ->0
  • OUTPUT ->1
  • INPUT  ->0
  • PULL-UP ->1
  • PULL-DOWN ->2
yerine bu rakamlar kullanılabilir. Örneğin;

gpio.setcfg(port.PA6, 1)  ve gpio.setcf(port.PA6 , gpio.OUTPUT)  kodlarının ikiside PA6 pinini çıkış yapar.

Bu kütüphaneyi kullandığımızda iki şekilde pin ataması yapabiliriz.

1)Port adı ile 

Burada pinlerin üzerindeki isimlendirmeyi(PA6, PC2, PG3) kullanarak istediğimiz pini giriş/ çıkış olarak ayarlayabiliriz. Bunun için port kütüphanesini import etmeliyiz. Bir örnekler görecek olursak;

from pyA20.gpio import port
gpio.setcfg(port.PA6, 1) diyerek PA6 isimli 7.pini çıkış olarak ayarlayabiliriz.

2) Bağlayıcı(pin grubu) ve pin adı ile


Böyle bir isimlendirme ile atama yukarıda bahsettiğimiz gibi A-20 OlinuXino-MICRO kartının yapısını düşündüğümüzde aslında bir kolaylık sağlar.  Fakat Orange pi kartında da pin ataması yaparken bu yolu kullanmak bize kolaylık sağlayabilir. Tabi Orange pi' de farklı bağlayıcılar olmadığı ve tek bir grup olduğu için bu grup gpio1 diye geçer.


Burada C' de kullandığımız pin sıralamasına bakarsak pinlerin bir kısmı giriş çıkış bir kısmı i2c, bir kısmı spi gibi farklı işlevlerde kullanılıyor. Burada bunları düşünmeksizin tüm pinleri gpio1 başlığı altında düşüneceğiz.

Kullanımı ise şu şekilde;

from pyA20.gpio import connector

gpio.setcfg(connector.gpio1p7, 1) diyerek  7.pini çıkış olarak ayarlayabiliriz. Burada gpio1 pin grubunu ve p7 ise 7. pin olduğunu ifade eder.

Diyelim ki i2c pin grubunu kullanarak bir atama  yapalım. Böyle bir özelliğin bu modülde olmadığını belirten bir hata verir.




Diyelim ki Orange pi' de birden fazla gpio bağlayıcısı yok  bu yüzden gpio1' e ne gerek var diye düşünüp gpio pin grubunu kullanarak pinleri kullanalım. Tekrardan aynı hatayı verir ve böyle bir özelliğin bu modülde olmadığını  söyler. Benzer şekilde gpio0p18 dediğimizde de aynı hatayı verir.



Doğru kullanım aşağıdaki şekildedir ve burada  bir pin kullanırken bu pinin başka bir çevre tarafından kullanılmadığından emin olmak gerekir. Bu pini scl/sda, spi pini olmamasına dikkat etmek gerekir.




"README.txt" yazısında belirtilen bir başka konu ise eğer siz bir pine isim verir ve bu ismi yazdırırsanız ekranda çıkacak olan sayı BCM numarası olur.



Aynı kod içinde eğer hem "port" hem de "connector" kütüphanesini kullanırsak bu iki isimlendirmeyi de aynı kod içinde kullanabiliriz.


Şimdi geçelim button ile led uygulamamıza. 

Burada bir giriş pini belirleyip buradan buton ile bir bilgi alacağız. Aynı zamanda bir de çıkış pini belirleyip bu pine de led bağlayıp butondan gelen bilgiyi şartlandırıp lede 1 veya 0 göndereceğiz.  Ayrıca C' de olmayıp Python' da karşımıza çıkan  gpio.pullup(gpio.PULLDOWN) diyoruz. Hangi durumdan pull up/pull down dirençlerini kullanacağımızdan bu yazıda bahsetmiştik. Eğer butona bastığımızda  karta 1 gitsin istiyorsak pull down direnci kullanacağız.

Devre şeklimiz bu şekilde. Buton ve lede neden ve ne kadar direnç bağladığımıza önceki yazılarımızdan ulaşabilirsiniz.


Koda genel olarak bakacak olursak pinler için "port" veya "connector" isimlendirmesini kullanmak için bu kütüphaneleri koda dahil ediyoruz. Daha sonra Python ile gpio pinlerini kullanmak için gpio kütüphanesini de dahil ediyoruz. Sonrasında "gpio.init()"  diyerek modülü başlatıyoruz. Sonrasında "gpio.setfcg()" ile PC4 pinin led ile kullanmak için çıkış, PC7 pinin buton ile kullanmak için giriş olarak ayarlıyoruz. Sonrasında  "gpio.pullup(PC7,0)" ile pullupları temizleyip bu pin için pulldown olacağını belirtiyoruz. Sonrasında da "if" yapısını kullanarak butona basıldığında led pinine 1, basılmadığında ise led pinine 0 gitmesi için gpio.output() kod yapısını kullanıyoruz.

Sudo python buttondeneme2.py ile kodu çalıştırdığımızda programımız başlar. Daha sonra programı durdurmak için CTRL-C tuş birleşimini kullanabiliriz. Fakat kodu durdurduğumuzda hata değil fakat bir uyarı mesajı karşımıza çıkar.


En son işlenen kodu söylüyor. Eğer böyle bir uyarı almak istemezsek, örnek kodlarda da kullanılan "try" yapısını kullanabiliriz.




Devrenin çalışır halinin aşağıdaki videoda görebilirsiniz.


                                      

Okuduğunuz için teşekkür ederim. Aklınıza takılan bir soru veya karşılaştığınız bir sorun olduğunda yorumlarda belirtebilirsiniz. Burada eksik olarak anlattığımı düşündüğünüz veya sizlerin gerekli olarak gördüğünüz bilgileri yine yorumlarda yazarsanız, bundan herkesin faydalanmasını sağlamış olursunuz. Herkese iyi çalışmalar.

Kaynakça:

  • https://www.olimex.com/wiki/Main_Page
  • https://github.com/duxingkei33/orangepi_PC_gpio_pyH3/blob/master/README.txt

Hiç yorum yok:

Yorum Gönder

Öne Çıkan Yayın

ORANGE PI PYTHON UART

ORANGE PI PYTHON UART Python kurulum  yazısında Orange pi'de Python konusuna giriş yapmıştık. Daha sonra  Python Gpio  yazısında gir...