RP–02 · Raspberry Pi başlangıç projesi

Butonlu Yaya Geçidi Trafik Lambası

Yaya geçitlerindeki "bas-bekle" butonlarını hiç merak ettiniz mi? Bu projede kırmızı, sarı ve yeşil LED'leri gpiozero'nun TrafficLights sınıfıyla yönetecek, bir butonla yaya isteği alıp ışıkları doğru sırayla değiştireceğiz.

SeviyeBaşlangıç
Süre35–40 dk
Malzeme8 çeşit
TrafficLightsButtonwait_for_press()Dahili pull-upDurum sırasıTuple

Proje hakkında

Bir trafik lambası, belirli bir sırayla belirli sürelerde değişen bir durum makinesidir. Bu projede araçlar için yeşil yanan lambayı, yaya butona bastığında güvenli bir sırayla kırmızıya çevireceğiz. Türkiye'deki trafik lambalarında olduğu gibi, yeşile dönmeden önce kırmızı ve sarı birlikte yanacak.

Butonu okumak için ek bir direnç kullanmayacağız; gpiozero Raspberry Pi'nin içindeki pull-up direncini otomatik olarak açar. Ayrıca butona basılana kadar programı bekleten wait_for_press() fonksiyonunu ve ışıkları tek satırda ayarlamayı sağlayan tuple yapısını öğreneceğiz.

  • gpiozero'nun TrafficLights ve Button sınıflarını
  • Dahili pull-up direncinin nasıl çalıştığını
  • wait_for_press() ile olay beklemeyi
  • Durumları tuple listesiyle tanımlayıp döngüyle oynatmayı

Malzeme listesi

Projeyi tamamlamak için aşağıdaki 8 çeşit malzemeye ihtiyacınız var. Raspberry Pi'niz hazırsa geri kalan parçaların çoğu elektronik başlangıç setlerinde bulunur.

Raspberry Pi 4 veya 5 1 adet

Raspberry Pi OS (Bookworm veya üstü) kurulu olmalı. Pi 3B+ ile de çalışır.

microSD kart 1 adet

En az 16 GB, Raspberry Pi OS yüklü.

Resmi güç adaptörü 1 adet

Pi 5 için 5V 5A USB-C, Pi 4 için 5V 3A USB-C.

Breadboard 1 adet

Yarım boy (400 delik) yeterlidir.

5 mm LED (kırmızı, sarı, yeşil) 3 adet

Her renkten bir tane.

330 Ω direnç 3 adet

Her LED için bir direnç.

Push buton 1 adet

4 bacaklı tactile buton.

Jumper kablo (dişi-erkek) 6 adet

Devre bağlantıları

Bağlantıları Raspberry Pi kapalıyken ve güç kablosu çıkarılmışken yapın. Her satırda önce GPIO (BCM) numarası, ardından kart üzerindeki fiziksel pin numarası yazar; çizgi rengi önerilen kablo rengidir.

Kırmızı LED anotGPIO22 · pin 15330 Ω direnç üzerinden
Sarı LED anotGPIO27 · pin 13330 Ω direnç üzerinden
Yeşil LED anotGPIO17 · pin 11330 Ω direnç üzerinden
Tüm LED katotlarıGND · pin 9Breadboard'un − hattı üzerinden
Buton 1. bacakGPIO2 · pin 3Dahili pull-up kodda açılır
Buton 2. bacak (çapraz)GND · pin 6
GPIO2'de kart üzerinde kalıcı bir 1,8 kΩ pull-up direnci vardır; bu yüzden buton için en sorunsuz pinlerden biridir. Butonu breadboard'un ortadaki kanalının üzerine oturtup çapraz iki bacağını kullanırsanız yanlış bağlantı yapma ihtimaliniz kalmaz.

