Raspberry Pi’nin beyni ve omurgası sayılan BCM2835‘in P1 portu 26 pine sahip. P1, BCM2835’in bazı pinlerine erişmemizi sağlayan bir port. 26 pinin 8 tanesi Genel Amaçlı Giriş Çıkış için programlanırken (GPIO), biri donanımsal PWM çıkışı olmak üzere I2C, SPI ve UART gibi birçok güzel porta sahip. P1’de, ayrıca 3.3v ve 5v luk besleme uçları da var
Pi’nin B modeli ayrıca bir konnektör lehimleyebilirceğiniz 4 pinli ayrı bir GPIO portuna da sahip. Bu portun adı P5. P5’i kullanmak isterseniz 2mm’lik 2×4’erkek header konnektör bağlayıp 4 GPIO pini daha elde edebilirsiniz. Detaylı bilgi için buraya bakabilirsiniz.
Yukarıda bahsettiğim I2C, SPI ve UART çalışma modları değiştirilerek ilgili pinler GPIO olarak da kullanılabiliyor. Bu durumda toplam 8 + 2 + 5 + 2 + 4 = 21 bitlik bir giriş çıkış portuna sahibiz demektir.
WiringPi
WiringPi, birçok dolaylı GPIO kontrol projesine de temel teşkil etmiş durumda. Bu özelliğini C’de kodlanmış olmasına bağlıyorum. Buradan programlama dillerine göre yapılmış bir performans sınamasına ulaşabilirsiniz. Sayfada göreceğiniz gibi C ile kodlanmış olan WiringPi kütüphanesi ile port’un on/off frekansı 7MHz’in üzerine çıkabilmiş.
WiringPi.GPIO komut satırı aracı
WiringPi’nin asıl bahsetmek istediğim kısmı beraberinde gelen gpio adındaki komut satırı aracı. Bu komut ile Pi’nin portlarını komut satırından kolayca kontrol edebilirsiniz. İleride bu komutu web sayfasından shell komutu aracılığı ile kullanmaktan da bahsedeceğim.
wiringPi’yi kurmak için aşağıdaki komutları sırasıyla uygulayın:
1 2 3 |
[crayon-678f1e678bc8b961521042 lang="bash" ] sudo apt-get install git-core |
1 2 3 4 5 |
[crayon-678f1e678bc8e494775630 lang="bash" ] sudo apt-get update sudo apt-get upgrade git clone git://git.drogon.net/wiringPi |
1 2 3 4 |
[crayon-678f1e678bc90829339431 lang="bash" ] cd wiringPi git pull origin |
1 2 3 4 |
[crayon-678f1e678bc92160127352 lang="bash" ] cd wiringPi ./build |
Kurulumu tamamladıktan sonra WiringPi ile gelen gpio komut satırı aracını test etmek için şu komutu verin.
1 2 3 |
[crayon-678f1e678bc94166192685 lang="bash" ] sudo gpio -v |
V parametresi Pi’niz hakkında bilgi kısa bir bilgi görüntüleyecek.
WiringPi GPOI hakkında bilmek isteyebileceğiniz bir detay da şu; GPIO komut satırı aracı esasında wiringPi kütüphanesini kullanmıyor, hali hazırda zaten raspbian’a entegre edilmiş olan /sys/class/gpio/ arabirimi ile dosya sistemi üzerinden iletişime portları yönetmenizi sağlıyor. Bu nedenle hız gerektiren uygulamalar için gpio komut satırı aracı çok yavaş kalabilir.
Tüm GPIO pinlerinin durum ve değerlerini görüntülemek için şu komutu verin:
1 2 3 |
[crayon-678f1e678bc96314474366 lang="bash" ] sudo gpio readall |
gpio’nun komut satırından kullanımına örnek vermek gerekirse, aşağıdaki 3 satırlık komut Raspberry Pi’nin 2. pine bağlı Led’i yakıp daha sonra da söndürmektedir. Led’in katotuna, 330 ohm’luk direnç ile GND’ye bağlıdır.
1 2 3 4 5 |
[crayon-678f1e678bc98682032804 lang="bash" ] gpio mode 2 out gpio write 2 1 gpio write 2 0 |
İl satırda 2. pin çıkış olarak ayarlanıyor ardından çıkışa 1 bilgisi gönderilerek led yakılıyor, 3. satırda da 0 bilgisi ile 2. led’in sönmesi sağlanıyor.
Raspbian Linux kullandığınızı varsayarak aynı işlemi wiringPi ile gelen gpio aracını kullanmadan da gerçekleştirebilirsiniz. WiringPi GPIO’nun BCM2835 ile çekirdek seviyesinde iletişim kurmadığından yukarıda bahsetmiştim. Şöyle:
1 2 3 4 5 6 7 |
[crayon-678f1e678bc9a009388382 lang="bash" ] echo "27" > /sys/class/gpio/export echo "out" > /sys/class/gpio/gpio27/direction echo "1" > /sys/class/gpio/gpio27/value echo "0" > /sys/class/gpio/gpio27/value |
Kısaca açıklamak gerekirse 2. pinin yönü (direction) çıkış (out) olarak ayarlanıyor ardından bu pine değer olarak sırasıyla 1 ve 0 bilgileri gönderiliyor. Bu yöntemi kullanmanızı tavsiye etmiyorum. Çünkü bu yöntemde kullanmak istediğiniz pin’e karşılık gelen BCM GPIO numarasını yazmanız gerekiyor. Pin’lerin BCM GPIO numaralarını aşağıdaki tablodan görebilirsiniz.
BCM GPIO numaralandırması aslında Raspberry’nin beynini oluşturan BCM2835 işlemcisinin bacak numarasına karşılık geliyor. Port’ları BCM numarası ile adlandırmak ve yukarıdaki gibi /sys/class/gpio arabirimini kullanarak uygulama gerçekleştirmek pek iyi bir fikir değil.
Şöyleki; Ilerleyen zamanlarda işlemcinin veya Pi kartının tasarımı veya bacak bağlantılarının değişmesi çok olası. Bu durumda uygulamanızda kullandığımız portun BCM2835’in farklı bir karşılık gelmesi durumu var. Aslında gpio aracı tam da bu noktada araya giriyor ve raspberry pin sıra numaraları ile bcm gpio’nun pin numaraları arasında bir bir nevi eşleştirme yapıyor. Yani biz ona pin 2 dediğimiz de o aslında BCM2835 çipinin 27 numaralı bacağını (GPIO27) kastettiğimizi anlıyor. İleride BCM2835’in bacakları veya Pi’nin tasarımı değiştiğinde wiringPi ile gelen gpio aracının güncellenen sürümü sayesinde program kodlarımızda ve uygulama devrenizde hiçbir değişiklik yapmadan yolunuza devam edebilirsiniz. Yani gpio aracı diğerine göre iyi bir yöntem.
WiringPi gpio aracı ile pwm, SPI, UART gibi Pi’nin izin verdiği hemen hemen tüm özellikleri kullanabilirsiniz. Port’tan okuma yapmaya örnek vererek sonlandırmak istiyorum.
1 2 3 |
[crayon-678f1e678bca1537913438 lang="bash" ] gpio read 2 |
Bu komut ile 2. pinin mevcut değerini okutup ekrana yazdırıyoruz.
Umarım faydalı olmuştur. Sorularınız olursa sayfanın sonuna yazabilirsiniz. Elimden geldiğince yanıtlamaya çalışırım.
Kaynak:
[0] http://wiringpi.com/
[1] http://wiringpi.com/download-and-install/
[2] http://codeandlife.com/2012/07/03/benchmarking-raspberry-pi-gpio-speed/
[3] http://www.raspberrypi-spy.co.uk/2012/09/raspberry-pi-p5-header/
“WiringPi.GPIO ile Komut Satırından Port Kontrolü” için bir yorum