WiringPi ile Raspberry Pi GPIO Kontrolü

Öncelikle Wiring Pi nedir bundan başlayalım. WiringPi bir kütüphane bu kütüphaneyi kullanarak raspberry pi üzrindeki gpıo pinlerini programlayabiliriz, tabi bu kütüphaneyi kullanmadanda yapabilirsiniz ama bu sefer direk işlemci ile uğraşmamız gerekiyor ben tavsiye etmiyorum zaman kaybı olur bu :) Daha önce arduino kullandıysanız WiringPİ kullanmak size oldukca kolay gelecektir, kullanmadıysanızda önemli değil yinede oldukca kolay :D . Bu yazı şimidilik basit bir giriş devamında lcd ekran sürme ve bunun gibi konuları anlatacağım yazılarda gelecek.


WringPİ'nin RaspberryPi'ye kurulması:


İlk olarak wiringpiyi indirip Pİmize kurmamız gerekiyor bunun için terminali açın ve alttaki kodları sırasıyla yapıştırın.
⦁    sudo apt-get install git-core
⦁    sudo apt-get update
⦁    sudo apt-get upgrade
⦁    git clone git://git.drogon.net/wiringPi
⦁    cd wiringPi
⦁    git pull origin
⦁    cd wiringPi
⦁    ./build

Kullunımı:


efenim öncelikle bu Wiring Pi denen arkadaşın Raspberry Pi'de ki gpıo pinlerini kendine özel olarak numaralandırdığını söyleyeyim ve şu iki tabloyu koyayım (bu tabloları  kullanarak programlayacağız pinleri iyi bakın bu nedenle :) :
header_pinout

rpigpio


ilk olarak raspberry pi üzerinde bir c dosyası oluşturup kütüphaneyi dahil edelim:


ben ssh ile terminalden bağlanıyorum bu nedenle dosya oluşturmak için istediğim dizine gidip orada "sudo nano wiringpideneme.c" yazmam yeterli sizde istediğiniz şekilde yeni bir dosya oluşturup ismini blabala.c olarak değiştirin ve kodu oraya yazın. oluşturduğunuz c dosyasında Wiring Pi'yi kullanabilmek için  #include <wiringPi.h> yazarak başlayın. Bu kod programımıza Wiring Pi kütüphanesini dahil etmemizi sağlar. Bu işlemden sonra programa hangi pin düzenini kullanacağımızı bildirmemiz gerekiyor bunun için şu iki komutu kullanıyoruz:

wiringPiSetup(); //Bu kod wiringPinin kendi numaralandırma sistemini kullanmak istediğiniz belirtir.
wiringPiSetupGpio(); //Bu kod Broadcom'un numaralandırma sistemini kullanmak istediğinizi belirtir.
Bu işlemler bittikten sonra aynı arduino'da ki gibi hanigi pini ne için kullanacağımızı bildirmemiz gerekiyor (vahi gelecek değil ya bilgisayara biz belirleyecez ne istediğimizi :D) bunu pinMode(17, İŞLEM); koduyla yapıyoruz. Burada İŞLEM yazan yerde kullanabileceğiniz çeşitli komutlar var bunları şöyle yazalım ve açıklayalım;
pinMode(17, INPUT); //Bu şekilde INPUT yazdığımızda Raspberry Pİ'e 17. pinin bir giriş pini olduğunu söylüyoruz. Buradan RPI lojik 1 veya 0 sinyali vererek Pİye çeşitli işleri yapması gerektiğini söyleyebiliriz.
pinMode(23, OUTPUT); //Bu kod ile Raspberry Pi'e 23. gpıo pinin bir çıkış pini olduğunu söyledik artık bu pinden dışarıya bir sinyal gönderebiliriz.
pinMode(18, PWM_OUTPUT); Bu kodda yukardakinin aynısı ama burada 18.pine analog sinyali taklit etmek için pwm sinyali ürettireceğimizi belirttik. Eğer bilmiyorsanız PWM konusuna çok takılmayın şu videoda güzelce anlatmışlar nedir ne değildir :) https://www.youtube.com/watch?v=i2UpqGcRacg

Pinlerin ne iş yapacağını tanımladığımıza göre sıra geldi onları kullanarak çıkış veya giriş almaya. Şimdi bu işlemi bir kaç başlıkta inceleyelim.

Digital Çıkış işlemleri (Output)


Raspberry Pİ'de bir pinden dijital çıkış almak için digitalWrite([pin], [HIGH/LOW]) kodunu kullanıyoruz yani eğer 18. pinden dijital 1 (açık veya var) sinyali almak istiyorsak digitalWrite(18, HIGH); yazmamız gerekiyor, o pinle işimiz bittiyse ve artık ordan sinyal gelsin istemiyorsak aynı şekilde digitalWrite(18, LOW); yazarak pine sinyal gidişini durdurabilirsiniz (sinyal derken elektrik demek istiyorum)


PWM (“Analog”) Çıkış işlemleri


