มีมากกว่าหนึ่งปุ่มในพินเดียวกัน


12

ฉันกำลังทำโครงการและฉันใช้ Arduino เป็นเครื่องต้นแบบฉันต้องใช้ปุ่มกด 10 ปุ่ม (รวมถึงสิ่งอื่น ๆ อีกมากมาย) และฉันไม่มีพินเพียงพอ

วิธีแก้ปัญหาอย่างหนึ่งที่ฉันคิดได้ก็คือใช้หมุดแบบแอนะล็อกและใช้ปุ่มเหล่านี้สำหรับปุ่มกดสองปุ่มดังนี้:

แผนผัง

จำลองวงจรนี้ - แผนผังที่สร้างโดยใช้CircuitLab

ด้วยวิธีนี้ฉันสามารถอ่านพิน A0 และรู้ว่าพวกเขากำลังถูกผลักโดยดูว่าแรงดัน 5V หรือครึ่งหนึ่งของสิ่งนั้น

นี่เป็นความคิดที่ดีหรือไม่? ปุ่มกดที่แตกต่างกันไม่ควรถูกผลักในเวลาเดียวกันซึ่งเป็นปัญหาเดียวที่ฉันคิดได้

มีวิธีที่ดีกว่านี้ไหม?


คุณพยายามใช้พินกี่ครั้ง
W5VO

@ W5VO ฉันต้องการ 22, มี 10 ปุ่ม, บอร์ดมีเพียง 18 ... ดังนั้นสองปุ่มสำหรับแต่ละขาอะนาล็อกฉันต้องการ 5 หมุดแบบอะนาล็อกเท่านั้นและคณะกรรมการมี 6
MyUserIsThis

1
เพียงแค่ FYI ผู้ผลิตรถยนต์หลายรายใช้วิธีการเดียวกันสำหรับการควบคุมพวงมาลัยสำหรับระบบเสียง มีปุ่ม (ให้หรือรับ) 8 ปุ่มแต่ละตัวมีตัวต้านทานของตัวเอง สิ่งนี้ช่วยให้พวกเขาเรียกใช้สายเดียว (หรือสายคู่เพื่อรับประกันผลตอบแทนที่สะอาด) จากล้อไปยังหัวเสียง มันเป็นวิธีการที่ดีอย่างสมบูรณ์แบบ
DoxyLover

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

คำตอบ:


22

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

สองวิธีในการทำ หนึ่งอยู่ในอนุกรมอื่น ๆ ขนาน

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

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

นี่คือการควบคุมเสียงของพวงมาลัยรถยนต์ และวิธีการควบคุมอินไลน์ ipod รุ่นเก่าบางรุ่น

ขึ้นอยู่กับตัวต้านทานที่คุณใช้หากคุณต้องการกดปุ่มหลายปุ่มในเวลาเดียวกันและความไวของระบบอนาล็อกของคุณคุณสามารถมีปุ่มทั้ง 10 ปุ่มบนขาเดียว


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

เนื่องจากพื้นฐานการวิเคราะห์เครือข่ายตัวต้านทานของฉันไม่มั่นคงฉันจึงลองใช้ CircuitLab เพื่อจำลองวงจรอนุกรมและดึงตารางความจริงออกมาเพื่อวัดแรงดันไฟฟ้าที่ขาอินพุตอะนาล็อก ฉันพบว่าชุดค่าผสม B2 + B3 ส่งผลให้ 2.499V และชุดค่าผสม B1 + B4 ส่งผลให้เป็น 2.498V ด้วยตัวเลขที่ใกล้เคียงกันฉันคิดว่า ADC 10 บิตทั่วไปจะไม่สามารถแยกความแตกต่างของชุดค่าผสมอินพุตหลายอินพุตได้อย่างถูกต้อง พูดว่าอะไรนะ ? แน่นอนว่าครั้งหนึ่งกุญแจจะทำงานได้อย่างสมบูรณ์แบบไม่ต้องสงสัยเลย หมายเหตุ B1 = ปุ่ม 1
icarus74

จริงๆแล้ว B2 + B4 ให้ 1.666V ในขณะที่ B2 + B3 + B4 ก็ให้ 1.666V ด้วย! วิธีแก้ปัญหาอาจใช้ค่าตัวต้านทานที่แตกต่างกันสำหรับ R1, R2, R3, R4 และไม่เก็บค่าทั้งหมดของ 1K พูดอะไร ?
icarus74

7
บันไดเก่า 2R / R เปลี่ยนปุ่มให้เป็น D / A และการกดปุ่มทุกปุ่มจะมีค่าที่ไม่ซ้ำกัน ฉันเชื่อว่ามันจะใช้งานได้กับปุ่ม N-3 โดยที่ N เป็นความละเอียดของ ADC
Scott Seidman