Adım adım kurulum

  1. Pi'yi kapatın

    Güç kablosunu çıkarın.

  2. Ortak GND hattını kurun

    Pin 9'u (GND) breadboard'un mavi (−) hattına bağlayın. Tüm LED'lerin kısa bacakları bu hatta gidecek.

  3. LED'leri sıralayın

    Kırmızı, sarı ve yeşil LED'leri yukarıdan aşağıya dizin. Kısa bacakları − hattına bağlayın, uzun bacaklarının sütununa birer 330 Ω direnç takın.

  4. LED'leri pinlere bağlayın

    Kırmızının direncini pin 15'e (GPIO22), sarınınkini pin 13'e (GPIO27), yeşilinkini pin 11'e (GPIO17) bağlayın.

  5. Butonu bağlayın

    Butonu orta kanala yerleştirin. Bir bacağını pin 3'e (GPIO2), çapraz bacağını pin 6'ya (GND) bağlayın.

  6. Kodu çalıştırın

    Pi'yi açın, kodu trafik_lambasi.py olarak kaydedip çalıştırın. Yeşil yanmalı ve ekrana bekleme mesajı gelmeli.

  7. Test edin

    Butona basın: 1 saniye sonra sarı, ardından kırmızı yanar; 5 saniyelik yaya süresinden sonra kırmızı-sarı birlikte yanar ve tekrar yeşile döner.

Python kodu

Kodları Thonny editörüne yapıştırıp .py uzantısıyla kaydedin ve Run düğmesine basın ya da terminalden python3 dosya_adi.py komutuyla çalıştırın. Programı durdurmak için Ctrl+C tuşlarını kullanın.

Butonla tetiklenen yaya geçidi programı.

trafik_lambasi.pyPython
# Butonlu Yaya Geçidi Trafik Lambası
# RobotikHocasi.com

from gpiozero import TrafficLights, Button
from time import sleep

isiklar = TrafficLights(red=22, amber=27, green=17)
buton = Button(2)      # Dahili pull-up otomatik açılır

isiklar.green.on()
print("Araclar geciyor. Yaya butonu bekleniyor...")

while True:
    buton.wait_for_press()          # Butona basılana kadar bekle
    print("Yaya istegi alindi!")
    sleep(1)

    # Yeşil -> Sarı
    isiklar.green.off()
    isiklar.amber.on()
    sleep(2)

    # Sarı -> Kırmızı: yayalar geçer
    isiklar.amber.off()
    isiklar.red.on()
    print("Yayalar gecebilir")
    sleep(5)

    # Kırmızı + Sarı: yeşil yanmak üzere
    isiklar.amber.on()
    sleep(1)

    # Tekrar yeşil
    isiklar.red.off()
    isiklar.amber.off()
    isiklar.green.on()
    print("Araclar geciyor")

Bonus: Buton olmadan sürekli dönen kavşak lambası; durumlar tek bir listede tanımlanır.

otomatik_dongu.pyPython
# Otomatik trafik lambası döngüsü
from gpiozero import TrafficLights
from time import sleep

isiklar = TrafficLights(red=22, amber=27, green=17)

# (kırmızı, sarı, yeşil) durumları ve süreleri (saniye)
dongu = [
    ((0, 0, 1), 6),    # Yeşil
    ((0, 1, 0), 2),    # Sarı
    ((1, 0, 0), 6),    # Kırmızı
    ((1, 1, 0), 1),    # Kırmızı + sarı
]

while True:
    for durum, sure in dongu:
        isiklar.value = durum
        sleep(sure)

Kod açıklaması

TrafficLights(red=22, amber=27, green=17)

Üç LED'i tek bir nesnede toplar. isiklar.red, isiklar.amber ve isiklar.green ile her birine ayrı ayrı ulaşabilirsiniz.

Button(2)

GPIO2'deki butonu temsil eder. Varsayılan olarak dahili pull-up açılır; buton basılı değilken pin 3,3V, basılınca 0V olur.

buton.wait_for_press()

Program bu satırda durur ve butona basılmasını bekler. Bu sırada işlemciyi meşgul etmez.

