4. ünite / 10 · yaklaşık 5 saat
GPIO: LED, buton, buzzer ve servo
40 pinli başlık, BCM numaraları, pull-up, sıçrama önleme, olay güdümlü kod ve PWM ile servo.
Bu ünitenin sonunda
- 40 pinli başlıkta güç, toprak ve GPIO pinlerini, fiziksel ve BCM numaralarını ayırt etmek
- LED ön direncini hesaplamak ve bir GPIO'dan çekilebilecek akım sınırını bilmek
- Butonu dahili pull-up ile okumak, sıçramayı (bounce) önlemek ve olay güdümlü kod yazmak
- Servoyu donanım PWM'li pinden 50 Hz darbeyle sürmek
Ders notları
Pi'nin 40 pinli başlığında 26 GPIO, 3,3 V ve 5 V güç pinleri ve sekiz GND vardır. İki numaralandırma kullanılır: fiziksel (başlıktaki sıra, 1–40) ve BCM (yongadaki GPIO numarası). gpiozero BCM kullanır: LED(17) fiziksel 11. pindir.
Çıkış: LED
Bir GPIO en fazla yaklaşık 16 mA vermelidir ve hepsinin toplamı da sınırlıdır. Kırmızı LED (Vf ≈ 2 V) ile 10 mA için ön direnç R = (3,3 − 2) / 0,01 = 130 Ω; standart 220 Ω daha güvenli (≈ 6 mA). Röle ya da motor gibi büyük yükler asla doğrudan pine bağlanmaz: transistör ya da sürücü kartı gerekir.
Giriş: buton
Boşta kalan giriş yüzer: ne 0 ne 1 okunur, elini yaklaştırınca bile değişir. gpiozero'da Button(27) dahili pull-up'ı açar; buton pini GND'ye çeker, basılıyken 0 okunur. Mekanik kontaklar birkaç milisaniye sıçrar; bounce_time=0.05 bunu süzer.
PWM ve servo
Pi'nin iki donanım PWM kanalı vardır (GPIO12/18 ve GPIO13/19). Başka pinlerde gpiozero yazılımsal PWM kullanır: LED için yeter, servo titrer. Servonun gücünü Pi'nin 5 V pininden değil ayrı bir kaynaktan ver, toprakları birleştir.
Simülasyon
40 pinli GPIO başlığı: LED, buton, buzzer, servo
Her cihazın sinyal ucunu bir fiziksel pine bağla: kablolama denetimi 5 V, GND, veri yolu ve donanım PWM hatalarını yakalar. Bir program seç, butona bas ve gpiozero kodunun pin numaralarıyla birlikte değiştiğini gör.
from gpiozero import LED, Button, Buzzer
from signal import pause
led, buzzer = LED(17), Buzzer(22)
button = Button(27, bounce_time=0.05)
def toggle():
if led.is_lit:
led.off(); buzzer.off()
else:
led.on(); buzzer.beep(on_time=0.2, off_time=0.2)
button.when_pressed = toggle
pause()LED (220 Ω) GPIO17 (fiziksel 11) uygun.
Buton GPIO27 (fiziksel 13) uygun.
Aktif buzzer GPIO22: aktif buzzer küçük bir akım çeker; büyük buzzer için transistör kullan.
Servo (SG90) GPIO18 (fiziksel 12) uygun.
Kendin dene
Benzetimde LED'i fiziksel 2. pine bağla ve hatayı oku; sonra 11. pine taşı. Servoyu 11. pine bağlayınca gelen uyarıyı oku ve 12. pine al. "Alarm" programını seç: butona bas, LED ve buzzer'ın nasıl değiştiğini ve koddaki pin numaralarını izle. 330 Ω ile LED akımını hesapla (V_f = 2 V).
Kod
from gpiozero import LED, Button, Buzzer
from signal import pause
led = LED(17)
buzzer = Buzzer(22)
button = Button(27, pull_up=True, bounce_time=0.05) # dahili pull-up: buton GND'ye çeker
def toggle():
if led.is_lit:
led.off(); buzzer.off()
else:
led.on(); buzzer.beep(on_time=0.2, off_time=0.2) # arka planda iş parçacığı
button.when_pressed = toggle # döngü yok: geri çağırma
pause() # ana iş parçacığını uyut# Pi 5'te RPi.GPIO yerine rpi-lgpio paketi aynı API'yi sunar
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM) # BCM numaraları (fiziksel değil)
GPIO.setup(17, GPIO.OUT)
GPIO.setup(27, GPIO.IN, pull_up_down=GPIO.PUD_UP)
servo = GPIO.PWM(18, 50) # 50 Hz servo; donanım PWM pini
servo.start(7.5) # %7,5 görev = 1,5 ms = orta
try:
while True:
pressed = GPIO.input(27) == GPIO.LOW
GPIO.output(17, pressed)
servo.ChangeDutyCycle(10.0 if pressed else 5.0)
finally:
GPIO.cleanup() # pinleri giriş kipine geri alSık yapılan hatalar
- Fiziksel ve BCM numaralarını karıştırmak: LED(11) fiziksel 11 değil, GPIO11 (SCLK) demektir.
- LED'i dirençsiz bağlamak: pin ve LED aşırı akımdan bozulur.
- Servoyu Pi'nin 5 V pininden beslemek: akım darbeleri Pi'yi yeniden başlatır.
- Butonu pull-up/down olmadan okumak: rastgele basışlar görülür.
Yazılım mühendisliği bağlantısı
gpiozero olay güdümlüdür: button.when_pressed = toggle. Döngü yerine geri çağırma kullanmak kodu sade tutar ama iş parçacığı demektir.
- Geri çağırmada uzun iş yapma; paylaşılan durum için kilit kullan.
- Pin numaralarını tek bir ayar dosyasında topla: kablolama değişince kod değişmesin.
Kendini sına
gpiozero'da LED(17) hangi fiziksel pindir?
3,3 V GPIO, V_f = 2 V kırmızı LED ve 10 mA için ön direnç kaç Ω?
Button(27) varsayılan olarak nasıl bağlanır?
Servo neden GPIO18'e bağlanmalı?
