Kurs içeriği (9 / 10)
- 1 Raspberry Pi ile Tanışma ve Kurulum
- 2 Makine Öğrenmesi Nedir? İlk Modelimiz
- 3 Kamera ve Görüntü İşlemenin Temelleri
- 4 Görüntü Veri Seti Hazırlama
- 5 Görüntü Tanıma Modeli Eğitip Pi’de Çalıştırma
- 6 Mikrofon ve Sesin Temelleri
- 7 Ses Veri Seti Hazırlama
- 8 Ses Tanıma Modeli ile Sesli Komutlar
- 9 Yapay Zekâyı Donanıma Bağlama: LED, Buzzer ve Servo
- 10 Mini Proje: Akıllı Geri Dönüşüm Kutusu
Raspberry Pi ile Makine Öğrenmesi: Görüntü ve Ses Tanıma · Ders 9 / 10
Yapay Zekâyı Donanıma Bağlama: LED, Buzzer ve Servo
GPIO pinlerini tanıyor, iki LED, bir buzzer ve bir SG90 servo motoru breadboard üzerinden Raspberry Pi’ye güvenle bağlıyoruz. gpiozero ile her parçayı test ediyor, ardından görüntü tanıma modelinin tahminlerine göre LED yakan, ses çıkaran ve servoyu doğru bölmeye çeviren bir program yazıyoruz.
Bu derste
- GPIO numarası (BCM) ile fiziksel pin numarası arasındaki farkı açıklar.
- LED, buzzer ve servo motoru dirençleri ve besleme pinleriyle doğru bağlar.
- gpiozero ile LED, buzzer ve AngularServo nesnelerini kullanır.
- Model tahminlerini güven eşiği ve kararlılık kontrolünden geçirerek donanıma aktarır.
- Elektronik devre kurarken güvenlik kurallarına uyar.
Malzemeler
- Raspberry Pi 5 veya 4 ve kamera
- Breadboard ve erkek-dişi jumper kablolar
- 1 yeşil ve 1 kırmızı LED, 2 adet 330 Ω direnç
- 3,3 V ile çalışabilen aktif buzzer modülü
- SG90 servo motor
- Ders 5’teki görüntü modeli (goruntu_model.py ve model klasörü)
Modelimiz artık gördüğü atığın türünü söyleyebiliyor; ama şimdilik bunu yalnızca ekrana yazıyor. Gerçek bir akıllı cihaz, kararına göre bir şey yapar. Bu derste yapay zekâyı LED’lere, bir buzzer’a ve bir servo motora bağlıyoruz.
Dersin Amacı ve Kazanımlar
Bu dersin sonunda:
- GPIO numarası ile fiziksel pin numarası arasındaki farkı açıklayabileceksiniz.
- LED, buzzer ve servo motoru doğru bağlayabileceksiniz.
- gpiozero ile LED, buzzer ve servo motoru kontrol edebileceksiniz.
- Model tahminlerini güven eşiği ve kararlılık kontrolünden geçirerek donanıma aktarabileceksiniz.
- Devre kurarken güvenlik kurallarına uyacaksınız.
Gerekli Malzemeler
| Malzeme | Açıklama |
|---|---|
| Raspberry Pi ve kamera | Ders 5’teki görüntü tanıma düzeneği |
| Breadboard ve jumper kablolar | Pi’nin pinleri için erkek-dişi, breadboard üzerinde erkek-erkek kablolar |
| 2 LED ve 2 adet 330 Ω direnç | Yeşil LED “tanıdım”, kırmızı LED “emin değilim” anlamına gelecek. Direnç LED’i ve Pi’yi korur. |
| Aktif buzzer modülü | 3,3 V ile çalışan, tercihen transistörlü modül. Aktif buzzer, enerji verilince kendi sesini üretir. |
| SG90 servo motor | 0–180° dönebilen küçük servo. Kahverengi kablo GND, kırmızı kablo 5 V, turuncu kablo sinyaldir. |
💡 İpucu
Devreyi kurmadan önce aşağıdaki şemayı yazdırıp masanıza koyun ve her kabloyu taktıktan sonra şemada işaretleyin. Hataların çoğu bir pin kaydırarak takılan tek bir kablodan çıkar.
GPIO Pinlerini Tanıyalım
Raspberry Pi’nin kenarındaki 40 pinin hepsi aynı değildir. Bazıları sürekli güç verir (3,3 V ve 5 V), bazıları topraktır (GND), çoğu da programla açıp kapatabildiğimiz GPIO pinleridir. Pinlerin iki farklı numarası vardır:
- Fiziksel numara: Pinin sırası (1’den 40’a). Kartı tutarken saymak için kullanılır.
- GPIO (BCM) numarası: Programda yazdığımız numara. gpiozero bu numarayı kullanır.
Örneğin LED(17) yazdığımızda kastettiğimiz pin GPIO17’dir ve bu pin fiziksel olarak 11 numaralı pindir. Terminale pinout yazarak kendi Pi’nizin pin haritasını görebilirsiniz.

