Isi kandungan:

Pengawal Pintasan Genggam (untuk Photoshop + Lagi) [Arduino]: 4 Langkah
Pengawal Pintasan Genggam (untuk Photoshop + Lagi) [Arduino]: 4 Langkah

Video: Pengawal Pintasan Genggam (untuk Photoshop + Lagi) [Arduino]: 4 Langkah

Video: Pengawal Pintasan Genggam (untuk Photoshop + Lagi) [Arduino]: 4 Langkah
Video: Pengawal Rahasia 2024, Julai
Anonim
Pengawal Pintasan Genggam (untuk Photoshop + Lagi) [Arduino]
Pengawal Pintasan Genggam (untuk Photoshop + Lagi) [Arduino]

Kali terakhir saya membuat pad kawalan kecil untuk digunakan di Photoshop. Ia mengagumkan, dan saya masih menggunakannya! Tetapi ia juga agak terhad, dengan hanya lima butang dan dail ukuran dan kelegapan yang berguna. Saya masih banyak mencari papan kekunci …

Oleh itu, saya mula mengusahakan lelaran pad kawalan seterusnya, satu dengan lebih banyak butang dan fungsi. Satu pad kawalan untuk mengatur semuanya.

Ini bukan alat kawalan itu. TETAPI dengan cara mungkin lebih baik.

Bagaimana jika anda dapat memiliki banyak jalan pintas, tetapi dalam pakej super selesa dan ringan, anda boleh memegang dengan tangan percuma semasa anda menarik tanpa gangguan? … ok, cukup dengan infomersial.

Pengawal ini diprogramkan dengan cara, dengan hanya 4 butang, ia dapat dipetakan hingga 32 jalan pintas yang mungkin! Butang ke-5 tambahan ada untuk membolehkan saya menggunakan kekunci pengubah dalam mana-mana kombinasi, yang berguna untuk banyak program (adakah anda pernah mencuba kombo Alt-RMB di PS? Sekiranya belum, sila lakukan. Ini adalah penyelamat). Saya menerangkan sistemnya di kemudian hari.

Untuk membuat semua ini, anda memerlukan:

  • 1 Mikrokontroler (Saya menggunakan Adafruit ItsyBitsy 32u4 tetapi mana-mana yang perlu dilakukan selagi ia mempunyai cip atmega32u4)
  • 1 penyesuai mikro-USB (data, bukan hanya kuasa)
  • 5 butang tekan (saya menggunakan yang lembut, seperti ini)
  • Perintang Ohk 10k (1 setiap butang)
  • Kawat, papan roti, bahan pateri, dll.
  • Sesuatu untuk dibuat casing dengan (pencetak 3D, dll.)

Ini adalah projek Arduino peringkat pertengahan, dan saya cadangkan melihat tutorial masa lalu saya untuk lebih memahami apa yang sedang berlaku, kerana ini adalah pengulangan dari perkara yang saya jelaskan di sana.

Ok, mari kita mulakan!

Langkah 1: Merancang

Perancangan
Perancangan

Ini adalah skema asas yang saya buat dari pengawal. Litar ini sangat mudah apabila anda membandingkannya dengan projek saya sebelumnya! Tetapi kami akan dapat melakukan lebih banyak lagi dengan beberapa butang yang ada, dengan kekuatan tekan gabungan!

Idea di sebalik skema kawalan adalah bahawa setiap butang boleh bebas, ditekan dan dilepaskan, atau ditekan dan tahan. Menekan dan melepaskan adalah apa yang sebenarnya akan mengaktifkan jalan pintas, sambil menekan butang akan memberi kita akses ke jalan pintas yang berbeza. Oleh itu, jika anda hanya menekan butang A, anda akan mengaktifkan pintasan A, tetapi jika anda menahan B ketika menekan A, anda akan mendapat jalan pintas yang berbeza. Anda boleh menahan hingga 3 butang sekaligus sambil menekan, jadi apabila anda menggunakan beberapa kombinasi asas, anda akan melihat berapa banyak kombinasi yang mungkin dilakukan dengan sistem ini!

Butang kelima tambahan terasa seperti penambahan semula jadi, memandangkan bentuk genggam yang saya buat. Saya memutuskan untuk menggunakannya untuk mengakses kunci pengubah di photoshop. Cara kerjanya sedikit berbeza dari butang lain: setiap kali butang ibu jari dipegang, hanya pengubah yang akan digunakan. Ini akan diaktifkan apabila dipegang dan beberapa boleh ditekan. Jadi jika butang A adalah Shift, dan butang B adalah Ctrl, ketika anda menekan A dan B, itu seperti menekan kedua Shift dan Ctrl, tetapi hanya selama butang ibu jari dipegang!

Cengkerang direka untuk ergonomik dan ambidextrous. Saya sangat berhati-hati untuk membuatnya pas dengan selesa sehingga menggunakan jari kelingking tidak terlalu meletihkan, dan ia juga sesuai untuk tangan yang lebih besar dari tangan saya.

