สารบัญ:

โอสุ! แป้นพิมพ์: 8 ขั้นตอน (พร้อมรูปภาพ)
โอสุ! แป้นพิมพ์: 8 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: โอสุ! แป้นพิมพ์: 8 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: โอสุ! แป้นพิมพ์: 8 ขั้นตอน (พร้อมรูปภาพ)
วีดีโอ: วิธีตั้งค่ารูปภาพบนคีย์บอร์ด [Android & Ios] 2023 || เพิ่มรูปภาพบนแป้นพิมพ์ใน Samsung M62 2024, กรกฎาคม
Anonim
โอสุ! แป้นพิมพ์
โอสุ! แป้นพิมพ์

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

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

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

หมายเหตุ 2: ฉันได้อัปเดตรหัสหลายครั้งและตอนนี้เป็นเวอร์ชัน 3ish ฉันจะปล่อยให้รหัสออนไลน์ทั้งหมด แต่ฉันแนะนำให้คุณใช้เวอร์ชันล่าสุด ขณะนี้ยังไม่มีฟังก์ชันนำ แต่ควรเป็นฟังก์ชันที่มีประสิทธิภาพดีที่สุด

ขั้นตอนที่ 1: วัสดุและคำอธิบาย

วัสดุและคำอธิบาย
วัสดุและคำอธิบาย

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

1 Arduino pro micro + สาย USB

3 Kailh BOX สวิตช์สีแดง

ตัวต้านทาน 3 10k (0805 SMD)

ตัวเก็บประจุ 3 100nF (0805 SMD)

4 APA102 rgb LED (5050 SMD)

3 คีย์แคป

1 แผงวงจรพิมพ์ (PCB) ที่มีให้ในโครงการนี้

มีเคสพิมพ์ 3 มิติ 1 ใบในโครงการนี้

เหตุใดฉันจึงใช้ Arduino pro micro

บอร์ด Arduino ส่วนใหญ่เช่น Uno (Atmega328) ไม่มีการรองรับการสื่อสารผ่าน USB ใช่ คุณสามารถตั้งโปรแกรมผ่าน USB ได้ง่ายมาก และฉันคิดว่ามีวิธีแก้ไขปัญหาชั่วคราว แต่ฉันชอบที่จะทำให้การสื่อสารผ่าน USB เป็นเรื่องง่าย และฉันไม่รู้ว่าวิธีแก้ปัญหานั้นตอบสนองหรือไม่ บอร์ดเหล่านั้นใช้ชิปภายนอกเพื่อให้การสื่อสารผ่าน USB เป็นไปได้ในขณะที่ Arduino pro micro (Atmega32U4) มีมาให้

สวิตช์

มีสวิตช์เชิงกลมากมายที่คุณสามารถใช้ได้ เชิงเส้น สัมผัส หรือคลิกจาก Kailh หรือ Cherry MX เลือกเอาตามใจชอบ ฉันใช้สวิตช์ Kailh เพราะราคาถูกใน Ailexpress หากคุณเลือกใช้ PCB คุณจะต้องใช้สวิตช์ Kailh BOX สีเป็นตัวกำหนดความรู้สึก

ชิ้นส่วนอิเล็กทรอนิกส์

ไม่มีอะไรจะอธิบายมากนักในบทนี้ แต่ถ้าคุณไม่ได้ใช้ PCB ผมขอแนะนำส่วนประกอบรูรางแบบธรรมดาเพื่อให้บัดกรีได้ง่าย น่าเสียดายที่ไฟ LED ที่ใช้ไม่มีในแพ็คเกจรูราง ฉันจะไม่แนะนำให้ใช้สายไฟกับแพ็คเกจ SMD เว้นแต่คุณจะมั่นใจในทักษะการบัดกรีของคุณมาก แม้แต่สำหรับ SMD บน PCB "ขั้นสูง" ก็จำเป็นต้องมีทักษะการบัดกรี

ที่อยู่อาศัย

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

ขั้นตอนที่ 2: แผนผัง

แผนผัง
แผนผัง

