วิธีเชื่อมต่อปุ่ม 16 ปุ่มด้วยสาย 8 เส้นเท่านั้น?


9

นี่คือผลิตภัณฑ์ ฉันเข้าใจความคิด: ปุ่ม 16 เหล่านี้ใช้เมทริกซ์ 4x4 4 สายสำหรับแถว 4 สายสำหรับคอลัมน์และเรามี 8 สาย

ป้อนคำอธิบายรูปภาพที่นี่

แต่:

  1. วิธีนี้สามารถทำงานได้โดยไม่ต้องมัลติเพล็กเซอร์?

  2. สามารถตรวจจับการกดปุ่มหลาย ๆ ปุ่มได้อย่างแม่นยำหรือไม่? แม้ว่าปุ่มจะใช้แถวหรือคอลัมน์เดียวกัน ตัวอย่าง: ปุ่มที่ตำแหน่ง (2,2) (2,3), (3,2) และกด (3,3) ในเวลาเดียวกัน

  3. มันทำงานยังไง?


7
นี่เป็นความรู้ทั่วไปที่คุณจะพบได้จากการค้นหาคำว่า 'แผงปุ่มกดมัลติเพล็กซ์' ของ Google คุณยังไม่ได้ลองก่อนที่จะโพสต์สิ่งนี้?
TonyM

3
@ Tonyony แน่นอนว่าฉันทำการค้นหาจำนวนมากและฉันก็สั่งชิพมัลติเพล็กเซอร์สองสามตัวที่ 74HC164 ที่มาถึงบ้านเมื่อสองสามวันก่อน ฉันกำลังจะวางสายทุกอย่างด้วยชิปมัลติเพล็กเซอร์นี้เมื่อฉันพบสิ่งนี้ ถ้าอย่างนั้นฉันก็สงสัยว่า "จะทำงานได้อย่างไรโดยไม่มีมัลติเพล็กเซอร์"?
Basj

1
อุปกรณ์ทางด้านซ้ายจะต้องมีรหัสการมัลติเพล็กซ์อยู่ข้างใน
Marcelo Espinoza Vargas

3
@ Tonyony ขอบคุณที่ชี้นำฉัน คุณสามารถลิงก์ PDF แทนการสร้างปริศนาได้หรือไม่? บางทีฉันอาจค้นหาด้วยคำหลักอื่นที่ไม่ใช่แป้นกด ฯลฯ และฉันอาจไม่พบสิ่งเดียวกัน
Basj

1
@Basj: การกดหลายครั้งไม่เป็นปัญหา คุณสแกนทั้งสี่บรรทัดทีละบรรทัด หากพบว่ามีการกดปุ่มในบรรทัดที่ 1 คุณจะสังเกตเห็น เมื่อพูดถึงบรรทัดที่ 3 คุณจะพบปุ่มกดอีกอันหนึ่งคุณก็สังเกตเห็นเช่นกัน ในท้ายที่สุดคุณจะได้รับทั้งสองปุ่ม ตราบใดที่คุณสามารถสแกนได้เร็วกว่าที่คนทั่วไปสามารถกดปุ่มคุณจะไม่พลาดมัน
Gábor

คำตอบ:


24
วิธีนี้สามารถทำงานได้โดยไม่ต้องมัลติเพล็กเซอร์?

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

อัลกอริธึมมัลติเพล็กซ์ทำงานได้ดังนี้:

  1. ขับหนึ่งแถวสูงแถวอื่น ๆ ต่ำ

  2. เปิดใช้งาน pulldowns แฝงบนบรรทัดคอลัมน์

  3. ดูว่าบรรทัดคอลัมน์ใดสูง ปุ่มที่จุดตัดของบรรทัดคอลัมน์เหล่านั้นกับหนึ่งแถวที่ถูกยืนยันจะถูกกด ปุ่มอื่น ๆ ในแถวนั้นจะถูกปล่อยออกมา

  4. ทำซ้ำกลับไปที่ขั้นตอนที่หนึ่งยืนยันแถวถัดไปตามลำดับ

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

