Membuat papan catur elektronik

14

Saya ingin membuat papan catur dari kayu yang dapat Anda mainkan dengan potongan-potongan reguler (yaitu, bukan potongan yang dimodifikasi yang menggunakan kode RFID, magnet, ...), tetapi itu terhubung ke perangkat lunak yang memperhatikan gerakan saya dan bertindak sebagai pemain kedua.

Saya telah berpikir tentang cara mendeteksi potongan-potongan di papan tulis, dan saya telah membuat keputusan bahwa saya tidak perlu mengenali bagian mana itu: "Kebenaran" ada di dalam perangkat lunak, jadi jika saya memindahkan potongan dari A ke B , perangkat lunak dapat mengetahui bagian mana yang dipindahkan

Jadi, saya punya ide untuk mengebor dua lubang ke setiap bidang papan catur, satu di tengah, dan satu di sudut kanan atas:

  • Yang di tengah akan digunakan untuk sensor kecerahan untuk mendeteksi apakah ada yang berdiri di lapangan atau tidak.
  • Yang di sudut akan digunakan untuk LED untuk menunjukkan bagian mana yang harus dipindahkan oleh pengguna untuk komputer, sehingga situasi dunia nyata cocok dengan situasi perangkat lunak lagi.

Saya ingin menggunakan Raspberry Pi sebagai landasan perangkat keras untuk menjalankan perangkat lunak, yang akan ditulis dalam Node.js (tapi itu seharusnya tidak penting untuk pertanyaan ini).

Jadi, yang akhirnya saya dapatkan adalah 64 sensor kecerahan, dan 64 LED, yang perlu saya tangani secara terpisah. Dengan kata lain: Saya membutuhkan 64 output, dan 64 input. Dan tentu saja ini adalah sesuatu yang Raspberry Pi tidak menangani di luar kotak - dan saya pikir harus ada cara yang lebih baik daripada memiliki 128 port I / O.

Karena saya berpikir bahwa mendeteksi status papan adalah tugas yang lebih penting, saya mulai mencari di web bagaimana menangani matriks switch 8x8. Saya menemukan saran untuk menggunakan pengontrol mikro yang memindai kolom papan secara berurutan, dan di setiap kolom mendeteksi apakah baris (= bidang) digunakan atau tidak.

Ini akan mengurangi kompleksitas untuk memiliki 8 output dan 8 input (untuk dapat membaca status dewan).

Tentang ini, saya punya beberapa pertanyaan:

  1. Apakah pikiran saya benar, yaitu apakah ini pendekatan yang benar, atau apakah ada alternatif yang lebih baik yang harus saya perhatikan?
  2. Karena saya tidak punya pengalaman dengan pengontrol mikro, apa yang harus saya perhatikan? Apakah saya hanya memerlukan pengontrol mikro dengan 16 pin, yang dapat diprogram dalam bahasa yang dapat saya tulis, atau ...?
  3. Adakah yang membuat papan seperti itu dan memiliki saran atau tahu tentang tutorial yang menuntun Anda melalui proses?
Golo Roden
sumber
1
Anda punya ide yang tepat. Ini akan membutuhkan sedikit penyempurnaan aplikasi penginderaan. Tergantung pada ukuran dan berat potongan Anda bisa menggunakan skema deteksi pemblokiran cahaya atau tombol sentuhan. Pertanyaan sebenarnya di sini adalah bagaimana Anda akan tahu bagian apa itu? Mungkin akan membutuhkan bagian kustom juga. Mungkin meletakkan tag RFID pada masing-masing dan kemudian setiap kotak memiliki pemindai RFID? Terlalu banyak, tapi sebuah pemikiran.
mcmiln
1
Routing pemindaian matriks yang Anda gambarkan tidak akan dapat mengatasi dengan memiliki 4 buah pada 2 baris dan 2 kolom. Lihatlah 3-8 decoder baris (74138) dan ekstrapolasi menjadi 5-64
Icy
2
Susunan awal potongan selalu sama, sehingga perangkat lunak tahu bagian mana. Jika Anda kemudian memindahkan bagian dari A ke B, perangkat lunak tahu bagian mana yang telah dipindahkan. Tentu saja ini tidak memungkinkan untuk memulai dengan lineup yang sewenang-wenang, tetapi ini Anda juga bisa mengatur dalam perangkat lunak secara manual.
Golo Roden
1
Ini sepertinya ... merepotkan. Saya akan menggunakan metode video perangkat lunak. OpenCV dan kamera. Dan sebuah proyektor.
Pejalan kaki
2
panduan ini mungkin berguna sejauh organisasi sensor / deteksi
user2813274