แผนผังสำหรับโครงการนี้ค่อนข้างง่าย แต่ฉันต้องการอธิบายองค์ประกอบสำหรับผู้ที่มีความสนใจและไม่ทราบการใช้งานนี้

สลับการเชื่อมต่อกับ Arduino

สวิตช์เชื่อมต่อกับพิน Arduino 0, 2 และ 3 เนื่องจากพินเหล่านั้นสามารถใช้เป็นอินเตอร์รัปต์ภายนอกได้ มีการอธิบายเพิ่มเติมในส่วนรหัส

วงจรอุบาทว์

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

ดูการจำลองนี้ก่อนเพื่อวาดภาพแรก (คลิกสวิตช์อย่างรวดเร็วและดูสัญญาณด้านล่าง)

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

วงจร debounce นี้จะทำให้ขอบที่ตกลงมาของสัญญาณช้าลง สัญญาณที่ส่งไปยัง Arduino จะไม่สามารถเปลี่ยนแปลงได้เร็วเท่าที่เกิดการตีกลับ ดังนั้นจะอ่านได้เพียงกดครั้งเดียว ไม่ต้องกังวลว่ามันจะช้าลงสำหรับการกดจริงครั้งต่อไปเพราะมันจะทำให้

ขั้นสูง:

Atmaga32U4 อ่านค่าต่ำสุดแบบดิจิตอลที่ 0.2Vcc - 0.1V = 0.9 โวลต์ แรงดันไฟฟ้าของตัวเก็บประจุเมื่อใดก็ได้ในการคายประจุคือ Vcc * e^(-t/RC) หากคุณวัดเวลาดีบักที่แตกต่างกันบนสวิตช์ คุณสามารถคำนวณค่าตัวต้านทานและตัวเก็บประจุได้

แบบฟอร์มสูตร

LEDs

ไฟ LED rgb เป็นไฟ LED APA102 ซึ่งระบุตำแหน่งแยกกันได้โดยใช้นาฬิกาและสายข้อมูล ไม่จำเป็นต้องใช้ส่วนประกอบภายนอกเพื่อให้ทำงานได้ สำหรับ LED หลายๆ ดวง คุณควรใช้ตัวเก็บประจุขนานกับ 5 โวลต์และกราวด์ แต่ด้วย LED เพียง 4 ดวง คุณไม่จำเป็นต้องใช้

ขั้นตอนที่ 3: การออกแบบบอร์ด

การออกแบบบอร์ด
การออกแบบบอร์ด

PCB ได้รับการออกแบบใน JLCPCB ฉันไม่ได้รับการสนับสนุนจากพวกเขา แต่สำหรับต้นแบบราคาถูกพวกเขาสร้าง PCB ที่ยอดเยี่ยม สำหรับ 2 ดอลลาร์ คุณจะได้ 10 กระดานเดียวกัน แต่ค่าขนส่งประมาณ 11 ดอลลาร์สำหรับฉัน หากคุณไม่ต้องการไฟ rgb โดยไม่จำเป็นและวางแผนที่จะสร้างเพียงอันเดียว คุณควรพิจารณาสร้างคีย์บอร์ดของคุณโดยไม่ใช้ PCB

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

หากต้องการสั่งซื้อ PCB ให้ไปที่ https://jlcpcb.com/ แล้วเลือกตัวเลือก 2 ชั้น มันจะขอไฟล์ Gerber จากคุณ ดาวน์โหลดไฟล์ ".zip" แล้วลากไปที่หน้าต่าง คุณไม่จำเป็นต้องเปิดเครื่องรูด การตั้งค่าควรจะใช้ได้ และคุณสามารถดำเนินการสั่งซื้อให้เสร็จสิ้นได้

ขั้นตอนที่ 4: เคล็ดลับในการออกแบบและประกอบเคส

เคล็ดลับการออกแบบและประกอบเคส
เคล็ดลับการออกแบบและประกอบเคส
เคล็ดลับการออกแบบและประกอบเคส
เคล็ดลับการออกแบบและประกอบเคส
เคล็ดลับการออกแบบและประกอบเคส
เคล็ดลับการออกแบบและประกอบเคส
เคล็ดลับการออกแบบและประกอบเคส
เคล็ดลับการออกแบบและประกอบเคส

