Parçalar · 13 dk okuma

L293D Motor Shield Kullanımı: AFMotor, 4 Motor, Step ve Servo

L293D motor shield nasıl kullanılır? AFMotor kütüphanesi, PWR jumper'ı, boş pinler, 4WD araba kodu, step ve servo, 0,6 A sınırı ve motor dönmüyor çözümleri.

L293D motor shield, Arduino Uno'nun üstüne doğrudan takılan ve tek kartla 4 DC motor, 2 step motor ve 2 servo sürmeni sağlayan bir motor sürücü kartıdır. Üzerindeki iki L293D yongası motorların ihtiyaç duyduğu akımı sağlar, dönüş yönlerini çevirir ve hızlarını PWM ile ayarlar; böylece tek bir jumper kablo kullanmadan dört tekerli bir robot arabanın bütün motorlarını yönetebilirsin. Piyasadaki kartların neredeyse hepsi Adafruit'in eski Motor Shield V1 tasarımının kopyasıdır ve aynı kütüphaneyle, yani AFMotor ile programlanır.

Bu rehberde shield'in içinde neler olduğunu, hangi Arduino pinlerini kullandığını ve hangilerinin sensörlere boş kaldığını, en çok kafa karıştıran PWR jumper'ını üç farklı besleme düzeniyle, AFMotor kütüphanesinin komutlarını ve telefondan sürülen dört tekerli bir robot arabanın tam kodunu öğreneceksin. Son bölümlerde 0,6 A'lik akım sınırını, yonganın neden ısındığını, L298N ile farklarını ve "motorlar dönmüyor" sorununun bilinen sebeplerini tek tabloda topladık.

L293D motor shield üstten görünüm: M1–M4 klemensleri, servo başlıkları ve güç jumper'ı
L293D motor shield (Adafruit V1 tasarımı): ortada 74HC595, iki yanında L293D yongaları; solda M1–M2, sağda M3–M4 klemensleri, sol üstte iki servo başlığı, altta harici besleme klemensi ve PWR jumper'ı.

L293D motor shield nedir, nasıl çalışır?

Bir DC motoru iki yöne döndürmek için H-köprüsü denen dört anahtarlı bir devre gerekir; bu mantığı L298N ile DC Motor Kontrolü yazısında ayrıntılı anlattık. L293D yongasının içinde iki H-köprüsü vardır; shield'de bu yongadan iki tane bulunduğu için toplam dört motor kanalı elde edilir. Adındaki "D" harfi, motor kapanırken oluşan ters gerilim sıçramalarını söndüren koruma diyotlarının yonganın içinde olduğunu gösterir. L293D ayrıca aşırı ısındığında çıkışlarını kendiliğinden kapatır.

Shield'in asıl püf noktası ortadaki 74HC595 kaydırmalı yazmaçtır (shift register). Dört motorun her biri yön için iki, hız için bir sinyal ister; bu da toplam 12 Arduino pini demektir. Shield sekiz yön sinyalini 74HC595'e seri olarak gönderip bunun için yalnızca 4 pin (D4, D7, D8, D12) harcar, hız için de 4 PWM pini (D3, D5, D6, D11) kullanır. Bu tasarım pin kazandırır ama bir bedeli vardır: motorları digitalWrite ile doğrudan süremezsin, yön bitlerini yazmaca gönderen bir kütüphane gerekir. O kütüphane de AFMotor'dur.

ÖzellikDeğer
Sürücü yongaları2 adet L293D (toplam 4 H-köprüsü)
Yön kontrolü74HC595 kaydırmalı yazmaç (D4, D7, D8, D12)
Motor besleme gerilimi4,5–25 V (harici besleme klemensi)
Kanal başına akım0,6 A sürekli, 1,2 A çok kısa süreli tepe
Hız ayarı8 bit PWM, setSpeed(0–255)
Sürebildiği motorlar4 DC motor, 2 step motor ya da 2 DC + 1 step
Servo2 adet, Arduino'nun 5 V hattından beslenir (D9 ve D10)
KorumaDahili diyotlar, aşırı sıcaklıkta kapanma
Uyumlu kartlarArduino Uno R3 ve Mega 2560 (Uno R4 ve Leonardo desteklenmez)

Kartın üzerinde neler var? Klemensler, başlıklar ve jumper

ParçaGörevi
M1 ve M2 klemensi (sol)1. ve 2. DC motor; ortadaki GND ucu unipolar step motorun ortak kablosu içindir
M3 ve M4 klemensi (sağ)3. ve 4. DC motor ya da 2 numaralı step motor
EXT_PWR (+M ve GND)Motorların besleme girişi: pil ya da adaptör
PWR jumper'ıTakılıyken motor beslemesini Arduino'nun Vin hattına bağlar
SER1 ve SERVO_2İki servo başlığı (−, +, S); D10 ve D9
PWR LED'iMotor beslemesi var mı gösterir; sönükse motorlar dönmez
RESET düğmesiArduino'nun reset düğmesinin shield üstündeki kopyası
A0–A5 sırasıBoş analog pinler; çoğu kartta yanlarında +5V ve GND sıraları da vardır

Shield hangi pinleri kullanır, hangileri boş kalır?

