Arduino'nuzu Programlayın 4x4x4 LED Küp Bazı Daha Müthiş Şeyler Yapmak için

  • Mark Lucas
  • 0
  • 3134
  • 255
reklâm

Geçen hafta, bir LED küp inşa ettim Gelecekten Gelmiş gibi Görünen Titreşimli Arduino LED Küpü Nasıl Gelecekten Gelmiş gibi Görünen Titreşimli Arduino LED Küpü Nasıl Yapılır? , ama biraz kalıcı ve başka bir harika seviyede bir şey arıyorsanız, mütevazı 4 x 4 x 4 LED küp… - 64 LED harika fütüristik ışık gösterileri yapmak için programlayabilirsiniz - ve umarım siz de öyle yaparsınız, çünkü sizi motive etmek ve Arduino becerilerinizi geliştirmek için harika bir proje. Düşünmenizi sağlamak için sizi birkaç temel uygulama ile bıraktım, ancak bugün küp açıklamaları için kod açıklamaları ile birlikte birkaç yazılım daha sunacağım. Bunun amacı, hem size çalışmanız için biraz daha güzel ışık şovları vermek hem de küpü programlamanın bazı kısıtlamaları hakkında bilgi edinmek ve süreçteki bazı yeni programlama kavramlarını öğrenmek..

Bu oldukça gelişmiş bir kodlamadır; sağlanan kodu özelleştirmeden önce gerçekten tüm Arduino eğiticilerimi ve başlangıç ​​seviyesindeki Arduino rehberimi okumuş olmanız gerekir..

Uygulama 1: Mini Yılan

Set yılan benzeri bir desen dizisi kullanmak yerine, kendi rastgele seçimlerini yapan ve tamamen öngörülemeyen bir yapay olan bir yılan programlamak istedim. Daha sonra açıklayacağım sadece 2 bölümle sınırlıdır ve aşağıdaki demosu görebilirsiniz. Kodun tamamını buradan indirin.

3B alanla uğraşırken, tek bir nokta için 3 koordinat gerekir: X, Y, ve Z.

Bununla birlikte, küpümüzde, X ve Z düzlemleri LED pimleri ile temsil edilirken, Y doğrudan katod düzlemleriyle eşlenir. Bu koordinatlarla çalışmayı ve küpün etrafındaki hareketi bulmayı kolaylaştırmak için yeni bir veri türü yarattım. (yapı kullanarak) aradığım küp üzerindeki tek bir noktayı temsil etmek “xyz”. Sadece iki tam sayıdan oluşur: “xz”, ve “y”. Bu yapıyla, özel (xz, y) koordinat sistemimizde aşağıda belirtilen bir yönü de temsil edebilirim:

Y hareketi (yukarı aşağı): (xz, y + 1), (xz, y-1)
Z hareket (ileri, geri): (xz-1, y), (xz + 1, y)
X hareketi (sol sağ): (xz + 4, y), (xz-4, y)

Örneğin, LED'i konumuna taşımak için (0,0) bir tane sola, uygularız (xz + 4, y) ve sonunda (0,4).

Harekete geçirilecek belirli sınırlamalar var - yani Y koordinatları sadece mümkün olabilir 0 - 3 (0 alt katman, 3 üst kısımdır) ve XZ koordinatları yalnızca 0 - 15. Z hareketinin engellenmesi için başka bir limit yerleştirilir. “atlama” arkadan küpün önüne ve tam tersi. Bu durumda, katsayıları 4'ün katları için test etmek ve bu hareket girişimini reddetmek için kullanırız. Bu mantık temsil edilir geçerli() Önerilen yön kabul edilebilir bir hareketse true döndüren işlev, aksi takdirde false olur. Kontrol etmek için başka bir işlev ekledim. ters yön - yani, yılan bir yöne doğru yöneliyorsa, başka bir yere gitmek için geçerli bir yer olsa bile, kendisinin geriye doğru gitmesini istemeyiz. hareket() bir koordinat, yön alan ve yeni koordinatı döndüren işlev.