ออกแบบ

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

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

การประกอบ

ตอนนี้คุณมีส่วนประกอบทั้งหมดที่จำเป็นในการประกอบแล้ว มีคำสั่งให้ประกอบรุ่นแรกนี้เพราะสวิทช์บัดกรี

1. ประสานส่วนประกอบ SMD เหล่านี้คือตัวต้านทาน ตัวเก็บประจุ และไฟ LED

2. ประสาน Arduino pro micro

3. วางสวิตช์ 3 ตัวในแผ่นปิดที่พิมพ์ 3 มิติก่อนทำการบัดกรี ไม่สามารถถอดฝาครอบออกได้หลังจากบัดกรีสวิตช์แล้ว ไม่แนะนำให้ถอดสวิตช์ออกและอาจทำลายสวิตช์ได้

4. ตอนนี้ประสานสวิตช์เข้าที่ ทำเช่นนี้โดยเร็วที่สุดเนื่องจากสวิตช์พลาสติกสามารถละลายและทำลายได้ หรือลดจำนวนการคลิกลงอย่างมาก

5. วางแผ่นปิดที่ประกอบแล้วไว้ในเคสที่พิมพ์ 3 มิติ และยึดด้วยเทปหรือใช้สลักเกลียวหากไม่ไปยุ่งกับคีย์แคป

6. วางคีย์แคปบนสวิตช์แล้วเสร็จ

คำแนะนำ

Desolder หรือปิดบัง LED บน Arduino หลังจากอัปโหลดรหัสของคุณ ไฟ LED จะดีมากหากโค้ดของคุณไม่อัปโหลดแต่ดูไม่ดีหากมองว่าเป็นผลิตภัณฑ์สำเร็จรูป ต้องใช้ทักษะและแหนบแหลม

ขาตั้งกริปที่ด้านล่างยังดีสำหรับการกันลื่นและปล่อยให้แสง rgb ส่องผ่านได้

ขั้นตอนที่ 5: The Code V1 (ฮาร์ดแวร์ Debounce)

The Code V1 (ฮาร์ดแวร์ Debounce)
The Code V1 (ฮาร์ดแวร์ Debounce)
The Code V1 (ฮาร์ดแวร์ Debounce)
The Code V1 (ฮาร์ดแวร์ Debounce)

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

กำลังอัปโหลดรหัส

ก่อนอื่นให้ดาวน์โหลดไฟล์ ".ino" ทั้ง 3 ไฟล์แล้วใส่ไว้ในโฟลเดอร์เดียว หากคุณไม่มี Arduino IDE เพียงดาวน์โหลดฟรีบนเว็บไซต์ทางการของ Arduino

เชื่อมต่อ Arduino ของคุณกับพีซีและเปิด "OSU_Keyboard_code_V1.ino" ใน Tools Board เลือก "Arduino/Genuino Micro" นอกจากนี้ในเครื่องมือให้เลือกพอร์ต COM ที่เหมาะสม สิ่งนี้สามารถเปลี่ยนแปลงได้ในบางครั้ง ในการอัปโหลดโค้ดไปยัง Arduino ของคุณ เพียงคลิกที่ลูกศรที่ด้านบนซ้ายของหน้าจอ และรอจนกว่าจะบอกคุณว่ามันเสร็จสมบูรณ์ที่ด้านล่างซ้าย

OSU_Keyboard_code_V1

รวมถึงและกำหนด

ขั้นแรกคุณต้องรวมไลบรารีของคีย์บอร์ด ทำให้สามารถใช้ Arduino เป็นคีย์บอร์ดได้

ต่อไปฉันกำหนดค่าบางอย่าง การกำหนดก็เหมือนกับตัวแปร แต่ไม่สามารถเปลี่ยนแปลงได้ในขณะที่โปรแกรมกำลังทำงาน 9 ตัวแรกเป็นอักขระบนแป้นพิมพ์ หมายเลขพิน Arduino และบิตพอร์ต