Arduino piniShield'deki göreviNe zaman meşgul?
D3M2 hızı (PWM, Timer2)M2 ya da 1. step motor kullanılınca
D474HC595 saat sinyali (CLK)Herhangi bir DC ya da step motor kullanılınca
D5M4 hızı (PWM, Timer0)M4 ya da 2. step motor kullanılınca
D6M3 hızı (PWM, Timer0)M3 ya da 2. step motor kullanılınca
D774HC595 çıkış etkinleştirme (EN)Herhangi bir motor kullanılınca
D874HC595 veri girişi (DATA)Herhangi bir motor kullanılınca
D9SERVO_2 sinyali (Timer1)Yalnızca o servo kullanılınca
D10SER1 sinyali (Timer1)Yalnızca o servo kullanılınca
D11M1 hızı (PWM, Timer2)M1 ya da 1. step motor kullanılınca
D1274HC595 mandal (LATCH)Herhangi bir motor kullanılınca
D0, D1Kullanılmaz (USB seri hattı)Kod yüklerken ve Seri Monitör açıkken
D2Kullanılmaz; kartta küçük bir lehim noktası vardırHiçbir zaman
D13Kullanılmaz ama shield'in üstüne çıkarılmamıştırHiçbir zaman
A0–A5 (D14–D19)Kullanılmaz; kartın kenarında sıra hâlindeHiçbir zaman

Boşta kalan altı analog pin sensörler için fazlasıyla yeterlidir, çünkü Uno'nun A0–A5 pinleri gerektiğinde 14–19 numaralı dijital pinler gibi de çalışır. Pratik bir dağılım şöyle olabilir: A0 ve A1'e HC-SR04 mesafe sensörü ya da SoftwareSerial ile bir Bluetooth modülü, A2 ve A3'e çizgi izleme ya da engel sensörleri, A4 ve A5'e I2C hattı (OLED, LCD, MPU6050). attachInterrupt() ile kesme kullanan bir tekerlek enkoderi ya da buton için tek boş pin D2'dir; Uno'nun diğer kesme pini D3, M2'nin hız pinidir. Servo kullanmıyorsan D9 ve D10 da serbest kalır. Kartının pin düzenini Pinout aracında, pinlerin özelliklerini de Arduino Uno Pinleri yazısında görebilirsin.

Shield takılıyken D3–D8, D11 ve D12'yi kodunda başka bir iş için kullanma. Örneğin HC-SR04'ün trig ucunu D7'ye ya da bir LED'i D12'ye bağlarsan 74HC595'e giden bilgi bozulur ve motorlar rastgele yön değiştirir. Ayrıca M1 ve M2'nin hız sinyali Timer2'den gelir: tone() fonksiyonu ve Uno'daki IRremote kütüphanesi de Timer2'yi kullandığı için bunlar çalışırken M1 ve M2'nin hız ayarı bozulur.

Besleme ve PWR jumper'ı: doğru bağlantının üç yolu

Kartın alt kenarındaki iki uçlu EXT_PWR klemensi motorların besleme girişidir; artı ucu genellikle "+M" ya da "+", eksi ucu "GND" diye yazılıdır. Hemen yanındaki PWR jumper'ı bu motor hattını Arduino'nun Vin pinine bağlar. Jumper takılıyken iki kart tek kaynaktan beslenir: EXT_PWR'a verdiğin gerilim Vin üzerinden Arduino'yu da çalıştırır ya da Arduino'nun DC jakına taktığın adaptör motorları da besler. Jumper çıkarıldığında iki hat birbirinden tamamen ayrılır. Kartın üzerindeki PWR LED'i yalnızca motor beslemesi geldiğinde yanar; motorlarla uğraşmaya başlamadan önce ilk kontrol edeceğin şey bu LED'dir.

DüzenArduino beslemesiMotor beslemesiPWR jumper'ı
Tek kaynak (7–12 V pil ya da adaptör)Aynı kaynaktan, Vin üzerindenEXT_PWR ya da Arduino'nun DC jakıTakılı
Arduino USB'den, motorlar pildenUSB kablosuEXT_PWRÇıkarılmış
İki ayrı kaynak (en güvenlisi)DC jakı ya da USBEXT_PWRÇıkarılmış