สามารถตรวจจับการกดปุ่มหลาย ๆ ปุ่มได้อย่างแม่นยำหรือไม่?

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

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


1
ขอบคุณ ถ้าเช่นนั้นการกดหลายครั้งพร้อมกัน? หมายเหตุ: กระดานด้านซ้ายคือ RaspberryPi
Basj

1
@Hayman ทำไมมันเป็นเช่นนั้น? คุณยกตัวอย่างได้ไหม เหตุใด (1,2), (2,2) และ (3,3) ถูกกดในเวลาเดียวกันจึงเกิดปัญหาเมื่อไม่มีไดโอด บางทีคุณอาจมีแผนงานเล็ก ๆ เนื่องจากประเด็นนี้มีความสำคัญจริง ๆ อาจจะคุ้มค่าสำหรับคำตอบเฉพาะ
Basj

8
+1 สำหรับ "กระดานด้านซ้ายดูเหมือนว่ามีโปรเซสเซอร์อยู่" รักที่
Enric Blanco

3
@Basj มันชัดเจนถ้าคุณเล่นกับมัน เมื่อใดก็ตามที่คุณกดปุ่มคุณกำลังเชื่อมต่อแถวกับคอลัมน์ เมื่อใดก็ตามที่เชื่อมต่อแถวและคอลัมน์คีย์ที่จุดตัดจะลงทะเบียนตามที่กด แต่หากกดอย่างน้อย 3 ปุ่มจะสามารถเชื่อมต่อแถวและคอลัมน์ทางอ้อมได้
ฮอบส์

2
@Basj ไปดูรูปนี้ เส้นสีแดงแสดงถึงระดับตรรกะสูง หากคุณกดปุ่ม 3 ตัวที่มีเครื่องหมาย 'x' คุณสามารถติดตามได้และดูเส้นทางที่สัญญาณจะไหล ตอนแรกแถวที่ 1 ถูกเลือกและถูกตั้งค่าสูงโดยการกดปุ่ม 1,1 สิ่งนี้ทำให้คอลัมน์แรกสูง ด้วยการกดปุ่ม 1,2 เราทำให้แถวสูงขึ้น ตอนนี้ถ้าเรากดปุ่มอื่น ๆ ในแถวที่ 2 เราจะทำให้คอลัมน์สูง ปัญหาเกี่ยวกับสิ่งนี้คือμCเป็นใบ้มันรู้ว่ามันตั้งค่าแถว 1 สูงและเห็นค่าสูงในคอลัมน์ 3 ดังนั้นจึงคิดว่าปุ่ม 1,3 สูง
Doodle

9

หากไม่มีไดโอด ... คุณจะได้รูปสี่เหลี่ยมจัตุรัส

ตัวอย่างเช่นในตัวอย่างของคุณ (2,2) (2,3), (3,2) และ (3,3); คุณเลือกตัวอย่างที่น่าขันโดยเลือกสี่เหลี่ยมผืนผ้า หากคุณกดทั้งสี่จริง ๆมันจะทำงาน แต่ถ้าคุณกดปุ่มใด ๆ สามมุมของสี่เหลี่ยมมุมสี่ก็จะปรากฏขึ้นที่จะต้องกดแม้ว่ามันจะไม่ได้

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

อย่างไรก็ตามหากคุณสร้าง S1 ให้เป็นปุ่ม Shift และ S3 เป็นปุ่ม alt-shift ซึ่งผู้ใช้อาจกดค้างไว้ทั้งสองขณะที่กด S13 ด้วยเหตุนี้ S15 ก็จะถูกกดเช่นกัน