((0, 0, 1), 6)

İç içe tuple: ilk kısım (kırmızı, sarı, yeşil) LED durumları, ikinci kısım saniye cinsinden süre.

isiklar.value = durum

Üç LED'in durumunu tek satırda ayarlar. (1, 1, 0) kırmızı ve sarıyı yakar, yeşili söndürür.

for durum, sure in dongu:

Listedeki her tuple'ı açarak iki değişkene ayırır. Python'da buna tuple açma (unpacking) denir.

Nasıl çalışır?

Buton, iki bacağı arasındaki yolu basıldığında kapatan basit bir anahtardır. gpiozero, GPIO2 pinini Raspberry Pi'nin içindeki pull-up direnciyle 3,3V'a çeker. Butona basıldığında pin doğrudan GND'ye bağlanır ve 0V olur. Kütüphane bu düşüşü "basıldı" olarak yorumlar ve mekanik titreşimleri de kendi içinde filtreler.

Trafik lambası sırası güvenlik için tasarlanmıştır. Yeşilden doğrudan kırmızıya geçilmez; sarı, sürücülere durmaları için zaman tanır. Kırmızı ile sarının birlikte yanması ise sürücülere yeşilin gelmek üzere olduğunu haber verir. Gerçek kavşaklarda bu süreler trafik yoğunluğuna göre ayarlanır.

Sorun giderme

Butona basmadan program devam ediyor
Buton yanlış bacaklardan bağlanmış ve sürekli basılı durumda olabilir. Butonu 90° döndürün ya da çapraz bacakları kullanın.
Butona bastığım halde bir şey olmuyor
Kablonun pin 3'e (GPIO2) ve diğer bacağın GND'ye bağlı olduğunu kontrol edin. Kodda Button(2) yazdığından emin olun.
Yanlış LED yanıyor
Kablolar pinlere karışık takılmış. Kabloları değiştirmek yerine koddaki red, amber, green numaralarını düzenleyebilirsiniz.
Program kapandığında LED'ler yanık kalıyor
gpiozero program normal kapanınca pinleri sıfırlar. Thonny'de Stop yerine Ctrl+C kullanmayı deneyin.

Geliştirme fikirleri

Projeyi tamamladıysanız, aşağıdaki fikirlerle bir adım öteye taşıyabilirsiniz.

Yaya için ikinci lamba

Kırmızı ve yeşil iki LED daha ekleyip yayalar için ayrı bir lamba yapın.

Geri sayım

Yaya süresi boyunca terminale kalan saniyeyi yazdırın veya buzzer ile bip sesi verin.

Gece modu

Belirli saatler arasında sadece sarı ışığın yanıp söndüğü bir mod ekleyin.

Web'den kontrol

Flask ile telefondan yaya isteği gönderilebilen bir arayüz yapın.

Sık sorulan sorular

Neden butona dirençsiz bağlantı yeterli?
gpiozero Button sınıfı Raspberry Pi'nin dahili pull-up direncini otomatik açar. Arduino'daki gibi harici 10 kΩ dirence gerek kalmaz.
wait_for_press() yerine when_pressed kullanabilir miyim?
Evet. when_pressed bir fonksiyonu butona basıldığında arka planda çalıştırır. Ancak ışık sırası zaman gerektirdiği için bu projede sıralı akışı gösteren wait_for_press() daha anlaşılırdır.
TrafficLights yerine üç ayrı LED nesnesi kullanabilir miyim?
Elbette. LED(22), LED(27) ve LED(17) ile aynı sonucu alırsınız; TrafficLights sadece kodu daha düzenli hale getirir.

Bir sonraki projeye hazır mısınız?

Raspberry Pi serisindeki 5 projeyi tamamladığınızda GPIO, kamera, sensör verisi ve web sunucusu ile çalışmanın temellerini öğrenmiş olursunuz.

Raspberry Pi projelerine dön