สารบัญ:

แผงควบคุมขนาดเล็กสำหรับ Photoshop (Arduino): 6 ขั้นตอน
แผงควบคุมขนาดเล็กสำหรับ Photoshop (Arduino): 6 ขั้นตอน

วีดีโอ: แผงควบคุมขนาดเล็กสำหรับ Photoshop (Arduino): 6 ขั้นตอน

วีดีโอ: แผงควบคุมขนาดเล็กสำหรับ Photoshop (Arduino): 6 ขั้นตอน
วีดีโอ: BASIC #1 - การใช้งานโปรแกรม Arduino พื้นฐานร่วมกับบอร์ด Arduino Nano | JAKK DIY 2024, กรกฎาคม
Anonim
แผงควบคุมขนาดเล็กสำหรับ Photoshop (Arduino)
แผงควบคุมขนาดเล็กสำหรับ Photoshop (Arduino)

ฉันจะแสดงให้คุณเห็นถึงวิธีการสร้างเครื่องมือเล็กๆ น้อยๆ เพื่อช่วยให้คุณทำงานใน Photoshop ได้เร็วขึ้น!

คีย์บอร์ดที่ผลิตขึ้นสำหรับ PS โดยเฉพาะไม่ใช่ของใหม่ แต่ไม่มีสิ่งที่ฉันต้องการอย่างแน่นอน ในฐานะจิตรกร ฉันใช้เวลาส่วนใหญ่ใน Photoshop ในการปรับการตั้งค่าพู่กัน และฉันคิดว่าปุ่มลัดง่ายๆ ไม่ได้ทำให้ฉันสามารถควบคุมให้เข้ากับขั้นตอนการทำงานของฉันได้ ดังนั้นฉันจึงตัดสินใจสร้างแป้นพิมพ์ของตัวเองขึ้นมา ซึ่งมีขนาดเล็ก ไม่เกะกะ และมีแป้นหมุนเพื่อให้การโต้ตอบแบบอะนาล็อกที่ฉันต้องการมาโดยตลอด

วิธีการทำงานนั้นง่าย: ในการทำให้ไมโครคอนโทรลเลอร์โต้ตอบกับ Photoshop เราใช้ประโยชน์จากทางลัดเริ่มต้น ด้วยบอร์ดที่คอมพิวเตอร์สามารถอ่านเป็นคีย์บอร์ด/เมาส์ได้ สิ่งที่เราต้องทำคือใช้โค้ดง่ายๆ เพื่อบอกให้คอมพิวเตอร์อ่านอินพุตแต่ละรายการเป็นการรวมกันของการกดปุ่ม ตอนนี้ปุ่มเลิกทำเป็นเพียงปุ่มเดียว!

มาเริ่มกันเลย! สำหรับโครงการนี้ คุณจะต้อง:

  • 1 Sparkfun ProMicro (หรือ Arduino Leonardo ไม่แนะนำ)
  • อะแดปเตอร์ไมโคร USB 1 ตัว
  • 6 ปุ่มกด (หรือตัวเลขตามชอบ)
  • ตัวต้านทาน 10k Ohm (1 สำหรับแต่ละปุ่ม)
  • 1 โพเทนชิออมิเตอร์
  • เครื่องเข้ารหัสแบบหมุน 1 เครื่อง
  • สายไฟ, เขียงหั่นขนม, perfboard, บัดกรี, หมุดส่วนหัว ฯลฯ

คุณสามารถใช้ Arduino Leonardo สำหรับโครงการนี้ได้ แต่ ProMicro เป็นทางเลือกที่ถูกกว่ามากซึ่งใช้ชิป atmega32u4 ตัวเดียวกัน มีพินมากกว่าและมาในรูปแบบที่เล็กกว่ามาก ทำให้เหมาะสำหรับคีย์บอร์ด

ในการตั้งโปรแกรม ProMicro ใน Arduino IDE คุณอาจต้องตั้งค่าบางอย่างก่อน คุณสามารถอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ได้ในคู่มือของ SparkFun:

หากคอมพิวเตอร์ของคุณมีปัญหาในการค้นหาอุปกรณ์ ตรวจสอบให้แน่ใจว่า micro-USB ที่คุณใช้ไม่ใช่พลังงานอย่างเดียวและรองรับการถ่ายโอนข้อมูล

นี่เป็นโครงการ Arduino แรกของฉันและเหมาะสำหรับผู้เริ่มต้น

ขั้นตอนที่ 1: การสร้างต้นแบบแผ่นควบคุม

การสร้างต้นแบบแผ่นควบคุม
การสร้างต้นแบบแผ่นควบคุม

ฉันแนะนำให้คุณทดสอบโปรแกรมของคุณบนเขียงหั่นขนมก่อนที่จะเริ่มบัดกรี

ที่นี่คุณสามารถดูแผนผังของฉัน

ปุ่ม 1 และ 2 จะเป็นเลิกทำและทำซ้ำ 3 ถึง 5 ปุ่มสำหรับเครื่องมือ Brush, Eraser และ Lasso ปุ่ม 6 คือปุ่มบันทึกด่วน ตัวเข้ารหัสและ potmeter ควบคุมขนาดและความทึบตามลำดับ

โปรดทราบว่าฉันเป็นคนถนัดซ้ายและออกแบบเลย์เอาต์ในลักษณะที่สะดวกที่สุดสำหรับฉันที่จะใช้ ดูช่วงเวลาที่คุณใช้เขียงหั่นขนมเป็นโอกาสในการคิดเกี่ยวกับฟังก์ชันที่คุณต้องการให้ตัวควบคุมของคุณมี อะไรทำงานได้ดีที่สุดสำหรับคุณ และในที่สุด หากคุณต้องการชิ้นส่วนเพิ่มเติมเพื่อสร้างมันขึ้นมา

ขั้นตอนที่ 2: กดปุ่ม

ปุ่มกด
ปุ่มกด

ปุ่มต่างๆ นั้นใช้งานง่ายที่สุด มาดูโค้ดกัน:

#รวม

ปุ่ม int const = {2, 3, 4, 5, 6, 7, 8, 9}; // อาร์เรย์ของหมุดปุ่มทั้งหมด ถ่าน ctrlKey = KEY_LEFT_GUI; // ใช้ตัวเลือกนี้สำหรับ Windows และ Linux: //char ctrlKey = KEY_LEFT_CTRL; ถ่าน shiftKey = KEY_LEFT_SHIFT; ถ่าน altKey = KEY_LEFT_ALT; การตั้งค่าเป็นโมฆะ () { // ใส่รหัสการตั้งค่าของคุณที่นี่เพื่อเรียกใช้ครั้งเดียว: Serial.begin (9600); แป้นพิมพ์.begin(); //ปุ่ม -- วนซ้ำในอาร์เรย์และตรวจสอบการกดสำหรับ (int i = buttons[0]; i < (sizeof(buttons)/sizeof(buttons[0]))+buttons[0]; ++i) { pinMode(i, INPUT); } } บูลีน readButton (int pin) {// ตรวจสอบและ debounce ปุ่มถ้า (digitalRead (พิน) == สูง) { ล่าช้า (10); ถ้า (digitalRead (พิน) == สูง) { คืนค่าจริง; } } คืนค่าเท็จ } โมฆะ doAction (int pin) {// ดำเนินการสลับ (พิน) { // ---- ทางลัด ---- // เลิกทำกรณีที่ 4: Keyboard.press (ctrlKey); Keyboard.print('z'); Serial.print ("อินพุต"); Serial.println (พิน); ล่าช้า(200); Keyboard.releaseAll(); หยุดพัก; //ทำซ้ำกรณีที่ 5: Keyboard.press(ctrlKey); Keyboard.print('y'); Serial.print ("อินพุต"); Serial.println (พิน); ล่าช้า(200); Keyboard.releaseAll(); หยุดพัก; //กล่องใส่แปรง 6: Keyboard.press('b'); Serial.print ("อินพุต"); Serial.println (พิน); ล่าช้า(200); Keyboard.releaseAll(); หยุดพัก; //ยางลบกรณีที่ 7: Keyboard.press('e'); Serial.print ("อินพุต"); Serial.println (พิน); ล่าช้า(200); Keyboard.releaseAll(); หยุดพัก; // Lasso case 8: Keyboard.press('l'); Serial.print ("อินพุต"); Serial.println (พิน); ล่าช้า(200); Keyboard.releaseAll(); หยุดพัก; //บันทึกกรณีที่ 9: Keyboard.press(ctrlKey); Keyboard.print('s'); Serial.print ("อินพุต"); Serial.println (พิน); ล่าช้า(200); Keyboard.releaseAll(); หยุดพัก; ค่าเริ่มต้น: Keyboard.releaseAll(); หยุดพัก; } }

วงเป็นโมฆะ () {

// ใส่รหัสหลักของคุณที่นี่เพื่อเรียกใช้ซ้ำ ๆ:

สำหรับ (int i = ปุ่ม[0]; i < sizeof(ปุ่ม)/sizeof(ปุ่ม[0])+ปุ่ม[0]; ++i) { if (readButton(i)) { doAction(i); } } //รีเซ็ตตัวแก้ไข Keyboard.releaseAll();

}

พวกเขาค่อนข้างตรงไปตรงมา เพื่อให้คอมพิวเตอร์รู้จักการกดปุ่มเป็นการกดแป้น เราเพียงแค่ใช้ฟังก์ชัน Keyboard.press() ดังนั้นเพื่อเปิดใช้งานทางลัดเลิกทำ (ctrl+z) เราเพียงแค่ใช้ Keyboard.press(ctrlKey) จากนั้น Keyboard.press('z') จำไว้ว่าคุณจะต้องรวม Keyboard.h และกำหนดค่าเริ่มต้นของแป้นพิมพ์เพื่อเข้าถึงฟังก์ชันเหล่านี้

พินอินพุตถูกเก็บไว้ในอาร์เรย์ ดังนั้นคุณจึงสามารถวนซ้ำทั้งหมดได้อย่างง่ายดายในฟังก์ชันลูป () วิธีง่ายๆ วิธีหนึ่งในการเข้าถึงและความยาวของอาร์เรย์ใน c++ โดยหารขนาดของอาร์เรย์ทั้งหมดด้วยองค์ประกอบอาร์เรย์ บวกหนึ่งองค์ประกอบ เราวนซ้ำทุกปุ่มเพื่อตรวจสอบว่ามีการกดปุ่มหรือไม่

เพื่อให้สิ่งต่าง ๆ เป็นระเบียบ ฉันเก็บการทำงานของปุ่มทั้งหมดไว้ในคำสั่ง switch ของฟังก์ชันที่ใช้หมายเลขพินเป็นอาร์กิวเมนต์

หากคุณต้องการให้ปุ่มของคุณทำสิ่งต่าง ๆ หรือต้องการเพิ่มปุ่มเพิ่มเติม เพียงแค่แก้ไขเนื้อหาของฟังก์ชั่น doAction!

เนื่องจากการทำงานของปุ่มทางกายภาพ เราจะต้องดีบักมัน เพื่อป้องกันไม่ให้โปรแกรมอ่านการกดที่ไม่ต้องการซึ่งเกิดจากความสปริงของปุ่มกด มีหลายวิธีในการทำเช่นนี้ แต่ฉันได้เพิ่มฟังก์ชัน readButton() แบบง่ายที่ดูแลเรื่องนั้น

เพียงเชื่อมต่อปุ่มของคุณด้วยตัวต้านทาน 10k และคุณควรจะเป็นสีทอง!

ขั้นตอนที่ 3: โพเทนชิออมิเตอร์

โพเทนชิออมิเตอร์
โพเทนชิออมิเตอร์

ตอนนี้ไปที่ potmeter:

#รวม