จากนั้นบิตพอร์ตของข้อมูล LED และนาฬิกา

นอกจากนี้ยังมีการกำหนดจำนวนไฟ LED และตัวแปรสำหรับมุมของวงล้อสี

ติดตั้ง

โค้ดส่วนนี้จะดำเนินการเพียงครั้งเดียวเมื่อเสียบปลั๊ก Arduino

อันดับแรก หมุดนาฬิกาและข้อมูลของ LED จะถูกตั้งค่าเป็นเอาต์พุต และหมุดสวิตช์เป็นอินพุต นี่เป็นเวอร์ชันขั้นสูงของ pinMode() หากคุณสนใจค้นหา "การจัดการพอร์ตโดยตรง"

Keyboard.begin() เพียงแค่เริ่มการเชื่อมต่อ usb เป็นคีย์บอร์ด

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

ห่วง

ส่วนนี้จะทำซ้ำอย่างต่อเนื่องในขณะที่ขับเคลื่อน Arduino

ฉันใช้เพื่อเปลี่ยนและอัปเดตสีของไฟ LED เท่านั้น

อินเตอร์รัปต์

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

ก่อนอื่นจะตรวจสอบว่ามีการกดหรือปล่อยปุ่มและส่งคำสั่งแป้นพิมพ์ที่ถูกต้องหรือไม่

LED (อธิบายในลำดับอื่น)

หากคุณสงสัยว่า LED ถูกควบคุมอย่างไร คุณควรดูที่แผ่นข้อมูล APA102

OneBit

นี่เป็นอีกครั้งเวอร์ชันการจัดการพอร์ตโดยตรงของการเขียนดิจิทัล

ขั้นแรกตรวจสอบว่าควรส่ง 0 หรือ 1 และดึงข้อมูลพินข้อมูลต่ำหรือสูงตามลำดับ จากนั้นจึงเขียนเข็มนาฬิกาให้สูงสั้นมากและเขียนต่ำอีกครั้ง

OneByte

ทำซ้ำ oneBit 8 ครั้งด้วยลูป "for" มันอ่านบิตแรกเป็นไบต์และส่งค่าไปยังฟังก์ชัน oneBit และทำเช่นเดียวกันสำหรับ 7 บิตถัดไป

LedData

การดำเนินการนี้ซ้ำ oneByte 4 ครั้งเพื่อให้ข้อมูลที่จำเป็นสำหรับหนึ่ง led ไบต์แรกเริ่มต้นด้วย 111xxxxx และค่าความสว่าง 5 บิตแทนที่ xxxxx ความสว่างสามารถตั้งค่าได้ตั้งแต่ 0 ถึง 31 (2^5 = 32 ระดับ)

3 ไบต์ถัดไปใช้สำหรับค่าสีน้ำเงิน สีเขียว และสีแดง หนึ่งไบต์สำหรับแต่ละสี

ColorWheelThisLed

ฟังก์ชันนี้เรียก ledData ให้สี rgb ขึ้นอยู่กับมุมในวงล้อสี

ค่า 16 บิตเป็นการปันผลใน 6 ส่วนที่มีระยะห่างเท่ากัน 60 องศา การดูภาพอาจช่วยให้คุณเข้าใจได้ดีขึ้น

(มีเวอร์ชัน 8 บิตให้ด้วย แต่แสดงความคิดเห็นเพราะมันกะพริบเกินไป)

StartEndFrame

ต้องใช้เฟรมเริ่มต้นทุกครั้งที่คุณต้องการส่งสีใหม่ไปยังไฟ LED และต้องการอัปเดตสีจริงของไฟ LED

ฉันใช้เฟรมเริ่มต้นเท่านั้นเพราะไม่ต้องการเฟรมสุดท้าย เฟรมเริ่มต้นคือ 4 ไบต์ 0 เฟรมสุดท้ายคือ 4 ไบต์ 255 (11111111)