1
@ icarus74 ใช่โดยใช้ค่าที่แตกต่างแทน 1k ทั้งหมดจะให้ชุดค่าผสมที่ไม่ซ้ำกัน ลอง 1k, 2k, 4k, 8k, 16k, ฯลฯ (หรือ 1k, 4k, 16k, ฯลฯ สำหรับช่วงกว้างขึ้น)
Passerby

10

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

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

นี่คือเมทริกซ์ 2x2 เมทริกซ์ที่มีประโยชน์นั้นใหญ่กว่าเนื่องจากขนาดนี้คุณไม่ได้บันทึกพินใด ๆ

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

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

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


แค่คำถาม. ทำไมจะดีกว่านี้ถ้าฉันต้องการพินเพิ่มเติม วิธีนี้ฉันจะต้องมี 6 พินสำหรับเมทริกซ์ 9x9 บวกอีกหนึ่งพินสำหรับสิบในขณะที่สิ่งที่ฉันทำฉันต้องใช้ 5 พินเท่านั้น
MyUserIsThis

@MyUser ของฉันนี่จะปรับขนาดได้ดีขึ้นเนื่องจากจำนวนสวิตช์ทั้งหมดเพิ่มขึ้น เช่นเมทริกซ์ 5x5 ให้คุณเชื่อมต่อ 25 สวิทช์ถึง 10 พิน ในฐานะที่เป็นความคิดเห็นทั่วไปมากขึ้นการทำสิ่งต่าง ๆ ด้วยวิธีดั้งเดิมทำให้ทั้งสองคนง่ายต่อการเข้าใจสิ่งที่คุณทำ และเพื่อให้คุณรับรู้ว่าวงจรของคนอื่นทำอะไร (เพราะคุณได้ฝึกฝนตัวเองเกี่ยวกับการใช้มาตรฐาน)
Dan เล่นซอโดย Firelight

@MyUserIsThis ดูการแก้ไข Passerby มีคำตอบที่ดีเช่นกัน
Phil Frostst

2

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


2

ใช่ว่าเป็นความคิดที่ดี แต่อย่างไรก็ตามฉันจะเสนอทางเลือกที่เพิ่งมาถึงใจของฉัน

หากคุณมีสิทธิ์เข้าถึงประตูตรรกะคุณสามารถแมปnปุ่มจำนวนมากเพื่อceil(log2(n + 1))ปักหมุดผ่านตรรกะบูลีน ตัวอย่างเช่นถ้าคุณมี 4 ปุ่ม แต่มีเพียง 2 พินเท่านั้นคุณสามารถสร้างการกำหนดค่าดังนี้:

Buttons | Pins
----    | --
0123    | 01
----    | --
0001    | 00
0010    | 01
0100    | 10
1000    | 11

นั่นคือbutton0กดควรมีpin0และpin1ต่ำ; button1, pin0ต่ำและpin1สูง button2, pin0สูงpin1ต่ำ; และbutton3, pin0และpin1สูง

จากนี้นิพจน์บูลีนต่อไปนี้จะเกิดขึ้น

pin0 = button2 OR button3
pin1 = button1 OR button3

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

แน่นอนว่ายังคงมีปัญหาหากกดปุ่มหลายปุ่มพร้อมกัน

นอกจากนี้หากคุณยังคงใช้วิธีตัวต้านทานให้พิจารณาใช้ค่าที่มากกว่าบนตัวต้านทานอื่น ๆ ที่ 100 โอห์มตั้งแต่ 5 V ผ่านตัวต้านทานตามลำดับ 100s โอห์มจะให้กระแสตามลำดับ 10 mA ซึ่งเป็นชนิด ของสูงโดยไม่จำเป็น ฉันเดาว่าค่าที่สมเหตุสมผลจะเป็น 10k Ohm หรือ 47k Ohm


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

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

ตกลง! โชคดีกับโครงการของคุณ!
nijoakim

0

หน้าต่อไปนี้อาจมีประโยชน์:

http://txapuzas.blogspot.co.uk/2010/07/papertecladoanalogico-varios-pulsadores.html

มันเขียนเป็นภาษาสเปน แต่ภาพเขียนนั้นนำเสนอฉันคิดว่ามันเป็นความคิดที่ดีสำหรับคุณ

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

วิดีโอ Youtube: แป้นพิมพ์ 10 ปุ่มบนพินเดียว

นี่คือแผนผังจากเว็บไซต์ด้านบน:

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

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


2
โปรดเพิ่มบทสรุปของลิงก์ที่มีในกรณีที่มันเคยตายโดยเฉพาะเมื่ออยู่ในสเปนและนี่เป็นเว็บไซต์ภาษาอังกฤษ
PeterJ

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

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

ฉันเป็นมือใหม่ในฟอรัมนี้ฉันจะทำให้คุณบอกฉันได้อย่างไร บางส่วนเป็นพิเศษ ... ? ขอบคุณสำหรับเวลาของคุณ
JohnnyDeauville

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