Bolu Beyi tarafından yazıldı Ekim - 22 - 2013 0 Yorum

1024px-3V_DC_Motor_Connected_to_an_Arduino_Uno_and_Motor_ShieldDC Motor hız kontrolünün sağlanması için Arduino’ya ait “Servo” kütüphanesi kullanılabilmektedir ve motorlar Servo değişkeni ile tanımlanır. Motorlara bağlı olan ESC’lerin 3 adet pini bulunmaktadır. Pinler:

  • Artı
  • Toprak
  • Sinyal

Toprak pini Arduino Mega üzerindeki GND pinlerine, sinyal ise bu örnekte 4, 5, 6 ve 7. Pinlere bağlanmıştır. Çok sayıda motor kullanıyorsanız, Arduino Mega üzerinde yeterli sayıda GND pini bulunmadığından breadboard kullanabilirsiniz.

Bağlantıların doğru bir şekilde yapılmasından sonra yazılım kısmında hangi motorların hangi pine bağlı olduğu belirtilir. Hız kontrolleri de bağlı olduğu pinler üzerinden gerçekleştirilmektedir.

İlk aşamada setup() fonksiyonu içerisinde ESC’lerin minimum ve maksimum değerleri belirtilerek pozisyon bilgileri ayarlanmıştır. Belirtilmediği takdirde motorların aynı anda dönmelerinde problem oluşabilmektedir. Bununla birlikte PID kontrolcü kullanıyorsanız, belirtilen aralığın dışına çıkabilir motor hızları. Bu sebeple “constrain” fonksiyonu ile önlem alabilirsiniz.

Örnek olarak paylaşacağım bu kod quadrotor dc motor kontrolüne aittir. PID kontrolcü ile birlikte kullanıldığından hız değeri sürekli değişiklik gösterip, On, Arka, Sag ve Sol değişkenlerine hız değeri aktarılmaktadır. İlerleyen zamanlarda PID kontrolcü kodlarını da paylaşacağım. Motor hızı ayarlarken bu örnekte “writeMicroseconds” kullanılmıştır. Alternatif olarak yaklaşık 20-120 aralığında hız değeri verebileceğiniz “write” komutunu da kullanabilirsiniz.

#include <Servo.h>
#define MOTOR_ON 4
#define MOTOR_ARKA 5
#define MOTOR_SOL 6
#define MOTOR_SAG 7typedef struct
{
int Pin;
int MinMax[2];
} ESCRecord;
ESCRecord MotorPozisyon[4];Servo Motor[4];
float OnArka, SagSol, On,Arka, Sag, Sol;
int hiz = 1550;

void setup()
{
Pozisyon();
MotorAyarla();
Pozisyon();
}

void loop()
{
MotorGuncelle();
}

void Pozisyon()
{
MotorPozisyon[0] = (ESCRecord) {MOTOR_ON,  {1000, 2000}};
MotorPozisyon[1] = (ESCRecord) {MOTOR_ARKA,{1000, 2000}};
MotorPozisyon[2] = (ESCRecord) {MOTOR_SOL, {1000, 2000}};
MotorPozisyon[3] = (ESCRecord) {MOTOR_SAG, {1000, 2000}};
}

void MotorAyarla()
{
for(int esc = 0; esc < 4; esc++)
{
Motor[esc].attach(MotorPozisyon[esc].Pin, MotorPozisyon[esc].MinMax[0], MotorPozisyon[esc].MinMax[1]);
Motor[esc].writeMicroseconds(2000);
delay(1000);
Motor[esc].writeMicroseconds(1000);
delay(15);
}
}

void MotorGuncelle()
{
On = constrain(On,1000,2000);
Arka = constrain(Arka,1000,2000);
Sag = constrain(Sag,1000,2000);
Sol = constrain(Sol,1000,2000);

Motor[0].writeMicroseconds(On);
Motor[1].writeMicroseconds(Arka);
Motor[2].writeMicroseconds(Sol);
Motor[3].writeMicroseconds(Sag);
}


Time limit is exhausted. Please reload CAPTCHA.