3×2 Macropad: Kısayollarınızı Kişiselleştirin, Verimliliğinizi Zirveye Taşıyın
Merhaba, ben Nurbanu Karakaya. Bu blogda, kendi tasarladığım 3×2 macropad projesini detaylarıyla paylaşacağım. Amacım sizlere, kendi deneyimlerimi ve öğrendiklerimi paylaşarak faydalı, teknik ve uygulanabilir bir rehber sunmak.
Projeyi adım adım anlatarak, herkesin kolayca kendi macropad’ini yapabilmesini hedefliyorum. Umarım sizler için de ilham verici olur.
ATmega32U4 mikrodenetleyicisi tabanlı, 3 satır x 2 sütun tuş matrisi içeren kompakt bir macropad tasarımını kapsamaktadır. USB HID (Human Interface Device) protokolü ile bilgisayar tarafından klavye olarak algılanmakta ve ek sürücü gerektirmeden kullanılabilmektedir. Tuşlar programlanabilir olup, kullanıcı tarafından özel kısayol ve makro atamaları yapılabilmektedir. Bu sayede yazılım geliştirme, oyun, grafik tasarım gibi alanlarda iş akışının hızlandırılması ve verimliliğin artırılması hedeflenmiştir.
ÖZELLİKLER
- Mikrodenetleyici: ATmega32U4, USB HID protokolünü donanım seviyesinde destekleyen bir mikrodenetleyicidir. USB üzerinden klavye olarak tanınabilmesi için Arduino IDE’nin Keyboard kütüphanesi gibi uygun yazılım kullanılır. Bu sayede ek sürücü yüklemeye gerek kalmadan bilgisayar ile hızlı ve sorunsuz iletişim sağlanır.
- Tuş Düzeni: 3 satır × 2 sütun (toplam 6 adet) programlanabilir buton ile kompakt tasarım.
- Bağlantı: USB Type-C portu üzerinden hızlı ve güvenilir iletişim.
- Programlama: Arduino IDE kullanılarak kolayca özelleştirilebilir ve programlanabilir.
- Donanım: Projede yüzeye montaj (SMD) komponentler kullanılmıştır; ancak dilerseniz, daha kolay lehimleme için THT komponentlerle de üretim yapılabilir.
- Esneklik: Açık kaynak donanım ve yazılım yapısı sayesinde kullanıcılar kolayca değişiklik yapabilir ve geliştirebilir.
- Güç Yönetimi: 5V besleme ile stabil çalışma sağlar.
GEREKLİ MALZEMELER VE YAZILIMLAR
MALZEMELER
- 1x ATmega32U4 mikrodenetleyici
- 6x Cherry MX tarzı anahtarlar
- 3x Kondansatör: 1 µF/50V SMD_0603
- 3x Kondansatör: 22 pF/50V/ SMD_0603
- 2x Kondansatör: 10 µF/50V/ SMD_0603
- 1x Kondansatör: 0.1 µF/50V/ SMD_0603
- 3X Direnç: 330R/ SMD_0603
- 3X Direnç:22R/ SMD_0603
- 2X Direnç:10K/ SMD_0603
- 1X Direnç: 5K1/ SMD_0603
- 3XLed: Yeşil,Mavi,Kırmızı LED SMD_0603
- 1X Diyot: 1N5819 SMD_1206
- 1XTVS Diyot: USBLC6-2SC6/ SOT-23-6
- 1X Kristal: 16MHz
- 1XRegülatör: AMS1117-3.3/SOT-223
- Usb-C Yuvası
- Programlama için PinHeader
YAZILIMLAR
- Arduino IDE
- KiCad
- Arduino Keyboard kütüphanesi
KİCAD ÜZERİNDEN PCB VE ŞEMATİK ÇİZİMİ
Aşağıda, bu proje için tarafımca tasarlanmış PCB ve şema çizimlerini bulabilirsiniz. Tasarım KiCad yazılımı kullanılarak oluşturulmuştur ve şematik, PCB ve 3D yerleşim görüntüleri paylaşılmaktadır.