Langkah 2: Prototaip + Kod

Prototaip + Kod
Prototaip + Kod

Amalan baik untuk menguji butang di papan roti. Cukup mudah, sambungkan butang dan perintang seperti yang ditunjukkan. Anda boleh mengujinya dengan kod di sini (alternatif pautan pastebin):

#sertakan

// gunakan pilihan vthisv untuk MacOS:

// char ctrlKey = KEY_LEFT_GUI;

// gunakan pilihan vthisv untuk Windows dan Linux:

char ctrlKey = KEY_LEFT_CTRL; char shiftKey = KEY_LEFT_SHIFT; char altKey = KEY_LEFT_ALT;

// Kekunci Fungsi di sini

char Fn1Key = KEY_F2; char Fn2Key = KEY_F3; char Fn3Key = KEY_F4; char Fn4Key = KEY_F5;

const int pin = {9, 10, 11, 12, 13}; // susunan semua pin butang

// Kepekaan

const int THRESH_0 = 10; const int THRESH_1 = 20; const int THRESH_2 = 25; const int THRESH_3 = 50; const int THRESH_4 = 100; const int THRESH_5 = 200;

const int BUTTON_NUM = 5;

// Bekukan bingkai

const int DELAY = 0;

enum Negeri {dibebaskan, ditekan, ditahan, dibebaskan};

butang struktur {

pin int; Negeri menyatakan; int timeHeld; }; // ibu jari, indeks, pertengahan, cincin, sedikit;

butang butang [BUTTON_NUM] = {};

butang initButton (int p) {

butang b; pinMode (p, INPUT); b.pin = p; b.state = Negeri:: dibebaskan; b.timeHeld = 0; pulangan b; }

batal persediaan () {

// letakkan kod persediaan anda di sini, untuk dijalankan sekali: Serial.begin (9600); Papan kekunci.begin ();

sementara (! bersiri) {};

// Butang untuk (int i = 0; i <(BUTTON_NUM); ++ i) {Serial.print ("set button"); Cetakan bersiri (i); Serial.print ("di pin:"); Serial.println (pin ); //buttons.pin = 1; butang = initButton (pin ); Serial.println (butang .pin); }

}

