7. ünite / 10 · yaklaşık 5 saat
Motorlar: L298N, enkoder ve hız denetimi
H köprüsü, PWM ile hız, enkoderden yön ve devir, PI döngüsü; güç ve toprak düzeni.
Bu ünitenin sonunda
- H köprüsünün ileri, geri, fren ve serbest kiplerini IN1/IN2/EN ile açıklamak
- Dörtlü enkoderin A/B kanallarından yön ve devir hesaplamak
- PI hız denetimini ileri beslemeyle kurmak ve doyumda integrali dondurmak
- Motor gücünü Pi'den ayırıp ortak toprak kurmak
Ders notları
Bir DC motor Pi'nin pininden sürülemez: amperlerce akım çeker ve kapanırken gerilim sıçraması üretir. Araya bir H köprüsü (L298N, TB6612FNG) girer: dört anahtar motorun uçlarını kaynağa iki yönde bağlar.
- IN1 = 1, IN2 = 0: ileri; IN1 = 0, IN2 = 1: geri.
- IN1 = IN2: fren (motor uçları kısa devre, hızla durur).
- EN = 0: serbest (motor kendi kendine yavaşlar).
- EN'e PWM verilince ortalama gerilim, dolayısıyla hız ayarlanır.
L298N bipolar transistörlüdür ve yaklaşık 2 V düşürür: 7,4 V pilde motor ~5,4 V görür ve sürücü ısınır. TB6612FNG MOSFET'lidir, kaybı çok azdır.
Enkoder
Motor miline bağlı dörtlü enkoderin iki kanalı (A, B) 90° faz farklıdır. Sıra 00 → 01 → 11 → 10 ise ileri, tersiyse geri. Her kenarı saymak (4× çözme) çözünürlüğü dört katına çıkarır. İki kanal aynı anda değişmiş görünüyorsa bir örnek kaçırılmıştır: Pi'de yüksek hızda bu olur, bu yüzden hızlı enkoderler MCU'ya bırakılır.
PI denetimi
Yük binince hız düşer. PI denetimi hatayı (hedef − ölçülen) hem anlık (P) hem birikmiş (I) olarak düzeltir. 3. ünitedeki doğru, ileri besleme olarak iyi bir başlangıç verir; I terimi geri kalanı kapatır.
Simülasyon
L298N, DC motor ve dörtlü enkoder
IN1/IN2/EN ile ileri, geri, fren ve serbest; birinci dereceden motor modeli; enkoderin A/B kanallarından yön ve hız. PI denetimini açıp yük altında hızın nasıl tutulduğunu izle.
Kendin dene
Benzetimde IN1/IN2 ile dört kipi dene ve fren ile serbest arasındaki duruş süresi farkını not et. Enkoder kanallarını izleyerek yönü sıradan oku. Yükü %40 yap: PI kapalıyken hız ne kadar düşüyor? PI'ı aç ve hedefe ne kadar sürede oturduğunu ölç. KI'yı çok büyütüp salınımı gör.
Kod
from gpiozero import Motor, RotaryEncoder
from time import sleep, monotonic
motor = Motor(forward=5, backward=6, enable=12) # L298N IN1, IN2, ENA (PWM)
enc = RotaryEncoder(a=23, b=24, max_steps=0) # max_steps=0: sınırsız sayım
CPR = 1400 # çıkış milinde tur başına sayım
KP, KI, DT = 0.004, 0.02, 0.02
integral, last = 0.0, enc.steps
def control(target_rpm: float):
global integral, last
steps = enc.steps
rpm = (steps - last) / CPR * 60 / DT
last = steps
err = target_rpm - rpm
u = KP * err + KI * (integral + err * DT)
if abs(u) < 1:
integral += err * DT # doyumda integrali dondur (anti-windup)
u = max(-1.0, min(1.0, u))
motor.forward(u) if u >= 0 else motor.backward(-u)
return rpm
t0 = monotonic()
while monotonic() - t0 < 5:
print(f"{control(100):.0f} rpm")
sleep(DT) # Linux: 20 ms ± titreşim; kesin döngü için MCU
motor.stop()Sık yapılan hatalar
- Motoru Pi'nin 5 V pininden beslemek: Pi yeniden başlar ya da bozulur.
- Motor kaynağı ile Pi arasında ortak GND kurmamak: sürücü girişleri tanımsız kalır.
- Doyumda integrali biriktirmek (windup): hedef değişince robot uzun süre aşar.
- Yön değiştirirken doğrudan ileriden geriye geçmek: akım sıçrar; önce dur ya da rampa kullan.
Yazılım mühendisliği bağlantısı
PI denetleyicisi saf bir sınıftır: step(target, measured, dt) → u.
- Birinci dereceden motor modeliyle (benzetimdeki gibi) kapalı döngü testi yaz: "2 s içinde hedefin %5'ine oturur".
- Kazançlar ayar dosyasında; her değişiklik test ve günlükle belgelenir.
Kendini sına
L298N'de IN1 = 1, IN2 = 1 ve EN = 1 ise motor ne yapar?
Enkoder sırası 00 → 10 → 11 → 01 ise yön?
50 ms'de 70 sayım, CPR 1400. Devir/dakika kaç?
Integral windup nedir?
Bu üniteden sonra bitirme projesinde
- Algılama ve hız denetimi: Renkli hedef algılayıcı (kayıtlı karelerle test) ve PI hız döngüsü; ayar dosyası.