back to top

Arduino Dersleri #12: Arduino Joystick ile Servo Motor Kontrolü

Merhaba arkadaşlar !

Arduino dersleri serimizin her bir adımında daha eğlenceli projeler yapıyoruz. Bugünkü yazımızda sizlere arduino ile servo motor kullanımından bahsedeceğiz.

Joystick kullanarak bu projeyi yapacağız. Bu sayede hem joystick kullanmayı hem de servo motor kontrol etmeyi öğreneceğiz.

Bir önceki yazımızda ses sensörü modülü ve DC motor kullanmıştık >>> Arduino ve Ses Sensörü Modülü ile Motor Kontrolü

Gerekli Malzemeler:

Arduino ile Joystick Kullanımı

Joystick, iki eksende hareket etmeyi sağlayan iki potansiyometre bulunduran ve dikey hareketinde ise buton görevi gören bir modüldür. Joystick’leri genellikle oyun konsollarında ve uzaktan kumandalı araçlarda görürüz.

Arduino ile uyumlu joystick modülleri ile birçok farklı proje yapılma imkanı vardır. Motor kontrolü, LED kontrolü, robotik kontroller gibi birçok farklı uygulama görmeniz mümkündür.

Arduino Joystick shield butonu, diğer butonların tersine çalışan bir karakteristiğe sahiptir. Yani bir pullup butondur. Butona basmadığımızda 1, bastığımızda ise 0 değerini okuruz.

Aşağıda Joystick modülünün pinout yapısı bulunmaktadır. Dikey, yatay ve buton hareketlerinin hepsi için ayrı birer data pini bulunmaktadır. Modülün çalışabilmesi için ise 5V ve GND beslemesinin yapılması gerekmektedir.

Arduino ile Servo Motor Kullanımı

Servo motorlar sayesinde çok hassas pozisyon kontrolü yapmak mümkündür.

Çoğunlukla çalışma açıları 0-180 derece arasındadır. Arduino’da servo motor kontrol kodları bulunmaktadır. Bunlar için Arduino’da Dosya>Örnekler>Servo>Sweep ve Dosya>Örnekler>Servo>Knob komutlarını takip etmeniz gerekecektir.

Servo Motor İçin Neden PWM Pinleri Kullanmalıyım?

Arduino’da Servo Motorlar PWM sinyali ile çalışırlar. PWM’in Türkçe açılımı Sinyal Genişlik Modülasyonudur ve bu sinyaller mikrokontrolcülerden veya uzaktan kumandalardan sağlanırlar.

PWM pinleri ile servonun tam dönüş açısı ve dönüş süresi kontrol edilebilmektedir.

Arduino PWM Pinleri: 3, 5, 6, 9, 10, 11

Servo motorlar, çalışma prensipleri ve PWM pinleri hakkında detaylı bilgiye buradan ulaşabilirsiniz.

Hadi devremizi kuralım !

Arduino Joystick ile Servo Motor Kontrolü

Gerekli Joystick kodlarını yazalım !

#include <Servo.h>
Servo motor;
int deger;
int derece;
void setup() {
  motor.attach(3);
}
void loop() {
  deger = analogRead(A0);
  derece = map(deger, 0, 1023, 0, 180);
  motor.write(derece);
}

Son Çıkan Yazılar

19 YORUMLAR

  1. İyi günler, ben joystick ile iki eksende ayrı servo motorlar döndürmek istiyorum.
    Kodlarım ise şöyle;
    #include

    Servo motor;
    Servo motor1;

    #define A0 yPin
    #define A1 xPin
    int xderece;
    int xdeger;
    int ydeger;
    int yderece;
    int zaman = 0;
    int xPin;
    int yPin;

    void setup() {
    motor.attach(3);
    motor1.attach(5);
    pinMode(xPin, INPUT);
    pinMode(yPin, INPUT);
    }

    void loop() {

    ydeger = analogRead(yPin);
    xdeger = analogRead(xPin);

    xderece = map (xdeger, 0,1023, 0,180);

    yderece = map(ydeger, 0,1023, 0,180);

    motor.write(yderece);
    motor1.write(xderece);

    }

    Yardım ederseniz sevinirim . Teşekkürler.

    • #include // Servo kütüphanesi

      Servo myservo1; // 2 adet servo motor kullanıldı
      Servo myservo2;

      int pozisyon_x=0; // Joystick lerden okunan analog değerler bu değişkenlerde tutulacak
      int pozisyon_y=0;
      const int x_pin=0; // Joystick in x ve y eksenleri 0 ve 1. pinlere bağlanacak
      const int y_pin=1;

      void setup() {
      myservo1.attach(9); // Servolar arduinonun 9 ve 10. pinlerine bağlanacak
      myservo2.attach(10);
      Serial.begin(9600); // Seri haberleşme başladı
      }

      void loop() {
      pozisyon_x = analogRead(x_pin); //0. pinden analog veri okundu
      pozisyon_x = map(pozisyon_x, 0, 1023, 0, 180); //0-1023 değeri 0-180 değerine çekildi
      myservo1.write(pozisyon_x); // Elde edilen 0-180 arası açı değeri servoya gönderildi
      delay(15); // Servonun uygun konuma gelmesi için kısa bir gecikme

      pozisyon_y = analogRead(y_pin); //1. pinden analog veri okundu
      pozisyon_y = map(pozisyon_y, 0, 1023, 0, 180); //0-1023 değeri 0-180 değerine çekildi
      myservo2.write(pozisyon_y); // Elde edilen 0-180 arası açı değeri servoya gönderildi
      delay(15); // Servonun uygun konuma gelmesi için kısa bir gecikme

      Serial.print(“Servo 1: “);
      Serial.print(analogRead(pozisyon_x)); // Servoların kaçar derece döndükleri seri monitörde görüntülenecek
      Serial.print(“\n”); // Alt satır
      Serial.print(“Servo 2: “);
      Serial.print(analogRead(pozisyon_x));
      Serial.print(“\n”);
      delay(1000);

      }

    • #include
      Servo motor;
      Servo motor1;
      #define yPin A0
      #define xPin A1
      void setup() {
      // put your setup code here, to run once:
      motor.attach(3);
      motor1.attach(5);
      }

      void loop() {
      // put your main code here, to run repeatedly:
      int ydeger = analogRead(yPin);
      int xdeger = analogRead(xPin);
      int xderece = map(xdeger,0,1023,0,180);
      int yderece = map(ydeger,0,1023,0,180);
      motor.write(yderece);
      motor1.write(xderece);

      Bu Kodu Kendim Denedim Çalışıyor İyi Günler

  2. Arduino:1.8.10 (Windows 8.1), Kart:”Arduino/Genuino Uno”

    Taslak adının değiştirilmesi gerekiyordu.
    Eskiz isimleri bir harf veya rakamla başlamalı, ardından harf
    sayılar, kısa çizgiler, noktalar ve alt çizgiler izlemeli. Maksimum uzunluk 63 karakterdir.
    joystick_servo:1:10: error: #include expects “FILENAME” or

    #include

    ^

    exit status 1
    #include expects “FILENAME” or

    This report would have more information with
    “Show verbose output during compilation”
    option enabled in File -> Preferences.
    hocam bu hatyı veriyor yardım edermisiniz

  3. BEN BİR POT İKİ BUTON İLE SERVO POZİSYON KONTROLÜ YAPMAK İSTİYORUM ÖRNEK VEREREK ANLATMAYA ÇALIŞAYIM POT DEĞERİ DİYELİMKİ 400 DE BIRAKTIM BUTON İLE TERS YÖNE BASILI TUTARAK 900 E GETİRDİM BIRAKTIM DURDU BEN TEKRAR POTU OYNATTIĞIMDA 400 DEĞERİNE DÖNÜP O POZİSYONDAN DEVAM ETMESİNİ İSTİYORUM AŞAĞIDAKİ KOD YANLIŞ BÜYÜK İHTİMAL BANA BU KONUDA YARDIMCI OLURSANIZ ÇOK SEVİNİRİM

    #include
    int giris_pot =A0;
    int giris_butony =2;
    int giris_butond =3;

    int pot ;
    int potsnce;
    int aci_deger ;

    Servo myservo;
    void setup() {
    myservo.attach(4);
    pinMode(giris_butony,INPUT);
    pinMode(giris_butond,INPUT);

    servo.attach(4);

    }

    void loop() {
    pot = analogRead(giris_pot);

    if(potonce !=pot){
    aci_deger=map(pot,0,1023,0,180);
    potonce = pot;
    }

    else {
    if(digitalRead(giris_butony) == HIGH)
    {aci_deger = aci_deger+1 ; }
    if(digitalRead(giris_butond) == HIGH)
    {aci_deger = aci_deger-1 ; }

    }
    servo.write(aci_deger;

    }

CEVAP VER

Lütfen yorumunuzu giriniz!
Lütfen isminizi buraya giriniz