Joystick ile Pan-Tilt Kamera Başlığı
Başlangıç40 dkİki servoyla kurulan bir kamera başlığı: alttaki servo kamerayı sağa sola, üstteki yukarı aşağı çevirir, sen de joystick'le yönetirsin. Kolu ne kadar itersen başlık o kadar hızlı döner, bırakınca olduğu yerde kalır; joystick'e basınca iki servo yavaşça ortaya döner. Servolar ayrı bir 3'lü AA pil yuvasından beslenir, GND'ler birleştirilir. Analog bir kolu ölü bölgeyle hıza çevirmeyi, servoları millis() ile düzgün ve sınırlar içinde hareket ettirmeyi ve birden fazla servoyu ayrı güçle beslemeyi öğretir. Servo kütüphanesi Arduino IDE ile gelir, ayrıca kitaplık kurulmaz.
Uygulamada adım adım yapGerekli malzemeler
1 × Arduino Uno R3
1 × Breadboard 830 Pin (MB-102)
1 × XY Joystick Modülü
2 × SG90 Mikro Servo Motor
1 × 3'lü AA Pil Yuvası (4,5V)
3 × AA Alkalin Kalem Pil (1,5V)
14 × Jumper Kablo - Erkek/Erkek
Bağlantı adımları
- 1
Arduino'nun güç kablolarını bağla

Kırmızı erkek-erkek kabloyla Arduino'nun güç başlığındaki 5V pinini breadboard'un alttaki kırmızı çizgili (+) sırasına, siyah kabloyla aynı başlıktaki GND pinini alttaki mavi çizgili (−) sıraya bağla. Alttaki sıralar joystick'i besler; servolar ayrı bir pilden beslenecek.
- Arduino GND → alttaki mavi çizgili (−) sıra (siyah kablo)
- Arduino 5V → alttaki kırmızı çizgili (+) sıra (kırmızı kablo)
- 2
Joystick'i tak ve bağla

Joystick modülünü, beş pini breadboard'un alt yarısında E sırasına gelecek şekilde tak: GND 4., +5V 5., VRx 6., VRy 7., SW 8. sütuna gelsin; pinleri yana bakan modül breadboard'da dik durur. Kısa siyah kabloyla 4. sütunu alttaki (−) sıraya, kısa kırmızı kabloyla 5. sütunu alttaki (+) sıraya bağla. Turuncu kabloyla Arduino'nun A2 pinini 6. sütuna (VRx, sağ-sol), mor kabloyla A1'i 7. sütuna (VRy, yukarı-aşağı), beyaz kabloyla A0'ı 8. sütuna (SW, düğme) bağla (JOY_X, JOY_Y, JOY_BUTTON). Düğmenin direncini kod Arduino'nun içindeki pull-up ile sağlar.
- joystick GND → 4. sütun, alt yarı
- joystick +5V → 5. sütun, alt yarı
- joystick VRx → 6. sütun, alt yarı
- joystick VRy → 7. sütun, alt yarı
- joystick SW → 8. sütun, alt yarı
- 4. sütun, alt yarı → alttaki mavi çizgili (−) sıra (siyah kablo)
- 5. sütun, alt yarı → alttaki kırmızı çizgili (+) sıra (kırmızı kablo)
- Arduino A2 → 6. sütun, alt yarı (turuncu kablo)
- Arduino A1 → 7. sütun, alt yarı (mor kablo)
- Arduino A0 → 8. sütun, alt yarı (beyaz kablo)
- 3
Pil yuvasını bağla, GND'leri birleştir

Pil yuvasına 3 AA pil tak, anahtarını şimdilik kapalı (OFF) tut. Kırmızı kablosunu breadboard'un üstteki kırmızı çizgili (+) sırasına, siyah kablosunu üstteki mavi çizgili (−) sırasına tak. Breadboard'un sağ ucunda siyah bir kabloyla alttaki (−) sırayı üstteki (−) sıraya bağla: Arduino ile pilin GND'si birleşmezse servolar Arduino'nun sinyalini anlayamaz. İki (+) sırayı ise birleştirme: üstteki pilin 4.5V'u, alttaki Arduino'nun 5V'u. Servoları ayrı pil besler, çünkü iki servo aynı anda dönerken çektikleri akım Arduino'nun 5V'unu düşürüp kartı yeniden başlatabilir.
- pil yuvası + ucu → üstteki kırmızı çizgili (+) sıra (kırmızı kablo)
- pil yuvası − ucu → üstteki mavi çizgili (−) sıra (siyah kablo)
- alttaki mavi çizgili (−) sıra → üstteki mavi çizgili (−) sıra (siyah kablo)
- 4
Sağ-sol servosunu bağla

Servonun üç telli fişine üç erkek-erkek kablo tak. Turuncu (sinyal) teli Arduino'nun 10 numaralı pinine, kırmızı (+) teli üstteki kırmızı çizgili (+) sıraya, kahverengi (−) teli üstteki mavi çizgili (−) sıraya bağla (PAN_PIN 10). Bu servo kamerayı sağa sola çevirir: başlığın altına, mili yukarı bakacak şekilde yerleştir.
- Arduino pin 10 → sağ-sol servosu sinyal ucu (turuncu kablo)
- sağ-sol servosu + ucu → üstteki kırmızı çizgili (+) sıra (kırmızı kablo)
- sağ-sol servosu − ucu → üstteki mavi çizgili (−) sıra (kahverengi kablo)
- 5
Yukarı-aşağı servosunu bağla

Servonun üç telli fişine üç erkek-erkek kablo tak. Turuncu (sinyal) teli Arduino'nun 9 numaralı pinine, kırmızı (+) teli üstteki kırmızı çizgili (+) sıraya, kahverengi (−) teli üstteki mavi çizgili (−) sıraya bağla (TILT_PIN 9). Bu servo kamerayı yukarı aşağı çevirir: alttaki servonun koluna yan yatmış olarak sabitle (pan-tilt braketi, sıcak silikon ya da sağlam bir kartonla). Hepsini bağladıktan sonra pil yuvasının anahtarını aç (ON).
- Arduino pin 9 → yukarı-aşağı servosu sinyal ucu (turuncu kablo)
- yukarı-aşağı servosu + ucu → üstteki kırmızı çizgili (+) sıra (kırmızı kablo)
- yukarı-aşağı servosu − ucu → üstteki mavi çizgili (−) sıra (kahverengi kablo)
Arduino kodu
// Servo kütüphanesi Arduino IDE ile gelir
#include <Servo.h>
// Joystick: iki eksen ve basma düğmesi
const int JOY_X = A2;
const int JOY_Y = A1;
const int JOY_BUTTON = A0;
// Servoların turuncu (sinyal) kabloları
const int PAN_PIN = 10;
const int TILT_PIN = 9;
// Açı sınırları: başlık bir yere
// takılıyor ya da zorlanıyorsa daralt
const int PAN_MIN = 0;
const int PAN_MAX = 180;
const int TILT_MIN = 20;
const int TILT_MAX = 160;
const int CENTER = 90;
// Kol ortadayken bu kadar oynama sayılmaz
const int DEAD_ZONE = 60;
// En hızlı dönüş (derece/saniye)
const float MAX_SPEED = 90.0;
// Kolu ittiğin yönün tersine dönüyorsa
// ilgili ayarı true yap
const bool INVERT_PAN = false;
const bool INVERT_TILT = false;
Servo pan;
Servo tilt;
float panAngle = CENTER;
float tiltAngle = CENTER;
// Kol bırakılmışken okunan orta değerler
int centerX = 512;
int centerY = 512;
// Düğmeye basınca ortaya dönüş sürer
bool homing = false;
unsigned long lastStep = 0;
unsigned long lastPrint = 0;
int shownPan = -1;
int shownTilt = -1;
int printedPan = -1;
int printedTilt = -1;
// Kolun ortadan sapması: -1 ile 1 arası,
// ölü bölgede 0
float stick(int pin, int center) {
int offset = analogRead(pin) - center;
if (abs(offset) <= DEAD_ZONE) return 0;
float range = 512 - DEAD_ZONE;
float amount = (abs(offset) - DEAD_ZONE) / range;
if (amount > 1) amount = 1;
return offset > 0 ? amount : -amount;
}
// Açıyı hedefe en çok "step" derece
// yaklaştırır
float approach(float angle, float target, float step) {
if (angle < target) return min(angle + step, target);
return max(angle - step, target);
}
void setup() {
Serial.begin(9600);
pinMode(JOY_BUTTON, INPUT_PULLUP);
// Kolun ortası her modülde biraz
// farklı: açılışta (kola dokunmadan)
// ölçülür
long sumX = 0;
long sumY = 0;
for (int i = 0; i < 16; i++) {
sumX += analogRead(JOY_X);
sumY += analogRead(JOY_Y);
delay(5);
}
centerX = sumX / 16;
centerY = sumY / 16;
// Kol tutuluyorsa ölçüm yanlış olur
if (abs(centerX - 512) > 150) centerX = 512;
if (abs(centerY - 512) > 150) centerY = 512;
pan.attach(PAN_PIN);
tilt.attach(TILT_PIN);
pan.write(CENTER);
tilt.write(CENTER);
Serial.println("Hazır: kolu it, düğmeye basınca ortaya döner.");
lastStep = millis();
}
void loop() {
unsigned long now = millis();
// Saniyede 50 adım
if (now - lastStep < 20) return;
float seconds = (now - lastStep) / 1000.0;
lastStep = now;
float x = stick(JOY_X, centerX);
float y = stick(JOY_Y, centerY);
if (INVERT_PAN) x = -x;
if (INVERT_TILT) y = -y;
if (digitalRead(JOY_BUTTON) == LOW) homing = true;
// Kol itilince ortaya dönüş bırakılır
if (x != 0 || y != 0) homing = false;
float step = MAX_SPEED * seconds;
if (homing) {
panAngle = approach(panAngle, CENTER, step);
tiltAngle = approach(tiltAngle, CENTER, step);
if (panAngle == CENTER && tiltAngle == CENTER) homing = false;
} else {
// Kol ne kadar itilirse o kadar hızlı
panAngle = constrain(panAngle + x * step, PAN_MIN, PAN_MAX);
tiltAngle = constrain(tiltAngle + y * step, TILT_MIN, TILT_MAX);
}
// Servoya yalnız açı değişince yazılır
int panNow = round(panAngle);
int tiltNow = round(tiltAngle);
if (panNow != shownPan || tiltNow != shownTilt) {
pan.write(panNow);
tilt.write(tiltNow);
shownPan = panNow;
shownTilt = tiltNow;
}
// Açılar en çok 0.2 sn'de bir yazılır;
// son açı da mutlaka yazılır
bool changed = shownPan != printedPan || shownTilt != printedTilt;
if (changed && now - lastPrint >= 200) {
lastPrint = now;
printedPan = shownPan;
printedTilt = shownTilt;
Serial.print("Sağ-sol: ");
Serial.print(shownPan);
Serial.print("° Yukarı-aşağı: ");
Serial.print(shownTilt);
Serial.println("°");
}
}
Seri Monitörde göreceğin
Hazır: kolu it, düğmeye basınca ortaya döner. Sağ-sol: 90° Yukarı-aşağı: 90° Sağ-sol: 108° Yukarı-aşağı: 90° Sağ-sol: 126° Yukarı-aşağı: 90° Sağ-sol: 126° Yukarı-aşağı: 72°
Sonuç
Kodu yükleyince iki servo ortaya (90°) gelir. Joystick'i sağa ya da sola it: alttaki servo o yöne döner; ne kadar itersen o kadar hızlı döner, en hızlı saniyede 90°. Kolu bırakınca servo olduğu yerde kalır. Yukarı ya da aşağı itince üstteki servo döner; zorlanmasın diye 20° ile 160° arasında durur. Joystick'e basınca iki servo yavaşça ortaya döner; bu sırada kolu itersen dönüş bırakılır. Açılar Seri Monitöre de yazılır. Servolar kolu ittiğin yönün tersine dönüyorsa koddaki INVERT_PAN ya da INVERT_TILT'i true yap. Kod başlarken kola dokunma: Arduino açılışta kolun ortasını ölçer. Servolar hiç kıpırdamıyorsa pil yuvasının anahtarının açık (ON) olduğuna ve iki (−) sıranın kabloyla birleştiğine bak; titriyor ya da yavaşlıyorsa pilleri yenile.
Uygulamada her bağlantıyı tek tek işaretle, envanterindeki parçalarla eşleştir ve kaldığın yerden devam et.
Uygulamada adım adım yap