Raspberry Pi'de  bir pinden pwm sinyal almak için ilk olarak o pini pwm output olarak tanımlamalıyız bunu yukarıda göstermiştim. Pini pwm output olarak tanımladıktan sonra ondan 0-1023 arasında bir değerde sinyal almamız mümkün bunu pwmWrite([pin], [0-1023]) koduyla yapıyoruz. Yine bir örnek vererek pekiştirelim eğer 18.pinden pwm sinyali almak istersek bunu pwmWrite(18, 763) şeklinde yapabiliriz.


Digital Giriş işlemleri (Input)


Bir pinden dijital giriş alarak yani pine sinyal gelip gelmediğini anlayarak RaspberryPİye çeşitli işlemler yapabiliriz. Bu okuma işlemini yapmak için kullanılan komut digitalRead([pin]) dir. Kullanımı ise şöyle:
if (digitalRead(17))
printf("Pin 17 is HIGH\n");
else
printf("Pin 17 is LOW\n");
Bu kod parçasının yaptığı işlem pin 17'den herhangi bir sinyal gelip gelmediğine bakmak ve eğer geliyorsa konsol ekranında Pin 17 is HIGH gelmiyorsa Pin 17 is LOW yazdırmaktır.


Pull-Up/Down Resistors


buton kullanırken  pullUpDnControl([pin], [PUD_OFF, PUD_DOWN, PUD_UP])  pin.
For example, if you have a button on pin 22 and need some help pulling it up, write:
pullUpDnControl(17, PUD_UP);

Bekleme (delay) komutu


Yazdığınız program herhangi bir nedenden dolayı belirli bir zaman aralığı için dursun ve sonra devam etsin istiyorsanız bunun için delay([milliseconds]) ve delayMicroseconds([microseconds]) komutlarını kullanmalısınız. Direk delay([milliseconds]); şeklinde yazarsanız program milisaniye cinsinden zamanı tutacak ve o kadar bekleyecektir (1000 millisaniye = 1 saniye) ama delayMicroseconds([microseconds]) şeklinde yazarsanız program mikrosaniye cinsinden zamanı tutacak ve o kadar bekleyecektir saniye bekleyecektir.


Bir Örnek yapıp onu derleyelim ve bunlar pekişsin.


#include <stdio.h>    // Used for printf() statements
#include <wiringPi.h> // içe WiringPi kütüphanesini aktar

// Pin numaralarının değişkenlere tanımlanması. Burada Broadcom'un pin numaraları kullanıldı.
const int pwmPin = 18; // PWM LED - Broadcom pin 18, P1 pin 12
const int ledPin = 23; // Regular LED - Broadcom pin 23, P1 pin 16
const int butPin = 17; // Active-low button - Broadcom pin 17, P1 pin 11

const int pwmValue = 75; // Led parlaklığı ayarlamak için pwm değeri değişkeninin tanımlanması.

int main(void)
{
// Pin modu ayarlamalarının yapılması:
wiringPiSetupGpio(); // Broadcom pin numaralının kullanılacağının programa söylenmesi

pinMode(pwmPin, PWM_OUTPUT); // PWM LED as PWM output
pinMode(ledPin, OUTPUT);     // Set regular LED as output
pinMode(butPin, INPUT);      // Set button as INPUT
pullUpDnControl(butPin, PUD_UP); // Enable pull-up resistor on button

printf("Blinker is running! Press CTRL+C to quit.\n");

// while(1) dögüsü;
while(1)
{
if (digitalRead(butPin)) // Butondan gelen değer 1se aşağıdaki kodu çalıştır.
{
pwmWrite(pwmPin, pwmValue); // PWM LED at bright setting
digitalWrite(ledPin, LOW);     // Regular LED off
}
else // Butondan gelen değer 0se aşağıdaki kodu çalıştır
{
pwmWrite(pwmPin, 1024 - pwmValue); // PWM LED at dim setting
// Do some blinking on the ledPin:
digitalWrite(ledPin, HIGH); // LEDi yak
delay(75); // 75ms bekle
digitalWrite(ledPin, LOW); // LEDi sondur
delay(75); // tekrar 75ms bekle
}
}

return 0;
}



Programın derlenmesi:

Linuxda bir programı gcc derleyicisi kullanarak derleriz. Sizde yaptığınız programı derlemek için onu kullanacaksınız. Bu işlemi yapmak için terminale tırnaklar olmadan "gcc -o programınızınismi programınkodununbulunduğuCdosyası" yazmanız gereiyor, bunu yaptıktan sonra programınızın C dosyasının olduğu dizinde programınızınismi yazan yere yazdığınız isimde bir dosya oluşacak onu alıştırmak için terminalde o dizine ulaşmanız ve tırnaklar olmadan "./programınızınismi" yazmanız gerekmekte.

Yorumlar

Yorum Gönder

Bu blogdaki popüler yayınlar

RTL-SDR ile Amatör Telsizciliğe bir Dinleyiş :)

Yeni Başlayanlar İçin Linux Rehberi

Ubuntu 20.04 ile Linux Deneyimim Üzerine Bir Deneme