1
อันที่จริงแป้นพิมพ์ป้อนข้อมูลส่วนใหญ่ไม่ได้ตั้งใจให้มีการกดครั้งละมากกว่า 2 ปุ่มดังนั้นจึงไม่มีปัญหา คีย์บอร์ดดนตรีเป็นอีกเรื่องหนึ่งซึ่งอาจมีการกดหลายครั้ง ส่วนใหญ่มีไดโอดหรือเดินสายอิสระแต่ละคีย์ แต่ฉันพบคีย์บอร์ดดนตรีหนึ่งอันในร้านขายของมือสอง (ราคาอยู่ที่ 9 ยูโร) ที่ไม่มีการปรับแต่งที่เหมาะสมสำหรับการกดแป้นหลายครั้งพร้อมกับผลลัพธ์ที่คาดเดาไม่ได้และน่ารำคาญ!
Level River St

คีย์สวิตซ์อาจเป็นประเภทที่มีไดโอดในตัวหรืออาจมีไดโอดซ่อนอยู่ข้างใต้
rackandboneman

1

นี่คือวิธีการทำโดยไม่ต้องสแกนอย่างต่อเนื่อง:

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

0

ฉันทำสิ่งนี้ด้วยภาษาแอสเซมบลีบนไมโครคอนโทรลเลอร์ Atmel AVR ที่เปลือยเปล่า
เพื่อความเรียบง่าย: แถวปุ่มกด: ใช้ Arduino Pins 4,5,6 และ 7 (AVR หมุด PD4, PD5, PD6 และ PD7) คอลัมน์ปุ่มกด: ใช้ Arduino Pins 8, 9, 10 และ 11 (AVR หมุด PB0, PB1, PB2 และ PB3 ) สร้างอินพุตพินแถวโดยเปิดใช้งานพูลอัพ ทำให้หมุดของคอลัมน์เป็นศูนย์และส่งออกเป็นศูนย์ เปิดใช้งานการเปลี่ยนการขัดจังหวะบนหมุดและแถวของแถวทั้งหมด http://playground.arduino.cc/Main/PinChangeInterrupt การกดปุ่มบนแป้นกดจะเป็นการดึงหมุดแถวต่ำ รูทีนการขัดจังหวะต้องอ่านพินแถวและค้นหาพินที่ต่ำ 4 บิตบนควรเป็นสามอันและหนึ่งศูนย์ หากคุณใช้ตัวแปร uint8_t 8 บิตคุณสามารถหารด้วย 16 หรือ (var >> 4) เพื่อใส่ 4 บิตในบิตล่างของตัวเลข คุณสามารถใช้บิตหรือ | ด้วย 240 เพื่อตั้งค่าบิตบน 4 เป็น 1 และบิตไม่ใช่การดำเนินการ ~ เพื่อสลับบิตทั้งหมดดังนั้นคุณจะมีชุดบิตเดียวที่แสดงแถวที่กดปุ่มอยู่ เก็บหมายเลขนี้เป็น 0, 1, 2 หรือ 3
สลับการกำหนดค่าหมุด:
ทำอินพุตพินคอลัมน์โดยเปิดใช้งานการดึงขึ้น ทำให้หมุดแถวส่งออกและศูนย์เป็นศูนย์พวกเขา อ่านพินคอลัมน์และค้นหาพินที่ต่ำ ทำการจัดการที่คล้ายกันกับค่านี้ยกเว้นคุณไม่จำเป็นต้องเปลี่ยนตัวเลขไปทางขวา หลังจาก var ^ 240 และ ^ var คุณมีเพียงบิตเดียวเพื่อแสดงคอลัมน์ที่การกดปุ่มเปิดอยู่ อย่าลืมปิดใช้งานการขัดจังหวะก่อนกำหนดค่าพอร์ตใหม่เนื่องจากอาจทำให้เกิดการขัดจังหวะที่ไม่ต้องการ คุณอาจต้องล้างการตั้งค่าสถานะอินเตอร์รัปต์เมื่อออกจากรูทีนการอินเตอร์รัปต์เพื่อป้องกันการจัดการอินเตอร์รัปต์ที่ซ้ำกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.