Devreyi Kuralım
| Parça | Bağlantı | Pi pini |
|---|---|---|
| Yeşil LED | Uzun bacak (+) 330 Ω direnç üzerinden GPIO’ya, kısa bacak GND’ye | GPIO17 (pin 11), GND (pin 9) |
| Kırmızı LED | Uzun bacak (+) 330 Ω direnç üzerinden GPIO’ya, kısa bacak GND’ye | GPIO27 (pin 13), GND (pin 9) |
| Aktif buzzer modülü | Sinyal (S veya I/O), VCC, GND | Sinyal GPIO22 (pin 15), VCC 3,3 V (pin 1), GND (pin 9) |
| SG90 servo | Turuncu: sinyal, kırmızı: güç, kahverengi: toprak | Sinyal GPIO18 (pin 12), güç 5 V (pin 2), GND (pin 6) |
LED’lerin ve buzzer’ın GND uçlarını breadboard’un eksi (-) hattında birleştirip bu hattı tek kabloyla pin 9’a bağlayabilirsiniz.


gpiozero ile Parçaları Test Etme
gpiozero, Raspberry Pi’de donanımı kontrol etmenin en kolay yoludur ve Raspberry Pi OS ile hazır gelir. Her parça bir nesne olarak oluşturulur: LED(17), Buzzer(22), AngularServo(18). Pi 5’te de Pi 4’te de aynı kod çalışır.
# dosya: donanim_test.py (her parçayı sırayla dener)
from gpiozero import LED, Buzzer, AngularServo
from time import sleep
yesil = LED(17)
kirmizi = LED(27)
buzzer = Buzzer(22)
servo = AngularServo(18, min_angle=0, max_angle=180,
min_pulse_width=0.0005, max_pulse_width=0.0024)
print("Yeşil LED yanıyor")
yesil.on()
sleep(1)
yesil.off()
print("Kırmızı LED yanıp sönüyor")
kirmizi.blink(on_time=0.2, off_time=0.2, n=5, background=False)
print("Buzzer 3 kez ötüyor")
buzzer.beep(on_time=0.1, off_time=0.1, n=3, background=False)
for aci in (0, 90, 180, 90):
print("Servo açısı:", aci)
servo.angle = aci
sleep(1)
servo.detach() # servoya sinyal göndermeyi bırak (titremeyi önler)
print("Test bitti.")
Örnek çıktı: (Raspberry Pi 5 üzerinde örnek çıktı. Asıl sonucu devrede görürsünüz: LED’ler yanmalı, buzzer ötmeli, servo dönmeli. Terminalde ayrıca “PWMSoftwareFallback: To reduce servo jitter, use the pigpio pin factory.” uyarısı görünür; açıklaması aşağıda.)
Yeşil LED yanıyor
Kırmızı LED yanıp sönüyor
Buzzer 3 kez ötüyor
Servo açısı: 0
Servo açısı: 90
Servo açısı: 180
Servo açısı: 90
Test bitti.
AngularServo oluştururken SG90’ın darbe genişliklerini veriyoruz: 0,5 ms sinyal 0°, 2,4 ms sinyal 180° anlamına gelir. Servo uç noktalarda zorlanıp vızıldıyorsa bu değerleri biraz daraltın (ör. 0.0006 ve 0.0023). blink() ve beep() fonksiyonlarındaki background=False, işlem bitene kadar programın beklemesini sağlar. detach() servoya sinyal göndermeyi durdurur; Pi 5’te servo sinyali yazılımla üretildiği için servo yerinde dururken hafifçe titreyebilir, detach() bu titremeyi keser. Program başlarken görünen PWMSoftwareFallback uyarısı da bununla ilgilidir: gpiozero titremeyi azaltmak için pigpio kütüphanesini önerir, ancak pigpio Pi 5’te çalışmaz. Bu uyarı bir hata değildir; görmezden gelebilirsiniz.
Tahmini Eyleme Dönüştürme
Şimdi modelin kararını donanıma aktaracak bir fonksiyon yazalım. Servo kolu, atığın atılacağı bölmeyi göstersin: kâğıt 0°, plastik 90°, metal 180°. Model emin değilse kırmızı LED yansın ve servo hiç kıpırdamasın.