Robot arabalarda en yaygın kullanım tek kaynaktır: 2 adet 18650 pilden oluşan paketi EXT_PWR'a bağlar, jumper'ı takarsın ve hem Arduino hem motorlar aynı pille çalışır. Bu düzen basittir, ama motorlar kalkışta çok akım çektiğinde pil gerilimi anlık olarak düşebilir ve Arduino yeniden başlayabilir. Bunu yaşıyorsan jumper'ı çıkarıp Arduino'yu ayrı bir kaynaktan (powerbank, USB ya da 9 V'luk bir adaptör) beslemek kesin çözümdür. Masada deneme yaparken ikinci düzen en pratiğidir: Arduino bilgisayara bağlı kalır, motorlar pilden çalışır ve jumper çıkarılmış olur.

EXT_PWR klemensinde ters polarite koruma diyotu yoktur; pili ters bağlamak shield'i ve büyük olasılıkla Arduino'yu anında bozar. Jumper takılıyken hem DC jakına hem EXT_PWR'a ayrı kaynaklar bağlama, iki kaynağı birbirine kısa devre etmiş olursun. Motor beslemesini de hiçbir zaman Arduino'nun 5V pinine verme.

Hangi pili seçmelisin? L293D'nin çıkış transistörleri akıma bağlı olarak yaklaşık 1,5–2,6 V yutar, yani motor pilin geriliminden bu kadar daha azını görür. Robot kitlerindeki sarı 3–6 V'luk TT motorlar için 2 adet 18650 lityum pil (nominal 7,4 V, dolu hâlde 8,4 V) idealdir: motorlar yaklaşık 5,5–6 V görür, jumper takılıyken Arduino'nun regülatörü de rahat çalışır. 4 adet AA pil (6 V) motorlara yalnızca 4 V civarı bırakır ve Arduino'yu Vin'den beslemeye yetmez. 9 V'luk kare pil ise birkaç yüz miliamperden fazlasını veremez; motorlar ya hiç dönmez ya da pil dakikalar içinde biter. Pil süresini Pil ömrü aracıyla hesaplayabilir, besleme seçeneklerinin tamamını Arduino Pil ile Çalıştırma yazısında okuyabilirsin.

AFMotor kütüphanesini kurmak

  1. Arduino IDE'de Kütüphane Yöneticisi'ni aç (Araçlar > Kütüphaneleri Yönet ya da Ctrl+Shift+I).
  2. Arama kutusuna Adafruit Motor Shield yaz. İki sonuç çıkar: açıklamasında "V1 firmware" yazan Adafruit Motor Shield library ve Adafruit Motor Shield V2 Library.
  3. L293D'li shield için V1 olanı kur. V2 kütüphanesi, I2C ile haberleşen ve TB6612 yongalı bambaşka bir kart içindir.
  4. Kodunun başına #include <AFMotor.h> satırını ekle.
  5. İstersen Dosya > Örnekler > Adafruit Motor Shield library > MotorTest örneğini açıp M1'e bağlı bir motorla kartı dene.
Derlerken AFMotor.h: No such file or directory hatası alıyorsan ya kütüphane hiç kurulmamıştır ya da yanlışlıkla V2 kütüphanesi kurulmuştur; V2'nin başlık dosyasının adı Adafruit_MotorShield.h'dir ve L293D kartıyla çalışmaz. Kütüphane kurulumundaki diğer sorunlar için Arduino Kütüphane Ekleme yazısına bakabilirsin.

İlk program: bir DC motoru ileri, geri ve farklı hızlarda döndürmek

Motorun iki kablosunu M1 klemensinin iki ucuna vidalarla sık; ortadaki GND ucunu boş bırak. Pil paketini EXT_PWR'a bağla, Arduino'yu USB ile bilgisayara tak ve PWR jumper'ını çıkar (yukarıdaki ikinci düzen). PWR LED'i yanıyorsa aşağıdaki kodu yükle: motor önce yavaşça hızlanıp yavaşlar, sonra iki saniye geri döner ve durur.

C++ (Arduino IDE)
1#include <AFMotor.h>                  // Adafruit Motor Shield V1 kütüphanesi / library
2
3AF_DCMotor motor(1);                  // M1 klemensi / M1 terminal
4
5void setup() {
6  Serial.begin(9600);
7  Serial.println(F("L293D motor testi / motor test"));
8  motor.setSpeed(200);                // 0–255; bunu unutursan motor dönmez / skip this and the motor won't turn
9  motor.run(RELEASE);                 // başlangıçta dur / start stopped
10}
11
12void loop() {
13  motor.run(FORWARD);                 // ileri / forward
14  for (int s = 60; s <= 255; s++) {   // yavaşça hızlan / ramp up
15    motor.setSpeed(s);
16    delay(10);
17  }
18  for (int s = 255; s >= 60; s--) {   // yavaşça yavaşla / ramp down
19    motor.setSpeed(s);
20    delay(10);
21  }
22  motor.run(RELEASE);                 // dur / stop
23  delay(500);
24
25  motor.setSpeed(180);
26  motor.run(BACKWARD);                // geri / backward
27  delay(2000);
28  motor.run(RELEASE);
29  delay(1000);
30}
KomutNe yapar?
AF_DCMotor motor(1);M1 klemensindeki motoru tanımlar; 1–4 arası numara alır
AF_DCMotor motor(1, MOTOR12_64KHZ);M1 ve M2 için PWM frekansını da seçer
motor.setSpeed(200);Hızı 0–255 arasında ayarlar (0 dur, 255 tam hız)
motor.run(FORWARD);İleri döndürür
motor.run(BACKWARD);Geri döndürür
motor.run(RELEASE);Motoru sürmeyi bırakır, motor durur
motor.run(BRAKE);Kütüphanede tanımlıdır ama V1'de hiçbir şey yapmaz

Hız, motorun enerjisinin saniyede binlerce kez açılıp kapatılmasıyla ayarlanır; ayrıntılar PWM Nedir? yazısında. M1 ve M2 Timer2'yi kullandığı için frekanslarını seçebilirsin: MOTOR12_64KHZ, MOTOR12_8KHZ (varsayılan), MOTOR12_2KHZ ve MOTOR12_1KHZ. 64 kHz motorun vınlamasını duyulmaz hâle getirir ama L293D bu hızda daha çok ısınır. M3 ve M4 ise Timer0'a bağlıdır; bu zamanlayıcı millis() ve delay()'i de çalıştırdığı için kütüphane onun frekansına dokunmaz ve bu iki kanal her zaman yaklaşık 1 kHz'de çalışır.

En sık yapılan hata setSpeed() komutunu unutmaktır. Kütüphane motoru tanımlarken hızı 0'a ayarlar; run(FORWARD) yazsan bile hız verilmediyse motor kıpırdamaz. Ayrıca TT motorların çoğu 80–100'ün altındaki değerlerde vınlar ama dönmez, bu yüzden kalkışı en az 100–120 ile yap.

Dört tekerli (4WD) robot araba kodu

Redüktörlü TT DC motor ve tekerlek
Robot kitlerindeki sarı redüktörlü TT motor: 3–6 V ile çalışır, yüksüz yaklaşık 150 mA, sıkıştığında 1 A'in üzerinde akım çeker.

L293D motor shield'in en sevilen kullanımı dört tekerli robot arabadır, çünkü dört motorun her biri kendi klemensine bağlanır ve kablo karmaşası olmaz. Bu tür arabalarda direksiyon yoktur; araba bir tank gibi döner: sol taraftaki iki tekerlek bir yöne, sağdaki iki tekerlek diğer yöne dönerse araba olduğu yerde döner. Bu yüzden kodda dört motoru tek tek değil, sol taraf ve sağ taraf olarak iki grup hâlinde yönetiyoruz. Telefondan kontrol için HC-05 Bluetooth modülünü boş kalan A0 ve A1 pinlerine SoftwareSerial ile bağlıyoruz; modülün ayrıntıları HC-05 Bluetooth Modülü yazısında.

ParçaBağlantı
Sol ön motorM1
Sol arka motorM2
Sağ arka motorM3
Sağ ön motorM4
HC-05 TXDA0 (SoftwareSerial RX)
HC-05 RXDA1, 1 kΩ + 2 kΩ gerilim bölücüyle (5 V → 3,3 V)
HC-05 VCC ve GNDShield'deki +5V ve GND sırası
2 adet 18650 pil (7,4 V)EXT_PWR (+M ve GND), PWR jumper'ı takılı
C++ (Arduino IDE)
1#include <AFMotor.h>
2#include <SoftwareSerial.h>
3
4AF_DCMotor frontLeft(1);              // M1: sol ön / front left
5AF_DCMotor rearLeft(2);               // M2: sol arka / rear left
6AF_DCMotor rearRight(3);              // M3: sağ arka / rear right
7AF_DCMotor frontRight(4);             // M4: sağ ön / front right
8
9SoftwareSerial bt(A0, A1);            // RX = A0 (HC-05 TXD), TX = A1 (HC-05 RXD, bölücüyle / via a divider)
10
11int speed = 200;                      // 0–255 arası sürüş hızı / driving speed 0–255
12
13void setSide(AF_DCMotor &a, AF_DCMotor &b, int value) {   // -255 … 255
14  uint8_t dir = value > 0 ? FORWARD : (value < 0 ? BACKWARD : RELEASE);
15  uint8_t pwm = constrain(abs(value), 0, 255);
16  a.setSpeed(pwm);
17  b.setSpeed(pwm);
18  a.run(dir);
19  b.run(dir);
20}
21
22void drive(int left, int right) {     // sol ve sağ taraf / left and right side
23  setSide(frontLeft, rearLeft, left);
24  setSide(frontRight, rearRight, right);
25}
26
27void setup() {
28  Serial.begin(9600);                 // hata ayıklama / debugging
29  bt.begin(9600);                     // HC-05 varsayılan hızı / default baud rate
30  drive(0, 0);
31}
32
33void loop() {
34  if (!bt.available()) return;
35  char c = bt.read();
36  Serial.println(c);
37
38  switch (c) {
39    case 'F': drive(speed, speed);        break;   // ileri / forward
40    case 'B': drive(-speed, -speed);      break;   // geri / backward
41    case 'L': drive(-speed, speed);       break;   // yerinde sola / spin left
42    case 'R': drive(speed, -speed);       break;   // yerinde sağa / spin right
43    case 'G': drive(speed / 3, speed);    break;   // ileri-sola kavis / curve forward-left
44    case 'I': drive(speed, speed / 3);    break;   // ileri-sağa kavis / curve forward-right
45    case 'S': drive(0, 0);                break;   // dur / stop
46    case 'q': speed = 255;                break;   // tam hız / full speed
47    default:
48      if (c >= '0' && c <= '9') speed = map(c - '0', 0, 9, 90, 240);   // hız kademesi / speed step
49  }
50}

Kodun kalbi drive(sol, sağ) fonksiyonudur: her taraf için -255 ile 255 arasında bir değer alır; artı ileri, eksi geri, sıfır dur demektir. setSide() aynı taraftaki iki motora aynı hızı ve yönü verir. Komutlar, telefon mağazalarındaki "Arduino Bluetooth RC Car" türü uygulamaların gönderdiği tek harflerdir: F ileri, B geri, L ve R yerinde dönüş, G ve I kavisli dönüş, S dur. Uygulamadaki hız çubuğu 0–9 arası bir rakam gönderir; kod bunu 90–240 arasında bir PWM değerine çevirir ve alt sınırı 90'da tuttuğu için en düşük kademede bile motorlar kalkabilir. Bir tekerlek ters dönüyorsa kodu değiştirme, o motorun iki kablosunu klemenste yer değiştir. Şasi montajı ve iki motorlu sürüm için Arduino Araba Yapımı rehberine bakabilirsin.

HC-05'in RXD ucu 3,3 V ile çalışır; Arduino'nun 5 V'luk TX sinyalini gerilim bölücü ile düşürmeden bağlama. Ayrıca bağlantı koparsa araba son komutla gitmeye devam eder; son harften bu yana 1 saniye geçtiğinde drive(0, 0) çağıran bir güvenlik kuralını millis() ile kolayca ekleyebilirsin.

Step motor sürmek: 28BYJ-48 ve NEMA 17

Shield aynı anda iki step motor sürebilir: 1 numaralı step portu M1 ve M2 klemenslerini, 2 numaralı port M3 ve M4'ü kullanır. Bipolar bir motorun (NEMA 17 gibi 4 kablolu) bir bobinini M1'e, diğer bobinini M2'ye bağlarsın. Unipolar bir motorda (5 ya da 6 kablolu) iki bobin yine M1 ve M2'ye gider, ortak uç da klemensin ortasındaki GND'ye bağlanır. Popüler 28BYJ-48 için bağlantı şöyledir: mavi ve sarı kablolar M1'e, pembe ve turuncu kablolar M2'ye, kırmızı ortak kablo GND'ye. Bu motorun ULN2003 kartıyla kullanımı Step Motor Nedir? yazısında.

Adım türüNasıl çalışır?Ne zaman kullanılır?
SINGLEHer an tek bobin enerjilenirEn az akım, en düşük tork
DOUBLEHer an iki bobin birlikte enerjilenirDaha yüksek tork; en sık kullanılan
INTERLEAVETek ve çift bobin sırayla (yarım adım)İki kat çözünürlük, daha yumuşak dönüş
MICROSTEPBobin akımları PWM ile kademeli değişir, her tam adım 16 parçaya bölünürYavaş ve sessiz dönüş; tork düşer

28BYJ-48 5 V'luk bir motordur; bu deney için motor beslemesini 4 adet AA pille (6 V) yap, jumper'ı çıkar ve Arduino'yu USB'den çalıştır. Motorun içindeki dişli kutusu yüzünden tam adımda bir tur 2048 adımdır:

C++ (Arduino IDE)
1#include <AFMotor.h>
2
3// 28BYJ-48: tam adımda tur başına 2048 adım / 2048 full steps per revolution
4AF_Stepper stepper(2048, 1);          // 1 = M1 + M2, 2 = M3 + M4
5
6void setup() {
7  stepper.setSpeed(10);               // dakikada 10 tur / 10 RPM
8}
9
10void loop() {
11  stepper.step(2048, FORWARD, DOUBLE);       // bir tur ileri, güçlü tork / one turn forward, more torque
12  delay(500);
13  stepper.step(4096, BACKWARD, INTERLEAVE);  // yarım adımla bir tur geri / one turn back in half steps
14  stepper.release();                         // bobinleri kapat, ısınmasın / de-energise the coils
15  delay(1000);
16}

setSpeed() dakikadaki tur sayısını belirler; 28BYJ-48 dişli kutusu nedeniyle dakikada 10–15 turdan hızlı dönemez. Dikkat etmen gereken nokta, step() fonksiyonunun bloklayıcı olmasıdır: motor istenen adımları bitirene kadar loop() başka hiçbir şey yapmaz. Step motor dönerken sensör okumak ya da DC motor sürmek istiyorsan kütüphanenin onestep() fonksiyonunu AccelStepper kütüphanesiyle birlikte kullan; kütüphanenin örnekleri arasındaki AFMotor_ConstantSpeed tam olarak bunu gösterir. Motor beklerken release() ile bobinleri kapatmak ısınmayı önler, ama mil bu sırada tutma torkunu kaybeder.

Çoğu NEMA 17 motor bobin başına 1,5–2 A çeker ve bobin direnci 1,5–3 Ω civarındadır. L293D'de akım sınırlama olmadığı için bu motorlar 12 V ile bağlandığında kanal sınırını kat kat aşar ve yonga birkaç saniyede kendini kapatır. L293D shield ile yalnızca bobin direnci yüksek, 12 V'ta 0,4 A'in altında akım çeken step motorları kullan; güçlü NEMA 17'ler için A4988 sürücü doğru seçimdir.

Servo bağlamak: SER1 ve SERVO_2 başlıkları

Shield'in köşesindeki iki üç pinli başlık servolar içindir. Kartın üzerindeki işaretlere göre pinler − (GND), + (5 V) ve S (sinyal) şeklindedir; servonun kahverengi kablosu −, kırmızısı +, turuncusu S'ye gelir. Kartın devre şemasına göre SER1 başlığı D10'a, SERVO_2 başlığı D9'a bağlıdır (bazı kaynaklarda numaralar ters yazılır; servo kıpırdamıyorsa kodda diğer pini dene). Servolar standart Servo kütüphanesiyle sürülür ve bu kütüphanenin Uno'da kullandığı Timer1, motorların zamanlayıcılarıyla çakışmaz; yani DC motorlar ve servolar aynı anda sorunsuz çalışır.

Servoların beslemesi motor pilinden değil, Arduino'nun 5 V hattından gelir. Bir SG90 için bu sorun değildir, ama MG996R gibi büyük servolar hareket ederken 1 A'in üzerinde akım çekebilir; Arduino'nun regülatörü ısınır, gerilim çöker ve kart yeniden başlar. Büyük servolarda yalnızca sinyal kablosunu başlığa tak, servonun + ve − uçlarını ayrı bir 5–6 V kaynaktan besle ve kaynakların GND'lerini birleştir. Ayrıntılar MG996R Servo Motor ve Servo Motor Nedir? yazılarında. Aşağıdaki kod M3'teki motoru döndürürken SER1'deki servoyu sağa sola tarar:

C++ (Arduino IDE)
1#include <AFMotor.h>
2#include <Servo.h>
3
4AF_DCMotor motor(3);                  // M3 klemensi / M3 terminal
5Servo servo1;                         // SER1 başlığı / SER1 header
6
7void setup() {
8  servo1.attach(10);                  // SER1 = D10, SERVO_2 = D9
9  motor.setSpeed(170);
10  motor.run(FORWARD);                 // motor dönerken servo tarar / servo sweeps while the motor runs
11}
12
13void loop() {
14  for (int a = 20; a <= 160; a += 2) {   // sağa tara / sweep right
15    servo1.write(a);
16    delay(15);
17  }
18  for (int a = 160; a >= 20; a -= 2) {   // sola tara / sweep left
19    servo1.write(a);
20    delay(15);
21  }
22}

Akım sınırı (0,6 A) ve ısınma

L293D'nin veri sayfasındaki en önemli satır kanal başına 0,6 A sürekli ve 1,2 A tepe akımdır. Tepe değeri yalnızca çok kısa darbeler içindir; motor saniyelerce 1 A çekiyorsa yonga zorlanır. Isınmanın sebebi basit bir hesapla görülür: L293D eski tip, bipolar transistörlü bir sürücüdür ve 0,6 A'de üst transistörde tipik olarak 1,4 V, alt transistörde 1,2 V düşer. Yani bir motor 0,6 A çektiğinde yongada 0,6 A × 2,6 V ≈ 1,6 W ısı oluşur; aynı yongadaki iki motor birlikte bunun iki katını, yaklaşık 3 W üretir. Soğutucusuz küçük bir DIP yonga bu ısıyı uzaklaştıramaz, sıcaklığı hızla yükselir ve sonunda aşırı ısınma koruması çıkışları kapatır. Belirtisi tanıdıktır: motorlar bir süre çalışır, durur, yonga soğuyunca yeniden döner.

Sarı TT motorlar yüksüz yaklaşık 150 mA, yerde ilerlerken 200–300 mA çeker; bu değerler shield'in sınırları içindedir. Sorun, tekerleğin bir engele dayandığı ya da arabanın yerinde döndüğü anlardır: kilitlenen bir TT motor 1–1,5 A çekebilir ve 4WD bir arabada yerinde dönüş sırasında dört motor birden zorlanır. Motorunun gerçek akımını öğrenmek için multimetreyi motorla seri bağla ve tekerleği elinle kısa bir süre tutarken ölç; nasıl yapılacağı Multimetre Nasıl Kullanılır? yazısında. Shield'i serin tutmak için şunları yap:

  • Yumuşak kalkış yap: Hızı 0'dan 255'e bir anda değil, 200–300 ms içinde kademeli olarak artır; kalkış akımı belirgin biçimde düşer.
  • Motoru sıkıştırma: Engelden kaçan robotlarda arabayı engele dayanmadan durdur; kilitlenen motor en çok ısıyı üretir.
  • Yongaların üstüne soğutucu yapıştır: Termal bantlı küçük alüminyum soğutucular L293D'nin sıcaklığını bir miktar düşürür.
  • İkinci bir L293D lehimle: Adafruit de akım kapasitesini artırmak için mevcut yongaların üstüne ikinci bir L293D'nin bacak bacağa lehimlenebileceğini belirtir; iki yonga akımı paylaşır.
  • Gerilimi gereğinden yüksek tutma: 6 V'luk motorlara 12 V vermek hem akımı hem ısıyı artırır.
  • Doğru sürücüye geç: Motorun sürekli 0,6 A'in üzerinde çekiyorsa L298N ya da TB6612FNG tabanlı bir sürücü kullan.

L293D motor shield mi, L298N mi?

L298N çift motor sürücü modülü
L298N modülü: tek yongada iki H-köprüsü, büyük soğutucu ve kanal başına 2 A; kablolarla bağlandığı için her karta uyar.
ÖzellikL293D motor shieldL298N modülü
Motor sayısı4 DC ya da 2 step + 2 servo2 DC ya da 1 step
Kanal başına akım0,6 A sürekli, 1,2 A tepe2 A sürekli, 3 A tepe
Motor gerilimi4,5–25 V5–35 V
Gerilim kaybıYaklaşık 1,5–2,6 VYaklaşık 2–3 V
BağlantıUno'nun üstüne takılır, kablo yokJumper kablolarla; pinleri sen seçersin
Kullandığı pin8 sabit pin + servolar için D9 ve D106 pin (ENA, IN1–IN4, ENB)
KütüphaneAFMotor şartGerekmez (digitalWrite, analogWrite)
ESP32 ve PicoUygun değilDoğrudan kullanılabilir
En uygun kullanımTT motorlu 4WD araba, öğrenme setleriDaha güçlü motorlar, 2WD robotlar

Kısacası, Arduino Uno ile TT motorlu bir 4WD araba yapıyorsan L293D shield kablolamayı en aza indirir ve dört motoru tek kartta toplar. Motorların daha güçlü, kartın ESP32 ya da Pico ise ya da pin seçimi senin için önemliyse L298N daha esnektir; ayrıntıları L298N ile DC Motor Kontrolü yazısında. İkisinden de verimli bir seçenek istiyorsan MOSFET tabanlı TB6612FNG'nin gerilim kaybı çok düşüktür ve pil ömrünü uzatır. Hangi motor türünün hangi işe uygun olduğunu DC, Servo ve Step Motor Farkı yazısında karşılaştırdık.

ESP32, Raspberry Pi Pico ve Mega ile kullanılabilir mi?

Arduino Mega 2560 ile sorunsuz çalışır: shield Mega'nın ilk dijital ve analog pinlerine oturur, AFMotor de Mega'nın zamanlayıcılarını tanır. Uno R4, Leonardo, ESP32 ve Raspberry Pi Pico ile ise çalışmaz, çünkü AFMotor doğrudan ATmega328P ve ATmega2560'ın zamanlayıcı kayıtlarına yazar. ESP32 seçiliyken derleme 'DC_MOTOR_PWM_RATE' was not declared in this scope, Leonardo seçiliyken #error "This chip is not supported!" hatasıyla durur. Uno biçimindeki ESP32 kartlar (ESPDuino-32 gibi) shield'e fiziksel olarak takılsa da pin numaraları ve 3,3 V'luk sinyal seviyesi farklıdır. Bu kartlarda shield yerine L298N, TB6612FNG ya da tek bir L293D yongası kullanmak çok daha kolaydır. L293D'nin girişleri 2,3 V'un üzerini HIGH kabul ettiği için 3,3 V'luk kartlarla doğrudan çalışır:

L293D piniGöreviRaspberry Pi PicoESP32
1 (1,2EN)Hız (PWM)GP15GPIO 25
2 (1A)Yön 1GP14GPIO 26
7 (2A)Yön 2GP13GPIO 27
3 ve 6 (1Y, 2Y)Motor uçlarıMotoraMotora
4, 5, 12, 13GND (ısı da bu pinlerden atılır)GNDGND
16 (VCC1)Lojik besleme, 5 VVBUS (pin 40)5V (VIN)
8 (VCC2)Motor beslemesiPilin artı ucuPilin artı ucu
MicroPython
1from machine import Pin, PWM
2import time
3
4en = PWM(Pin(15))                 # L293D pin 1 (1,2EN): hız / speed
5en.freq(1000)
6in1 = Pin(14, Pin.OUT)            # L293D pin 2 (1A): yön / direction
7in2 = Pin(13, Pin.OUT)            # L293D pin 7 (2A): yön / direction
8
9def motor(speed):                 # -100 … 100
10    in1.value(1 if speed > 0 else 0)
11    in2.value(1 if speed < 0 else 0)
12    en.duty_u16(int(abs(speed) * 655.35))
13
14while True:
15    motor(80)                     # ileri / forward
16    time.sleep(2)
17    motor(0)                      # dur / stop
18    time.sleep(0.5)
19    motor(-60)                    # geri / backward
20    time.sleep(2)
21    motor(0)
22    time.sleep(0.5)

Pico'nun ve pilin GND'leri mutlaka birleşmeli. ESP32'de aynı mantığı Arduino diliyle kurarsın: tablodaki pinlere digitalWrite ile yön, analogWrite ile hız verirsin. Bu kartları yeni tanıyorsan ESP32 Nedir? ve Raspberry Pi Pico Nedir? yazılarıyla başlayabilirsin.

Motorlar dönmüyor: sık hatalar ve çözümleri

BelirtiOlası nedenÇözüm
Hiçbir motor dönmüyor, PWR LED'i sönükMotor beslemesi yok: EXT_PWR boş ya da yalnızca USB bağlıEXT_PWR'a 6–12 V pil bağla; LED yanmadan motorlar dönmez
LED yanıyor, kod yüklendi ama motor kıpırdamıyorsetSpeed() yazılmamış ya da koddaki numara klemensle uyuşmuyorsetup()'ta setSpeed(200) ekle; AF_DCMotor(1) ↔ M1 eşleşmesini kontrol et
Motor vınlıyor ama dönmüyorPWM değeri düşük ya da pil zayıfHızı 100'ün üstünde başlat; pili şarj et ya da 2 adet 18650 kullan
"AFMotor.h: No such file or directory"Kütüphane kurulu değil ya da V2 kurulmuşKütüphane Yöneticisi'nden V1 olan Adafruit Motor Shield library'yi kur
"This chip is not supported!" ya da "DC_MOTOR_PWM_RATE" hatasıKart olarak Uno R4, Leonardo ya da ESP32 seçiliAraçlar > Kart menüsünden Uno ya da Mega seç
Motorlar çalışınca Arduino yeniden başlıyorKalkış akımı pil gerilimini düşürüyor (brownout)Jumper'ı çıkarıp Arduino'yu ayrı besle; motor uçlarına 100 nF kondansatör lehimle
Motor bir süre dönüp duruyor, yonga çok sıcakL293D'nin aşırı ısınma koruması devreye girdiYükü azalt, yumuşak kalkış yap, soğutucu ekle ya da L298N'e geç
Motorlar rastgele yön değiştiriyorKodda D4, D7, D8 ya da D12 başka bir iş için kullanılıyorSensörleri A0–A5'e taşı
M1 ve M2'nin hızı ayarlanmıyor, M3 ve M4 normaltone() ya da IRremote Timer2'yi kullanıyorBu motorları M3 ve M4'e taşı ya da çakışan kodu kaldır
Tek tekerlek ters dönüyorMotor kabloları klemenste tersO motorun iki kablosunu yer değiştir
Shield takılınca kart garip davranıyorUno'nun USB soketi shield'in alt yüzündeki lehimlere değiyor ya da bir pin bükülmüşUSB soketinin üstüne yalıtım bandı yapıştır, pinleri düzeltip shield'i yeniden tak
Sorunu bulmanın en hızlı yolu testi en basit hâline indirmektir: arabadaki bütün kodu bir kenara bırak, tek bir motoru M1'e bağla, PWR LED'inin yandığını gör ve yukarıdaki ilk programı yükle. Bu çalışıyorsa sorun shield'de değil kodundadır; çalışmıyorsa besleme ve kütüphaneyle başla. Arduino'nun yeniden başlamasının bütün sebepleri Arduino Kendini Resetliyor mu? yazısında.

L293D motor shield ile proje fikirleri

  • Bluetooth kumandalı 4WD araba: Yukarıdaki kodla telefondan sürülen, dört tekerden çekişli bir robot.
  • Engelden kaçan robot: SER1'deki servoya takılı HC-SR04 ile önünü tarayıp en açık yöne dönen bir araba; tam rehber Engelden Kaçan Robot Yapımı yazısında.
  • Çizgi izleyen robot: A0–A3'e bağlanan kızılötesi sensörlerle yerdeki siyah çizgiyi takip et; PID ayarları Çizgi İzleyen Robot yazısında.
  • Kamera kaydırıcı: Step motorla kamerayı ray üzerinde yavaşça kaydırıp hızlandırılmış video çek.
  • Pan-tilt kafa: İki servo başlığına iki servo bağlayıp bir kamerayı ya da lazeri iki eksende yönet; daha fazla servo için Arduino Robot Kol yazısına bak.
  • Otomatik perde ya da konveyör bant: Bir DC motorla perdeyi ışığa göre aç-kapat ya da küçük bir taşıma bandı yap.

L293D motor shield'i doğru kullanmanın özeti şudur: V1 kütüphanesini kur, PWR LED'ini kontrol et, jumper'ı besleme düzenine göre ayarla, setSpeed()'i unutma, sensörleri A0–A5'e bağla ve motorlarını 0,6 A sınırının altında tut. Bu kurallarla küçük bir shield, dört motorlu bir robotun bütün kas gücünü tek başına taşır. BlueGrays uygulamasında Bluetooth kontrollü araba, engelden kaçan robot, step motor ve servo projelerini devre şemaları ve kodlarıyla adım adım bulabilirsin.

Sıkça sorulan sorular

L293D motor shield kaç motor sürer?

Shield aynı anda 4 DC motoru bağımsız olarak ileri-geri ve farklı hızlarda sürebilir. DC motorlar yerine 2 step motor (M1–M2 ve M3–M4 çiftleri) ya da 2 DC motorla 1 step motor da bağlanabilir. Bunlara ek olarak iki servo başlığı vardır; servolar motorlardan bağımsız olarak D9 ve D10'dan sürülür.

L293D motor shield'deki PWR jumper'ı ne işe yarar?

Jumper takılıyken shield'in motor beslemesi Arduino'nun Vin hattına bağlanır ve iki kart tek kaynaktan çalışır. Arduino'yu USB'den, motorları ayrı bir pilden besleyeceksen jumper'ı çıkarmalısın. Jumper takılıyken hem DC jakına hem EXT_PWR'a ayrı kaynak bağlamak iki kaynağı kısa devre eder.

L293D motor shield'e hangi pil bağlanmalı?

TT motorlu robot arabalar için en iyi seçim 2 adet 18650 lityum pildir (7,4 V); L293D yaklaşık 2 V kaybettiği için motorlar 5,5–6 V görür. 4 adet AA pil motorlara 4 V civarı bırakır, 9 V'luk kare pil ise motorları sürecek akımı veremez. Pili EXT_PWR'a bağlarken kutuplara dikkat et, çünkü klemenste ters bağlantı koruması yoktur.

"AFMotor.h: No such file or directory" hatası nasıl çözülür?

Bu hata, AFMotor kütüphanesinin kurulu olmadığını gösterir. Kütüphane Yöneticisi'nde Adafruit Motor Shield araması yap ve açıklamasında V1 yazan Adafruit Motor Shield library'yi kur. V2 kütüphanesi farklı bir kart içindir ve AFMotor.h dosyasını içermez.

L293D motor shield kaç amper verir, neden ısınıyor?

Her kanal sürekli 0,6 A, çok kısa süreli olarak 1,2 A verebilir. L293D'nin transistörleri 0,6 A'de yaklaşık 2,6 V düşürdüğü için motor başına 1,5 W'a yakın ısı oluşur; yonga bu yüzden ısınır ve sınır aşılırsa kendini kapatır. Motorların sıkışmamasına dikkat et ve sürekli 0,6 A'in üzerinde akım çeken motorlar için L298N gibi daha güçlü bir sürücü kullan.

L293D motor shield mi L298N mi daha iyi?

Arduino Uno ile TT motorlu 4WD bir araba yapıyorsan L293D shield, kablosuz takılması ve dört motor kanalıyla daha pratiktir. Daha güçlü motorlar, ESP32 ya da Pico kullanıyorsan veya pinleri kendin seçmek istiyorsan kanal başına 2 A veren L298N daha uygundur. İkisi de motor geriliminin yaklaşık 2 V'unu kaybeder.

Tüm projeleri gör
L298N ile Bluetooth Kontrollü Araba
#80İleri
Premium

L298N ile Bluetooth Kontrollü Araba

Telefonunu kumandaya çevirip kendi robot arabanı sür. Arduino, Bluetooth modülü üzerinden telefondaki bir kumanda uygulamasından gelen komutları alır ve motor sürücüyle tekerlekleri döndürür; araba il

5.0(38)
65
Engelden Kaçan Robot
#81İleri
Premium

Engelden Kaçan Robot

Kendi yolunu bulan akıllı bir araç yapmaya ne dersin? Engelden Kaçan Robot, önündeki ultrasonik sensör sayesinde çevresini sürekli tarar. Bir engelle karşılaştığında durur, servo motoruyla sağına ve s

5.0(38)
49
Step Motor Kullanımı
#67Orta
Premium

Step Motor Kullanımı

Saatin akrebi gibi adım adım, tam istediğin kadar dönen bir motor. Arduino, küçük bir step motoru sürücü kartı üzerinden önce bir yöne tam bir tur çevirir, bir saniye bekler, sonra ters yöne bir tur d

4.5(31)
42
Step Motordan 360 Derecelik Servo Motor Yapımı
#68Orta
Premium

Step Motordan 360 Derecelik Servo Motor Yapımı

Sıradan bir step motora istediğin açıya gitmeyi öğret, üstelik tam bir tur boyunca. Arduino hangi açıya kaç adım düştüğünü hesaplar; motor sırayla 0, 90, 45, 180, 135 ve 360 dereceye gider, her durakt

4.5(22)
32
Servo Motor Kullanım
#35Başlangıç
Premium

Servo Motor Kullanım

Küçük bir servo motorun kolu sırayla üç konuma döner: en başa, tam ortaya ve en sona, her durakta iki saniye bekleyerek. Arduino motora hangi açıda durması gerektiğini söyler, motor da oraya gidip ora

4.7(48)
67
Potansiyometre İle Servo Motor Kullanım
#36Başlangıç
Premium

Potansiyometre İle Servo Motor Kullanım

Potansiyometrenin düğmesini çevirdikçe servo motorun kolu da onunla birlikte döner; düğmenin bir ucu sıfır dereceye, öbür ucu yarım tura karşılık gelir. Arduino düğmenin konumunu sürekli okur ve servo

4.6(37)
52
Bluetooth İle Telefondan Led Yakma
#34Başlangıç
Premium

Bluetooth İle Telefondan Led Yakma

Telefonundan odadaki ışıkları açıp kapatmanın küçük bir provası. Bluetooth modülü telefondan gelen harfleri Arduino'ya iletir; bir harf kırmızı LED'i, başka bir harf yeşil LED'i yakar, aynı harflerin

4.8(68)
89
TCRT5000 Siyah Beyaz Zemin Tespiti
#78Orta
Premium

TCRT5000 Siyah Beyaz Zemin Tespiti

Çizgi izleyen robotların gözü olan küçük bir sensörle zeminin siyah mı beyaz mı olduğunu anlarsın. TCRT5000 sensörü zemine gözle görülmeyen bir ışık gönderip ne kadarının geri döndüğüne bakar; beyaz z

4.7(40)
49