Servo Motor Nasıl Çalışır ve Arduino ile Servo Motor Kontrolü Nasıl Yapılır?

Servo Motor Nasıl Çalışır ve Arduino ile Servo Motor Kontrolü Nasıl Yapılır?

Servo motorların nasıl çalıştığını ve Arduino ve PCA9685 PWM sürücüsünü kullanarak servoların nasıl kontrol edileceğini öğreneceğiz.


 Birçok servo motor türü vardır ve bunların ana özelliği, millerinin konumunu hassas bir şekilde kontrol etme kabiliyetidir. Servo motor, hareketini ve son konumunu kontrol etmek için pozisyon geri bildirimini kullanan kapalıdöngü sistemidir. 

AC servo motor ve Endüstriyel tip servo motorlarda, konum geri besleme sensörü genellikle yüksek hassasiyetli bir kodlayıcıdır, daha küçük RC veya hobi servolarda ise konum sensörü genellikle basit bir potansiyometredir. Bu aygıtlar tarafından yakalanan gerçek konum, hedef konumla karşılaştırılıp hata algılayıcısına geri gönderilir. Ardından, hataya göre kontrolör, motorun gerçek konumunu hedef pozisyona uyacak şekilde düzeltir.

Hobi servoları RC oyuncak arabaları, botları, uçakları vb. kontrol etmek için kullanılan küçük boyutlu aktüatörlerdir. Aynı zamanda robotikte robotik prototip oluşturma, robot kollar, insansı robotlar gibi projelerde de kullanılırlar.

RC / Hobby Servo Motor Çalışma Prensibi



Bir hobi servo içinde dört ana bileşen, bir DC motor, bir dişli kutusu, bir potansiyometre ve bir kontrol devresi  vardır. DC motor yüksek hız ve düşük torktur, ancak dişli kutusu hızı 60 RPM'ye düşürür ve aynı zamanda torku  artırır.

Potansiyometre, son dişli veya çıkış şaftı üzerine takılır, böylece motor döner potansiyometrede dönerken, çıkış  milinin mutlak açısı ile ilgili bir voltaj üretir. Kontrol devresinde, bu potansiyometre voltajı, sinyal hattından gelen  voltaj ile karşılaştırılır. Gerekirse, kontrolör, iki sinyal sıfır farkına ulaşıncaya kadar motorun her iki yönde  dönmesini sağlayan entegre bir H Köprüsünü harekete geçirir.

 


 Bir servo motor, sinyal hattından bir dizi pulse gönderilerek kontrol edilir. Kontrol sinyalinin frekansı 50Hz olmalı ya da her 20 ms'de bir pulse oluşmalıdır. Pulse genişliği, servo açısal konumunu belirler ve bu tip servolar genellikle 180 derece dönebilir (fiziksel seyahat sınırlarına sahiptir).

 Genellikle 1 ms süreli pulse 0 derece, 1.5ms 90 dereceye ve 2 ms'den 180 dereceye karşılık gelir. Pulse minimum ve maksimum süresi bazen farklı markalarla değişebilir ve bunlar 0 derece için 0.5ms ve 180 derece pozisyon için 2.5ms olabilir.

Arduino ile Servo Motor Kontrolü Nasıl Yapılır?

Arduino kullanarak bir hobi servo kontrol etmek için hobi Servo Motor SG90 kullanacağım.  Servo motor fiyatları göz önüne alındığında sg90 en uygun fiyatlı servo motor olduğundan, basit projelerde, okul projelerinde, servo motor kontrolünü öğrenmek isteyenler tarafından en çok kullanılan servo motor çeşididir. Metal dişli daha güçlü bir servo motor arıyorsanız diğer servo motor çeşitlerimizi inceleyebilirsiniz.

SG90 Servo Motor Özellikleri

Çalışma gerilimi: 4.8 - 6.0 VDC

Zorlanma Torku @6V: 1.8 kg.cm

Hız @4.8V: 0.1 sn/60°

Dönüş açısı: 0-180°

Dişli kutusu: Plastik

Örnek Servo Motor Bağlantı Şeması  Servo motor arduino ile bağlantısını şekildeki gibi yapıyoruz. Kırmızı kablo 5V besleme kablosu, Siyah toprak  (GND) kablosu, Turuncu ise sinyal kablosudur. Turuncu kablo ile motorun açısını belirleyecek PWM sinyalleri  gönderilir. Arduino üzerinde (~) işareti bulunan pinler, PWM pinleridir. Turuncu kabloyu onlardan birine  bağlamanız gerekir.Arduino Servo Motor Kontrol KoduÖncelikle Servo.h kütüphanesini eklemeliyiz ve servo nesnesini tanımlayıp, attach() işlevi kullanarak servonun bağlı olduğu pini tanımlamalıyız. Sonra write () fonksiyonunu kullanarak servo pozisyonunu 0'dan 180 dereceye ayarlayabiliriz. Bu kütüphaneyle aynı anda 12 servo, Arduino Mega kullanarak 48 servoyu çalıştırabiliriz.


#include // Servo Motor Kütüphanesi

Servo motor1; // motor1 adında servo motor nesnesi tanımlandı

void setup() {

myservo.attach(9); // Servo motorun 9. Pine bağlandığı belirtildi

}

void loop() {

myservo.write(0); // Hangi açıya gitmesi isteniyorsa

delay(1000);

myservo.write(90);

delay(500);

myservo.write(135);

delay(500);

myservo.write(180);

delay(1500);

}

 

Arduino programındaki örnek servo kodlarını aşağıdaki adımları takip ederek bulabilirsiniz.

Dosya > Örnekler > Servo > Sweep

Dosya > Örnekler > Servo > Knob


Arduino ve PCA9685 PWM / Servo Sürücü

Arduino ile servoları kontrol etmenin başka bir yolu da PCA9685 servo sürücüsünü kullanmaktır. I2C veriyolunu kullanarak Arduino ile iletişim kuran 16 Kanallı 12 bitlik bir PWM ve servo sürücüdür. Bu sürücülerden 62 tanesine kadar tek bir I2C veriyolunda zincirleme yapabiliriz. Bu yüzden teorik olarak, Arduino kartından sadece iki I2C pini kullanarak 992 servoyu kontrol edebiliriz. 6 adres seçme pini, her ek sürücü için adreslenmiş farklı I2C'yi ayarlamak için kullanılır.

Arduino ve PCA9685 Servo Motor Sürücü Devresi 

Arduino koduna bir bakalım. Bu servo sürücüyü kontrol etmek PCA9685 kütüphanesini kullanacağız.

Önce kütüphaneleri dahil etmeli ve PCA9685 nesnesini tanımlamalıyız. Daha sonra Servo_Evaluator örneğini kullanarak, atım süresini veya sürücünün PWM çıkışını tanımlayın. Çıktıların 12 bit olduğunu veya 4096 adımlık bir çözünürlüğü olduğunu unutmayın. Bu nedenle, 0,5 ms'lik veya 0 derece konumdaki minimum pulse süresi, 102 basamağa ve 2.5 ms veya 180 derecelik maksimum pulse süresine 512 adıma karşılık gelecektir. Kurulum bölümünde I2C saat hızını tanımlamalı, sürücü adresini ayarlamalı ve frekansı 50Hz olarak ayarlamalıyız. Döngü bölümünde setChannelPWM () ve pwmForAngle () fonksiyonlarını kullanarak servoyu istenen açıya ayarlamanız yeterlidir.

 

#include

#include "PCA9685.h" // Kütüphaneyi ekleyin

PCA9685 driver;

PCA9685_ServoEvaluator pwmServo(102, 512); // (-90deg, +90deg)

// 2. Servo için örnek

// PCA9685_ServoEvaluator pwmServo2(102, 310, 505); // (0deg, 90deg, 180deg)

void setup() {

Wire.begin(); // Wire önce başlamalı

Wire.setClock(400000);

driver.resetDevices();

driver.init(B000000); // Address pins A5-A0 set to B000000

driver.setPWMFrequency(50); // Frekans 50Hz

}

void loop() {

driver.setChannelPWM(0, pwmServo.pwmForAngle(-90));

delay(1000);

driver.setChannelPWM(0, pwmServo.pwmForAngle(0));

delay(1000);

driver.setChannelPWM(0, pwmServo.pwmForAngle(90));

delay(1000);

}

PCA9685 Sürücüleri ile Çok Sayıda Servo Kontrol Etmek

Birden fazla zincirli PCA9685 sürücüsüyle çok sayıda servoyu kontrol etmek için aşağıdaki örneği inceleyebilirsiniz.

Arduino Örnek Kodu  

#include

#include "PCA9685.h"

PCA9685 driver;

PCA9685_ServoEvaluator pwmServo(102, 512); // (-90deg, +90deg)

// Second Servo

PCA9685_ServoEvaluator pwmServo2(128,324,526); // (0deg, 90deg, 180deg)

void setup() {

Wire.begin(); // Wire must be started first

Wire.setClock(400000); // Supported baud rates are 100kHz, 400kH

« Anasayfa