ขั้นตอนที่ 6: The Code V2 (ซอฟต์แวร์ Debounce With Timers)

The Code V2 (ซอฟต์แวร์ Debounce ด้วยตัวจับเวลา)
The Code V2 (ซอฟต์แวร์ Debounce ด้วยตัวจับเวลา)

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

ฉันจะไม่อธิบายโค้ดอย่างละเอียดเท่าเวอร์ชันก่อนหน้า เพราะมันอธิบายยากขึ้นเล็กน้อย

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

ข้อเสียเพียงอย่างเดียวที่ฉันทำได้คือไม่สามารถใช้ฟังก์ชั่นการหน่วงเวลาของ Arduino ได้อีกต่อไป เนื่องจากฟังก์ชั่นการหน่วงเวลาใช้ Timer 0 และโปรแกรมนี้ใช้ Timer 0 เพื่อ debounce

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

ขั้นตอนที่ 7: The Code V3 (ซอฟต์แวร์ Debounce ด้วย Vertical Counter) (แนะนำ) (ไม่มี LED)

The Code V3 (ซอฟต์แวร์ Debounce ด้วย Vertical Counter) (แนะนำ) (ไม่มี LED)
The Code V3 (ซอฟต์แวร์ Debounce ด้วย Vertical Counter) (แนะนำ) (ไม่มี LED)

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

ฉันยังประสบปัญหาการกดที่ไม่ได้ลงทะเบียนในรหัส V2 ฉันคิดว่าโค้ดนั้นซับซ้อนเกินไปด้วยตัวจับเวลาและการขัดจังหวะภายนอก และฉันอาจพลาดข้อยกเว้นบางประการ ด้วยเหตุผลนี้ ฉันจึงเริ่มต้นใหม่โดยค้นหาวิธีดีบักซอฟต์แวร์บนอินเทอร์เน็ต

(บอกตรงๆ ว่าตอนนี้โปรเจ็กต์นี้อย่างน้อยครึ่งหนึ่งกลายเป็นปุ่มที่เสียไปแล้วในตอนนี้)

หลังจากค้นหาฉันก็เจอโพสต์นี้:

www.compuphase.com/electronics/deboucing….

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

คำอธิบายของฉัน

ไดอะแกรมเวลา (สร้างใน WaveDrom) ที่ฉันเพิ่มเข้าไปควรทำให้บิตคณิตศาสตร์นี้เข้าใจยากอย่างน้อยก็เข้าใจง่ายขึ้นเล็กน้อย โปรดทราบว่ารูปภาพมีตัวนับ 2 บิต แต่รหัสของฉันมี 3 ตัว ซึ่งหมายความว่าเวลาดีบักจะนานขึ้น

หนึ่งบิตต่อค่า

ด้วยการใช้งานตัวนับแนวตั้ง เป็นไปได้ที่จะดีบักปุ่มหลายปุ่มพร้อมกันแบบขนาน ค่าทั้งหมดเป็นประเภท Byte(uint8_t) และประกอบด้วย 8 บิต เราไม่ได้สนใจว่าค่าใดของไบต์เหล่านี้มีอยู่ แต่เราสนใจในบิตของตัวเองมากกว่า ทุกปุ่มที่จะ debounced จะใช้เพียงหนึ่งบิตของแต่ละไบต์ ปุ่มแรกใช้เฉพาะบิตแรกของแต่ละไบต์ ปุ่มที่สองใช้บิตที่สอง เป็นต้น

ในเวลาเดียวกัน

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

ด้วยชนิดข้อมูล 8 บิต จึงสามารถทำเช่นนี้ได้สำหรับปุ่ม 8 ปุ่ม การใช้ประเภทข้อมูลที่มีขนาดใหญ่ขึ้นจะช่วยให้เกิดการดีบักซ์ได้มากขึ้นในคราวเดียว

การดีเบต

รูทีน debounce จะดำเนินการทุกๆ 1 มิลลิวินาทีโดยมีการขัดจังหวะตัวจับเวลา