XYZ veri tipi, geçerli(), hareket() ve ters() işlevlerin tümü xyz.h indirilenlerde dosya. Bunun neden ana program dosyası yerine ayrı bir dosyaya yerleştirildiğini merak ediyorsanız, bunun, işlevleri engelleyen karmaşık Arduino derleyici kuralları nedeniyle olması gerekir. özel veri türleri döndürme; kendi dosyalarına yerleştirilmeli, daha sonra ana dosyanın başında alınmalı.

Ana çalışma zamanı dosyasına geri dönersek, bir yön dizisi yılanın yapabileceği tüm olası hareketleri saklar; yeni bir yön elde etmek için rastgele bir dizi üyesi seçebiliriz. Değişkenler ayrıca geçerli konumu (şimdi) depolamak için önceki yön ve önceki yer. Kodun geri kalanı sizin için oldukça açık olmalıdır; sadece FOr döngüler ve LED'leri açıp kapama. Ana döngüde önerilen yönün geçerli olup olmadığını kontrol ederiz ve öyleyse o şekilde gideriz. Olmazsa, yeni bir yön seçeriz.

Ana döngüde işaret eden tek şey, çoklama ile ilgili bulduğum bir hatayı düzeltmek için yapılan bazı kontrollerdir: Yeni konum aynı katod düzleminde veya aynı anot pimindeyse, önceki LED'in kapatılması her ikisinin de sönmesine neden olur. Bu noktada 2 parçalı bir yılanın ötesine geçmenin şu anki uygulamam ile imkansız olacağını fark ettim: Köşe düzeninde 3 LED'i yakmaya çalışın. Yapamazsınız, çünkü 2 katman ve 2 LED pimi aktifken, 4 LED 3'lü yanar. Bu, 3'lü değil, sınırlı çoğullu küp tasarımımızla ilgili doğal bir konudur, ancak endişelenmenize gerek yok. vizyon kalıcılığı draw yöntemini yeniden yazmak.

Görme kararlılığı, ışığın gözlerimize sıralı bir şekilde ulaştığında - işleyebildiğimizden daha hızlı - tek bir görüntü gibi göründüğü anlamına gelir. Bizim durumumuzda, dört tabakanın hepsini aynı anda çizmek yerine, ilkini çizmeliyiz, pasifleştirmeliyiz, ikinciyi çekmeliyiz ve pasifleştirmeliyiz: herhangi bir değişikliğin bile olduğunu söyleyebildiğimizden daha hızlı. Bu, mesaj yazarlarının çalışma prensibidir, bunun gibi:

Görme Kalıcılığını Kullanan Yeni Çizim Yöntemi

Önce kapalı, sonra yeni bir beraberlik rutini. Ben oluşturdum 4 x 16 iki boyutlu dizi bitlerin (doğru veya yanlış) LED küp durumunun değişmez bir temsili olması. Beraberlik rutini, bunun üzerinde basitçe yinelenerek ve her bir katmanı kısa bir süre için küpün dışına aktararak görme kalıcılığını sağlayacaktır. Yenileme süresi doluncaya kadar kendisini şu anki haliyle çizmeye devam edecektir, bu noktada kontrolü ana döngüye geri döndüreceğiz (). Kodun bu bölümünü bu LED_cube_POV dosyasına kaydettim, bu nedenle sadece kendi oyunlarınızı programlamaya atlamak ve bu işlemi temel olarak kullanmaktan çekinmeyin.

App 2: Yaşam Oyunu

Şimdilik bunu Conway'in Yaşam Oyununun temel bir versiyonuna dönüştürelim. Tanıdık olmayanlar için (Harika bir paskalya yumurtası animasyonu bulmak için Googling'i deneyin), Hayatın oyunu sadece birkaç basit kural verilen, ortaya çıkan davranışların büyüleyici bir modelini oluşturan hücresel otomatlara bir örnektir..

