İçindekiler:
Video: El Kısayol Denetleyicisi (Photoshop + Daha Fazlası için) [Arduino]: 4 Adım
2024 Yazar: John Day | [email protected]. Son düzenleme: 2024-01-30 13:19
Geçen sefer Photoshop'ta kullanmak için küçük bir kontrol paneli oluşturdum. Harikalar yarattı ve hala kullanıyorum! Ancak aynı zamanda, sadece beş düğme ve kullanışlı boyut ve opaklık kadranları ile oldukça sınırlıdır. Yine de kendimi klavyeye çok uzanırken buldum…
Bu yüzden, kontrol panelinin bir sonraki yinelemesi üzerinde çalışmaya başladım, biri çok daha fazla düğme ve işlevsellik içeriyordu. Hepsine hükmedecek bir kontrol paneli.
Bu o kontrol paneli değil. AMA bir bakıma daha iyi olabilir.
Ya bir ton kısayolunuz olsaydı, ancak süper rahat ve hafif bir pakette kesintisiz çizim yaparken serbest elinizle tutabilirsiniz? …tamam, reklamla yeter.
Bu denetleyici, yalnızca 4 düğmeyle 32 olası kısayolla eşlenebilecek şekilde programlanmıştır! Ek 5. düğme, birçok program için yararlı olan herhangi bir kombinasyonda değiştirici tuşları kullanmama izin vermek için orada (PS'de Alt-RMB kombinasyonunu hiç denediniz mi? Denemediyseniz, lütfen deneyin. Bu bir cankurtaran). Sistemi daha sonra açıklarım.
Tüm bunları yapmak için ihtiyacınız olacak:
- 1 Mikrodenetleyici (Bir Adafruit ItsyBitsy 32u4 kullandım ancak atmega32u4 çipine sahip olduğu sürece herhangi birinin yapması gerekir)
- 1 mikro USB adaptörü (veriler, yalnızca güç için değil)
- 5 adet buton (Bunun gibi yumuşak olanları kullandım)
- 10k Ohm dirençler (düğme başına 1 adet)
- Teller, devre tahtası, lehim malzemesi vb.
- (3D yazıcı vb.)
Bu orta seviye bir Arduino projesidir ve neler olup bittiğini daha iyi anlamak için geçmiş eğitimime bakmanızı öneririm, çünkü bunun çoğu orada anlattığım şeylerin tekrarıdır.
Tamam, başlayalım!
Adım 1: Planlama
Bu, denetleyicinin çizdiğim temel bir şemasıdır. Önceki projemle karşılaştırdığınızda devre gerçekten basit! Ancak sahip olduğu birkaç düğmeyle, kombine preslerin gücüyle çok daha fazlasını yapabileceğiz!
Kontrol şemasının arkasındaki fikir, her bir düğmenin serbest, basılı ve bırakılmış veya basılı tutulmuş olmasıdır. Basmak ve bırakmak kısayolu gerçekten etkinleştirecek olan şeydir, düğmeleri basılı tutmak ise farklı kısayollara erişmemizi sağlayacaktır. Yani sadece A düğmesine basarsanız, A kısayolunu etkinleştirirsiniz, ancak A'ya basarken B'yi basılı tutarsanız, farklı bir kısayol alırsınız. Basarken aynı anda en fazla 3 düğmeyi basılı tutabilirsiniz, bu nedenle bazı temel kombinatorikleri uyguladığınızda, bu sistemle kaç kombinasyonun mümkün olduğunu göreceksiniz!
Ekstra beşinci düğme, bulduğum avuçiçinin şekli göz önüne alındığında, doğal bir ekleme gibi geldi. Photoshop'ta değiştirici tuşlara erişmek için kullanmaya karar verdim. Çalışma şekli diğer düğmelerden biraz farklıdır: başparmak düğmesi basılı tutulduğunda yalnızca değiştiriciler kullanılacaktır. Bunlar, tutulduklarında etkinleşir ve çoklu basılabilir. Bu nedenle, A düğmesi Shift ise ve B düğmesi Ctrl ise, A ve B'yi basılı tuttuğunuzda, hem Shift hem de Ctrl'ye basmak gibi olacaktır, ancak yalnızca başparmak düğmesi basılı tutulduğu sürece!
Kabuk hem ergonomik hem de çok yönlü olacak şekilde tasarlanmıştır. Serçe parmağını kullanmak çok yorucu olmasın diye sıkıca oturmasına büyük özen gösterdim ve benimkinden büyük eli olanlar için de işe yaramalı.
Adım 2: Prototip + Kod
Bir devre tahtasındaki düğmeleri test etmek iyi bir uygulamadır. Oldukça basit, sadece düğmeleri ve dirençleri gösterildiği gibi bağlayın. Buradaki kodla test edebilirsiniz (pastebin link alternatifi):
#Dahil etmek
// MacOS için vthisv seçeneğini kullanın:
//char ctrlKey = KEY_LEFT_GUI;
// Windows ve Linux için vthisv seçeneğini kullanın:
karakter ctrlKey = KEY_LEFT_CTRL; karakter shiftKey = KEY_LEFT_SHIFT; karakter altKey = KEY_LEFT_ALT;
//İşlev Tuşları burada
karakter Fn1Key = KEY_F2; karakter Fn2Key = KEY_F3; karakter Fn3Key = KEY_F4; karakter Fn4Key = KEY_F5;
const int pinler = {9, 10, 11, 12, 13}; // tüm buton pinlerinin dizisi
//duyarlılık
const int THRESH_0 = 10; const int EŞİK_1 = 20; const int EŞİK_2 = 25; const int EŞİK_3 = 50; const int THRESH_4 = 100; const int EŞİK_5 = 200;
const int BUTTON_NUM = 5;
//Çerçeveleri dondur
const int GECİKME = 0;
enum Durumlar {serbest bırakıldı, basıldı, tutuldu, serbest bırakıldı};
yapı düğmesi {
int pini; devletler durumu; int timeHeld; }; //parmak, dizin, orta, halka, küçük;
düğme düğmeleri[BUTTON_NUM] = {};
düğme initButton(int p) {
düğme b; pinMode(p, GİRİŞ); b.pin = p; b.state = Durumlar::serbest bırakıldı; b.timeHeld = 0; dönüş b; }
geçersiz kurulum() {
// bir kez çalıştırmak için kurulum kodunuzu buraya koyun: Serial.begin(9600); klavye.başla();
while(!Seri){};
//Butonlar for(int i = 0; i < (BUTTON_NUM); ++i) { Serial.print("düğmeyi ayarla"); Seri.baskı(i); Serial.print(" pinde: "); Serial.println(pinler); //düğmeler.pin = 1; düğmeler=initButton(pinler); Serial.println(düğmeler.pin); }
}
bool readButton(int pin) {
// eğer (digitalRead(pin) == HIGH) { delay(10); if (digitalRead(pin) == YÜKSEK) { return true; } } false döndür; }
int pintobin(int pin) {
if (pin==pins[0]) 1 döndür; if (pin== pin[1]) 10 döndürür; if (pin== pin[2]) 100 döndürür; if (pin== pin[3]) 1000 döndürür; if (pin== pin[4]) 10000 döndürür; } buttonStateUpdate(düğme b) {
bool press = readButton(b.pin);
switch (b.state) { case States::freed: b.timeHeld=0; if (basın) b.state=Durumlar::basıldı; kırmak; basılan vaka: b.timeHeld+=1; if (basın) { if (b.timeHeld>(THRESH_1/(1+DELAY))) { b.state=States::held; } } else { //if (b.timeHeld
int getButtonStateCode(düğme b)
{ return b.state*pintobin(b.pin); }
int getCodeByButton(int kodu, int dizin) {
int r1, r2, r3, r4, r5; int opStep = BUTTON_NUM - (1+indeks);
//ilk işlem
if (opStep==0) dönüş kodu/10000; r1 = kod%10000;
eğer (opAdım==1)
dönüş r1/1000; r2 = r1%1000; if (opStep==2) r2/100 döndürür; r3 = r%100; if (opStep==3) r3/10 döndürür; r4 = r%10; if (opStep==4) r4/1 döndürür; r5 = r4%1; }
void completePress(int pin) {
// Serial.print ("giriş"); // Serial.println(pin); gecikme(THRESH_3); Keyboard.releaseAll(); }
geçersiz doAction(int kodu) {
//Değiştiriciler if (getCodeByButton(kod, 0)==2) { // Serial.println("---değiştiriciler----"); if (getCodeByButton(kod, 1)>0) { Keyboard.press(altKey); // Serial.println("-------alt--------"); } else Keyboard.release(altKey); if (getCodeByButton(kod, 2)>0) { Keyboard.press(ctrlKey); // Serial.println("-------ctrl----------"); } else Keyboard.release(ctrlKey); if (getCodeByButton(kod, 3)>0) { Keyboard.press(' '); } else Keyboard.release(' '); if (getCodeByButton(kod, 4)>0) { Keyboard.press(shiftKey); // Serial.println("------shift------"); } else Keyboard.release(shiftKey); } Başka {
// görevleri gerçekleştir
geçiş (kod) { durum 30: //---| Fırça Klavye.press(shiftKey); klavye.print('b'); tamamlamaPress(kod); kırmak; vaka 300: //---| Silgi Klavye.press(shiftKey); klavye.print('e'); tamamlamaPress(kod); kırmak; vaka 3000: //---| Kova Klavye.press(shiftKey); klavye.print('g'); tamamlamaPress(kod); kırmak; vaka 30000: //---| Kement Klavyesi.press(shiftKey); klavye.print('l'); tamamlamaPress(kod); kırmak; case 320: //--|o Klavyeyi Geri Al.press(ctrlKey); klavye.print('z'); tamamlamaPress(kod); kırmak; case 3020: //-|-o Klavyeyi Yinele.press(ctrlKey); klavye.print('y'); tamamlamaPress(kod); kırmak; case 30020: //|--o History Keyboard.press(shiftKey); klavye.print('y'); tamamlamaPress(kod); kırmak; durum 230: //--o| Klavyeyi kaydedin.press(ctrlKey); klavye.print('s'); tamamlamaPress(kod); kırmak; case 3200: //-|o- Hızlı-p.webp
int düğmeKodu=0;
for(int i = 0; i < BUTTON_NUM; ++i) { düğmeler=buttonStateUpdate(düğmeler); buttonCode+=getButtonStateCode(düğmeler); }
if(düğmeKodu!=0) {
Serial.print("düğme kodu: "); Serial.println(düğmeKodu); }
doAction(düğmeKodu);
// tekrar tekrar çalıştırmak için ana kodunuzu buraya koyun: // for(int i = button[0]; i < sizeof(buttons)/sizeof(buttons[0])+buttons[0]; ++i) { / // if (readButton(i)) { // doAction(i); // } // }
if (getCodeByButton(buttonCode, 0)!=2)
Keyboard.releaseAll();
gecikme(DELAY);
}
Mantık hakkında söylenecek fazla bir şey yok, çünkü iki önemli farkla son denetleyiciminkine benziyor:
- Düğmeler kendi durum makinelerine sahip yapılardır.
- Durumlar, eylemi belirleyen bir kod yapmak için bir araya toplanır.
İlke, bit kaydırmaya benzer, ancak düğmelerin birden fazla durumu olduğundan ve basitçe bir ikili ile temsil edilemediğinden, bunun yerine onluk güçlerle çarpılırlar. Daha sonra tüm düğme durumlarını tek bir sayıya toplarım ve onu, tüm kısayol kodunu koyduğum doAction() switch deyimine aktarırım.
Gördüğünüz gibi, olası her kombinasyonu eşleştirmedim. Sadece en sevdiğim kısayollardan birkaçını ekledim, gerisini en uygun gördüğünüz şekilde doldurmayı size bırakıyorum;)
Adım 3: Muhafaza
Kasa için 3D yazıcı kullandım. Gördüğünüz gibi, tasarımın bazı kusurları var ve onu kapatmanın bir yolunu MacGyver'a verdim. Bu yüzden henüz model dosyasını yayınlamayacağım.
Düğmeler, kapakları yerinde tutmak için "banklar" üzerine sıcak yapıştırılmıştır. Yumuşak butonlar özellikle bu konuda iyidir, bu yüzden benimkine benzer bir kasa yapmayı planlıyorsanız, bunlardan bazılarını aldığınızdan emin olun.
Ayrıca çok hafif olduğu için kasanın içine biraz ağırlık eklemenizi öneririm. Ekstra gram, tutmayı daha doğal hissettirecek.
Her şeyi gösterildiği gibi lehimleyin ve usb kablosunu bağlayın, her şey yerine oturmalıdır (biraz yapıştırıcı yardımıyla)!
4. Adım: Sonuç ve Olası İyileştirmeler
İşte aldın! Tüm önemli kısayollarınıza tek elle erişmek için kullanabileceğiniz bir el kumandası!
Kullanmak biraz kas hafızası gerektirir, ancak gerçekten çok yönlüdür!
Tabii ki mükemmel değil ve şu anda onu iyileştirmenin bazı yollarını düşünüyorum. Kasayı iyileştirmenin ve kısayolları eklemenin yanı sıra, farklı kısayollarla birden fazla uygulamayı desteklemenin ilginç olacağını düşünüyorum. Kontrol şemaları arasında geçiş yapmak için bir düğme kombinasyonuna sahip olmayı düşünüyorum, örneğin bir Photoshop kısayol kitaplığı arasında Maya için tek kişiye özel olarak geçiş yapmak için aynı anda 4 düğmeye basmak gibi.
Sadece bazı fikirler.
Bir dahaki sefere kadar okuduğunuz için teşekkürler!
Önerilen:
CovBot - COVID 19 Bilgi ve Daha Fazlası için WhatsApp Tabanlı Chatbot: 7 Adım
CovBot - COVID 19 için WhatsApp Tabanlı Chatbot Bilgi ve Daha Fazlası: CoVbot, Whatsapp tabanlı basit ve sezgisel bir sohbet robotudur. Botun ana özelliği şudur: Seçtiğiniz ülkedeki COVID-19'un en son durumunu size basit ve sezgisel bir şekilde verebilir. Ayrıca bot, AT H yapmak için eğlenceli aktiviteler önerebilir
Daha Az Alanda Daha Fazla Marul Yetiştirmek Veya Uzayda Marul Yetiştirmek, (Daha Fazla veya Daha Az).: 10 Adım
Daha Az Alanda Daha Fazla Marul Yetiştirmek Veya… Uzayda Büyüyen Marul, (Daha Fazla veya Daha Az).: Bu, Instructables aracılığıyla gönderilen Growing Beyond Earth, Maker Yarışması'na profesyonel bir başvurudur. Uzay mahsulü üretimi için tasarım yapmaktan ve ilk Instructable'ımı göndermekten daha fazla heyecanlanamazdım. Başlamak için yarışma bizden
Oynak Basınca Duyarlı Pedler (Dijital Oyun Alanları - ve Daha Fazlası için): 11 Adım (Resimlerle)
Oynak Basınca Duyarlı Pedler (Dijital Oyun Alanları - ve Daha Fazlası için): Bu, dijital oyuncaklar veya oyunlar oluşturmak için kullanılabilecek, basınca duyarlı bir pedin nasıl yapıldığını gösteren bir Talimattır. Büyük ölçekli kuvvete duyarlı bir direnç olarak kullanılabilir ve eğlenceli olmasına rağmen daha ciddi projeler için kullanılabilir
Hızlandırılmış, Portreler ve Daha Fazlası için Büyük LED "halka" Işığı: 11 Adım (Resimlerle)
Hızlandırılmış, Portreler ve Daha Fazlası için Büyük LED "halka" Işığı…: Birkaç güne yayılan çok sayıda hızlandırılmış video çekiyorum, ancak kıskaç ışıklarının verdiği düzensiz ışıktan nefret ediyorum - özellikle geceleri. Büyük bir halka ışık çok pahalı - bu yüzden elimdeki malzemelerle tek bir akşamda kendim bir şeyler yapmaya karar verdim.
Evcil Hayvan Maması (köpek, Kedi, Tavuk vb.), Top Fırlatma ve Daha Fazlası İçin Otomatik Mancınık!: 4 Adım (Resimli)
Evcil Hayvan Maması (köpek, Kedi, Tavuk, Vb), Fırlatma Topları ve Daha Fazlası için Otomatik Mancınık!: Merhaba ve ilk Eğitilebilir Kitabıma hoş geldiniz! Köpeğimiz yemeğini SEVİYOR, kelimenin tam anlamıyla hepsini saniyeler içinde yiyecek. Bunu yavaşlatmanın yollarını arıyordum, içinde yiyecek olan toplardan arka bahçeye atmaya kadar. Şaşırtıcı bir şekilde, o