Joystick; iki tane potansiyometreden oluşan ve iki eksende kontrol sağlayan mekanik modüldür. Arduino uygulamalarında kullanılan joysticklerde iki potansiyometre dışında bir de buton bulunur. Ancak bu buton, push butonların aksine, basılı iken 0, basılı değilken 1 sinyali gönderir, yani pull-up butondur. Joystick modülünün 5 bağlantı pini vardır ve bu pinlerin özellikleri aşağıdaki şekilde gösterilmiştir.
Malzemeler
- 1 adet Arduino
- 1 adet joystick
- 2 adet servo
- 1 adet 4,8V ile 6V arasında güç kaynağı
Bağlantı şeması
Bu çalışmada kullanılan iki servoya enerji vermek için harici bir güç kaynağı kullanılmıştır. Arduino kartının dijital pinlerinden çekilebilecek maksimum akımın 40mA olduğunu unutmamak gerekir. Eğer servolara Arduino kartının 5V çıkışından güç verilirse, her iki servonun zorlanması durumunda çekilen akım 40mA’ i geçebilir ve Arduino kartı zarar görebilir. Özellikle motor gibi mekanik bileşenlerin bulunduğu Arduino projelerine mutlaka harici güç kaynağı ile enerji verilmelidir.
Kaynak kod
#include <Servo.h> int joyX = A3; // Joystick x ekseninin bağlı olduğu analog pin int joyY = A4; // Joystick y ekseninin bağlı olduğu analog pin Servo S1; // x ekseninde hareket edecek olan S1 adlı servo nesnesi Servo S2; // y ekseninde hareket edecek olan S2 adlı servo nesnesi void setup() { S1.attach(5); // S1 adlı servoyu 5 numaralı pine bağla S2.attach(6); // S2 adlı servoyu 6 numaralı pine bağla } void loop(){ servoValue = analogRead(joyX); // A3 pininden gelen joystick x ekseni verisini oku servoValue = map(servoValue, 0, 1023, 0, 180); // Sonucu 0-180 aralığında haritala S1.write(servoValue); // 1.Servo milini servoValue derecesine çevir servoValue = analogRead(joyY); // A4 pininden gelen joystick y ekseni verisini oku servoValue = map(servoValue, 0, 1023, 0, 180); // Sonucu 0-180 aralığında haritala S2.write(servoValue); // 2.Servo milini servoValue derecesine çevir delay(15); // Bir sonraki değeri okumak için 15ms bekle }
Arduino üzerindeki 10 bit Analog-Digital Converter (Analog Dijital Dönüştürücü) analog pinlerden okunan veriyi 10 bit yani 210 adet veriye haritalar. Bu durumda okunan verinin en düşük değeri 0, en yüksek değeri 1023 olur. Joystick bir eksenin bir ucunda iken o eksende okunan veri 0, diğer ucuna hareket ettirildiğinde okunan veri 1023 olacaktır. Servolar 0 ile 180 derece aralığında hareket ettiği için, joystick ekseninden okunan 0-1023 aralığının servonun hareket edebildiği 0-180 aralığına haritalanması gerekir. Bunun için programda servoValue = map(servoValue, 0, 1023, 0, 180)
satırı kullanılmıştır. Map fonksiyonu; 1. parametre olarak aldığı değişkenin, 2. ve 3. parametre olarak aldığı en düşük ve en yüksek değerlerini, 4. ve 5. parametre olarak verilen en düşük ve en yüksek değerler aralığına haritalar. Map fonksiyonu; map(haritalanacak_değişken, giriş_en_düşük_değer, giriş_en_yüksek_değer, çıkış_en_düşük_değer, çıkış_en_yüksek_değer)
şeklinde kullanılır.