Ahududu Pi 5 yeni piyasaya sürüldü ve bizi daha güçlü bir Pi ile tanıştırdı, ancak aynı zamanda birkaç şeyi de değiştirdi ve en önemlisi GPIO’ydu.
Hala aynı 40 pinli GPIO’ya sahibiz ancak yeni RP1 güney köprüsü çipine bağlı olduğu için artık biraz farklı çalışıyor. Bu neden önemli? Her şey GPIO ile etkileşime giren kodu nasıl yazdığımıza bağlı. Geçmişte birçok proje RPi.GPIO’yu tercih ediyordu. Bu, Ben Croston’un bir topluluk projesiydi ve birçok nesil Raspberry Pi’ye iyi bir şekilde hizmet etti. Raspberry Pi 5’te GPIO pinlerinin hafıza eşlemesi nedeniyle RPi.GPIO’yu kullanamıyoruz. Bu bizi bir alternatif kullanmaya zorluyor ve libgpiod bunun nasıl yapılacağı konusunun odak noktası.
Libgpiod, özellikle python3-gpiod GPIO ile etkileşime geçmek için saf bir Python modülüdür. Kullanmadan önce GPIO pinlerini açıkça ayarlamamız gerektiğinden RPI.GPIO’ya benzer bir his veriyor. Gpiod’u Python ve GPIO için daha çok bir ara modül olarak görüyoruz. Bu konuda yeniyseniz, şunu kullanın: GPIO Sıfır Raspberry Pi 5 ile de çalışır. GPIO Zero, Ben Nuttall ve Dave Jones tarafından oluşturuldu ve GPIO’yu büyük ölçüde basitleştiriyor.
Gpiod’u kullanarak çok basit iki proje oluşturacağız. Birincisi bir çıkış, bir LED. İkincisi, LED’in açılıp kapanmasını tetikleyecek bir düğme olan bir giriştir.
Bu projeler için ihtiyacınız olacak
Proje 1: Çıktı, Bir LED’in Yanıp Sönmesi
Herhangi bir dili/çerçeveyi öğrenirken ilk hedef bir “Merhaba Dünya” programı oluşturmaktır. Donanım, bilgisayar korsanlığı ve elektronikte bu, yanıp sönen bir LED’dir.
Devre son derece basittir. Bir atlama teli kullanarak GPIO 17’ye bağlanan bir LED’in uzun ayağına (anot) sahibiz. Kısa bacak (katot), bir direnç ve başka bir atlama kablosu aracılığıyla GND’ye bağlanır. Direnç 100 ila 330 Ohm (Turuncu-Turuncu-Kahverengi-Altın) arasında herhangi bir değer olabilir. Bizim göz atın direnç referans kılavuzu daha fazla bilgi için.
1. Thonny’yi açın ve iki kod modülünü içe aktarın. İlk modül GPIO’yu kontrol etmek ve okumak için kullanılan gpiod’dur. İkincisi, koda bir duraklama eklemek için kullanılan zamandır.
import gpiod
import time
2. LED_PIN adında bir değişken oluşturun ve 17 değerini bunun içinde saklayın. Bu değişken, Raspberry Pi’nin tüm modellerindeki GPIO pini için Broadcom pin referansını içerir. Broadcom pin referansları, tüm Raspberry Pi belgelerinde kullanılan standarttır. SoC’den GPIO’ya geçişi kullanır. Bize pek mantıklı gelmeyebilir ama panoları oluşturan mühendislere göre pinler doğru şekilde kırılmış.
LED_PIN = 17
3. Koda GPIO’yu nerede bulacağınızı söyleyin. Başlangıçta Raspberry Pi’nin belleğe eşlenen tek bir gpiomem cihazı vardı ve bunu RPi.GPIO gibi Python modülleriyle kullanabiliyorduk. Raspberry Pi 5 ve RP1 çipi ile artık dinamik olarak bölünmüş cihazlarımız var ve GPIO’muz gpiomem4’te.
chip = gpiod.Chip('gpiochip4')
4. led_line adında bir değişken oluşturun ve LED GPIO pinine bir referans saklayın. Gpiod modülü, GPIO pinlerine atıfta bulunmak için çizgiler kullanır.
led_line = chip.get_line(LED_PIN)
5. LED’i çıkış olarak ayarlayın. Akımın LED’e akmasını istiyoruz.
led_line.request(consumer="LED", type=gpiod.LINE_REQ_DIR_OUT)
6. Kodun ana gövdesini try ve while True döngüsüne sarın.Try, kodumuzu çalıştırmayı deneyecek istisna işleyicinin bir parçasıdır, istisnaları işleyebilir ve çıktığımızda kodun bir bölümünü çalıştırabilir.
try:
while True:
7. LED’i çevirin ve ardından bir saniye bekleyin. Bu, LED’in bir saniye boyunca açık kalmasını zorlayacaktır.
led_line.set_value(1)
time.sleep(1)
8. LED’i kapatın ve ardından bir saniye bekleyin. Uyku, LED’i bir saniye boyunca kapalı kalmaya zorlar.
led_line.set_value(0)
time.sleep(1) # Sleep for one second
9. Kod çıktığında GPIO’yu temizlemek için bir kod bölümü ekleyin. GPIO Zero ile bunu yapmak zorunda değiliz ancak gpiod’u (ve eski RPi.GPIO’yu) çıkmadan önce temizlememiz gerekiyor.
finally:
led_line.release()
10. Kodu Blinky.py olarak kaydedin ve başlamak için Çalıştır’a tıklayın. GPIO 17’deki LED her saniye yanıp sönecektir. Sonlandırmak için CTRL + C tuşlarına basın veya Durdur’a tıklayın.
Proje 1: Tam Kod Listeleme
import gpiod
import time
LED_PIN = 17
chip = gpiod.Chip('gpiochip4')
led_line = chip.get_line(LED_PIN)
led_line.request(consumer="LED", type=gpiod.LINE_REQ_DIR_OUT)
try:
while True:
led_line.set_value(1)
time.sleep(1)
led_line.set_value(0)
time.sleep(1)
finally:
led_line.release()
Proje 2: Girdi, Kullanıcı Girdisine Tepki Verme
“Merhaba Dünya”dan sonraki hedef bir girdi oluşturmaktır. Bu örnekte bir buton oluşturuyoruz, bir tarafı Button GPIO pinine, diğer tarafı 3V3’e bağlı. Button GPIO pininin varsayılan durumu güç yok (0, Yanlış, Düşük) ancak düğmeye bastığımızda 3V3 pinini Button GPIO pinine bağlayıp durumunu güç (1, Doğru, Yüksek) olarak değiştiriyoruz. Kodumuz bu durum değişikliğini arayacak ve buna göre tepki verecektir. Tek ihtiyacımız olan düğme ve iki aktarma kablosu.
1. Thonny’yi açın ve iki kod modülünü içe aktarın. İlk modül GPIO’yu kontrol etmek ve okumak için kullanılan gpiod’dur. İkincisi, koda bir duraklama eklemek için kullanılan zamandır.
import gpiod
import time
2. LED_PIN adında bir değişken oluşturun ve 17 değerini bunun içinde saklayın. Bu değişken, Raspberry Pi’nin tüm modellerindeki GPIO pini için Broadcom pin referansını içerir. Broadcom pin referansları, tüm Raspberry Pi belgelerinde kullanılan standarttır. SoC’den GPIO’ya geçişi kullanır. Bize pek mantıklı gelmeyebilir ama panoları oluşturan mühendislere göre pinler doğru şekilde kırılmış.
LED_PIN = 17
3. BUTTON_PIN adında bir değişken oluşturun ve 27 değerini bunun içinde saklayın. GPIO 27, GPIO 17’nin hemen yanındadır.
BUTTON_PIN = 27
4. Koda GPIO’yu nerede bulacağınızı söyleyin. Başlangıçta Raspberry Pi’nin belleğe eşlenen tek bir gpiomem cihazı vardı ve bunu RPi.GPIO gibi Python modülleriyle kullanabiliyorduk. Raspberry Pi 5 ve RP1 çipi ile artık dinamik olarak bölünmüş cihazlarımız var ve GPIO’muz gpiomem4’te.
chip = gpiod.Chip('gpiochip4')
5. led_line adında bir değişken oluşturun ve LED GPIO pinine bir referans saklayın. Gpiod modülü, GPIO pinlerine atıfta bulunmak için çizgiler kullanır.
led_line = chip.get_line(LED_PIN)
6. Button_line adında bir değişken oluşturun ve Button GPIO pinine bir referans kaydedin.
button_line = chip.get_line(BUTTON_PIN)
7. LED’i çıkış olarak ayarlayın. Akımın LED’e akmasını istiyoruz.
led_line.request(consumer="LED", type=gpiod.LINE_REQ_DIR_OUT)
8. Düğmeyi giriş olarak ayarlayın. Akımın LED’e akmasını istiyoruz.
button_line.request(consumer="Button", type=gpiod.LINE_REQ_DIR_IN)
9. Kodun ana gövdesini try ve while True döngüsüne sarın.Try, kodumuzu çalıştırmayı deneyecek istisna işleyicinin bir parçasıdır, istisnaları işleyebilir ve çıktığımızda kodun bir bölümünü çalıştırabilir.
try:
while True:
10. Button GPIO pininin mevcut durumunu alın ve onu Button_state adlı bir değişkende saklayın.
button_state = button_line.get_value()
11. Düğmeye basılıp basılmadığını kontrol etmek için if koşulunu kullanın. Eğer öyleyse, LED’i açın. Button GPIO pininin varsayılan durumu düşük (0, Yanlış) olacaktır. Fakat butona bastığımızda Raspberry Pi 5’in 3V pinini Button GPIO pinine bağlıyoruz. Bu, Düğme pimini yükseğe çeker (1, Doğru). Bu durum değişikliği kodumuzun tetikleyicisidir.
if button_state == 1: # Button is pressed
led_line.set_value(1) # Turn the LED on
12. Düğmeye basılmadığında LED’i kapatmak için başka bir koşul kullanın.
else:
led_line.set_value(0) # Turn the LED off
13. Kod çıktığında GPIO’yu temizlemek için bir kod bölümü ekleyin. GPIO Zero ile bunu yapmak zorunda değiliz ancak gpiod’u (ve eski RPi.GPIO’yu) çıkmadan önce temizlememiz gerekiyor.
finally:
led_line.release()
button_line.release()
14. Kodu Button-press.py olarak kaydedin ve başlamak için Çalıştır’a tıklayın. LED’i açmak için düğmeye basın ve kapatmak için bırakın. Sonlandırmak için CTRL + C tuşlarına basın veya Durdur’a tıklayın.
Proje 2: Tam Kod Listeleme
import gpiod
LED_PIN = 17
BUTTON_PIN = 27
chip = gpiod.Chip('gpiochip4')
led_line = chip.get_line(LED_PIN)
button_line = chip.get_line(BUTTON_PIN)
led_line.request(consumer="LED", type=gpiod.LINE_REQ_DIR_OUT)
button_line.request(consumer="Button", type=gpiod.LINE_REQ_DIR_IN)
try:
while True:
button_state = button_line.get_value()
if button_state == 1:
led_line.set_value(1)
else:
led_line.set_value(0)
finally:
led_line.release()
button_line.release()