PCB tasarımı tamamlandığında, artık projeyi fiziksel olarak hayata geçirme aşamasına geçebiliriz. Öncelikle, PCB üzerine gerekli tüm komponentleri dikkatlice lehimledim. Lehimleme işlemi tamamlandıktan sonra, olası bağlantı hatalarını ve kısa devreleri tespit etmek amacıyla kısa devre testi yaptım. Bu kontrol, ilerleyen aşamalarda oluşabilecek arızaların önüne geçecektir. Testin ardından yazılım yükleme aşamasına geçtim.
YAZILIM YÜKLEME
Kartımı kullanılabilir hale getirmek için öncelikle bootloader atmam gerekiyor. Bootloader, mikrodenetleyicinin açılışında çalışan küçük bir yazılımdır. Bilgisayar ile mikrodenetleyici arasında haberleşmeyi sağlar ve asıl programın yüklenmesine imkân tanır. Eğer kartta bootloader bulunmazsa, Arduino IDE üzerinden doğrudan program yüklemek mümkün olmaz.
Bootloader atma işleminden önce, bu işi Arduino Uno ile yapacağım için Uno’yu programlayıcı (Arduino as ISP) olarak kullanıma hazır hale getirdim.
Arduino Uno’yu Programlayıcıya (Arduino as ISP) Dönüştürme Adımları
-
Arduino Uno’yu bilgisayara bağladım ve Arduino IDE’yi açtım.
-
Menüden Dosya > Örnekler > 11.ArduinoISP > ArduinoISP yolunu izleyerek örnek programı açtım.
-
Kart olarak Arduino Uno’yu, bağlantı portu olarak da Uno’nun bağlı olduğu COM portunu seçtim.
-
“Yükle” butonuna tıklayarak ArduinoISP yazılımını Uno’ya yükledim.
-
Yükleme tamamlandıktan sonra Uno artık başka bir kartın bootloader’ını atmak için programlayıcı olarak kullanılmaya hazır hale geldi.
Ardından SPI pinleri üzerinden Pro Micro ile bağlantı kurdum.
| Arduino Uno Pin | ATmega32U4 (Pro Micro) Pin | Açıklama |
| 10 (SS) | RESET | Reset pin bağlantısı |
| 11 (MOSI) | MOSI | Master Out Slave In |
| 12 (MISO) | MISO | Master In Slave Out |
| 13 (SCK) | SCK | Saat sinyali |
| 5V | VCC | Besleme (5V) |
| GND | GND | Toprak |
Arduino IDE’de Programmer olarak Arduino as ISP seçeneğini işaretledim ve “Bootloader Burn” komutunu çalıştırarak yüklemeyi tamamladım.
Bu işlem sonrasında kart, USB üzerinden bilgisayara bağlandığında USB HID özellikleriyle tanınabilir hale geldi ve program yüklemeye hazır oldu.
ARDUİNO KODU
#include "Keyboard.h"
// --- Buton Pin Tanımlamaları ---
const int buttonA_Pin = 6; // D6: Kopyala (Ctrl + C)
const int buttonB_Pin = 4; // D4: Kes (Ctrl + X)
const int buttonC_Pin = 8; // D8: Yapıştır (Ctrl + V)
const int buttonD_Pin = 10; // D10: Kaydet (Ctrl + S)
const int buttonE_Pin = A3; // A3: Geri Al (Ctrl + Z)
const int buttonF_Pin = 9; // D9: ALT + TAB
// --- Buton Durum Değişkenleri ---
int buttonA_CurrentState;
int buttonB_CurrentState;
int buttonC_CurrentState;
int buttonD_CurrentState;
int buttonE_CurrentState;
int buttonF_CurrentState;
int buttonA_LastState = HIGH;
int buttonB_LastState = HIGH;
int buttonC_LastState = HIGH;
int buttonD_LastState = HIGH;
int buttonE_LastState = HIGH;
int buttonF_LastState = HIGH;
unsigned long buttonA_LastDebounceTime = 0;
unsigned long buttonB_LastDebounceTime = 0;
unsigned long buttonC_LastDebounceTime = 0;
unsigned long buttonD_LastDebounceTime = 0;
unsigned long buttonE_LastDebounceTime = 0;
unsigned long buttonF_LastDebounceTime = 0;
// Debounce süresi
const unsigned long debounceDelay = 50;
void setup() {
pinMode(buttonA_Pin, INPUT_PULLUP);
pinMode(buttonB_Pin, INPUT_PULLUP);
pinMode(buttonC_Pin, INPUT_PULLUP);
pinMode(buttonD_Pin, INPUT_PULLUP);
pinMode(buttonE_Pin, INPUT_PULLUP);
pinMode(buttonF_Pin, INPUT_PULLUP);
Keyboard.begin();
Serial.begin(9600);
Serial.println("Kısayol Keypad Projesi Başlatıldı!");
Serial.println("----------------------------------");
Serial.println("D6 (A): Kopyala");
Serial.println("D4 (B): Kes");
Serial.println("D8 (C): Yapistir");
Serial.println("D10 (D): Kaydet");
Serial.println("A3 (E): Geri Al (Ctrl+Z)");
Serial.println("D9 (F): ALT + TAB");
Serial.println("----------------------------------");
}
void loop() {
int readingA = digitalRead(buttonA_Pin);
int readingB = digitalRead(buttonB_Pin);
int readingC = digitalRead(buttonC_Pin);
int readingD = digitalRead(buttonD_Pin);
int readingE = digitalRead(buttonE_Pin);
int readingF = digitalRead(buttonF_Pin);
// --- A ---
if (readingA != buttonA_LastState) buttonA_LastDebounceTime = millis();
if ((millis() - buttonA_LastDebounceTime) > debounceDelay) {
if (readingA != buttonA_CurrentState) {
buttonA_CurrentState = readingA;
if (buttonA_CurrentState == LOW) {
Keyboard.press(KEY_LEFT_CTRL);
Keyboard.press('c');
Serial.println("D6 (A) -> Kopyala (Ctrl+C)");
Keyboard.releaseAll();
}
}
}
buttonA_LastState = readingA;
// --- B ---
if (readingB != buttonB_LastState) buttonB_LastDebounceTime = millis();
if ((millis() - buttonB_LastDebounceTime) > debounceDelay) {
if (readingB != buttonB_CurrentState) {
buttonB_CurrentState = readingB;
if (buttonB_CurrentState == LOW) {
Keyboard.press(KEY_LEFT_CTRL);
Keyboard.press('x');
Serial.println("D4 (B) -> Kes (Ctrl+X)");
Keyboard.releaseAll();
}
}
}
buttonB_LastState = readingB;
// --- C ---
if (readingC != buttonC_LastState) buttonC_LastDebounceTime = millis();
if ((millis() - buttonC_LastDebounceTime) > debounceDelay) {
if (readingC != buttonC_CurrentState) {
buttonC_CurrentState = readingC;
if (buttonC_CurrentState == LOW) {
Keyboard.press(KEY_LEFT_CTRL);
Keyboard.press('v');
Serial.println("D8 (C) -> Yapistir (Ctrl+V)");
Keyboard.releaseAll();
}
}
}
buttonC_LastState = readingC;
// --- D ---
if (readingD != buttonD_LastState) buttonD_LastDebounceTime = millis();
if ((millis() - buttonD_LastDebounceTime) > debounceDelay) {
if (readingD != buttonD_CurrentState) {
buttonD_CurrentState = readingD;
if (buttonD_CurrentState == LOW) {
Keyboard.press(KEY_LEFT_CTRL);
Keyboard.press('s');
Serial.println("D10 (D) -> Kaydet (Ctrl+S)");
Keyboard.releaseAll();
}
}
}
buttonD_LastState = readingD;
// --- E ---
if (readingE != buttonE_LastState) buttonE_LastDebounceTime = millis();
if ((millis() - buttonE_LastDebounceTime) > debounceDelay) {
if (readingE != buttonE_CurrentState) {
buttonE_CurrentState = readingE;
if (buttonE_CurrentState == LOW) {
Keyboard.press(KEY_LEFT_CTRL);
Keyboard.press('z');
Serial.println("A3 (E) -> Geri Al (Ctrl+Z)");
Keyboard.release('z');
} else {
Keyboard.release(KEY_LEFT_CTRL);
Serial.println("A3 (E) -> Ctrl tusu birakildi.");
}
}
}
buttonE_LastState = readingE;
// --- F ---
if (readingF != buttonF_LastState) buttonF_LastDebounceTime = millis();
if ((millis() - buttonF_LastDebounceTime) > debounceDelay) {
if (readingF != buttonF_CurrentState) {
buttonF_CurrentState = readingF;
if (buttonF_CurrentState == LOW) {
Keyboard.press(KEY_LEFT_ALT);
Keyboard.press(KEY_TAB);
delay(100);
Keyboard.release(KEY_TAB);
Serial.println("D9 (F) -> ALT + TAB gönderildi!");
} else {
Keyboard.release(KEY_LEFT_ALT);
Serial.println("D9 (F) -> ALT tuşu bırakıldı.");
}
}
}
buttonF_LastState = readingF;
delay(1);
}
Bu projede, yaz stajımda yaptığım ATmega32U4 tabanlı, USB HID destekli 3X2 macropad tasarımımı ve uygulama sürecimi detaylarıyla paylaştım. Hem donanım hem yazılım tarafında karşılaştığım adımları aktararak, kendi macropad’inizi yapmanız için kapsamlı bir rehber oluşturmaya çalıştım.
Herkese kolaylıklar ve başarılar dilerim!