bool readButton (int pin) {

// butang semak dan tolak jika (digitalRead (pin) == TINGGI) {kelewatan (10); if (digitalRead (pin) == TINGGI) {return true; }} kembali palsu; }

int pintobin (int pin) {

jika (pin == pin [0]) pulangkan 1; jika (pin == pin [1]) pulangkan 10; jika (pin == pin [2]) pulangkan 100; jika (pin == pin [3]) pulangkan 1000; jika (pin == pin [4]) pulangkan 10000; } butang butangStateUpdate (butang b) {

tekan bool = readButton (b.pin);

tukar (b.state) {case States:: dibebaskan: b.timeHeld = 0; jika (tekan) b.state = State:: ditekan; rehat; kes ditekan: b.timeHeld + = 1; if (tekan) {if (b.timeHeld> (THRESH_1 / (1 + DELAY))) {b.state = Negeri:: ditahan; }} lain {// jika (b.timeHeld

int getButtonStateCode (butang b)

{return b.state * pintobin (b.pin); }

int getCodeByButton (int code, int index) {

int r1, r2, r3, r4, r5; int opStep = BUTTON_NUM - (1 + indeks);

// operasi pertama

jika (opStep == 0) kembalikan kod / 10000; r1 = kod% 10000;

jika (opStep == 1)

pulangan r1 / 1000; r2 = r1% 1000; jika (opStep == 2) pulangkan r2 / 100; r3 = r2% 100; jika (opStep == 3) pulangkan r3 / 10; r4 = r3% 10; jika (opStep == 4) pulangkan r4 / 1; r5 = r4% 1; }

batal lengkap Tekan (int pin) {

// Serial.print ("input"); // Serial.println (pin); kelewatan (THRESH_3); Papan Kekunci.releaseAll (); }

void doAction (int code) {

// Pengubah jika (getCodeByButton (code, 0) == 2) {// Serial.println ("--- pengubah ----"); if (getCodeByButton (kod, 1)> 0) {Keyboard.press (altKey); // Serial.println ("------- alt ---------"); } Keyboard.release yang lain (altKey); jika (getCodeByButton (kod, 2)> 0) {Keyboard.press (ctrlKey); // Serial.println ("-------- ctrl ----------"); } Keyboard.release yang lain (ctrlKey); jika (getCodeByButton (kod, 3)> 0) {Keyboard.press (''); } Keyboard.release yang lain (''); if (getCodeByButton (kod, 4)> 0) {Keyboard.press (shiftKey); // Serial.println ("------ shift ------"); } Keyboard.release yang lain (shiftKey); } lain {

// melaksanakan tugas

tukar (kod) {kes 30: // --- | Papan Kekunci Berus.press (shiftKey); Papan kekunci.cetak ('b'); completePress (kod); rehat; kes 300: // --- | Papan Kekunci Pemadam.press (shiftKey); Papan kekunci.cetak ('e'); completePress (kod); rehat; kes 3000: // --- | Papan Kekunci Bucket.press (shiftKey); Papan kekunci.cetak ('g'); completePress (kod); rehat; kes 30000: // --- | Papan Kekunci Lasso.press (shiftKey); Papan kekunci.print ('l'); completePress (kod); rehat; kes 320: // - | o Undo Keyboard.press (ctrlKey); Papan kekunci.print ('z'); completePress (kod); rehat; kes 3020: // - | -o Redo Keyboard.press (ctrlKey); Papan kekunci.print ('y'); completePress (kod); rehat; kes 30020: // | --o History Keyboard.press (shiftKey); Papan kekunci.print ('y'); completePress (kod); rehat; kes 230: // - o | Simpan Papan Kekunci.press (ctrlKey); Papan kekunci.cetak ('s'); completePress (kod); rehat; kes 3200: // - | o- Papan Kekunci-p.webp

int buttonCode = 0;

untuk (int i = 0; i <BUTTON_NUM; ++ i) {butang = butangStateUpdate (butang ); buttonCode + = getButtonStateCode (butang ); }

jika (butangCode! = 0) {

Serial.print ("kod butang:"); Serial.println (buttonCode); }

doAction (butang Kod);

// letakkan kod utama anda di sini, untuk dijalankan berulang kali: // untuk (int i = butang [0]; i <sizeof (butang) / sizeof (butang [0]) + butang [0]; ++ i) {/ / // if (readButton (i)) {// doAction (i); //} //}

jika (getCodeByButton (buttonCode, 0)! = 2)

Papan Kekunci.releaseAll ();

kelewatan (DELAY);

}

Tidak banyak yang boleh dikatakan mengenai logiknya kerana ia serupa dengan pengawal terakhir saya, dengan dua perbezaan yang ketara:

  1. Butang adalah struktur dengan mesin keadaan mereka sendiri
  2. Negeri-negeri digabungkan bersama untuk membuat kod yang menentukan tindakan

Prinsipnya mirip dengan pengalihan bit, tetapi kerana butang mempunyai beberapa keadaan dan tidak dapat digambarkan dengan binari, ia digandakan dengan kekuatan sepuluh sebagai gantinya. Saya kemudian menambahkan semua keadaan butang menjadi satu nombor, dan meneruskannya ke pernyataan suis doAction (), di mana saya meletakkan semua kod pintasan.

Seperti yang anda lihat, saya tidak memetakan setiap kemungkinan kombinasi. Saya hanya menambah beberapa jalan pintas kegemaran saya, saya menyerahkan kepada anda untuk mengisi selebihnya bagaimana yang paling sesuai;)

Langkah 3: Sarung

Selongsong
Selongsong
Selongsong
Selongsong
Selongsong
Selongsong

Saya menggunakan pencetak 3D untuk selongsong. Seperti yang anda lihat, reka bentuknya mempunyai beberapa kekurangan dan saya terpaksa menggunakan MacGyver untuk menutupnya. Oleh itu, saya tidak akan menghantar fail model.

Butang-butang dilekatkan panas ke "bangku" sehingga mereka meletakkan penutupnya di tempat. Tombol tekan lembut sangat bagus untuk itu, jadi pastikan anda mendapatkannya jika anda merancang untuk membuat kes yang serupa dengan saya.

Juga, saya cadangkan untuk menambahkan sedikit berat di dalam beg ini, kerana ia sangat ringan. Gram tambahan akan menjadikannya terasa lebih semula jadi.

Selesaikan segalanya seperti yang ditunjukkan dan sambungkan kabel usb, dan semuanya mesti dipasang di tempatnya (dengan bantuan beberapa gam)!

Langkah 4: Hasil dan Kemungkinan Penambahbaikan

Hasil dan Kemungkinan Penambahbaikan
Hasil dan Kemungkinan Penambahbaikan
Hasil dan Kemungkinan Penambahbaikan
Hasil dan Kemungkinan Penambahbaikan
Hasil dan Kemungkinan Penambahbaikan
Hasil dan Kemungkinan Penambahbaikan

Di sana anda memilikinya! Alat kawalan tangan yang boleh anda gunakan untuk mengakses semua pintasan penting anda dengan satu tangan!

Memerlukan memori otot untuk digunakan, tetapi sangat serba boleh!

Sudah tentu ia tidak sempurna, dan sekarang saya sedang memikirkan beberapa cara untuk memperbaikinya. Selain memperbaiki casing dan menambah jalan pintas, saya rasa akan menarik untuk menyokong pelbagai aplikasi dengan jalan pintas yang berbeza. Saya berfikir untuk mempunyai kombinasi butang untuk beralih antara skema kawalan, seperti menekan 4 butang pada masa yang sama untuk menukar antara perpustakaan pintasan Photoshop ke satu-disesuaikan yang dibuat untuk Maya.

Hanya beberapa idea.

Terima kasih kerana membaca, sehingga lain kali!

Disyorkan: