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.
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.
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 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
Ö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);
}
Birden fazla zincirli PCA9685 sürücüsüyle çok sayıda servoyu kontrol etmek için aşağıdaki örneği inceleyebilirsiniz.
#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, 400kHz, and 1000kHz
driver.resetDevices(); // Software resets all PCA9685 devices on Wire line
driver.init(B000000); // Address pins A5-A0 set to B000000
driver.setPWMFrequency(50); // Set frequency to 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);
}
Her bir sürücü için ayrı bir PCA9685 nesnesi oluşturmalı, her sürücünün adreslerini tanımlamalı ve frekansı 50Hz olarak ayarlamalıyız. Şimdi sadece setChannelPWM () ve pwmForAngle () işlevlerini kullanarak istediğimiz açıyı konumlandırabilmek için herhangi bir sürücüde herhangi bir servo ayarlayabiliriz.