Jawaban:

5

Karena gambar bernilai ribuan kata, inilah contoh LDM-24488NI : sebuah matriks yang dipimpin 64

masukkan deskripsi gambar di sini

Untuk aplikasi Anda, Anda akan memerlukan satu matriks untuk LED, dan satu lagi untuk sensor, membutuhkan total 32 pin IO. Karena RPi Anda tidak memiliki banyak, Anda harus menggunakan 1 hingga 8 demux untuk memilih setiap baris dan kolom:

masukkan deskripsi gambar di sini

Untuk LED, Anda dapat menggunakan demultiplexer untuk baris dan kolom, karena Anda hanya perlu satu led pada satu waktu. Untuk sensor, saya sarankan menggunakan demux untuk baris dan baris individual untuk kolom, untuk dapat mendeteksi beberapa sensor aktif dalam satu baris. Itu akan membawa jumlah pin yang diperlukan menjadi 17 pin, yang dapat ditangani oleh RPi.

Dmitry Grigoryev
sumber
12

Ya, multiplexing seperti yang Anda gambarkan adalah cara yang umum untuk mengatasi berbagai hal.

Bagian tersulit akan berurusan dengan sifat analog dari sensor cahaya. CdS LDRs (resistor yang bergantung pada cahaya) mungkin adalah yang terbaik dalam hal ini karena mereka sensitif, murah, dan menghasilkan respons besar yang mudah diukur pada rentang cahaya manusia. Secara elektrik, mereka adalah resistor, dengan resistensi menurun dalam cahaya yang lebih terang.

Ini akan menyederhanakan multiplexing jika Anda menggunakan mikro yang memiliki 8 input analog. Itu berarti setengah mux Anda dibangun ke dalam mikro. Anda mengaktifkan deretan LDR, dan membaca sinyal 8 kolom langsung dengan mikro, misalnya.

Memindai 64 input analog secara berurutan dapat dengan mudah dilakukan secara instan dalam istilah manusia dengan micros biasa. Katakanlah Anda dapat mengambil bacaan baru setiap 100 μs. Itu "panjang", bahkan untuk micros kecil dan murah. Itu berarti seluruh papan akan dipindai setiap 6,4 ms, yang jauh lebih cepat daripada yang dapat Anda lihat penundaan.

Multiplexing LED lebih mudah karena itu semua dilakukan dengan output digital. Banyak micros memiliki lebih dari 16 output digital, jadi ini bukan masalah. Ada hal-hal lain yang harus terjadi, dan Anda akan menggunakan pin lebih cepat dari yang Anda harapkan sekarang, tetapi 64 pin mikro harus benar-benar cukup baik, jika bukan yang 44 pin.

Saya mungkin akan mendedikasikan satu mikro hanya untuk menangani papan I / O. Ini dioptimalkan untuk memiliki cukup pin I / O, input A / D, dan sejenisnya. Kemudian antarmuka ke mesin komputasi utama melalui UART. Protokol akan terlihat seperti "kotak menyala 3,2" atau "potongan dihapus dari kotak 5,4". Ini juga memungkinkan antarmuka perangkat keras yang sama sekali berbeda di masa depan selama Anda menjaga protokolnya tetap sama.

Olin Lathrop
sumber
7

Untuk LED , cara yang jelas untuk melakukan ini adalah memiliki output untuk setiap baris dan setiap kolom papan catur: total 8 + 8 = 16 pin. Anoda akan dihubungkan ke kabel baris dan katoda ke kawat kolom. Untuk LED yang ingin Anda nyalakan, Anda akan membuat kawat anoda positif (logika 1) dan kabel katoda negatif (logika 0), sambil mempertahankan yang lain dalam keadaan terbalik (sehingga LED yang tersisa memiliki bias netral atau terbalik.)

Saya membuat asumsi di sini bahwa mikrokontroler memberikan tegangan cukup tinggi / rendah bagi Anda untuk dapat menjembatani LED dari satu ke yang lain. Jika bukan itu masalahnya, Anda akan memerlukan transistor atau buffer untuk setiap baris. Dengan pasokan 5V sangat ketat, mengingat LED turun sekitar 2V dan Anda ingin penurunan tegangan yang wajar atas resistor pembatas Anda saat ini (perhatikan bahwa Anda hanya perlu menginstalnya di baris baris atau kolom, bukan keduanya.)

Jika output Anda adalah tri state (yaitu, selain logika 0 dan logika 1, mereka dapat diatur ke status impedansi tinggi, mungkin dengan mengkonfigurasi sementara sebagai input) maka Anda bisa menjadi pintar dan menggunakan kisi 4x8, dengan LED. terhubung berpasangan antiparalel. Sangat penting untuk mengatur output yang tidak digunakan ke impedansi tinggi dalam pengaturan ini, jika tidak maka LED yang tidak diinginkan akan menyala.

Dalam kedua kasus tersebut, Anda harus memikirkan tentang penarikan saat ini , dan apakah dapat diterima untuk mengambil risiko kemungkinan kesalahan perangkat lunak menerangi semua LED secara bersamaan (yang jika tidak diperhitungkan, dapat melampaui arus baris mikrokontroler itu). .)


Kasing sensor lebih rumit. Saya akan menganggap Anda menggunakan sensor resistif, meskipun fototransistor tidak selalu dijamin untuk melakukan hanya dalam satu arah.

Anda dapat menggunakan output 8 baris yang sama yang Anda gunakan untuk menyalakan LED Anda, tetapi Anda akan membutuhkan 8 input kolom yang didedikasikan untuk penginderaan. Anda pasti akan melihat sirkuit untuk keypad seperti ini. Ingatlah bahwa ini hanya dirancang untuk menekan satu tombol pada satu waktu . Jika pengguna menekan 1,3,7 dan 9 bersamaan, tombol tidak dapat mendeteksi jika pengguna melepaskan salah satu dari empat tombol ini karena masih ada jalur saat ini melalui tiga switch lainnya.

Solusi yang digunakan pada keyboard musik (yang dirancang untuk memiliki lebih dari satu elemen dari matriks melakukan pada suatu waktu) adalah memiliki dioda secara seri dengan setiap sakelar.

Solusi lain adalah dengan membeli empat IC decoder 4-ke-16 dengan output kolektor terbuka (atau tiriskan terbuka jika menggunakan IC MOSFET) seperti ini: http://www.unicornelectronics.com/ftp/Data%20Sheets/74159.pdf Kolektor terbuka berarti bahwa output IC hanya akan menenggelamkan arus, bukan sumbernya. Dengan demikian Anda dapat menghubungkan 16 sensor ke 16 output chip, dan ujung umum lainnya bersama dengan resistor pullup (Anda akan menghubungkan ADC Anda di sini juga). Anda membawa satu output rendah (melakukan) dan 15 lainnya tetap tinggi (nonconducting.) Ini berbeda dengan output logika standar, di mana 15 output lainnya akan menuangkan arus ke titik umum.

Input ke IC ini adalah biner 4 bit untuk memilih salah satu dari 16 output, tetapi mereka juga memiliki input tambahan untuk mengaktifkan / menonaktifkan chip. Dengan demikian, Anda berpotensi memiliki susunan 64 kolektor terbuka, yang terhubung ke 64 sensor, dengan ujung sensor yang lain semuanya umum pada resistor pullup tunggal dan konverter analog ke digital. Anda akan membutuhkan total 8 output pada mikrokontroler Anda untuk ini: empat untuk mengambil 4-ke-16 sinyal pilih (umum untuk keempat chip) dan empat untuk mengambil sinyal aktif (satu untuk setiap chip.)

EDIT: 3 hingga 8 decoder (juga disebut 1 dari 8 = 1 baris dari 8) tampaknya lebih tersedia daripada 4 hingga 16, tetapi 8 IC jauh lebih berantakan daripada 4. Jenis IC lainnya yang dapat bermanfaat adalah penghitung oktal (dan sepupunya yang lebih umum penghitung dekade , yang dapat dikonfigurasi sebagai penghitung oktal dengan menghubungkan ouput kesembilan ke garis reset.) Ini membutuhkan pulsa serial untuk bergerak dari satu output ke output berikutnya, sehingga akan membutuhkan lebih sedikit I / O pin pada mikrokontroler daripada IC decoder. Mereka biasanya memiliki input tambahan untuk diatur ulang dan diaktifkan. Ada juga IC ini disebut pergeseran register , yang tersedia dalam dua jenis: satu untuk mengubah seri menjadi paralel, yang lain untuk mengubah paralel ke seri. Akhirnya adabuffer, yang dapat Anda tempatkan di antara Rasberry Pi dan papan catur Anda agar Pi tidak hancur saat terjadi arus berlebih. Semua ini dapat berguna dalam rangkaian multiplexing.

Level River St
sumber
1
Anda menyebutkan register geser - mereka dapat digunakan untuk output LED juga. Penghitung lain plus register geser 8-bit yang dapat tristate dapat menggerakkan seluruh array dengan hanya lebih dari dua atau tiga pin, jika itu cukup cepat untuk menghindari kedipan yang terlihat.
hobbs
@ hobbs Saya tidak berpikir berkedip adalah masalah karena OP hanya ingin menyalakan satu atau dua LED sekaligus. Bahkan tristate tidak benar-benar diperlukan jika Anda hanya memiliki satu register counter / shift dekade / oktal lurus dan satu terbalik untuk menggerakkan LED. 3 pin dapat dicapai dengan sempurna: reset umum, gerak maju kolom, gerak maju baris. Itu mungkin cara yang harus dilakukan - simpan semua pin lainnya untuk masalah sensor yang lebih sulit.
Level River St
Untuk LED, Driver LED MAX7219 / 7221 dapat digunakan juga. Ini akan mengurangi jumlah input menjadi 3 - jam, data, kait.
jnovacho
4

Multiplexing memang merupakan praktik umum.

Ada beberapa cara Anda bisa mendapatkan lebih banyak dari pin pi raspberry Anda

Salah satunya adalah menggunakan chip untuk melakukan beberapa pekerjaan berat untuk Anda. Misalnya, jika Anda memiliki 8 input dan 8 output untuk membaca status board, Anda dapat menggunakan penghitung, untuk menaikkan 8 input naik satu per satu. Anda akan membutuhkan 2 pin pada Arduino untuk ini - satu untuk mengatur ulang kembali ke pin pertama, dan satu untuk "pergi ke baris berikutnya". Anda baru saja menyimpan 6 pin!

Menyimpan 6 pin mungkin tidak cukup - mari kita lihat di mana kita bisa pergi dari sini: Jika Anda mengatur ulang grid 8x8 Anda menjadi grid 16x4, Anda dapat menggunakan sesuatu seperti http://www.instructables.com/id/16-Stage -Decade-Counter-Chain-Using-two-4017-Chi /? ALLSTEPS (abaikan bagian atas, dua garis yang turun dari atas ke bawah adalah "reset" Anda, datang dari kiri atas, dan " buka baris berikutnya ", yang disebut CLK, untuk jam, di sini). Anda sekarang dapat menghitung 8 di bagian kiri papan, diikuti oleh 8 di bagian kanan papan; hubungkan kolom A dan E, B dan F, C dan G, dan D dan H bersama-sama.

Selamat, Anda sekarang memiliki dua pin output (reset dan clock), dan 4 pin input, dengan total 6 - yang menghemat 10 pin! Perhatikan bahwa pi raspberry tidak memiliki konverter analog ke digital, jadi Anda akan memerlukan beberapa pekerjaan tambahan untuk itu.

Sekarang untuk LED. Anda sudah memiliki catu daya yang terkontrol (penghitung dua dekade) - mari kita gunakan kembali. Letakkan 64 LED Anda dari 16 pin pasokan Anda, melalui sebuah resistor (setiap LED HARUS memiliki resistor sendiri!), Ke 4 rel lainnya (tata letak yang sama seperti di atas: AE, BF, CG dan DH). Hubungkan 4 rel ini ke melalui 4 transistor ke 4 pin, dan letakkan semua pin ke "tinggi" - karena kedua sisi LED sekarang di 5 volt, LED akan mati. Kemudian, ketika Anda ingin menyalakan LED, pastikan dua dekade Anda berada di posisi yang tepat (seolah-olah Anda membaca sensor di kotak itu), atur salah satu dari 4 rel ke rendah. Arus sekarang harus mengalir dari "tinggi" dari counter dekade, ke "rendah" di rel khusus itu. Hai, astaga, lampu menyala! Berikan sedikit penundaan, lalu matikan kembali sebelum Anda mengubah penghitung dekade lagi.

Jika Anda ingin lebih banyak kontrol, Anda dapat menggunakan sesuatu seperti chip TLC5940 - http://playground.arduino.cc/Learning/TLC5940 - setiap chip dapat mengatur 16 LED (sehingga Anda memerlukan 4 di antaranya) ke tingkat kecerahan dari 0 (mati) hingga 1024 (penuh), sehingga Anda dapat memudar setiap LED masuk dan keluar, dengan kontrol yang sangat baik. Dari memori, ini membutuhkan sekitar 4 pin, dan mereka dapat dirangkai daisy, jadi 4 pin digital (salah satunya harus PWM - ini memiliki simbol "~" di sebelah pin) akan mengontrol sejumlah LED.

Semoga berhasil!

AMADANON Inc.
sumber
Ini RPi, bukan Arduino.
Dmitry Grigoryev
Maaf, Anda benar. Hampir semua yang saya katakan masih berlaku, jadi saya telah membuat beberapa pengeditan kecil, untuk membuatnya bekerja
AMADANON Inc.
0

Saya tidak berpikir Anda akan membutuhkan LED di sudut kanan atas. Sebuah sensor di tengah seperti yang Anda sebutkan sudah cukup. Bagian Tricky akan menjadi kode untuk papan catur. Bayangkan Anda memiliki papan catur. Baris akan ditunjukkan sebagai 'alfabet' dan kolom ditunjukkan sebagai 'angka'.

Jadi pertama-tama Anda memerlukan program untuk memprogram jenis potongan di posisi awal. Kemudian, ketika Anda memindahkan karya Anda, kode akan menghasilkan lokasi awal karya ke lokasi akhir. Itu akan mengurangi input Anda hingga setengahnya.

Brandon Lok
sumber
5
Mungkin saya tidak menjelaskan dengan baik ... LED tidak dimaksudkan untuk membaca dalam keadaan saat ini, mereka dimaksudkan untuk menunjukkan gerakan yang ingin dilakukan komputer. Jadi, pengguna bergerak: Sensor kecerahan memberi tahu perangkat lunak apa yang digunakan. Perangkat lunak menghitung langkah selanjutnya, dan berkedip dua LED, pengguna memindahkan potongan, dan kemudian giliran manusia lagi.
Golo Roden