Lebih dari satu tombol di pin yang sama

12

Saya sedang melakukan beberapa proyek dan saya menggunakan Arduino untuk prototipe, saya harus menggunakan 10 tombol (bersama dengan lebih banyak hal) dan saya tidak memiliki cukup pin.

Salah satu solusi yang dapat saya pikirkan adalah dengan menggunakan pin analog dan menggunakan masing-masing untuk dua tombol, seperti ini:

skema

mensimulasikan rangkaian ini - Skema dibuat menggunakan CircuitLab

Dengan begitu saya bisa membaca pin A0 dan tahu yang mana dari mereka didorong dengan melihat apakah tegangannya 5V atau setengahnya.

Apakah ini ide yang bagus? Berbagai tombol yang ditekan TIDAK PERNAH seharusnya didorong pada saat bersamaan, yang merupakan satu-satunya masalah yang dapat saya pikirkan.

Apakah ada cara yang lebih baik?

MyUserIsThis
sumber
Berapa pin yang Anda coba gunakan?
W5VO
@ W5VO Saya akan membutuhkan 22, dengan 10 tombol, papan hanya memiliki 18 ... jadi dua tombol untuk setiap pin analog saya hanya perlu 5 pin analog dan papan memiliki 6.
MyUserIsThis
1
Hanya FYI, banyak produsen mobil menggunakan pendekatan yang sama untuk kontrol yang dipasang di roda kemudi untuk sistem audio. Mereka memiliki (memberi atau menerima) 8 tombol, masing-masing dengan resistornya sendiri. Ini memungkinkan mereka menjalankan satu kawat (atau sepasang kabel untuk menjamin pengembalian yang bersih) dari roda ke kepala audio. Ini adalah pendekatan yang sangat baik.
DoxyLover
Saya percaya Anda benar-benar dapat menggunakan tiga pin untuk memasukkan secara teoritis jumlah switch yang tidak terbatas menggunakan beberapa register geser. Dimungkinkan juga untuk menggunakan 8 pin untuk memasukkan 256 switch menggunakan multiplexer.
Alvin Wong

Jawaban:

22

Mengapa membuang beberapa pin analog untuk masing-masing dua sakelar, ketika Anda bisa melakukan sejumlah tombol pada pin analog tunggal?

Dua cara melakukannya. Satu dalam seri, lainnya paralel.

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Ini adalah bagaimana beberapa kontrol audio setir mobil. Dan bagaimana beberapa pengendali inline ipod yang lebih lama bekerja.

Bergantung pada resistor yang Anda gunakan, jika Anda perlu menekan beberapa tombol secara bersamaan, dan seberapa sensitif analog Anda, Anda dapat memiliki semua 10 tombol pada satu pin.

Pejalan kaki
sumber
Terima kasih, saya juga memikirkan hal ini, tetapi juga berpikir bahwa mungkin pembacaan tegangan tidak setepat yang saya butuhkan agar dapat mengandalkan metode ini. Saya akan mencoba ini juga dan melihat cara kerjanya.
MyUserIsThis
Karena fundamental analisis jaringan resistor saya tidak cukup solid, saya mencoba menggunakan CircuitLab untuk mensimulasikan rangkaian seri, dan menarik tabel kebenaran, untuk mengukur tegangan pada pin input analog. Saya menemukan bahwa, kombinasi B2 + B3 menghasilkan 2.499V dan kombinasi B1 + B4 menghasilkan 2.498V. Dengan angka sedekat itu, saya pikir ADC 10-bit yang khas tidak akan dapat membedakan kombinasi multi-input dengan benar. Apa yang kamu katakan ? Tentu saja, satu kunci pada suatu waktu, akan bekerja dengan sempurna - tidak diragukan lagi. Catatan B1 = Tombol1.
icarus74
Sebenarnya, B2 + B4 menghasilkan 1.666V, sementara B2 + B3 + B4 juga menghasilkan 1.666V! Solusinya mungkin menggunakan nilai resistor yang berbeda untuk R1, R2, R3, R4 dan tidak menyimpan semuanya dengan 1K. Apa yang dikatakan ?
icarus74
7
Tangga 2R / R tua mengubah tombol menjadi D / A, dan setiap kombo penekanan tombol akan memiliki nilai unik. Saya percaya ini akan bekerja dengan tombol N-3, di mana N adalah resolusi ADC
Scott Seidman
1
@ icarus74 ya, menggunakan nilai yang berbeda dan bukan semua 1k, akan memberikan kombinasi unik. Coba 1k, 2k, 4k, 8k, 16k, dll (Atau 1k, 4k, 16k, dll, untuk rentang yang lebih luas)
Pejalan kaki
10

Itu akan berhasil, tetapi cara yang lebih baik adalah dengan matriks . Ini adalah konsep yang sama dengan LED multiplexing dengan matriks, tetapi dengan sakelar.

masukkan deskripsi gambar di sini

Ini adalah matriks 2x2. Matriks yang berguna lebih besar, karena pada ukuran ini, Anda tidak menyimpan pin apa pun dari menghubungkan switch secara individual.

Dengan matriks 3x3 Anda bisa mendapatkan 9 switch. Anda memerlukan 10, sehingga Anda dapat menambahkan satu baris atau satu kolom lagi dan mendukung 12 switch, atau cukup meletakkan switch ke-10 pada pinnya sendiri.

Keuntungannya di sini adalah Anda dapat menggunakan IO digital, yang lebih murah dan biasanya lebih banyak daripada IO analog. Daftar shift adalah cara murah untuk menambahkan lebih digital IO, jika Anda kehabisan.

Jika Anda menginginkan pin yang lebih sedikit lagi, Anda dapat, untuk beberapa peningkatan kompleksitas, menggunakan charlieplexing . Anda harus menambahkan dioda sebagai tambahan untuk sakelar Anda, dan dioda ini mungkin berharga sebanyak register geser. Namun, jika biaya bukan urusan utama Anda, maka itu mungkin memiliki beberapa keuntungan. Dengan metode ini, Anda bisa membaca semua switch Anda (hingga 12, sebenarnya) dengan empat pin.

Phil Frost
sumber
Hanya sebuah pertanyaan. Mengapa ini lebih baik jika saya membutuhkan lebih banyak pin? Dengan cara ini saya akan membutuhkan 6 pin untuk matriks 9x9 ditambah satu pin lagi untuk yang kesepuluh, sementara dalam apa yang saya buat, saya hanya perlu 5 pin.
MyUserIsThis
@MyUserIsThis ini berskala lebih baik karena jumlah total switch naik. ex a 5x5 matrix memungkinkan Anda menghubungkan 25 switch ke 10 pin. Sebagai komentar yang lebih umum, melakukan hal-hal dengan cara konvensional keduanya memudahkan orang lain untuk memahami apa yang telah Anda lakukan; dan agar Anda mengenali apa yang dilakukan sirkuit orang lain (karena Anda telah melatih diri sendiri tentang penerapan standar).
Dan is Fiddling oleh Firelight
@MyUserIsIni lihat suntingan. Pejalan kaki memiliki jawaban yang bagus juga.
Phil Frost
2

Input analog adalah pendekatan yang valid, Anda harus dapat memiliki beberapa tombol di atasnya. Saya juga ingin menyarankan menggunakan chip IO Expander seperti MCP23017 . Ini memiliki 16 pin yang dapat menjadi input adalah output dan dikontrol dengan I2C menggunakan dua pin. Adafruit memiliki perpustakaan Arduino untuk itu.

BrianK
sumber
2

Ya, itu sepertinya ide yang bagus, tetapi saya akan mengusulkan alternatif yang baru saja muncul di benak saya.

Jika Anda memiliki akses ke gerbang logika, Anda bisa memetakan banyak ntombol ke ceil(log2(n + 1))pin melalui logika boolean. Sebagai contoh, jika Anda memiliki 4 tombol, tetapi hanya 2 pin Anda dapat membuat konfigurasi seperti ini:

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

Artinya, button0harus ditekan pin0dan pin1rendah; button1, pin0rendah dan pin1tinggi; button2, pin0tinggi pin1rendah; dan button3, pin0dan pin1tinggi.

Dari sini ekspresi boolean berikut akan muncul

pin0 = button2 OR button3
pin1 = button1 OR button3

Dengan demikian pemetaan 4 tombol menjadi 2 pin dapat direalisasikan hanya dengan 2 gerbang OR. Anda akan memerlukan pin tambahan dan beberapa logika tambahan, untuk menunjukkan apakah ada tombol yang ditekan.

Tentu saja, masih akan ada masalah jika beberapa tombol ditekan secara bersamaan.

Juga, jika Anda masih akan pergi dengan pendekatan resistor, pertimbangkan untuk menggunakan nilai yang lebih besar pada resistor lain yang 100 ohm sejak 5 V melalui resistor pada urutan 100-an ohm akan menghasilkan arus pada urutan 10-an mA yang merupakan jenis dari tinggi yang tidak perlu. Saya kira nilai yang lebih masuk akal adalah 10k Ohm atau 47k Ohm.

nijoakim
sumber
Terima kasih atas pendekatan Anda. Saya juga memikirkan sesuatu seperti itu, tapi saya tidak punya gerbang logika dan saya punya banyak resistor. Dan ya saya biasanya menggunakan 10k resistor untuk ini, 100 ohm hanya nilai default dari editor rangkaian. Sekali lagi terima kasih atas bantuannya.
MyUserIsThis
Saya pikir saya akhirnya akan menggunakan pendekatan resistor, karena saya tidak perlu membeli gerbang logika, ditambah pendekatan logika Anda menghemat hanya 1 pin dan saya tidak membutuhkannya. Saya akan memikirkan ini untuk proyek yang lebih besar. Terima kasih banyak.
MyUserIsThis
Baik! Semoga berhasil dengan proyek Anda!
nijoakim
0

Halaman berikut mungkin bermanfaat:

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

Itu ditulis dalam bahasa Spanyol, tetapi esensi digambarkan, saya pikir itu ide yang sangat bagus untuk Anda.

Pada video ini Anda dapat melihat hasil akhirnya, sketsanya ada di halaman juga, dienkapsulasi fungsinya untuk memudahkan implementasi proyek Anda

Video Youtube: 10 tombol keyboard pada satu pin

Berikut ini skema dari situs di atas:

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

JohnnyDeauville
sumber
2
Harap tambahkan ringkasan dari apa yang terkandung dalam tautan itu jika ia mati, terutama ketika itu dalam bahasa Spanyol dan ini adalah situs berbahasa Inggris.
PeterJ
Maaf, mungkin situasi biasanya di Spanyol adalah normal untuk merujuk publikasi bahasa Inggris ... Tetapi tautannya sangat menarik, mengatakan bagaimana membuat 10 tombol keyboard menggunakan hanya satu pin dengan deskripsi foto langkah-demi-langkah, diagram untuk membuat papan dan gambar untuk membuat sampul tombol. Juga kode untuk mengelola keyboard, mudah dimengerti. Bagus berkembang saya pikir.
JohnnyDeauville
Ini bukan hanya masalah sisi Spanyol, saya setuju diagramnya jelas, terlihat bagus dan saya bisa menyelesaikannya berdasarkan itu saja. Tetapi Stack Exchange mengecilkan tautan hanya jawaban karena mereka tidak berguna jika tautan itu mati, bayangkan jika blog itu ditutup / dihapus besok seberapa bermanfaat jawabannya. Mungkin Anda bisa memasukkan skematis dan satu atau dua kalimat tentang hal itu dan biarkan saja tautannya sebagai referensi untuk informasi lebih lanjut.
PeterJ
Saya pemula di forum ini, bagaimana saya bisa membuat Anda memberi tahu saya? Beberapa bagian khusus ...? Terima kasih atas waktu Anda
JohnnyDeauville
Saya baru saja memasukkan skematis dan referensi dari mana asalnya, tetapi mungkin juga layak menerjemahkan sedikit lebih banyak halaman untuk memberikan beberapa konteks cara kerjanya dan apa bacaan ADC nantinya.
PeterJ