İçindekiler:

RGB LED Matrisi: 5 Adım
RGB LED Matrisi: 5 Adım

Video: RGB LED Matrisi: 5 Adım

Video: RGB LED Matrisi: 5 Adım
Video: How does an RGB LED Matrix work? 2024, Temmuz
Anonim
Image
Image
Donanım Tasarımı
Donanım Tasarımı

Instructable'ı arayın ve birçok LED matris projesi bulabilirsiniz. Hiçbiri tam olarak istediğim gibi değildi; bu, bir şey üretmek için donanım ve yazılım tasarımının etkileşimlerini keşfetmek ve son ürünü, üst düzey kullanarak "LED ekrana" çizmeme izin veren bir sürücüyle düzgün bir PCB'de üretmekti. yapılar (örneğin, belirli pikselleri ayarlamak yerine bir çizgi çizme). Bu kısım benim için önemliydi, çünkü LED matris sürücülerinin çoğu basit olduğundan ve programlı olarak bir görüntü veya animasyon oluşturma yolunda pek bir şey sağlamaz. Bu, diğer sürücülerle görüntü ve animasyon oluşturamayacağınız anlamına gelmez, sadece projeden projeye daha fazla tekrar eden çalışma yapmanız gerekeceği anlamına gelir.

Bu yüzden vizyonumu gerçekleştirmek için yola çıktım. İlk adım, donanımı tasarlamaktı. Arka planım daha fazla yazılım olduğu için bu muhtemelen benim için en zor olanıydı. Yine, önceden hazırlanmış birçok tasarım vardı ve onları kesinlikle ilham almak için kullandım, ancak yaparak öğrenmek istedim, bu yüzden bir devre tahtası üzerinde 4x4 matris prototipi oluşturdum. İlk birkaç yinelemem işe yaramadığı için bu süreçte çok şey öğrendim. Ancak, çalışan bir donanım tasarımı yaptım ve bu da bir sürücü geliştirmeye başlamamı sağladı.

Arduino'yu sürücü platformum olarak seçtim çünkü yaygın olarak mevcut ve çevrimiçi olarak birçok referansı var. Kariyer deneyimim, bir sürücünün çalışan bir sürümüne donanım çabalarımdan daha hızlı bir şekilde ulaşmamı sağlasa da, ATMega mikro denetleyicisi için sürücü performansını optimize ederken ve sevdiğim bir programlama API'sini geliştirirken hala birçok yineleme vardı.

Bu Eğitilebilir Kitap, tasarımı ve projemden bazı önemli öğrenmeleri belgeliyor. Kendi RGB LED matrisinizi oluşturmak için satın alabileceğiniz tam kitler de dahil olmak üzere bu proje hakkında daha fazla bilgiyi web sitemde burada bulabilirsiniz.

Adım 1: Donanım Tasarımı

Donanım tasarımımın birincil amacı, programlayabileceğim bir dizi RGB LED oluşturmaktı, ama aynı zamanda çok fazla para harcamak da istemiyordum. Karar verdiğim yaklaşım, LED'leri kontrol etmek için 74HC595 kaydırma yazmaçlarını kullanmaktı. Gereken kaydırma yazmaçlarının sayısını en aza indirmek için RGB LED'leri, ortak anotların sıralar halinde ve kırmızı, yeşil ve mavi katot uçlarının sütunlar halinde birbirine bağlandığı bir matris düzenine yerleştirdim. 4x4 matris için devre şeması ekli devre şemasına benziyordu.

Hemen fark edeceğiniz bir şey, matris devresi göz önüne alındığında, istenen tüm LED'lerin aynı anda açık olmasıyla yapılamayan bazı LED aydınlatma konfigürasyonları olduğudur. Örneğin, matris, birbirinden diyagonal olan iki LED'i aynı anda yakamaz çünkü hem satırlara hem de sütunlara güç verilmesi, iki zıt LED'in istenen LED'lere dik diyagonal üzerinde yanmasına neden olacaktır. Bu sorunu çözmek için, her satırı taramak için çoğullama kullanacağız. Web'de çoğullama tekniğini kapsayan birçok kaynak var, onları burada kopyalamaya çalışmayacağım.

Ortak anot LED'leri kullandığım için bu, satırların pozitif güç sağladığı ve sütunların toprağa battığı anlamına gelir. İyi haber şu ki, 74HC595 kaydırmalı yazmaçlar hem güç sağlayabilir hem de azaltabilir, ancak kötü haber şu ki, ne kadar güç sağlayabilecekleri veya batırabilecekleri konusunda bir limitleri var. 74HC595'in bireysel pinlerinin maksimum akım çekişi 70 mA'dır, ancak en iyisi 20 mA'dan az tutmaktır. RGB LED'lerimizdeki ayrı renklerin her biri yaklaşık 20 mA çekişe sahiptir. Bu, hepsini açmak istersem 74HC595'in tüm LED sırasını doğrudan çalıştıramayacağı anlamına gelir.

Böylece, sıraya doğrudan güç vermek yerine, 74HC595 bunun yerine her sıra için bir transistör çalıştıracak ve transistör sıraya güç veren akımı açıp kapatacaktır. Tasarım ortak bir anot LED'leri kullandığından, anahtarlama transistörü PNP olacaktır. Ortak bir katot LED kullanıyor olsaydık, anahtarlama transistörü NPN olurdu. Bir satırı sürmek için bir PNP transistörü kullanıldığında, bir PNP transistörünün, verici ile taban arasında açılması için negatif bir voltaja ihtiyaç duyması nedeniyle, kaydırma yazmacının açma ayarının artık düşük olduğunu unutmayın; bu, pozitif akımın akmasına izin verecektir. sıra.

Dikkate alınması gereken diğer bir şey, kaydırma yazmaçlarının istenen bit düzenidir. Yani, kaydırma kayıtları arasında, matristeki hangi satırları veya sütunları kontrol eden bitlerdir. İle gönderdiğim tasarım, papatya dizimli kaydırma yazmaçlarına gönderilen ilk bitin veya "en önemli bitin", LED'lerin kırmızı öğesinin sütununu kontrol ettiği, ikinci bitin ilk sütunun yeşil öğesini kontrol ettiği, üçüncü bitin ilk sütunun kontrol ettiği yerdir. mavi öğe, dördüncü bit ikinci sütunun kırmızı öğesini kontrol eder, … bu model soldan sağa sütunlar boyunca tekrarlanır. Sonra gönderilen bir sonraki bit son veya alt satırı kontrol eder, sonraki ikinci son satıra kadar bu, gönderilen son bit veya "en az anlamlı bit"e kadar tekrarlanır, matristeki ilk veya en üst satırı kontrol eder.

Son olarak, RGB LED'deki LED'lerin her biri için hangi dirençleri kullanacağımı belirlemem gerekiyordu. Gerekli direnci hesaplamak için ileri voltajı ve istenen akımı birleştiren standart formülü kullanabilseniz de, her bir LED'in akımını 20 miliampere ayarlamanın tüm kırmızı, yeşil ve mavi LED'ler açıkken kirli beyaz bir renkle sonuçlandığını buldum.. Bu yüzden göz küresi yapmaya başladım. Beyazda çok fazla kırmızı, akımı azaltmak için kırmızı LED'in direnç ohm'unu artırmak anlamına geliyordu. Doğru olduğunu hissettiğim beyaz bir renk üreten bir kombinasyon bulana kadar farklı ohmlardaki dirençleri değiştirmeyi tekrarladım. Son kombinasyon kırmızı LED için 180 Ω, yeşil LED için 220 Ω ve mavi LED için 100 Ω idi.

2. Adım: Donanım Yapısı - Breadboard

Donanım İnşaatı - Breadboard
Donanım İnşaatı - Breadboard
Donanım İnşaatı - Breadboard
Donanım İnşaatı - Breadboard

Donanım üreticisinin ilk aşaması ekmek tahtasıydı. Burada RGB LED'lerle 4x4 matris yaptım. Bu matrisin kontrol edilmesi için 16 bit, RGB sütunları için 12 ve her satır için 4 bit gerekir. İki 74HC595 kaydırma yazmacı hepsini halledebilir. Önce işe yarayacağını düşündüğüm bir devreyi araştırdım ve tasarladım, ardından devre tahtası üzerine kurdum.

Muhtemelen breadboard kurulumunun en büyük zorluğu tüm kabloları yönetmekti. Breadboard'lar için önceden şekillendirilmiş bir tel seti aldım, ancak o zaman olay biraz hantaldı. Yararlı bulduğum bir numara, Arduino kartına bağlanmak için bir "port" oluşturmaktı. Yani, Arduino üzerindeki pinleri doğrudan breadboard üzerindeki çeşitli IC pinlerine bağlamak yerine, breadboard üzerindeki birkaç satırı Arduino için bağlantı noktası olmaya ayırın ve ardından ilgili ID pinlerini bu satırlara bağlayın. Bu proje için Arduino'ya yalnızca beş bağlantıya ihtiyacınız var: +5V, toprak, veri, saat ve mandal.

Breadboard kurulumu tamamlandıktan sonra test etmem gerekiyordu. Ancak, vardiya kayıtlarına doğru sinyalleri gönderecek bir tür sürücü olmadan, donanım düzeninin çalışıp çalışmadığını test edemedim.

3. Adım: Sürücü Yazılım Tasarımı

Image
Image

Yazılım geliştirme konusundaki kendi kariyer deneyimime bakıldığında, bu, muhtemelen izlenecek yol konusunda en net olduğum projenin parçasıydı. Diğer Arduino tabanlı LED matris sürücülerinin çoğunu araştırdım. Kesinlikle iyi sürücüler mevcut olsa da, hiçbiri istediğim tasarıma sahip değildi. Sürücünün tasarım hedeflerim şunlardı:

  • Programlı olarak görüntüler ve animasyonlar oluşturabilmek için üst düzey bir API sağlayın. Gördüğüm çoğu sürücü daha çok sabit kodlanmış görüntülere odaklanmıştı. Ayrıca, ticari olarak bir C++ programcısı olduğum için, LED matrisine çizim faaliyetlerini uygulamak ve yönetmek için iyi nesne yönelimli tasarım kullanmak istedim.
  • Ekrandaki görüntüyü yönetmek için çift arabellekli bir yaklaşım kullanın. Bir arabellek, programlı olarak çizilen şeydir, diğeri ise herhangi bir anda matris piksellerinin durumunu temsil eder. Bu yaklaşımın avantajı, çoğullamanın güncelleme döngüleri arasında ekran için bir sonraki çerçeve güncellemesini tamamen oluşturmanızın gerekmemesidir.
  • Bir RGB'nin kırmızı, yeşil ve mavi öğelerin basit kombinasyonlarıyla oluşturabileceği yedi ilkel renkten daha fazlasına izin vermek için PWM'yi kullanın.
  • Sürücüyü, genel matris tasarım yaklaşımımı izleyen farklı boyuttaki RGB LED matrisleriyle "sadece çalışacak" şekilde yazın. Donanım tasarımım 74HC595 kaydırma yazmaçları kullanırken, sürücümün donanım tasarımımla benzer bir bit düzeni kullanılarak düzenlenmiş herhangi bir kaydırma yazmacı stili açma/kapama mekanizmasıyla çalışmasını beklerdim. Örneğin, sürücümün sütunları kontrol etmek için DM13A yongalarını ve satırları kontrol etmek için bir 74HC595 yongasını kullanan bir donanım tasarımıyla çalışmasını beklerdim.

Doğrudan sürücü koduna bakmak isterseniz, onu GitHub'da burada bulabilirsiniz.

Sürücümün ilk yinelemesi, Arduino platformunun yetenekleri konusunda biraz öğrenme eğrisiydi. En belirgin sınırlama, Arduino Uno ve Nano için 2K bayt olan RAM'dir. Böyle bir senaryoda C++ nesnelerinin kullanılması, nesnelerin bellek yükü nedeniyle sıklıkla tavsiye edilmez. Ancak, doğru yapılırsa, C++'daki nesnelerin faydasının (RAM'de) maliyetlerinden daha ağır bastığını hissettim.

İkinci büyük zorluk, RGB LED'in yedi ilkel renginden fazlasını üretebilmem için darbe genişliği modülasyonunu kaydırma yazmaçları aracılığıyla nasıl uygulayacağımızı bulmaktı. Linux platformlarında uzun yıllar program yaptıktan sonra, tutarlı zamanlama gerektiren süreçleri yönetmek için iş parçacığı gibi yapıları kullanmaya alışkındım. Kaydırmalı yazmaç güncelleme işleminin zamanlaması, çoğullama kullanan bir LED matrisi için bir sürücü oluştururken oldukça kritik hale gelir. Bunun nedeni, çoğullama o kadar hızlı gerçekleşse de, gözleriniz tek tek LED'lerin yanıp söndüğünü göremese de, gözleriniz LED'lerden herhangi birinin açık olduğu toplam toplam süredeki farklılıkları algılayabilir. Bir sıra LED diğerlerinden daha uzun süre sürekli yanarsa, çoğullama sırasında daha parlak görünecektir. Bu, matriste eşit olmayan parlaklığa veya bir bütün olarak matrisin periyodik olarak yanıp sönmesine yol açabilir (bu, bir güncelleme döngüsü diğerlerinden daha uzun sürdüğünde meydana gelir).

Vardiya kaydı güncellemelerinin onaylanmasını sağlamak için tutarlı bir zamanlama mekanizmasına ihtiyacım olduğundan, ancak Arduino resmi olarak iş parçacığını desteklemediğinden, kendi iş parçacığı benzeri mekanizmamı oluşturmam gerekiyordu. Bunu ilk yinelemem, basitçe Arduino loop() işlevine bağlı olan ve eylemin son başlatılışından bu yana belirli bir süre geçtiğinde bir eylemi başlatacak bir döngü zamanlayıcısı oluşturmaktı. Bu bir "ortak çoklu görev" biçimidir. Kulağa hoş geliyor ama pratikte ateşleme hızı mikrosaniye cinsinden ölçüldüğünde bunun tutarsız olduğu ortaya çıktı. Bunun nedeni, bu döngü zamanlayıcılarından ikisini çalıştırırsam, eylemlerinden birinin, ikinci eylemin istenenden daha sonra başlamasına neden olacak kadar uzun sürmesidir.

Bu sorunun çözümünün Arduino'nun yerel saat kesme mekanizmasını kullanmak olduğunu buldum. Bu mekanizma, çok tutarlı aralıklarla küçük bir kod parçası çalıştırmanıza izin verir. Bu yüzden sürücü kodunu, matrisin kaydırma yazmaçlarını çoklama döngüsündeki bir sonraki güncellemeyi göndermek için kodu tetiklemek için bir saat kesmesi kullanma tasarım öğesi etrafında tasarladım. Bunu yapmak ve vardiya kayıtlarına aktif bir dökümü engellememek için ekran görüntüsünde güncellemelerin gerçekleşmesine izin vermek için ("yarış koşulu" olarak adlandırdığımız bir şey), kaydırma yazmacı bitleri için ikiz arabelleğe sahip bir yaklaşım kullandım, bir yazmak için ve bir tane okumak için. Kullanıcı matris görüntüsünü güncellerken, bu işlemler yazma arabelleğinde gerçekleşir. Bu işlemler tamamlandığında, kesintiler geçici olarak askıya alınır (bu, saat kesintisinin tetiklenemeyeceği anlamına gelir) ve yazma arabelleği önceki okuma arabelleğiyle değiştirilir ve bu yeni okuma arabelleği değildir, ardından yorumlar yeniden etkinleştirilir. Ardından, bir sonraki bit konfigürasyonunu kaydırma yazmaçlarına gönderme zamanının geldiğini belirten saat kesmesi tetiklendiğinde, bu bilgi mevcut okuma tamponundan okunur. Bu şekilde, bir saat kesmesi sırasında okunmakta olan bir ara belleğe hiçbir şekilde yazma gerçekleşmez ve bu da vardiya kayıtlarına gönderilen bilgileri bozabilir.

Sürücünün geri kalanını tasarlamak, nesne yönelimli tasarımın nispeten basit bir durumuydu. Örneğin, herhangi bir ekran durumu için kaydırma yazmacı bit görüntüsünü yönetmek için bir nesne yarattım. Bit görüntü yönetimine ilişkin kodu kapsülleyerek, yukarıda bahsedilen ikiz arabellek yaklaşımını oluşturmak, başlı başına basit bir alıştırmaydı. Ancak bu Eğitilebilir Yazıyı, nesne yönelimli tasarımın erdemlerini övmek için yazmadım. Diğer tasarım öğesi, bir Glif ve bir RGB Görüntü kavramını içerir. Glif, doğuştan gelen renk bilgisi olmayan temel bir görüntü yapısıdır. Bunu siyah beyaz bir görüntü olarak düşünebilirsiniz. Glif LED ekrana çizildiğinde, "beyaz" piksellerin nasıl renklendirilmesi gerektiğini belirtmek için renk bilgisi verilir. RGB Görüntü, her pikselin kendi renk bilgisine sahip olduğu bir görüntüdür.

Bir RGB LED matrisinde görüntüler ve animasyonlar oluşturmak için sürücünün nasıl kullanılacağına aşina olmak için Arduino çizim örneklerini incelemenizi ve sürücü başlığı belgelerini incelemenizi tavsiye ederim.

Adım 4: LED'in Gölgelenmesi

LED Gölgelenme
LED Gölgelenme
LED Gölgelenme
LED Gölgelenme

Bir LED matrisinde, "gölgelenme", matristeki bir LED'in istenmediğinde, genellikle çok düşük bir seviyede parlaması olgusudur. Orijinal donanım tasarımım, özellikle son sırada olmak üzere, gölgelenmeye karşı hassastı. Bunun nedeni iki şeyden kaynaklanmaktadır: Transistörler hemen kapanmaz ve RGB LED'lerde parazitik kapasitans.

Sıraları tararken, transistörlerin hemen kapanmaması nedeniyle, bir sonraki satır açıldığında, tarama döngüsündeki önceki satır hala kısmen güçlenir. Önceki satırda kapalı olan belirli bir sütun, yeni satıra güç verildiğinde yeniden açılırsa, önceki satırdaki o sütunun LED'i, önceki satırın anahtarlama transistörü hala dönme sürecindeyken kısa bir süre yanacaktır. kapalı. Transistörün kapanması için belirgin bir süre almasına neden olan şey, transistörün tabanındaki doygunluktur. Bu, transistör toplayıcı-verici yolunun, akım tabandan çıkarıldığında, en azından doygunluk dağılana kadar iletmeye devam etmesine neden olur. Çoğullama güncelleme döngümüzün, mikrosaniye cinsinden ölçülen süre boyunca satırların bilerek açık olmasına neden olduğu göz önüne alındığında, önceki satırın doymuş transistörünün iletken kaldığı süre, bunun gözle görülür bir kısmı olabilir. Sonuç olarak, gözünüz bir önceki sıranın LED'inin açık olduğu çok küçük bir süreyi algılayabilir.

Transistör doygunluğu sorununu gidermek için, transistör açıkken tabana biraz geri akım sağlamak ve transistörün doymasını önlemek için taban ile kollektör arasındaki transistöre bir Schottky diyot eklenebilir. Bu da tabandan akım kesildiğinde transistörün daha hızlı kapanmasına neden olacaktır. Bu etkinin ayrıntılı bir açıklaması için bu makaleye bakın. Bu bölümdeki resimden de görebileceğiniz gibi, diyot olmadan gölgelenme oldukça belirgindir, ancak diyotun devreye her sıra için eklenmesi gölgelenmeyi önemli ölçüde ortadan kaldırır.

RGB LED'ler, parazit kapasitans adı verilen başka bir fenomene karşı hassastır. Bunun temel nedeni, RGB LED ünitesindeki üç renkli LED'in her birinin farklı ileri voltajlara sahip olmasıdır. İleri voltajlardaki bu fark, ayrı LED renklerinin her biri arasında elektrik kapasitansının etkisine neden olabilir. Güç verildiğinde LED ünitesinde bir elektrik yükü oluştuğundan, güç kesildiğinde parazitik kapasitansın boşaltılması gerekir. Bu LED sütunu başka bir satırın gücü için açıksa, parazitik yük bu sütun LED'inden boşalır ve kısa bir süre parlamasına neden olur. Bu etki bu makalede güzel bir şekilde açıklanmıştır. Çözüm, bu parazitik yük için LED'in kendisi dışında bir deşarj yolu eklemek ve ardından kolona tekrar güç verilmeden önce LED'in deşarj olması için zaman tanımaktır. Donanım tasarımımda bu, gücü toprağa bağlayan her sıranın güç hattına bir direnç ekleyerek gerçekleştirilir. Bu, sıraya güç verildiğinde daha fazla akımın çekilmesine neden olur, ancak sıraya güç verilmediğinde parazitik kapasitans için bir deşarj yolu sağlar.

Bununla birlikte, pratikte parazitik kapasitansın etkisini zar zor fark ettiğimi (eğer ararsanız bulabilirsiniz) ve bu yüzden bu ekstra direnci isteğe bağlı olarak eklemeyi düşünüyorum. Doymuş transistörler için yavaşlama süresinin etkisi çok daha güçlü ve dikkat çekicidir. Bununla birlikte, bu bölümde verilen üç fotoğrafı incelerseniz, dirençlerin, yavaş transistör kapalı zamanlarının ötesinde hala meydana gelen gölgelenmeyi tamamen ortadan kaldırdığını görebilirsiniz.

Adım 5: Son İmalat ve Sonraki Adımlar

Image
Image

Bu projenin son aşaması benim için bir baskılı devre kartı (PCB) oluşturmaktı. PCB'mi tasarlamak için açık kaynaklı Fritzing programını kullandım. 100 LED'i 10x10'luk bir panoya yerleştirmek için birçok tekrarlanan görev olsa da, aslında projenin bu aşamasını garip bir şekilde tatmin edici buldum. Her bir elektrik yolunun nasıl düzenleneceğini bulmak bir bulmaca gibiydi ve bu bulmacayı çözmek bir başarı duygusu yarattı. Devre kartlarını üretmeye hazır olmadığım için, küçük özel PCB çalışmaları yapan birçok çevrimiçi kaynaktan birini kullandım. Tasarımım tüm delikten geçen parçaları kullandığından, parçaları birbirine lehimlemek oldukça kolaydı.

Bu Eğitilebilir Yazıyı yazarken, RGB LED Matrix projelerim için aşağıdaki planlarım var:

  1. Programcıya, özellikle metin kaydırma olmak üzere daha yüksek düzeyde işlevsellik sağlamak için API katmanında sürücüyü geliştirmeye devam edin.
  2. 16x16 ve hatta 16x32 gibi daha büyük matris tasarımları oluşturun.
  3. Sıra güç değiştirme için BJT'ler yerine MOSFET'leri kullanmayı keşfedin
  4. Sütun değiştirme için 74HC595'ler yerine DM13As sabit akım sürücülerini kullanmayı keşfedin
  5. Teensy, ODROID C2 veya Raspberry Pi gibi diğer mikro kontrol platformları için sürücüler oluşturun.

Hem donanım tasarımının hem de sürücünün bu GitHub deposunda GPL v3 açık kaynak lisansı altında yayınlandığını unutmayın. Ayrıca, PCB üreticileri benim PCB tasarımımda "küçük çalışmalar" yapsalar bile, kişisel olarak ihtiyacım olandan çok daha fazlasını elde ediyorum. Bu yüzden, web sitemden çeşitli RGB LED matris tasarımlarım (PCB ve tüm parçalar dahil) için tam kitler satıyorum.

Önerilen: