Parçalar · 11 dk okuma

MG996R Servo Motor: Tork, Akım, Besleme ve Arduino Kodu

MG996R servo nasıl kullanılır? 11 kg·cm tork ve 2,5 A akım, harici 5–6 V besleme, kondansatör, 500–2500 µs ayarı, titreme çözümü, PCA9685 ve SG90 farkı.

MG996R servo, metal dişlileri ve 6 V'ta 11 kg·cm'ye varan torkuyla Arduino projelerinde ağır işlerin standart servo motorudur. 55 gramlık gövdesiyle robot kolun omzunu kaldırır, ağır bir kapağı açar, pan-tilt kamera yuvasını döndürür. Ancak bu gücün bir bedeli vardır: MG996R zorlandığında 2,5 A'e kadar akım çeker. Bu yüzden SG90 gibi Arduino'nun 5V pinine takılıp çalıştırılamaz; harici 5–6 V besleme, ortak GND ve servoya yakın bir kondansatör ister. Bu kurallara uyulmadığında servo titrer, Arduino kendini resetler, hatta bilgisayar USB portunu kapatır.

Bu rehberde MG996R'ın tork ve akım değerlerini gerçek sayılarla yorumlamayı, doğru güç kaynağını seçmeyi, Servo kütüphanesiyle 500–2500 µs aralığını kullanıp kendi servonun sınırlarını bulmayı, titremeyi ve resetlenmeyi önlemeyi öğreneceksin. Ardından ESP32 ve Raspberry Pi Pico kodlarına, 16 servoyu iki kabloyla süren PCA9685 modülüne, robot kol için servo seçimine ve SG90 ile MG90S karşılaştırmasına geçeceğiz.

MG996R metal dişli servo motor
MG996R: 40,7 × 19,7 × 42,9 mm gövde, metal dişliler, çift bilyalı rulman ve 25 dişli çıkış mili. Kahverengi kablo GND, kırmızı kablo artı, turuncu kablo sinyaldir.

MG996R servo nedir, nasıl çalışır?

MG996R, TowerPro'nun eski MG995 modelinin geliştirilmiş sürümüdür: yenilenen kontrol kartı ve dişliler sayesinde daha kararlı merkezlenir ve daha az boşluk bırakır. Gövdenin içinde küçük bir DC motor, motoru yavaşlatıp torku artıran metal dişli kutusu, çıkış milinin açısını ölçen bir potansiyometre ve bunları yöneten kontrol kartı bulunur. Kart, sinyal kablosundan her 20 ms'de (50 Hz) bir gelen darbenin genişliğini okur, istenen açıyla potansiyometrenin gösterdiği açıyı karşılaştırır ve fark kapanana kadar motoru döndürür. Yaklaşık 1500 µs'lik darbe orta konum demektir; darbe kısaldıkça mil bir yöne, uzadıkça diğer yöne döner. Veri sayfasındaki 5 µs ölü bant, servonun bundan küçük değişikliklere tepki vermediğini gösterir. Servo motorların genel çalışma mantığını Servo Motor Nedir? yazısında temelden anlattık.

ÖzellikDeğer
Çalışma gerilimi4,8–7,2 V (pratikte 5–6 V)
Kilitlenme torku9,4 kg·cm (4,8 V), 11 kg·cm (6 V) ≈ 0,92–1,08 N·m
Hız (60° için)0,17 sn (4,8 V), 0,14 sn (6 V)
Boşta akımYaklaşık 10 mA (yüksüz, mil dururken)
Çalışma akımı500–900 mA (6 V, hareket ederken)
Kilitlenme (stall) akımı2,5 A (6 V)
Ölü bant5 µs
Dönüş açısı1000–2000 µs ile yaklaşık 120°, 500–2500 µs ile 180°'ye yakın (birimden birime değişir)
Sinyal50 Hz (20 ms periyot), konum darbe genişliğiyle verilir
Dişli ve yatakMetal dişli, çift bilyalı rulman
Çıkış mili25 dişli (25T)
Ağırlık ve boyut55 g, 40,7 × 19,7 × 42,9 mm
KabloYaklaşık 30 cm; kahverengi GND, kırmızı artı, turuncu sinyal
Çalışma sıcaklığı0–55 °C

Tork ne demek? kg·cm değerini doğru okumak

Tork, servonun milinden belli bir uzaklıktaki yükü döndürme gücüdür ve kuvvet × uzaklık olarak ölçülür. 11 kg·cm, milden 1 cm uzaktaki 11 kg'lık yükü ya da 10 cm uzaktaki 1,1 kg'ı tutabilmek demektir; uzaklık iki katına çıkınca taşınabilecek yük yarıya iner. Newton metreye çevirmek için 0,098 ile çarp: 11 kg·cm ≈ 1,08 N·m. Burada kritik ayrıntı şudur: veri sayfasındaki değer kilitlenme torkudur, yani servonun milinin durduğu, en yüksek akımı çektiği ve ısındığı sınırdır. Sürekli çalışmada bu değerin en fazla yarısını kullanmak servoyu serin tutar, titremeyi azaltır ve dişlilerin ömrünü uzatır.

Kol uzunluğu (milden yüke)Kilitlenme sınırı (6 V)Güvenli sürekli yük (%50)
2,5 cm (korna ucu)4,4 kg2,2 kg
5 cm2,2 kg1,1 kg
10 cm1,1 kg550 g
15 cmYaklaşık 730 gYaklaşık 365 g
20 cm550 g275 g

Tablo yalnızca uçtaki yükü hesaba katar. Gerçek bir mekanizmada kolun kendi ağırlığı, üzerine takılan diğer servolar ve kıskaç da torka eklenir; her parçanın kütlesini milden uzaklığıyla çarpıp toplaman gerekir. Örneğin 15 cm'lik bir kolun ucunda 150 g'lık bir kıskaç ve 100 g'lık bir nesne varsa yalnızca bu ikisi 0,25 × 15 = 3,75 kg·cm eder; kolun kendi ağırlığıyla birlikte toplam 5 kg·cm'yi bulabilir. Bu, MG996R'ın 6 V'taki kilitlenme torkunun yarısının biraz altındadır, yani doğru seçimdir. Parça parça tork hesabını Arduino robot kol rehberinde örnekle bulabilirsin.

Akım: MG996R neden Arduino'nun 5V pininden beslenmez?

MG996R yüksüz dururken yalnızca yaklaşık 10 mA çeker (yük tutarken bu değer yükle birlikte artar), ama hareket ederken akım 0,5–0,9 A'e çıkar; mil zorlandığında ve her kalkışın ilk milisaniyelerinde ise 2,5 A'e yaklaşır. Arduino Uno USB'den beslendiğinde 5V pininden alabileceğin toplam akım, kartın 500 mA'lik sigortasıyla sınırlıdır ve bunun bir kısmını kart kendisi harcar. Servo kalkışa geçtiği anda 5 V hattı birkaç milisaniyeliğine belirgin biçimde düşer, işlemci kararsızlaşır ve kart yeniden başlar. Bilgisayar da aşırı akım gördüğü USB portunu bir süreliğine kapatabilir.

Kablolar da sorunun parçasıdır. Breadboard'da kullanılan ince jumper kabloların ve breadboard kontaklarının toplam direnci kolayca 0,2 Ω'u bulur. Ohm kanunu ile hesaplarsan 2,5 A'lik tepe akımda yalnızca kablolarda 2,5 × 0,2 = 0,5 V kaybolur; 5 V'luk kaynak servoya 4,5 V olarak ulaşır, servo zayıflar ve titrer. Breadboard kontakları da yaklaşık 1 A için tasarlanmıştır. MG996R'ın besleme kablolarını breadboard yerine doğrudan bir klemense ya da lehimli bir dağıtım hattına bağla ve 20–22 AWG kalınlığında kablo kullan.

Servo sayısıHareket ederkenEn kötü durum (hepsi kilitli)Önerilen kaynak
1 adet MG996R0,5–0,9 A2,5 A5–6 V, en az 3 A
2 adet1–1,8 A5 A5–6 V, 5 A
4 adet2–3,6 A10 A5–6 V, 6–10 A anahtarlamalı adaptör
6 adet (robot kol)3–5,4 A15 A6 V, 10 A ve servoları sırayla hareket ettiren kod
16 adet (PCA9685)8–14 A40 ABirkaç ayrı 6 V hat ya da 20 A ve üzeri kaynak

Doğru besleme: harici 5–6 V, ortak GND ve kondansatör

  1. Kaynağı seç: Servo sayısına göre yukarıdaki tablodaki akımı verebilen 5 V ya da 6 V'luk anahtarlamalı bir adaptör kullan. Taşınabilir projelerde 4 adet AA Ni-MH pil (4,8 V) ya da 2S LiPo ile 6 V'a ayarlı bir düşürücü (UBEC) iyi çalışır.
  2. Artıyı yalnızca servoya ver: Kaynağın artısını MG996R'ın kırmızı kablosuna bağla; Arduino'nun 5V pinine bağlama.
  3. GND'leri birleştir: Kaynağın eksisini hem servonun kahverengi kablosuna hem de Arduino'nun GND pinine bağla. Sinyal, GND'ye göre ölçülen bir gerilim olduğu için ortak GND olmadan servo darbeleri anlayamaz.
  4. Sinyali bağla: Turuncu kabloyu Arduino Uno'nun D9 pinine bağla (ESP32'de GPIO 18, Pico'da GP15).
  5. Kondansatör ekle: Servonun besleme uçlarına, servoya olabildiğince yakın, 470–1000 µF / 16 V bir elektrolitik kondansatör koy; gövdesindeki şeritli bacak eksiye gelir. Birden fazla servo varsa servo başına yaklaşık 100 µF hesapla.
  6. Arduino'yu ayrı besle: Kartı USB'den ya da DC jaktan çalıştır. Böylece servonun yarattığı gerilim düşmeleri işlemciye ulaşmaz.
2S LiPo pili (dolu hâlde 8,4 V) MG996R'a doğrudan bağlama; 7,2 V'luk üst sınırı aşar ve kontrol kartını yakabilir. 9 V'luk kare pil ise gereken akımı hiç veremez. Elektrolitik kondansatörü ters bağlamak onu ısıtıp patlatabilir; gerilim değeri hattın en az iki katı (6 V için 16 V) olmalıdır. Ortak GND'nin neden şart olduğunu GND nedir?, kondansatör seçimini de Kondansatör nedir? yazısında anlattık.
BağlantıArduino UnoESP32Raspberry Pi Pico
Turuncu kablo (sinyal)D9GPIO 18GP15
Kırmızı kablo (artı)Harici 5–6 V artıHarici 5–6 V artıHarici 5–6 V artı
Kahverengi kablo (GND)Kaynağın eksisi + Arduino GNDKaynağın eksisi + ESP32 GNDKaynağın eksisi + Pico GND
Kondansatör (470–1000 µF)Servonun artısı ile eksisi arasınaServonun artısı ile eksisi arasınaServonun artısı ile eksisi arasına
Potansiyometre (ESP32 örneği)—Orta bacak GPIO 34, kenarlar 3V3 ve GND—
Elektrolitik kondansatörler
Elektrolitik kondansatör, servonun kalkış anında istediği ani akımı kaynaktan önce kendi üzerinden verir. Gövdedeki şerit eksi bacağı gösterir; MG996R için 470–1000 µF / 16 V iyi bir başlangıçtır.
12 V'luk bir adaptörün varsa LM2596 modülüyle çıkışı 6 V'a ayarlayabilirsin. Ancak LM2596 en fazla 3 A verir ve soğutucusuz yaklaşık 2 A'de ısınır; 2,5 A kilitlenme akımıyla bu sınıra dayanan tek bir MG996R için uygundur. Daha fazla servo için 5 A ve üzeri bir düşürücü ya da doğrudan güçlü bir 5–6 V adaptör seç. Pille çalışan projelerde çalışma süresini pil ömrü hesaplayıcısıyla tahmin edebilirsin.

Servo kütüphanesi ve 500–2500 µs aralığı

Arduino'nun Servo kütüphanesi IDE ile birlikte gelir. servo.attach(9) yazdığında kütüphane varsayılan olarak 544–2400 µs aralığını kullanır ve write(0) ile write(180) komutlarını bu iki uca eşler; birçok MG996R bu aralıkta 180 derecenin biraz altında kalır. Aralığı genişletmek için servo.attach(9, 500, 2500) yaz. Bu ayrıntı önemlidir, çünkü writeMicroseconds() de attach ile verilen sınırların dışına çıkamaz: sınırları vermeden writeMicroseconds(2500) yazarsan kütüphane değeri sessizce 2400'e indirir. Ayrıca write() fonksiyonu 544'ten küçük sayıları açı, daha büyüklerini mikro saniye olarak yorumlar.

Servo kütüphanesi Arduino Uno'da 12 servoya kadar destek verir ve Timer1'i kullandığı için servo bağlıyken 9 ile 10 numaralı pinlerde analogWrite çalışmaz. Her MG996R'ın mekanik sınırı da birbirinden biraz farklıdır: üreticinin veri sayfası standart 1000–2000 µs darbelerle yaklaşık 120 derecelik dönüş verir, geniş aralıkla ise çoğu servo 180 dereceye yaklaşır. Sınırın ötesine itilen servo iç durdurucuya dayanır, kilitlenme akımı çeker, vızıldar ve ısınır. Bu yüzden ilk iş, aşağıdaki kodla kendi servonun güvenli darbe aralığını bulmaktır.

C++ (Arduino IDE)
1#include <Servo.h>
2
3const byte SERVO_PIN = 9;          // turuncu sinyal kablosu / orange signal wire
4Servo servo;
5int pulseUs = 1500;                // orta konum / center position
6
7void setup() {
8  Serial.begin(115200);
9  servo.writeMicroseconds(pulseUs);      // önce darbe, sonra attach / pulse first, then attach
10  servo.attach(SERVO_PIN, 500, 2500);    // aralığı genişlet / widen the range
11  Serial.println(F("500-2500 arasi bir deger yaz / type a value between 500 and 2500"));
12}
13
14void loop() {
15  if (Serial.available()) {
16    long value = Serial.parseInt();             // yazılan sayıyı oku / read the typed number
17    while (Serial.available()) Serial.read();   // satır sonunu temizle / clear the line ending
18    if (value >= 500 && value <= 2500) {
19      int step = (value > pulseUs) ? 10 : -10;  // 10 µs adımlarla yavaşça git / move slowly in 10 µs steps
20      while (abs(value - pulseUs) >= 10) {
21        pulseUs += step;
22        servo.writeMicroseconds(pulseUs);
23        delay(5);
24      }
25      pulseUs = value;
26      servo.writeMicroseconds(pulseUs);
27      Serial.print(F("Darbe / pulse: "));
28      Serial.print(pulseUs);
29      Serial.println(F(" us"));
30    }
31  }
32}
  1. Kodu yükle, Seri Monitör'ü 115200 baud'da aç ve satır sonunu Yeni Satır olarak ayarla.
  2. 1500 yaz; servo orta konuma gelir. Kornayı mekanizmanın orta konumuna bakacak şekilde bu anda tak.
  3. 1000, 800, 700 gibi değerlerle alt sınıra doğru 50'şer µs azalt. Servo artık dönmüyor ya da vızıldamaya başlıyorsa son değerden 30–50 µs geri gel ve bu sayıyı MIN_US olarak not et.
  4. Aynı işlemi 2000, 2200, 2300 gibi değerlerle üst sınır için yap ve MAX_US değerini bul. Bu iki sayıyı sonraki kodlarda kullanacaksın.

Yumuşak hareket: akım darbelerini ve sarsıntıyı azaltan kod

servo.write(160) gibi tek bir komut servoyu tam hızla, 6 V'ta 60 dereceyi 0,14 saniyede geçerek hedefe fırlatır. Bu sırada motor neredeyse kilitlenme akımı çeker, mekanizma sarsılır ve tutulan nesne düşebilir. Hareketi küçük adımlara bölmek hem akım tepelerini hem de mekanik darbeyi azaltır. Aşağıdaki kod servoyu her 15 ms'de 1 derece (yaklaşık 67°/sn) ilerletir ve millis() kullandığı için bu sırada başka işler de yapabilirsin.

C++ (Arduino IDE)
1#include <Servo.h>
2
3const byte SERVO_PIN = 9;
4const int MIN_US = 550;            // kalibrasyonda bulduğun alt sınır / lower limit from calibration
5const int MAX_US = 2450;           // kalibrasyonda bulduğun üst sınır / upper limit from calibration
6const byte STEP_MS = 15;           // derece başına süre: 15 ms ≈ 67°/sn / time per degree: 15 ms ≈ 67°/s
7
8const int POSES[] = {20, 160, 90, 45, 135};    // sırayla gidilecek açılar / angles to visit in order
9const byte POSE_COUNT = sizeof(POSES) / sizeof(POSES[0]);
10
11Servo servo;
12int current = 90;                  // şu anki açı / current angle
13int target = 90;                   // hedef açı / target angle
14byte poseIndex = 0;
15unsigned long lastStep = 0;
16unsigned long arrivedAt = 0;
17
18int angleToUs(int angle) {
19  return map(angle, 0, 180, MIN_US, MAX_US);   // açıyı darbeye çevir / angle to pulse width
20}
21
22void setup() {
23  servo.writeMicroseconds(angleToUs(current)); // önce konum, sonra attach / position first, then attach
24  servo.attach(SERVO_PIN, MIN_US, MAX_US);
25  arrivedAt = millis();
26}
27
28void loop() {
29  unsigned long now = millis();
30
31  // Hedefe 1 derecelik adımlarla yaklaş / approach the target in 1-degree steps
32  if (current != target && now - lastStep >= STEP_MS) {
33    lastStep = now;
34    current += (target > current) ? 1 : -1;
35    servo.writeMicroseconds(angleToUs(current));
36    if (current == target) arrivedAt = now;
37  }
38
39  // Hedefte 1 sn bekle, sonra sıradaki poza geç / wait 1 s at the target, then take the next pose
40  if (current == target && now - arrivedAt >= 1000) {
41    target = POSES[poseIndex];
42    poseIndex = (poseIndex + 1) % POSE_COUNT;
43  }
44
45  // Burada başka işler de yapılabilir / other tasks can run here too
46}

angleToUs() fonksiyonu açıyı kalibrasyonda bulduğun MIN_US ile MAX_US arasına eşler; böylece 0 ve 180 derece servonun gerçek ve güvenli uçları olur. Servo kapalıyken konumunu hatırlamaz ve ilk darbeyi aldığı an tam hızla o açıya gider. writeMicroseconds() komutunun attach()'tan önce verilmesi, kütüphanenin varsayılan 1500 µs darbesini atlayıp doğrudan senin başlangıç açını göndermesini sağlar; mekanizmayı kapatmadan önce aynı başlangıç pozuna getirirsen açılış sıçraması neredeyse yok olur. Hızı STEP_MS ile ayarla: 30 ms yavaş ve yumuşak, 5 ms hızlı ama sarsıntılı bir hareket verir. Servoyu bir potansiyometreyle sürmek istersen okuduğun değeri açıya çevirip target değişkenine yazman yeterlidir.

Titreme ve Arduino'nun resetlenmesi: sebepler ve çözümler

BelirtiOlası sebepÇözüm
Servo hareket edince Arduino resetleniyor, USB bağlantısı kopuyorServo Arduino'nun 5V pininden besleniyor, kalkış akımı gerilimi düşürüyorHarici 5–6 V kaynak, ortak GND ve 470–1000 µF kondansatör
Servo dururken titriyor ya da vızıldıyorZayıf besleme, ince kablolar ya da kilitlenme torkuna yakın yükKalın kablo ve kondansatör kullan, kolu kısalt ya da yükü azalt
Potansiyometreyle kontrolde sürekli kıpırdıyorAnalog okumadaki birkaç basamaklık gürültüYumuşatma filtresi ve 2 derecelik ölü bant ekle
Servo rastgele hareket ediyor ya da hiç tepki vermiyorHarici kaynağın GND'si Arduino'ya bağlanmamışKaynağın eksisini Arduino'nun GND pinine bağla
Uçlarda vızıldıyor ve ısınıyorDarbe aralığı servonun mekanik sınırını aşıyorKalibrasyonla MIN_US ve MAX_US değerlerini daralt
NeoPixel, SoftwareSerial ya da IR kütüphanesiyle birlikte seğiriyorBu kütüphaneler kesmeleri kısa süre kapatıyor, darbe süresi kayıyorServoyu PCA9685'e taşı ya da donanım PWM'li bir kart kullan
ESP32 "Brownout detector was triggered" yazıp yeniden başlıyorServo ile ESP32 aynı zayıf kaynağı paylaşıyorServoyu ayrı kaynaktan besle, GND'leri birleştir
Yük altında "tık tık" sesi ve kaymaDişli dişi kırılmış ya da plastik korna sıyırmışDişli setini değiştir, metal 25T korna ve orta vida kullan
Etiketteki değerin çok altında torkKalitesiz kopya ya da düşük besleme gerilimi6 V ile dene, güvenilir bir satıcıdan al ve %50 pay bırak
Servo bir yükü tutmak zorunda değilse hedefe vardıktan sonra servo.detach() ile sinyali kesebilirsin; servo susar ve neredeyse hiç akım çekmez. Ancak sinyal kesilince tutma torku da kaybolur, bu yüzden robot kolun omzu gibi yük taşıyan eklemlerde detach kullanma. Resetlenmenin bütün sebeplerini ve teşhis kodunu Arduino kendini resetliyor, ESP32'deki karşılığını ESP32 brownout hatası yazısında bulabilirsin.

ESP32 ile MG996R kontrolü

ESP32'de Arduino'nun standart Servo kütüphanesi çalışmaz; Kütüphane Yöneticisi'nden ESP32Servo kütüphanesini kur. Kullanımı neredeyse aynıdır: periyodu setPeriodHertz(50) ile belirtirsin ve kütüphane 500–2500 µs dışındaki sınırları kabul etmez. ESP32'nin sinyal çıkışı 3,3 V'tur ve MG996R'ların büyük çoğunluğu bunu sorunsuz algılar; servon tepki vermiyor ya da kararsızsa sinyal hattına bir lojik seviye dönüştürücü ekle. Aşağıdaki örnekte GPIO 34'e bağlı bir potansiyometre servoyu döndürür. ESP32'nin ADC'si 12 bit olduğu için okuma 0–4095 arasındadır ve biraz gürültülüdür; kod bu yüzden süzme ve ölü bant kullanır.

C++ (Arduino IDE)
1#include <ESP32Servo.h>
2
3const int SERVO_PIN = 18;          // servo sinyali / servo signal
4const int POT_PIN = 34;            // pot orta bacağı (ADC1) / pot wiper (ADC1)
5const int MIN_US = 500;            // ESP32Servo bu aralığın dışına çıkmaz / ESP32Servo stays within 500–2500
6const int MAX_US = 2500;
7
8Servo servo;
9float smooth = 0;                  // süzülmüş pot değeri / filtered pot value
10int lastAngle = -1;
11
12void setup() {
13  Serial.begin(115200);
14  ESP32PWM::allocateTimer(0);              // servo için zamanlayıcı ayır / reserve a timer for the servo
15  servo.setPeriodHertz(50);                // 50 Hz = 20 ms periyot / 20 ms period
16  servo.attach(SERVO_PIN, MIN_US, MAX_US);
17  smooth = analogRead(POT_PIN);
18}
19
20void loop() {
21  smooth += (analogRead(POT_PIN) - smooth) * 0.1;   // ADC gürültüsünü süz / filter ADC noise
22  int angle = map((int)smooth, 0, 4095, 0, 180);    // 12 bit ADC: 0–4095
23  if (abs(angle - lastAngle) >= 2) {                // ölü bant: titremeyi keser / deadband stops jitter
24    servo.write(angle);
25    lastAngle = angle;
26    Serial.println(angle);
27  }
28  delay(20);
29}

Raspberry Pi Pico (MicroPython) ile MG996R

Raspberry Pi Pico'da ek kütüphane gerekmez: PWM'i 50 Hz'e ayarlayıp darbe genişliğini duty_ns() ile nanosaniye cinsinden verirsin; 500 µs, 500000 ns demektir. Pico'nun sinyali de 3,3 V'tur. Servoyu Pico'nun VBUS ya da VSYS pininden besleme; bu pinlerdeki akım bilgisayarın USB portundan gelir ve MG996R'ın tepe akımı Pico'yu yeniden başlatır. Servoyu harici kaynaktan besle ve GND'leri birleştir. Aşağıdaki kod servoyu derece derece, yumuşak biçimde üç konum arasında gezdirir.

MicroPython
1from machine import Pin, PWM
2import time
3
4MIN_NS = 500000                   # 500 µs = 0 derece / 0 degrees
5MAX_NS = 2500000                  # 2500 µs = 180 derece / 180 degrees
6
7servo = PWM(Pin(15))              # turuncu kablo GP15'e / orange wire to GP15
8servo.freq(50)                    # 50 Hz servo sinyali / 50 Hz servo signal
9
10def write_angle(angle):
11    angle = max(0, min(180, angle))                           # 0–180 ile sınırla / clamp to 0–180
12    servo.duty_ns(MIN_NS + (MAX_NS - MIN_NS) * angle // 180)  # açıyı darbeye çevir / angle to pulse
13
14def move_slow(start, end, ms_per_degree=15):
15    step = 1 if end > start else -1
16    for a in range(start, end + step, step):  # 1 derecelik adımlar / 1-degree steps
17        write_angle(a)
18        time.sleep_ms(ms_per_degree)
19
20write_angle(90)                   # ortadan başla / start at the center
21time.sleep(1)
22
23while True:
24    move_slow(90, 170)
25    time.sleep(1)
26    move_slow(170, 10)
27    time.sleep(1)
28    move_slow(10, 90)
29    time.sleep(1)

PCA9685 ile 16 servo: iki kabloyla çok sayıda MG996R

Servo sayısı artınca ya da kesmeleri kapatan kütüphanelerle çalışırken PCA9685 modülü işini kolaylaştırır. Bu kart 16 kanallı, 12 bit çözünürlüklü bir PWM üretecidir ve Arduino ile yalnızca SDA ve SCL kablolarıyla, I2C üzerinden konuşur. Darbeleri kendi saatiyle ürettiği için işlemci başka işlerle meşgulken bile sinyal titremez. Varsayılan adresi 0x40'tır; kart üzerindeki A0–A5 lehim köprüleriyle adres değiştirilerek aynı hatta 62 kart, yani teorik olarak 992 servo bağlanabilir. 50 Hz'de 20 ms'lik periyot 4096 adıma bölünür ve bir adım yaklaşık 4,9 µs eder: 500 µs yaklaşık 102, 2500 µs yaklaşık 512 adımdır.

PCA9685 piniArduino UnoESP32Raspberry Pi Pico
GNDGNDGNDGND
VCC (yalnızca yonganın beslemesi)5V3V33V3
SDAA4GPIO 21GP4
SCLA5GPIO 22GP5
V+ klemensi (servo beslemesi)Harici 5–6 VHarici 5–6 VHarici 5–6 V
OEBoş bırakBoş bırakBoş bırak
C++ (Arduino IDE)
1#include <Wire.h>
2#include <Adafruit_PWMServoDriver.h>
3
4Adafruit_PWMServoDriver pca = Adafruit_PWMServoDriver(0x40);   // varsayılan adres / default address
5
6const byte SERVO_COUNT = 16;
7const uint16_t MIN_US = 500;       // kalibrasyonla daralt / narrow it after calibration
8const uint16_t MAX_US = 2500;
9
10uint16_t angleToUs(float angle) {
11  return MIN_US + (uint16_t)(angle * (MAX_US - MIN_US) / 180.0);
12}
13
14void setup() {
15  pca.begin();
16  pca.setOscillatorFrequency(27000000);   // kartın gerçek saatine yakın / close to the real board clock
17  pca.setPWMFreq(50);                     // servolar için 50 Hz / 50 Hz for servos
18  delay(10);
19  for (byte ch = 0; ch < SERVO_COUNT; ch++) {
20    pca.writeMicroseconds(ch, angleToUs(90));   // hepsini ortala / center them all
21    delay(200);                                 // sırayla başlat: akım darbesini dağıt / one by one: spread the current surge
22  }
23}
24
25void loop() {
26  // Dalga: her servo komşusundan biraz geride / wave: each servo slightly behind its neighbour
27  float t = millis() / 1000.0;
28  for (byte ch = 0; ch < SERVO_COUNT; ch++) {
29    float angle = 90 + 40 * sin(t * 2.0 - ch * 0.4);   // 50–130° arası / between 50° and 130°
30    pca.writeMicroseconds(ch, angleToUs(angle));
31  }
32  delay(20);
33}

Kodu çalıştırmak için Kütüphane Yöneticisi'nden Adafruit PWM Servo Driver kütüphanesini kur. setOscillatorFrequency(27000000) satırı önemlidir: PCA9685'in iç saati kâğıt üzerinde 25 MHz'tir ama gerçekte yaklaşık 23–27 MHz arasında değişir ve Adafruit'in örnekleri 27 MHz kullanır. Bu ayar olmadan writeMicroseconds() ile verdiğin darbeler birkaç yüzde kayabilir. Kurulumda servoların 200 ms arayla tek tek başlatılması, 16 servonun aynı anda kalkış akımı çekmesini önler. Her servonun sınırı farklıysa MIN_US ve MAX_US değerlerini 16 elemanlı dizilere çevirip kanal başına kalibrasyon yapabilirsin. Kod ESP32'de de değişmeden çalışır, çünkü Wire kütüphanesi orada varsayılan olarak GPIO 21 ve 22'yi kullanır.

PCA9685'te iki ayrı besleme vardır: VCC yalnızca yongayı besler, servolar ise klemensteki V+ girişinden beslenir. V+ boş kalırsa kart I2C'de görünür ama servolar kıpırdamaz; V+'yı asla Arduino'nun 5V pininden besleme. Ucuz modüllerin ince baskı devre yolları onlarca amperi taşımak için tasarlanmamıştır: 4–6'dan fazla MG996R kullanıyorsan servoların artı ve eksi kablolarını kalın bir dağıtım hattına bağla, karttan yalnızca sinyal al. V+ hattına da servo başına yaklaşık 100 µF kondansatör ekle.

MG996R, SG90 ve MG90S karşılaştırması

ÖzellikSG90MG90SMG996R
Kilitlenme torku1,8 kg·cm (4,8 V)1,8 kg·cm (4,8 V), 2,2 kg·cm (6 V)9,4 kg·cm (4,8 V), 11 kg·cm (6 V)
Hız (60° için)0,10 sn (4,8 V)0,10 sn (4,8 V), 0,08 sn (6 V)0,17 sn (4,8 V), 0,14 sn (6 V)
Ağırlık9 g13,4 g55 g
Boyut22,2 × 11,8 × 31 mm22,8 × 12,2 × 28,5 mm40,7 × 19,7 × 42,9 mm
DişliPlastikMetalMetal, çift rulman
Çalışma gerilimi4,8–6 V4,8–6 V4,8–7,2 V
Kilitlenme akımıYaklaşık 0,6–0,75 AYaklaşık 0,7–1 A2,5 A (6 V)
Arduino'nun 5V pinindenTek servo, hafif yükleTek servo, hafif yükleHayır, her zaman harici kaynak
Tipik kullanımİlk denemeler, pan-tilt, kıskaçBilek, kıskaç, küçük robotlarRobot kol omzu, ağır kapak, direksiyon

Seçimi yük ve kol uzunluğu belirler. Birkaç gramlık bir parçayı döndürecek ya da yalnızca deneme yapacaksan SG90 yeterlidir. Aynı boyutta ama darbelere dayanıklı metal dişli istiyorsan MG90S'i seç. Gereken tork 1 kg·cm'yi geçiyorsa, örneğin 10 cm'lik bir kolun ucunda 100 g taşıyacaksan, MG996R'a geç. MG996R'ın torku SG90'ınkinin yaklaşık beş katıdır, ama daha yavaştır, altı kat ağırdır ve üç dört kat fazla akım çeker; kaynağı ve mekanik bağlantıyı buna göre planlamalısın. 11 kg·cm de yetmiyorsa 20 kg·cm sınıfındaki DS3218 gibi daha büyük servolara bakabilirsin.

SG90
SG90
MG90S
MG90S
MG996R
MG996R

Robot kol için servo seçimi

  • Taban: MG996R. Kolun bütün ağırlığını servo miline bindirme; tabana bir rulman koy, servo yalnızca döndürsün.
  • Omuz: En çok zorlanan eklemdir. MG996R kullan; kol 20 cm'yi geçiyorsa 20 kg·cm sınıfı bir servo ya da karşı ağırlık ekle.
  • Dirsek: MG996R. Ağır servoyu omuz hizasına alıp dirseği bir itme çubuğuyla sürmek omzun yükünü azaltır.
  • Bilek ve bilek dönüşü: MG90S yeterlidir; burada MG996R kullanmak omzun taşıdığı ağırlığı boşuna artırır.
  • Kıskaç: SG90 ya da MG90S. Kapanma açısını nesneye yeni değdiği noktaya ayarla; sürekli sıkmaya çalışan servo kilitlenme akımı çeker.
  • Bağlantı: MG996R'ın 25 dişli miline metal korna tak ve kornayı ortadaki vidayla sabitle; plastik kornalar bu torkta kısa sürede sıyırır.

MG996R ile proje fikirleri

  • Robot kol: Taban, omuz ve dirsekte MG996R, bilek ve kıskaçta MG90S ile 6 servolu bir kol; yapımı robot kol rehberinde.
  • Pan-tilt kamera: İki MG996R ile bir ESP32-CAM modülünü yatay ve dikey eksende döndür.
  • Güneş takip sistemi: Dört LDR ile ışığın geldiği yönü bul ve küçük bir paneli MG996R ile güneşe çevir; ayrıntılar güneş takip sistemi yazısında.
  • Akıllı çöp kutusu: El yaklaşınca ağır bir kapağı açan akıllı çöp kutusu.
  • Kartlı kapı kilidi: RFID RC522 ile doğru kart okutulunca bir sürgüyü MG996R ile çek.
  • Joystick kumandalı vinç: Bir joystick ile iki eksende hareket eden küçük bir vinç ya da kepçe.
  • Sürekli dönen tahrik: MG996R'ın 360 derece dönen sürümüyle yavaş ama güçlü bir tekerlek; farkı 360 derece servo yazısında.

MG996R, doğru beslendiğinde küçük servoların yapamadığı işleri kolayca üstlenen, dayanıklı ve ucuz bir motordur. Kuralları hatırla: harici 5–6 V kaynak, ortak GND, servoya yakın bir kondansatör, kalibre edilmiş darbe aralığı ve yumuşak hareket; servo sayısı artınca da PCA9685. BlueGrays uygulamasında potansiyometre ve joystick ile servo kontrolü, ESP32 ile servolu RFID kapı kilidi ve 32 servolu koreografi gibi projeleri adım adım devre şeması ve hazır kodlarıyla bulabilirsin.

Sıkça sorulan sorular

MG996R kaç kg kaldırır?

MG996R'ın torku 6 V'ta 11 kg·cm'dir; bu, milden 1 cm uzaklıkta 11 kg, 10 cm uzaklıkta 1,1 kg demektir. Bu değer servonun durduğu kilitlenme sınırıdır, sürekli kullanımda yarısını hesaba kat. Yani 10 cm'lik bir kolun ucunda yaklaşık 500 g'lık yükü rahatça taşır.

MG996R kaç volt ile çalışır, 12 V verilir mi?

Veri sayfasına göre çalışma aralığı 4,8–7,2 V'tur; pratikte 5 V ya da 6 V kullanılır ve 6 V daha fazla tork ve hız verir. 12 V ya da dolu hâlde 8,4 V olan 2S LiPo servonun kontrol kartını yakar. Yüksek gerilimli bir kaynağın varsa LM2596 gibi bir düşürücüyle 6 V'a indir.

MG996R kaç amper çeker, nasıl bir adaptör gerekir?

Yüksüz dururken yaklaşık 10 mA, hareket ederken 0,5–0,9 A, zorlandığında ve kalkış anında 2,5 A'e kadar akım çeker. Tek servo için en az 3 A, dört servo için 6–10 A veren 5–6 V'luk bir adaptör seç. Kaynağın eksisini Arduino'nun GND pinine bağlamayı unutma.

MG996R 180 derece mi döner, 360 derece dönen modeli var mı?

Standart MG996R bir konum servosudur: üretici standart darbelerle yaklaşık 120 derece verir, 500–2500 µs aralığıyla çoğu servo 180 dereceye yaklaşır. Aynı adla satılan 360 derece sürümü ise açıya gitmez, sinyale göre hız ve yön değiştirerek sürekli döner. Satın alırken ilandaki 180° ya da 360° ifadesine dikkat et.

MG996R servo neden titriyor ya da Arduino'yu resetliyor?

Sebep neredeyse her zaman beslemedir: servo Arduino'nun 5V pininden beslenince tepe akım gerilimi düşürür ve kart yeniden başlar. Harici 5–6 V kaynak, ortak GND ve servoya yakın 470–1000 µF kondansatör kullan. Duran servodaki titreme için kalın kablo kullan, potansiyometre okumalarını yumuşat ve darbe aralığını servonun mekanik sınırları içinde tut.

MG996R ile MG995 arasındaki fark nedir?

İki servo aynı boyuttadır ve aynı şekilde bağlanır; MG996R, MG995'in geliştirilmiş sürümüdür. Yenilenen kontrol kartı ve dişliler sayesinde daha dar ölü bant, daha kararlı merkezleme ve biraz daha yüksek tork sunar. Yeni bir projede MG996R'ı tercih et; eski bir MG995'in yerine doğrudan takılabilir.

Tüm projeleri gör
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
Joystick İle Servo Kontrol
#60Orta
Premium

Joystick İle Servo Kontrol

Bir oyun kolu çubuğuyla iki motoru yönet, tıpkı bir güvenlik kamerasını çevirir gibi. Çubuğu sağa sola ittiğinde alttaki servo motor yavaşça döner, yukarı aşağı ittiğinde üstteki servo başını kaldırıp

4.7(42)
58
ESP32 Servo Motor (Potansiyometre Kontrolü)
#118Orta
Premium

ESP32 Servo Motor (Potansiyometre Kontrolü)

Bu projede potansiyometre ile SG90 servo motoru kontrol ediyoruz. Potansiyometreden okunan analog değeri 0-180 derece aralığına map'leyerek servo açısını ayarlıyoruz. ESP32Servo kütüphanesi, ESP32'nin çıkış verebilen uygun GPIO'larında servo sinyali üretir; bu projede GPIO 18 kullanılır. Bu, robotik kollar, kamera gimbal'ları ve otomatik kapı mekanizmaları için temel bir kontrol yöntemidir.

4.3(29)
42
ESP32 RFID Kapı Kilidi (RC522 + Servo + OLED + Buzzer + LED)
#137İleri
Premium

ESP32 RFID Kapı Kilidi (RC522 + Servo + OLED + Buzzer + LED)

ESP32 ile RC522 RFID modülü, SG90 servo motoru, SSD1306 OLED ekran, aktif buzzer ve 2 LED kullanarak akıllı bir kapı kilidi yapıyoruz. Kart okutulduğunda, UID kod içinde tanımlı yetkili kartlar listesiyle karşılaştırılır — yetkiliyse servo motoru döndürerek kilit açılır (yeşil LED + 2 kısa bip), 5 saniye sonra otomatik kilitler. Yetkisiz kartta kırmızı LED yanar, 3 hızlı bip ile uyarı verir ve OLED'de yakalanan UID gösterilir. Gerçek IoT güvenlik senaryosu için pratik ve öğretici — SPI protokolü

4.8(9)
15
Servo Çember Koreografisi — 32 Servo ile Animasyonlu Desenler
#102İleri
Premium

Servo Çember Koreografisi — 32 Servo ile Animasyonlu Desenler

Arduino Mega üzerinde çember şeklinde dizilmiş 32 servo motorla çalışan görsel bir animasyon projesi. Servolar tek bir dizi (array) içinde yönetiliyor ve Mega'nın 22–53 numaralı pinlerine bağlanarak dört farklı hareket dizisi sergiliyor: tüm servoların rastgele açılara gittiği kaotik bir titreşim, hepsinin aynı anda hareket ettiği senkron süpürme, çember etrafında akıcı şekilde dönen bir dalga ve son olarak sağa sola sallanan bir pusula ibresi. Dönen dalga efekti, her servonun aktif servoya olan

4.5(40)
62
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