Bu, örneğin, karıncaların, gerçek kimyasal biyolojik kuralları yerine getirmelerine rağmen, istihbarat ve kovan akla nasıl hareket ettikleridir. İşte indirmek için tam kod İşte: sıfırlamak yeniden başlatmak için Kendinizi aynı modeli tekrar tekrar aldığınızda bulursanız, geri kalan düğmeyi daha uzun süre basılı tutmayı deneyin..

İşte Hayat Oyunu'nun kuralları:

  • İkiden az sayıda canlı komşusu olan herhangi bir canlı hücre, popülasyonun az olduğu gibi ölür..
  • İki veya üç canlı komşusu olan herhangi bir canlı hücre, bir sonraki nesle dayanır.
  • Üçten fazla canlı komşusu olan herhangi bir canlı hücre, aşırı kalabalık gibi ölür..
  • Tam olarak üç canlı komşusu olan herhangi bir ölü hücre, üreme gibi, canlı bir hücre haline gelir.

Kodu çalıştır. 5-10 içinde farkedeceksiniz “nesiller”, otomatlar muhtemelen belirli bir pozisyonda dengeleyici bir şekilde durdu; Bazen bu kararlı desen yerini değiştirir ve tahta etrafında kayması. Nadir durumlarda, tamamen ölmüş bile olabilirler. Bu sadece çalışmak için 4x4x4 LED'li bir sınırlamadır, fakat yine de iyi bir öğrenme alıştırmasıdır..

Kodu açıklamak için:

  • Yabancı olabilir memcpy () işlevi. Bunu önceki oyun durumunu kaydetmek için kullandım, çünkü sıralar normal değişkenler gibi birbirlerine sadece atanamaz - aslında hafıza alanı boyunca kopyalamanız gerekir (bu durumda, 64 bit).
  • howManyNeighbours () fonksiyon kendi kendini açıklayıcı olmalıdır, ancak böyle değilse - bu yöntem tek bir koordinat alır ve geçerli olup olmadıklarını kontrol etmek için olası her bir komşudan (daha önce yılan uygulamasında kullandığımız aynı yön dizisi) geçer. Daha sonra, önceki oyun durumunda bu LED'lerin açık olup olmadığını kontrol eder ve kaç tane bulunduğunu sayar..
  • Bu Hayat Oyunu uygulamasının ana işlevi progressGame (), hangi otomat kuralları geçerli oyun durumuna uygular.

İyileştirmeler: Şu ana kadar çok fazla zaman harcadım, ancak aynı ya da aynı kuşaktan nesiller sonra kartı otomatik olarak sıfırlayan bir çek eklemeyi denemek isteyebilirsiniz. o zaman lütfen bana bildirin! Ayrıca daha uzun bir yılanı mümkün kılmak için POV metodolojisini yılan oyununa eklemeye çalışmayı da öneririm..

Bugün benden. Arduino LED küp uygulamalarını daha sonra tekrar ziyaret edebilirim, ancak umarım kodumu değiştirebilecek ve kendi oyun kurallarınızı oluşturabilecek bir konumda olmalısınız: yorumlarda ne bulduğunuzu bize bildirin, böylece tüm indirmeleri yapabiliriz kreasyonların! Her zamanki gibi, sorularınızı cevaplamak ve korkunç kodlama yeteneklerimi savunmak için burada olacağım.

Resim Kredisi: kartezyen koordinatlar - Wikimedia user Sakurambo




Henüz no comments

Modern teknoloji hakkında basit ve uygun fiyatlı.
Modern teknoloji dünyasında rehberiniz. Her gün bizi çevreleyen teknolojileri ve araçları nasıl kullanacağınızı ve Internet'te ilginç şeyleri nasıl keşfedeceğinizi öğrenin.