int dial0 = 0; การตั้งค่าเป็นโมฆะ () { // ใส่รหัสการตั้งค่าของคุณที่นี่เพื่อเรียกใช้ครั้งเดียว: Serial.begin (9600); แป้นพิมพ์.begin(); //หมุน dial0= analogRead(0); dial0= แผนที่(หมุน0, 0, 1023, 1, 20); } โมฆะ dialAction (การโทรแบบ int, int newVal, int lastVal) { สวิตช์ (หมุน) {// กรณีความทึบ 0: ความล่าช้า (200); ถ้า (newVal!=lastVal) { int decim = ((newVal*5)/10); หน่วย int = ((newVal *5)% 10); ถ้า (newVal==20) { Keyboard.write (48+0); Keyboard.write(48+0); Serial.println("สูงสุด 1"); } อื่น ๆ { ทศนิยม = ข้อ จำกัด (ทศนิยม, 0, 9); หน่วย = ข้อ จำกัด (หน่วย, 0, 9); Serial.println(newVal*2); Keyboard.write(48+ทศนิยม); Keyboard.write(48+หน่วย); } } dial0=newVal; หยุดพัก; ค่าเริ่มต้น: แตก; } } //------------------ ลูปหลัก ------------------------- โมฆะ วนซ้ำ () { // ใส่รหัสหลักของคุณที่นี่เพื่อเรียกใช้ซ้ำ ๆ: // ความทึบ // ล่าช้า (500); int val0 = analogRead(0); val0 = แผนที่(val0, 0, 1023, 1, 20); //Serial.print ("dial0: "); //Serial.println(val0); if (val0!=dial0) {// ทำสิ่งที่ dialAction(0, val0, dial0); } }

Potmeter ใช้ตรรกะเดียวกัน แต่ยากกว่าเล็กน้อย

ขั้นแรก มาดูว่าเราต้องการให้มันทำงานอย่างไร: Photoshop มีปุ่มลัดที่มีประโยชน์บางอย่างเพื่อเปลี่ยนความทึบของแปรง หากคุณกดปุ่ม num ใดๆ ความทึบจะเท่ากับตัวเลขนั้น*10 แต่ถ้าคุณกดตัวเลขสองตัว มันจะอ่านตัวเลขที่สองเป็นหน่วย ทำให้คุณควบคุมได้แม่นยำยิ่งขึ้น

ดังนั้นเราจึงต้องการให้พอตมิเตอร์ของเราจับคู่การหมุนเป็นเปอร์เซ็นต์ แต่เราไม่ต้องการที่จะทำมันตลอดเวลาเพราะมันจะงี่เง่า เราเพียงต้องการเปลี่ยนความทึบเมื่อมีการหมุนมิเตอร์ ดังนั้นเราจึงเก็บค่าเพิ่มเติมที่เราเปรียบเทียบกับค่า analogRead() และเรียกใช้สคริปต์การดำเนินการเมื่อมีความแตกต่างเท่านั้น

ปัญหาอีกประการหนึ่งที่เราจะพบคือวิธีที่เราเปลี่ยน return int ของ analogRead เป็นอินพุต เนื่องจากไม่มีวิธีง่ายๆ ในการเปลี่ยน int ให้เป็นสตริง เราจึงต้องใช้ int เอง อย่างไรก็ตาม หากคุณเพียงแค่เขียน Keyboard.press(int) คุณจะสังเกตเห็นว่าการป้อนข้อมูลนั้นไม่ใช่สิ่งที่คุณต้องการ แต่จะมีการกดแป้นอื่นแทน

เนื่องจากคีย์ของแป้นพิมพ์ทั้งหมดถูกเข้ารหัสเป็นจำนวนเต็ม โดยแต่ละคีย์จะมีดัชนีของตัวเอง ในการใช้คีย์ num อย่างถูกต้อง คุณจะต้องค้นหาดัชนีในตาราง ASCII:

อย่างที่คุณเห็น ปุ่ม num เริ่มต้นที่ดัชนี 48 ดังนั้นหากต้องการกดปุ่มที่ถูกต้อง สิ่งที่เราต้องทำคือเพิ่มค่าของแป้นหมุนเป็น 48 ค่าทศนิยมและหน่วยเป็นการกดแยกกัน

สุดท้ายนี้ เราต้องการวิธีที่จะรักษาคุณค่าไม่ให้กระโดดไปมา เพราะถ้าคุณลองใช้แป้นหมุนที่มีแผนที่ (val0, 0, 1023, 0, 100) คุณจะพบผลลัพธ์ที่กระวนกระวายใจมาก ในทำนองเดียวกันกับวิธีที่เราดีบักปุ่ม เราจะแก้ไขปัญหานี้โดยสละความแม่นยำบางส่วนไป ฉันพบว่าการจับคู่กับ 1-20 แล้วคูณค่าของอาร์กิวเมนต์ด้วย 5 เพื่อให้ประนีประนอมที่ยอมรับได้

ในการเชื่อมต่อโพเทนชิออมิเตอร์ เพียงแค่ต่อสาย 5V, สายกราวด์ และสายอินพุตแบบแอนะล็อก และไม่น่าจะมีปัญหาใดๆ

เกร็ดน่ารู้: หากคุณใช้ช็อตคัทนี้ในขณะที่เลือกเครื่องมือเช่น Lasso มันจะเปลี่ยนความทึบของเลเยอร์แทน สิ่งที่ควรทราบ

ขั้นตอนที่ 4: ตัวเข้ารหัสแบบหมุน

ตัวเข้ารหัสแบบหมุน
ตัวเข้ารหัสแบบหมุน

เครื่องเข้ารหัสแบบโรตารี่นั้นคล้ายกับโพเทนชิโอมิเตอร์เล็กน้อย แต่ไม่จำกัดว่าจะหมุนได้มากน้อยเพียงใด แทนที่จะเป็นค่าแอนะล็อก เราจะดูทิศทางการเลี้ยวของตัวเข้ารหัสแบบดิจิทัล ฉันจะไม่ลงรายละเอียดมากเกี่ยวกับวิธีการทำงานเหล่านี้ แต่สิ่งที่คุณต้องรู้คือมันใช้พินอินพุตสองตัวบน Arduino เพื่อบอกทิศทางที่มันถูกเปิด ตัวเข้ารหัสแบบหมุนอาจใช้งานยากกว่า ตัวเข้ารหัสที่แตกต่างกันอาจต้องใช้การตั้งค่าที่แตกต่างกัน เพื่อให้ง่ายขึ้น ฉันซื้อ PCB มาอันหนึ่งซึ่งพร้อมสำหรับติดหมุดตัวเมีย ตอนนี้รหัส:

#รวม

//ตัวเข้ารหัสแบบโรตารี่ #define outputA 15 #define outputB 14 int counter = 0; int aState; int aLastState; การตั้งค่าเป็นโมฆะ () { // ใส่รหัสการตั้งค่าของคุณที่นี่ เพื่อเรียกใช้ครั้งเดียว: //Rotary pinMode (outputA, INPUT); โหมดพิน (เอาต์พุต B, INPUT); // อ่านสถานะเริ่มต้นของ outputA aLastState = digitalRead(outputA); } โมฆะ rotaryAction (int dir) { if (dir>0) { Keyboard.press (']'); } อื่น ๆ { Keyboard.press('['); } Keyboard.releaseAll(); } //------------------- ลูปหลัก --------------------- วงโมฆะ () { // ใส่รหัสหลักของคุณที่นี่เพื่อเรียกใช้ซ้ำ ๆ: //Size aState = digitalRead(outputA); if (aState != aLastState){ if (digitalRead(outputB) != aState) { //ตัวนับ ++; การกระทำแบบหมุน(1); } else { //ตัวนับ --; โรตารี่แอคชั่น(-1); } //Serial.print("ตำแหน่ง: "); //Serial.println(เคาน์เตอร์); } aLastState = aState; }

ตามค่าเริ่มต้น ปุ่มลัด] และ [ของ Photoshop จะเพิ่มและลดขนาดแปรง เช่นเดียวกับเมื่อก่อน เราต้องการป้อนข้อมูลเหล่านั้นด้วยการกดปุ่ม ตัวเข้ารหัสส่งอินพุตจำนวนหนึ่งต่อเทิร์น (ซึ่งขึ้นอยู่กับรุ่น) และเราต้องการเพิ่ม/ลดขนาดแปรงสำหรับแต่ละอินพุตเหล่านี้ ดังนั้นคุณจึงสามารถหมุนแป้นหมุนขึ้นหรือลงได้เร็วมาก แต่ก็สามารถ ควบคุมอย่างช้าๆ ด้วยความแม่นยำที่ยอดเยี่ยม

เช่นเดียวกับพอตมิเตอร์ เราต้องการเรียกใช้การดำเนินการเมื่อหมุนแป้นหมุนเท่านั้น ตามที่ฉันอธิบายไว้ก่อนหน้านี้ ตัวเข้ารหัสแบบหมุนมีอินพุตสลับกันสองช่อง ต่างจากมิเตอร์มิเตอร์ เราดูว่าสิ่งใดเปลี่ยนแปลงไปบ้างเพื่อกำหนดทิศทางการหมุนแป้นหมุน

จากนั้นเรากดปุ่มที่ถูกต้องขึ้นอยู่กับทิศทาง

ตราบใดที่คุณไม่มีปัญหาในการติดต่อก็ควรจะใช้ได้

ขั้นตอนที่ 5: นำทุกอย่างมารวมกัน

วางมันทั้งหมดเข้าด้วยกัน
วางมันทั้งหมดเข้าด้วยกัน
วางมันทั้งหมดเข้าด้วยกัน
วางมันทั้งหมดเข้าด้วยกัน
วางมันทั้งหมดเข้าด้วยกัน
วางมันทั้งหมดเข้าด้วยกัน

ตอนนี้เข้าสู่การบัดกรี ขั้นแรก เราเจาะรูสองรูบนแผ่นไม้อัดเพื่อให้พอดีกับแป้นหมุนทั้งสอง เราประสานปุ่มและตัวต้านทานตามลำดับ ฉันเจาะรูเล็กๆ อีกสองรูเพื่อให้สายป้อนผ่านด้านบนเพื่อประหยัดพื้นที่ด้านล่าง แต่ไม่จำเป็น มีสายอินพุตไม่มากนัก ดังนั้นสาย GND และ 5V จึงทำงานแบบขนาน แต่ถ้าคุณรู้สึกว่ามีเล่ห์เหลี่ยม คุณอาจต้องการสร้างเมทริกซ์ ฉันบัดกรีไมโครคอนโทรลเลอร์กับบอร์ดอื่นที่มีขนาดเล็กกว่าซึ่งอยู่ข้างใต้ตัวเข้ารหัสและพอตมิเตอร์ ตอนนี้ฉันบัดกรีสายไฟทั้งหมดเข้ากับ ProMicro ไม่จำเป็นต้องมีความคิดสร้างสรรค์ ฉันแค่ต้องทำตามแบบแผนเดียวกับที่อยู่บนเขียงหั่นขนม แต่การบัดกรีในที่เล็ก ๆ เช่นนี้อาจเป็นเรื่องที่น่าเบื่อหน่าย อย่าเป็นเหมือนฉันเลย ใช้คีมปอกสายไฟและบัดกรีดีๆ สิ!

สุดท้าย คุณอาจต้องการสร้างเคสที่ดีสำหรับเพื่อน Photoshop ใหม่ของคุณ อย่างน้อยก็ดีกว่าของฉัน!

แต่ถ้าคุณอยากลองใช้ ให้ใช้กระดาษแข็งและเทปแล้วเสียบไมโคร USB ของคุณ

ขั้นตอนที่ 6: รหัส + การสาธิต

Image
Image

อย่าลืมทดสอบโปรแกรมของแผ่นควบคุมในขณะที่คุณดำเนินการในโครงการเพื่อหลีกเลี่ยงความประหลาดใจ!

นี่คือรหัสที่สมบูรณ์:

ขอบคุณมากสำหรับการอ่าน!

แนะนำ: