Elektronik satranç tahtası yapmak


14

Normal parçalarla oynayabileceğiniz ahşap bir satranç tahtası yapmak istiyorum (yani, RFID kodlarını, mıknatısları, ... kullanan modifiye edilmiş parçaları değil), ancak bu hareketlerimi fark eden ve hareket eden bir yazılıma bağlı ikinci oyuncu.

Tahtadaki parçaları nasıl tespit edeceğimi düşünüyordum ve hangi parçanın nerede olduğunu tanımam gerekmediğine karar verdim: "Gerçek" yazılım içinde, yani bir parçayı A'dan B'ye taşırsam , yazılım hangi parçanın taşındığını bulabilir.

Bu yüzden, satranç tahtasının her alanına, biri merkezde, diğeri sağ üst köşede iki delik açma fikrim vardı:

  • Merkezdeki bir parça, bir parçanın sahada durup durmadığını tespit etmek için bir parlaklık sensörü için kullanılacaktır.
  • Köşedeki bir LED, kullanıcının bilgisayar için hangi parçayı hareket ettirmesi gerektiğini göstermek için bir LED için kullanılacaktır, böylece gerçek dünya durumu yazılım durumuyla tekrar eşleşir.

Yazılımın çalışması için bir Ahududu Pi'yi Node.js'de yazılacak olan donanım temeli olarak kullanmak istiyorum (ancak bu soru için önemli olmamalı).

Sonuç olarak, tek tek ele almam gereken 64 parlaklık sensörü ve 64 LED. Başka bir deyişle: 64 çıkışa ve 64 girişe ihtiyacım var. Ve elbette bu bir Raspberry Pi'nin kutudan çıkmadığı bir şey - ve bence 128 I / O portuna sahip olmaktan daha iyi bir yol olmalı.

Tahtanın durumunu tespit etmenin daha önemli bir görev olduğunu düşündüğüm için, 8x8 anahtar matrisinin nasıl işleneceğini web'de aramaya başladım. Tahtanın sütunlarını sırayla tarayan bir mikro denetleyici kullanma önerisini buldum ve her sütunda bir satır (= bir alan) kullanılıp kullanılmadığını tespit etti.

Bu, 8 çıkışa ve 8 girişe (kartın durumunu okuyabilmek için) karmaşıklığı azaltacaktır.

Bu konuda birkaç sorum var:

  1. Düşüncelerim doğru mu, yani bu doğru yaklaşım mı yoksa dikkat etmem gereken daha iyi bir alternatif var mı?
  2. Mikro denetleyicilerle ilgili hiçbir deneyimim olmadığından nelere dikkat etmeliyim? Yazabildiğim bir dilde programlanabilen 16 pinli bir mikro denetleyiciye ihtiyacım var mı, yoksa…?
  3. Herkes böyle bir tahta inşa ve süreç boyunca size rehberlik eden bir öğretici bazı tavsiye veya bilen var mı?

1
Doğru fikre sahipsiniz. Algılama uygulamasında biraz arındırma yapılacaktır. Parçaların boyutuna ve ağırlığına bağlı olarak, ışık engelleme veya dokunsal düğmenin bir algılama şemasını kullanabilirsiniz. Burada asıl soru, hangi parçanın ne olduğunu nasıl anlatacağınızdır. Muhtemelen özel parçalara da ihtiyaç duyacaksınız. Belki her bir RFID etiketi koymak ve daha sonra her kare bir RFID tarayıcı var? Aşırıya kaçmak, ama bir düşünce.
mcmiln

1
Açıkladığınız matris tarama yönlendirmesi, 2 satır ve 2 sütun üzerinde 4 parça ile baş edemeyecektir. 3-8 satır kod çözücülerine (74138) bakın ve 5-64
Icy

2
Parçaların ilk dizisi her zaman aynıdır, bu nedenle yazılım hangi parçanın nerede olduğunu bilir. Daha sonra bir parçayı A'dan B'ye taşırsanız, yazılım hangi parçanın nereye taşındığını bilir. Tabii ki bu keyfi dizilimlerle başlamasına izin vermez, ancak bu yazılımı manuel olarak da kurabilirsiniz.
Golo Roden

1
Bu ... hantal görünüyor. Bir yazılım video yöntemiyle giderdim. OpenCV ve bir kamera. Ve bir projektör.
Passerby

2
bu kılavuz sensör / algılama kuruluşu kadar faydalı olabilir
user2813274

Yanıtlar:


5

Bir görüntü bin kelimeye bedel olduğu için , LDM-24488NI örneği : 64 liderlikli bir matris

resim açıklamasını buraya girin

Uygulamanız için LED'ler için böyle bir matrise ve sensörler için toplam 32 IO pin gerektiren bir matrise ihtiyacınız olacak. RPi'niz çok fazla olmadığından, tek tek satırları ve sütunları seçmek için 1 ila 8 demux kullanmanız gerekir :

resim açıklamasını buraya girin

LED'ler için, tek seferde yalnızca bir led'e ihtiyacınız olduğu için hem satırlar hem de sütunlar için çoklu kopyalayıcıları kullanabilirsiniz. Sensörler için, bir satırda birden fazla aktif sensörü algılayabilmek için satırlar için bir demux ve sütunlar için ayrı satırlar kullanmanızı öneririm. Bu, gerekli pim sayısını bir RPi'nin kaldırabileceği 17 pime getirecektir.


12

Evet, tanımladığınız gibi çoğullama, şey dizilerini ele almanın yaygın bir yoludur.

En zor kısım ışık sensörlerinin analog doğasıyla ilgilenecek. CdS LDR'ler (ışığa bağımlı dirençler) muhtemelen bu durumda en iyisidir çünkü hassas, ucuzdur ve insan hafifliği aralığında kolayca ölçülebilir büyük bir tepki üretir. Elektriksel olarak, dirençler daha parlak ışıkta azalır.

8 analog girişi olan bir mikro kullanırsanız çoğullamayı basitleştirir. Bu, meksinizin yarısının mikrode yerleşik olduğu anlamına gelir. Bir sıra LDR'yi etkinleştirir ve örneğin 8 sütun sinyalini doğrudan mikro ile okursunuz.

64 analog girişin sıralı olarak taranması, sıradan mikrolarla insan terimleriyle hemen yapılabilir. Diyelim ki her 100 µs'de yeni bir okuma yapabilirsiniz. Bu "uzun", küçük ve ucuz mikrolar için bile. Bu, tüm panonun her 6,4 ms'de bir taranacağı anlamına gelir, bu da bir gecikmeyi algılayabileceğinizden çok daha hızlıdır.

LED'lerin çoğullanması daha da kolaydır, çünkü bunların hepsi dijital çıkışlarla yapılır. Bol miktarda mikronun 16'dan fazla dijital çıkışı vardır, bu yüzden bu bir problem değildir. Gerçekleşmesi gereken başka şeyler de var ve şimdi beklediğinizden daha hızlı pin kullanacaksınız, ancak 44 pinli olmasa da 64 pinli bir mikro gerçekten yeterince iyi olmalıdır.

Muhtemelen bir mikro kartı yalnızca kart G / Ç işlemlerine ayırmaya adardım. Bu, yeterli G / Ç pini, A / D girişi ve benzerine sahip olacak şekilde optimize edilmiştir. Daha sonra UART üzerinden ana hesaplama motoruyla arayüz oluşturur. Protokol, "ışık kare 3,2" veya "kare 5,4 kare kaldırıldı" gibi görünecektir. Bu aynı zamanda, protokolü aynı tuttuğunuz sürece gelecekte tamamen farklı bir donanım arayüzüne izin verir.


7

LED'ler için , bunu yapmanın bariz yolu, satranç tahtasının her satırı ve her sütunu için bir çıkış elde etmektir: toplam 8 + 8 = 16 pim. Anotlar sıra tellerine ve katotları sütun teline bağlanır. Aydınlatmak istediğiniz LED için, diğerlerini ters durumda tutarken anot telini pozitif (mantık 1) ve katot telini negatif (mantık 0) yaparsınız (böylece kalan LED'lerin nötr veya ters eğilimi olur.)

Burada mikrokontrolcünün bir LED'i bir diğerine köprüleyebilmeniz için yeterince yüksek / düşük voltaj verdiğini varsayıyorum. Eğer durum böyle değilse, her bir hat için bir transistöre veya tampona ihtiyacınız olacaktır. 5V besleme ile LED 2V hakkında düştüğü göz önüne alındığında sıkıdır ve mevcut sınırlama direnciniz üzerinde makul bir voltaj düşüşü istediğinizi düşünün (bunları her ikisine de değil sadece satır satırlarına veya sütun satırlarına kurmanız gerektiğini unutmayın.)

Çıkışlarınız üç durumluysa (yani, mantık 0 ve mantık 1'e ek olarak, belki de geçici olarak giriş olarak yapılandırarak yüksek empedans durumuna ayarlanabilir) LED'lerle akıllı olabilir ve 4x8 ızgara kullanabilirsiniz karşıt çiftler halinde bağlanır. Bu kurulumda kullanılmayan çıkışları yüksek empedansa ayarlamak önemlidir, aksi takdirde istenmeyen LED'ler yanar.

Her iki durumda da, mevcut çekilişi ve bir satırdaki tüm LED'leri aynı anda aydınlatma olasılığını riske atmanın kabul edilebilir olup olmadığını düşünmeniz gerekecek (bu, hesaba katılmazsa mikrodenetleyicinin sıra satırını aşırı akabilir) .)


Sensörlerin durumu daha karmaşıktır.Dirençli sensörler kullandığınızı varsayacağım, ancak fototransistörlerin sadece tek bir yönde çalışması garanti edilmez.

LED'lerinizi yakmak için kullandığınız aynı 8 satır çıkışını kullanabilirsiniz, ancak algılamaya adanmış 8 sütun girişine ihtiyacınız olacaktır. Kuşkusuz böyle tuş takımları için devreler göreceksiniz . Bunların aynı anda yalnızca bir tuşa basılacak şekilde tasarlandığını unutmayın . Kullanıcı 1,3,7 ve 9 tuşlarına birlikte basarsa, tuş takımı, kullanıcının bu dört tuştan herhangi birini bırakıp bırakmadığını algılayamaz, çünkü diğer üç anahtarda halen geçerli bir yol vardır.

Müzik klavyelerinde kullanılan bir çözüm (bir kerede ileten matrisin birden fazla elemanına sahip olacak şekilde tasarlanmış), her bir anahtarla seri olarak bir diyota sahip olmaktır.

Başka bir çözüm , açık kolektör çıkışlı (veya MOSFET IC'ler kullanılıyorsa açık tahliye) olan dört adet 4 ila 16 kod çözücü IC'si satın almak olacaktır : http://www.unicornelectronics.com/ftp/Data%20Sheets/74159.pdf Açık kollektör, IC çıkışlarının kaynağı değil, sadece akımı batıracağı anlamına gelir. Böylece, 16 sensörü çipin 16 çıkışına bağlayabilir ve diğer uçları bir çekme direnci ile ortaklaştırabilirsiniz (ADC'nizi buraya da bağlarsınız). Bir çıkışı düşük (iletken) ve diğer 15'i yüksek (iletken olmayan) olarak ayarlarsınız. Bu, diğer 15 çıkışın ortak noktaya akım dökeceği standart mantık çıkışının tersidir.

Bu IC'lerin girişi 16 çıkıştan birini seçmek için 4 bitlik ikilik bir sistemdir, fakat aynı zamanda çipi etkinleştirmek / devre dışı bırakmak için ekstra bir girişe sahiptirler. Böylece potansiyel olarak 64 sensöre bağlı bir dizi 64 açık kolektör lavaboya sahip olabilirsiniz, sensörlerin diğer uçları tek bir çekme direncine ve analog-dijital dönüştürücüye ortaktır. Bunun için mikrodenetleyicinizde toplam 8 çıkışa ihtiyacınız olacaktır: dördü 4 ila 16 seçim sinyalini almak için (dört çipin tümü için ortak) ve dördü etkinleştirme sinyallerini almak için (her yonga için bir tane).

DÜZENLEME: 3 ila 8 kod çözücü (8 üzerinden 1 = 8 satır 1 olarak da bilinir) 4'ten 16'ya kadar daha kullanılabilir gibi görünmektedir, ancak 8 IC 4'ten çok daha dağınıktır. sekizli sayaç (ve daha yaygın kuzeni on dokuzuncu çıkışını sıfırlama hattına bağlayarak sekizli bir sayaç olarak yapılandırılabilir.) Bunlar, bir çıkıştan diğerine ilerlemek için seri bir darbe gerektirir, bu yüzden daha az ihtiyaç duyar Mikrodenetleyici üzerindeki kod çözücü IC'lerinden daha fazla G / Ç pinleri. Genellikle sıfırlama ve etkinleştirme için ek girişleri vardır. İki tipte mevcut olan IC yazmacı adı verilen IC'ler de vardır: biri seriyi paralel dönüştürmek için, diğeri seriye paralel dönüştürmek için. Sonunda,Rasberry Pi'niz ve satranç tahtanızın arasına koyabileceğiniz tamponlar , böylece Pi aşırı akım durumunda yok olmaz. Bunların hepsi çoğullama devrelerinde faydalı olabilir.


1
Vites kayıtlarından bahsediyorsunuz - bunlar LED çıkışları için de kullanılabilir. Başka bir sayaç artı tristat olabilen 8 bitlik bir kaydırma yazmacı, görünür titremeyi önlemek için yeterince hızlıysa, tüm diziyi zar zor iki veya üç pimden fazla sürebilir.
hobbs

@hobbs OP'nin aynı anda sadece bir veya iki LED'i yakmak istediğinden titremenin bir sorun olduğunu düşünmüyorum. LED'leri sürmek için sadece bir düz ve bir ters on yıl / sekizli sayaç / vardiya kaydınız varsa tristat bile gerçekten gerekli değildir. 3 pin mükemmel bir şekilde elde edilebilir: ortak sıfırlama, sütun ilerlemesi, satır ilerlemesi. Bu yol olabilir - sensörlerin daha zor sorunu için diğer tüm pimleri kaydedin.
Level River St

LED'ler için MAX7219 / 7221 LED Sürücüsü de kullanılabilir. Bu, giriş sayısını 3 saat, veri, mandalla azaltacaktır.
jnovacho

4

Çoğullama gerçekten yaygın bir uygulamadır.

Ahududu pi pimlerinizden daha fazla yararlanmanın birkaç yolu vardır

Bunlardan biri, ağır kaldırma işlemlerini sizin için yapmak için bir çip kullanmaktır. Örneğin, kartın durumunu okumak için 8 giriş ve 8 çıkışınız varsa, 8 girişi birer birer yukarı kaldırmak için bir sayaç kullanabilirsiniz. Bunun için Arduino'da 2 pime ihtiyacınız olacak - biri ilk pime geri dönmek ve diğeri "sonraki satıra geçmek". 6 pini kurtardın!

6 iğneyi kaydetmek yeterli olmayabilir - buradan nereye gidebileceğimizi görelim: 8x8 ızgarayı 16x4 ızgaraya yeniden düzenlerseniz, http://www.instructables.com/id/16-Stage gibi bir şey kullanabilirsiniz. -Decade-Counter-Chain-Using-two-4017-Chi /? ALLSTEPS (üst yarıyı göz ardı edin, yukarıdan aşağıya doğru inen iki satır, soldan gelen "sıfırlama" ve " CLK adı verilen bir sonraki satıra git ", saat için burada). Artık tahtanın sol yarısında 8'i, ardından tahtanın sağ yarısında 8'i sayabilirsiniz; A ve E, B ve F, C ve G ve D ve H sütunlarını birbirine bağlayın.

Tebrikler, toplamda 6 çıkış için iki çıkış piminiz (sıfırlama ve saat) ve 4 giriş piminiz var - bu 10 iğneyi kurtarıyor! Raspberry pi'nin analogdan dijital dönüştürücülere sahip olmadığını unutmayın, bu nedenle bunun için biraz daha çalışmaya ihtiyacınız olacak.

Şimdi LED'ler için. Zaten kontrollü bir güç kaynağınız var (iki on sayaç) - bunları yeniden kullanalım. 64 LED'inizi 16 besleme piminden bir direnç (her LED'in kendi direnci olması GEREKİR!), Diğer 4 raya (yukarıdakiyle aynı düzen: AE, BF, CG ve DH) yerleştirin. Bu 4 rayı 4 transistör aracılığıyla 4 pime bağlayın ve tüm pimleri "yüksek" e koyun - LED'in her iki tarafı da 5 voltta olduğundan, LED'ler söner. Ardından, bir LED'i yakmak istediğinizde, yirmi yılınızın doğru konumda olduğundan emin olun (sensörü o karede okuyormuşsunuz gibi), 4 raydan birini düşük yapın. Akım şimdi on sayaçtan gelen "yüksek" den, söz konusu raydaki "düşük" değerine akmalıdır. Hey presto, ışık yanıyor! Biraz gecikme verin, sonra on sayacı tekrar değiştirmeden önce tekrar kapatın.

Daha fazla kontrol istiyorsanız, TLC5940 yongası gibi bir şey kullanabilirsiniz - http://playground.arduino.cc/Learning/TLC5940 - her yonga 16 LED'i ayarlayabilir (böylece bunlardan 4'üne ihtiyacınız olacak) parlaklık düzeyine 0 (kapalı) ile 1024 (tam açık) arasındadır, böylece tek tek LED'leri büyük bir kontrolle girip çıkarabilirsiniz. Bellekten, bunlar yaklaşık 4 pime ihtiyaç duyarlar ve papatya dizimi olabilirler, bu yüzden 4 dijital pim (biri PWM olmalıdır - bunlar pimin yanında "~" sembolü vardır) herhangi bir sayıda LED'i kontrol edecektir.

İyi şanslar!


RPi, Arduino değil.
Dmitry Grigoryev

Özür dilerim, haklısın. Söylediğim hemen hemen her şey hala geçerli, bu yüzden çalışmasını sağlamak için bazı küçük düzenlemeler yaptım
AMADANON Inc.

0

Sağ üst köşede bir LED'e ihtiyacınız olacağını sanmıyorum. Bahsettiğiniz gibi ortadaki bir sensör yeterli olacaktır. Zor kısım satranç tahtasının kodu olacaktır. Bir satranç tahtanız olduğunu hayal edin. Satır 'alfabe' ve sütun 'sayı' olarak belirtilecektir.

Bu nedenle, ilk olarak parça tipini programlamak için bir programa ihtiyacınız vardır. Daha sonra parçalarınızı taşıdığınızda, kod parçanın başlangıç ​​konumunu son konuma oluşturur. Bu, girdinizi yarı yarıya azaltacaktır.


5
Belki de kuyu açıklamamıştım ... LED'ler mevcut durumda okumak için değil, bilgisayarın hangi hareketi yapmak istediğini göstermek içindir. Böylece kullanıcı hareket eder: Parlaklık sensörleri yazılıma ne yaptığını söyler. Yazılım bir sonraki hareketini hesaplar ve iki LED'i yanıp söner, kullanıcı parçayı hareket ettirir ve sonra tekrar insan sırası.
Golo Roden
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.