# dosya: tepki.py (tahmine göre donanımı yöneten fonksiyon)
from gpiozero import LED, Buzzer, AngularServo
yesil = LED(17)
kirmizi = LED(27)
buzzer = Buzzer(22)
servo = AngularServo(18, min_angle=0, max_angle=180,
min_pulse_width=0.0005, max_pulse_width=0.0024)
ACILAR = {"kagit": 0, "plastik": 90, "metal": 180} # servo kolunun göstereceği bölme
ESIK = 0.80
def tepki_ver(etiket, guven):
"""Modelin kararını LED, buzzer ve servoya aktarır; yapılan işi metin olarak döndürür."""
if etiket == "bos":
yesil.off()
kirmizi.off()
return "boş: bekleniyor"
if guven < ESIK:
yesil.off()
kirmizi.on()
return f"emin değilim ({etiket} %{guven * 100:.0f})"
kirmizi.off()
yesil.on()
servo.angle = ACILAR[etiket]
buzzer.beep(on_time=0.1, off_time=0.1, n=1, background=True)
return f"{etiket} %{guven * 100:.0f} -> servo {ACILAR[etiket]} derece"
Bu dosyayı da goruntu_model.py gibi başka programlardan import ile kullanacağız. Fonksiyon, yaptığı işi bir metin olarak döndürüyor; böylece ana program bunu ekrana ya da bir kayıt dosyasına yazabilir.
Son olarak kamerayı, modeli ve donanımı birleştiriyoruz:
# dosya: akilli_gosterge.py (kamera + model + donanım, çıkmak için Ctrl+C)
from picamera2 import Picamera2
from goruntu_model import tahmin_et
from tepki import tepki_ver
import time
KARARLILIK = 5 # aynı tahmin art arda kaç karede gelirse kabul edilsin
picam2 = Picamera2()
picam2.configure(picam2.create_preview_configuration(
main={"size": (640, 480), "format": "RGB888"}))
picam2.start()
time.sleep(1)
aday, sayac, son_karar = None, 0, None
print("Çalışıyor... Kameranın önüne bir atık koyun.")
try:
while True:
kare = picam2.capture_array()
etiket, guven, _ = tahmin_et(kare)
durum = etiket if guven >= 0.80 else "belirsiz"
if durum == aday:
sayac += 1
else:
aday, sayac = durum, 1
if sayac == KARARLILIK and durum != son_karar:
son_karar = durum
print(time.strftime("%H:%M:%S"), tepki_ver(etiket, guven))
except KeyboardInterrupt:
print("Program durduruldu.")
finally:
picam2.stop()
Örnek çıktı: (Raspberry Pi 5 üzerinde örnek çıktı. Saatler ve yüzdeler sizin denemenize göre değişir.)
Çalışıyor... Kameranın önüne bir atık koyun.
10:42:07 boş: bekleniyor
10:42:12 plastik %96 -> servo 90 derece
10:42:18 boş: bekleniyor
10:42:23 emin değilim (metal %58)
10:42:25 metal %91 -> servo 180 derece
^CProgram durduruldu.
Burada önemli bir fikir var: kararlılık. Model her karede tahmin yapar ve nesne kameranın önüne yerleştirilirken birkaç kare boyunca yanlış tahminler verebilir. Her tahminde servoyu döndürseydik kol sürekli titreyip dururdu. Bu yüzden aynı sonucun art arda 5 karede gelmesini bekliyoruz. Ayrıca son_karar değişkeni sayesinde aynı nesne kameranın önünde durdukça servo tekrar tekrar komut almaz; yalnızca karar değiştiğinde tepki veririz.
⚠️ Önemli Not
Devreyi Pi kapalıyken kurun ve değiştirin. GPIO pinleri 3,3 V ile çalışır; bir GPIO pinini asla doğrudan 5 V’a bağlamayın, Pi kalıcı olarak zarar görebilir. LED’leri dirençsiz bağlamayın. Servoyu 5 V pininden besleyebiliriz, ama bu yalnızca SG90 gibi küçük bir servo için geçerlidir. Daha büyük servolar ya da birden fazla servo için ayrı bir 5 V güç kaynağı kullanın ve kaynağın GND’sini Pi’nin GND’siyle birleştirin. Servo hareket ederken Pi yeniden başlıyorsa güç yetmiyor demektir.
Sıra Sizde
- Kolay:
donanim_test.pyprogramına iki LED’in sırayla, trafik ışığı gibi yanıp söndüğü bir bölüm ekleyin. - Orta:
tepki_ver()fonksiyonunu, buzzer’ın atık türüne göre farklı sayıda ötmesi için değiştirin: kâğıt 1, plastik 2, metal 3 kez. - Zor:
KARARLILIKdeğerini 1, 5 ve 15 yaparak programı deneyin. Tepki hızını ve yanlış tepki sayısını karşılaştırın. Sizce en uygun değer hangisi? Neden?
Kendini Dene
LED(17)yazdığımızda LED’i Pi’nin hangi fiziksel pinine bağlamalıyız?- SG90 servonun üç kablosu nereye bağlanır?
- Programda “kararlılık” kontrolü neden gereklidir?
Cevaplar
- GPIO17, fiziksel olarak 11 numaralı pindir. LED direnç üzerinden bu pine, kısa bacağı ise bir GND pinine bağlanır.
- Turuncu sinyal kablosu GPIO18’e (pin 12), kırmızı kablo 5 V’a (pin 2), kahverengi kablo GND’ye (pin 6).
- Model, nesne yerleştirilirken birkaç kare boyunca yanlış tahmin verebilir. Aynı sonucun art arda birkaç karede gelmesini beklemek, servonun ve LED’lerin bu geçici hatalara tepki vermesini önler.