Kurs içeriği (9 / 10)
  1. 1 Raspberry Pi ile Tanışma ve Kurulum 80 dk
  2. 2 Makine Öğrenmesi Nedir? İlk Modelimiz 80 dk
  3. 3 Kamera ve Görüntü İşlemenin Temelleri 80 dk
  4. 4 Görüntü Veri Seti Hazırlama 80 dk
  5. 5 Görüntü Tanıma Modeli Eğitip Pi’de Çalıştırma 120 dk
  6. 6 Mikrofon ve Sesin Temelleri 80 dk
  7. 7 Ses Veri Seti Hazırlama 80 dk
  8. 8 Ses Tanıma Modeli ile Sesli Komutlar 120 dk
  9. 9 Yapay Zekâyı Donanıma Bağlama: LED, Buzzer ve Servo 80 dk
  10. 10 Mini Proje: Akıllı Geri Dönüşüm Kutusu 160 dk

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

Uygulama ⏱ 80 dk

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:

  1. GPIO numarası ile fiziksel pin numarası arasındaki farkı açıklayabileceksiniz.
  2. LED, buzzer ve servo motoru doğru bağlayabileceksiniz.
  3. gpiozero ile LED, buzzer ve servo motoru kontrol edebileceksiniz.
  4. Model tahminlerini güven eşiği ve kararlılık kontrolünden geçirerek donanıma aktarabileceksiniz.
  5. 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.

Raspberry Pi 40 pinli GPIO haritası ve kullandığımız pinler

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.

LED, buzzer ve servonun Raspberry Pi’ye bağlantı şeması

Breadboard üzerinde kurulmuş devrenin çizimi

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.

Tahminden eyleme karar akışı

# 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

  1. Kolay: donanim_test.py programına iki LED’in sırayla, trafik ışığı gibi yanıp söndüğü bir bölüm ekleyin.
  2. 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.
  3. Zor: KARARLILIK değ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

  1. LED(17) yazdığımızda LED’i Pi’nin hangi fiziksel pinine bağlamalıyız?
  2. SG90 servonun üç kablosu nereye bağlanır?
  3. Programda “kararlılık” kontrolü neden gereklidir?

Cevaplar

  1. GPIO17, fiziksel olarak 11 numaralı pindir. LED direnç üzerinden bu pine, kısa bacağı ise bir GND pinine bağlanır.
  2. Turuncu sinyal kablosu GPIO18’e (pin 12), kırmızı kablo 5 V’a (pin 2), kahverengi kablo GND’ye (pin 6).
  3. 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.