เมื่อกดปุ่มนั้น buttonState ซึ่งเป็นสถานะ debounced จะลดต่ำลง แสดงว่ามีการกดปุ่ม เพื่อตรวจจับการคลายปุ่มจะต้องอยู่สูงเป็นเวลานานเพียงพอ แสดงว่าไม่ได้ตีกลับในช่วงระยะเวลาหนึ่ง Toggle ใช้เพื่อระบุการเปลี่ยนแปลงปุ่ม บิตตัวนับใช้สำหรับ…. นับว่าไม่มีเด้งมานานแค่ไหน

เดลต้าบ่งชี้ความแตกต่างระหว่างอินพุตและสถานะที่ถูกดีบัก เฉพาะเมื่อมีความแตกต่างเคาน์เตอร์จะนับ ตัวนับจะถูกรีเซ็ตเมื่อตรวจพบการตีกลับ (เดลต้าคือ 0)

ขั้นตอนที่ 8: ผลลัพธ์

Image
Image

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

การกล่าวถึง V2 ก่อนหน้านี้ไม่ได้หมายถึงสัญญา ดังนั้นอย่าเลื่อนโปรเจ็กต์นี้ออกไปเพราะคุณต้องการรอ V2

ฉันหวังว่าคุณจะสนุกกับคีย์บอร์ดของคุณ!

โอสุ! ชื่อ: Thomazzz3

การแก้ไขปัญหา

หากคุณคิดว่าแป้นพิมพ์ของคุณมีปัญหา ให้เปิดโปรแกรมแก้ไขข้อความก่อนแล้วกดแต่ละแป้นหนึ่งครั้งเป็นเวลาสั้นๆ

หนึ่งหรือหลายปุ่มไม่ทำงาน?

เป็นไปได้ว่าคุณทำลายสวิตช์ภายในขณะบัดกรี หากคุณมีมัลติมิเตอร์ ให้เปิดเครื่องแบบต่อเนื่อง/ส่งเสียงบี๊บ ให้วางขนานกับสวิตช์ในขณะที่ไม่ได้เชื่อมต่อ Arduino แล้วกดปุ่ม มันควรจะส่งเสียงบี๊บ

อักขระที่คุณเพิ่งพิมพ์ตรงกับคีย์ที่คุณกำหนดค่าใน Osu! ?

เปลี่ยนอักขระในรหัส Arduino ใน 3 #Defines แรก (' ' จำเป็น!)

หรือเปลี่ยน Osu ของคุณ! การตั้งค่าเพื่อใช้คีย์ที่กำหนดค่าไว้

คีย์หนึ่งหรือหลายปุ่มมีการทำซ้ำสองสามครั้งหรือไม่?

วงจร debounce ไม่เหมาะสมกับสวิตช์ของคุณหรือบัดกรีไม่ถูกต้อง ตรวจสอบการเชื่อมต่อบัดกรีของคุณ หากยังคงเกิดขึ้น ให้ลองใช้ค่าตัวเก็บประจุที่ 1uF นี่จะเป็นเรื่องยากมากสำหรับผู้ใช้ PCB

หากคุณกำลังมีปัญหากับ LED ของคุณ

ไฟ LED กะพริบหรือไม่?

การเชื่อมประสานอาจหลวม หากคุณใช้ PCB ให้ยืนยันว่าดีบุกบัดกรีไหลบนแผ่นที่พิมพ์จริงๆ

ไม่มีไฟ LED ใดทำงานหรือจาก LED จำนวนหนึ่งหยุดทำงาน

ตรวจสอบการลัดวงจรระหว่างส่วนเชื่อมต่อของ LED ตัวแรก (ติดตามแทร็ก) และตรวจสอบดีบุกที่เชื่อมต่ออย่างดีบนเอาต์พุตของ Arduino และ LED ตัวแรกอีกครั้ง หากยืนยันว่าถูกต้องและยังมีข้อบกพร่องอยู่ คุณอาจต้องเปลี่ยน LED ดวงแรก

หากวิธีนี้แก้ไขได้ จะทำซ้ำสำหรับ LED ถัดไปหากจำเป็น

แนะนำ: