PWM ile 500 LED'i kontrol etme


26

Her biri için optimal olarak PWM desteğiyle 500 LED'e tek tek hitap edecek bir proje üstlenmeyi düşünüyorum.

Zaten bir tane olduğundan Arduino kullanmayı planlıyorum, ancak eğer farklı bir platformun daha iyi bir eşleşme olacağını düşünenlerin önerisine açığım.

Vardiya kayıtlarının kullanılması gerekecektir. Bu durumda kullanmak için iyi bir vardiya kaydı nedir? Eğer PWM bu projeyi çok daha pahalı hale getirirse, onsuz yapabilirim. 100 dolardan daha az harcamayı denemek istiyorum. Ben ebay kapalı 500 LED satın alırdım.

Bu kadar çok sayıda LED'i kontrol etmenin en iyi yolu hakkında fikriniz nedir? Ayrıca, gücü sağlama konusunda nasıl giderim? Herhangi bir yardım için minnettar olurum. Elektronik konusunda oldukça deneyimliyim, hiç bu kadar büyük bir şey yapmadım.

Yanıtlar:


14

ShiftPWM kütüphanesinin yazarıyım ve sadece normal LED'ler, LED şeritler ve yüksek güçlü LED'ler için şemalar ve daha birçok genel bilgi içerecek şekilde dökümanları güncelledim.

Büyük olasılıkla projenizi zaten başlattınız, ancak bu sayfa çok fazla ziyaretçi aldığından hala ayrıntılı bir cevap vermek istiyorum.

ShiftPWM ile 500 LED'i kontrol etmek istiyorsanız, 60 Hz'de LED başına yaklaşık 64 parlaklık seviyesi elde edebilirsiniz. 64 vardiya kaydı kullanırsınız. Özel donanım PWM sürücüleri size daha fazla parlaklık düzeyi verir, ancak biraz daha pahalı olur. Kitaplığımın temel avantajının kullanım kolaylığı olduğunu düşünüyorum, çünkü RGB ve HSV fonksiyonlarını ve birçok örneği içeriyor.

Sabit vardiya LED sürücüye sahip oldukları için normal vites kayıtları yerine kişisel olarak TLC5917 TLC5916'ya giderdim. Bu size çok lehimleme kazandıracak, çünkü dirençlere ihtiyacınız yok.

Web sitemde ( http://www.elcojacobs.com/shiftpwm ) LED'lerin nasıl bağlanacağı ve uzun sinyal kablolarının Arduino ile yüksek hızlarda sürülmesiyle nasıl başa çıkılacağı hakkında daha fazla bilgiye sahibim.

Başka sorunuz varsa, lütfen sorun.


Aşağıdaki cevabımı gördünüz mü? Tanımladığım teknik ekstra donanım kullanmasına rağmen, aynı yaklaşım kütüphanenizin hızını büyük ölçüde artırmak için kullanılabilir. Arduino'yu programlamamıştım, bu yüzden onun talimat zamanlamalarına aşina değilim, ama en basit haliyle CPU yüklemenizi SPI'yi basit bir şekilde bitirmek için gereken her şeye indirgeyebilirsiniz (şu anda 5 döngüdeyseniz) bit başına ve SPI'nız bayt başına 16 devir alır, bu 2.5x'lik bir hızlanma olur). Bu hızda çalışmaya devam ederken daha karmaşık şeyler bile yapabilirsiniz.
supercat,

Örneğin, tam, 1/2, 1/4, 1/8, 1/16, 1/32, 1/64 ve 1/128'i temsil eden sekiz parlaklık seviyesine sahip olmak istediğinizi varsayalım. Arduino, bir göstericiden alınan bir değerde "VE" veya "VEYA" işlemini gerçekleştirebiliyorsa ve bu işaretçiyi dört döngüden daha az artırıyorsa, parlaklık bilgilerinizi saklamak ve yine de bir aktarım hızı elde etmek için her piksel için üç bit kullanabilirsiniz. 8 LED başına 16 döngü.
supercat,

PWM değerlerini hesaplamak, kütüphanemdeki SPI çıktısını üst üste getirir. SPI'yi 4MHz'de çalıştırıyorum ve hesaplamalar SPI çıkışından biraz daha uzun sürüyor. Bayt başına 43 saat döngüsü alır, böylece 8 çıkış için. Bu, çoğu kurulum için yeterince hızlıdır. 8 güncelleme periyodunun olduğu bit kod modülasyonunu kullanarak, her bir önceki periyodun yarısı kadar olan periyotların yarısını kullanarak daha fazla hız elde edebilirsiniz. Bir BCM sürümü yazdım, ancak parlaklık ayarını güncellediğiniz andan daha hassastır. Yanlış hizalandığı zaman titremeye neden olabilir. Muhtemelen matris versiyonunda olsa kullanacağım.
ElcoJacobs

BCM, 1 / 2,1 / 4 ... zamanlamasından yararlanabileceğiniz yaklaşımınızın avantajına sahiptir, ancak yine de LED başına sadece bir pin alır. Bir bilgisayar bilimi geçmişiniz varsa, SPI baytlarının nasıl hesaplandığını ilginç bulabilirsiniz. Görev döngüsünü bellekten alıyorum (2 saat) ve bir karşılaştırma yapıyorum (1 saat). Karşılaştırma sonucu, taşıyıcıda depolanır, böylece bir döndürme taşı (1 saat) ile byte'a kaydırabilirim. 8 kez yapmak, tüm karşılaştırma sonuçlarını SPI'ye gönderilmeye hazır olan bir bayta koyar.
ElcoJacobs

13

Sadece kopyala :-)

http://www.evilmadscientist.com/article.php/peggy2

Bugün “Peggy” açık kaynaklı LED Pegboard projemiz için bir güncelleme yayınlıyoruz. Peggy versiyon 2 sıfırdan yeniden tasarlandı. Ve görünüyor… neredeyse tamamen aynı. Kaputun altındaki değişiklikler önemli olsa da, bunun birçok yönden büyük bir gelişme olduğunu düşünüyoruz.

Birincisi ve en önemlisi, Peggy 2.0 hala aynı lanet şeyi yapıyor: 25 x 25'lik bir dizi LED konumuna verimli güç sağlar. Peggy, bazı acı, karmaşıklık ve LED'lerle oynamaktan kurtulmak için tasarlanmıştır. Tek bir yük direnci hesaplamaksızın, yüzlerce LED'i istediğiniz herhangi bir yapılandırmada verimli bir şekilde sürmenize olanak tanıyan çok yönlü ve güçlü bir ışık yayan pegboard'dur. Bir ile 625 LED arasında herhangi bir yere kurabilirsiniz ve Peggy bunları sizin için aydınlatacaktır.


Peggy 2.0 artık Arduino uyumludur: popüler Arduino yazılım ortamını kullanarak bir USB-TTL kablosuyla programlamayı destekler.


Harika bağlantı! Yer işaretli. O küçük bir video :-) gördüm böyle bir proje üzerinde çalışmaya düşünmüyordum, ama şimdi yapmak zorunda
Wouter Simons

@ NicolaSurdu Kırık değil. Hemen şimdi açtım.
Axeman

3
Bu soruyu teorik olarak cevaplayabilse de , cevabın temel kısımlarını buraya eklemek ve referans için bağlantıyı sağlamak tercih edilir.

6

LED'lerin hangi düzende olmasını istersiniz? Bazı LED matrisleri satın alırsanız, çok fazla tasarruf edebilirsiniz , bir veya iki dolar için tek renkli 8x8 LED matrisleri (64 LED) alabilirsiniz .

Bir AVR ile gerçek PWM elde edemezsiniz ve bu birçok LED üzerinde vardiya kayıtlarını kullanabilirsiniz, ancak 2-4 parlaklık seviyesini sıkabilirsiniz. Numaraları kontrol edip neyin mümkün olduğunu görmelisin.

Allegro , LED dizilerini kontrol etmek için özel olarak tasarlanmış , bazı sabit akım düşürme kayma kayıtları yapar , böylece işleri daha da kolaylaştıracak ekstra dirençlere ihtiyacınız olmaz. Yeterli güç sağlayamıyorsa, LED'leri doğrudan AVR çıkışından çekemeyebilirsiniz, bu nedenle transistör kullanmanız gerekir. Onları tek bir IC'de dizilere sokabilirsiniz , bu da bazı işleri kurtarır.


hepsi çok iyi noktalar!
Jason S

5

Bir LED için ihtiyacınız olan PWM ürün yelpazesi hakkında hiçbir fikrim yok, ancak bana 600us ve 2,4 ms arasında puls verebilen bir servo kontrol uygulaması için 64 kanallı bir PWM kontrol cihazı üzerinde çalışıyorum. Bu, bir ATMega168'deki 8 G / Ç pimlerinden 64 kanal üretmek için CD74HCT238E'leri (3-8 hat azaltıcıları) kullanır ve basit seri komutlar ile kontrol edilebilir. Sanırım, bu kontrol cihazının birden fazla versiyonunu seri bir hat üzerinde bir araya getirebilir ve 500 LED'in tamamına hitap edebilirsiniz ... Cihaz yazılımı gereksinimleriniz daha basit olacağı için muhtemelen kontrol cihazının ATTiny2313 versiyonunu kullanabilirsiniz.

Benim blog montaj kaynak ve şemaları ve tasarım sürecinin ayrıntıları içerir.


5

Fuser / digikey'deki "LED driver" IC'lerine bakın. Örneğin, TI, ihtiyaçlarınızı kesinlikle karşılayacak çeşitli arayüzlere (I2C, SPI) sahip bir sürü sürücü yapar. Bu sürücülerin çoğu papatya zinciri olacak şekilde tasarlanmıştır, böylece bir seriden başka bir seriye beslenir.

Örneğin, TLC5940 gibi bir şey 16 kanallı PWM kontrolü sunar. Bu nedenle, temelde, 12 bit gri tonlamalı PWM kontrolüne sahip sabit bir akım 16 bit kaydırma yazmacıdır. Özel bir IC'yi 80x16'lık bir ekran tasarlamaya yardımcı olduğum için önerebilirim.


4

Mondomatrix bazı seri (rs-485) adreslenebilir LED sürücü kartlarını yapar ve Arduino platformuna dayanır: http://www.displayduino.com/ Bu donanımı kullanarak oldukça kolay bir şekilde bir sistemi bir araya getirebilirsiniz


4

Her bir LED için çok fazla PWM kontrolü istemiyorsanız ve her PWM döngüsünde 500 LED'in bulunduğu bir işlemciye sahip olmak zorunda kalmamak istiyorsanız, N 74HC595 veya eşdeğer yongalar kullanarak N parlaklık değerine sahip 8 LED'i kontrol edebilirsiniz. . Tüm N çiplerinin çıkışlarını bir araya getirin ve kabloları uygun zamanda sadece bir seferde bir tane sağlayacak olan bazı devrelere bağlayın. Düzenleyin, böylece ilk çip yarı yarıya, ikinci yarısı kalan kısım vb. İçin etkin olacak.

Vardiya kayıtlarının herhangi bir yeniden yüklenmesi, takma etkilerini en aza indirmek için PWM hızı ile senkronize edilmelidir (örneğin, eğer bir parlaklık seviyesi 0111 ile 1000 arasında hızlı bir şekilde değişiyorsa, anahtarın meydana geldiği andaki PWM döngüsündeki nokta anlık parlaklığı değiştirebilir) ).

Her LED için birden fazla 74HC595 çıkış kullanmak zorunda kalmak can sıkıcı olabilirken, bu yaklaşım muhtemelen devam etmekte olan CPU müdahalesi olmadan farklı parlaklık seviyelerini koruyabilen en basit olanıdır.


3

Bu doğrudan soruyu cevaplamıyor, ancak göz önünde bulundurmanız gereken bir başka husus , 500 partinizdeki LED'ler arasındaki olası parlaklık değişkenliği . Bu, özellikle LED'ler bir matris veya 7 segmentli ekranlarda olduğu gibi birbirine yakın monte edilirse önemlidir. Bu sorunun nasıl çözüleceği hakkında daha fazla ayrıntı için, özellikle LED parlaklığındaki değişimleri telafi etmek için nokta düzeltmesi kullanarak bu cevaba bakınız .

Yaptığım 7-segment büyük ekran için 200 1 mm kırmızı LED aldığımda bu sorunu yaşadım. Sorunu çözmek için ucuz olan çözümüm şunları gerektirdi:

  1. Çeşitli parlaklık kategorilerindeki led gruplarını sınıflandırmak için breadboard'da bir LED test cihazı yaptım
  2. Her segmenti aynı kategorideki LED'leri kullanarak monte ettim (tasarımımda her segment seri olarak monte edilmiş 5 LED'den oluşuyordu)
  3. Farklı akım sınırlama dirençleri kullanarak her bölüm parlaklığındaki farkı telafi ettim. Örneğin, daha parlak LED'li bir segment için 100 ohm'luk bir direnç, daha sönük LED'li başka bir segment için 120 ohm'luk direnç kullanırdım.

1
Geçerli bir nokta, ancak soruyu cevaplamıyor.
Matt Young,

1
@MattYoung Anlaşıldı. Soru, diğer tüm cevaplar tarafından büyük ölçüde cevaplanmaktadır. Ben sadece OP'nin tasarımını etkileyebilecek bir yan konuya değinerek bu cevapları tamamlamak istedim.
Ricardo


1

XMOS Macroblock MBI5026'yı LED karo kitleri ile birlikte kullanıyor. Diğer profesyonel sistemlerde kullanıldığını düşünüyorum.

Leon


1

Seri arayüzlere sahip özel sürücü yongaları muhtemelen en iyi yol olacaktır. Bireysel kayma kayıtları ile başa çıkmak muhtemelen çok karmaşık bir devre anlamına gelecektir. En azından Maxim ve TI bazılarını yapıyor. Her ikisinin de buna uygun bir modeli olup olmadığını hatırlamıyorum.

Hala çok fazla donanım gerektirecek.

Güç, programlama ve veri yollarına gelince, her sürücünün veri sayfası muhtemelen ihtiyacınız olan en fazla bilgiye sahip olacaktır.


1

Yazılım alanında, birinin ihtiyaç duyduğu farklı parlaklık ayarlarının sayısı çok büyük değilse, verileri "bit-düzlemsel" biçimde (diğer donanım tabanlı cevabımda açıklandığı şekilde) saklamak ve sonra çıktı yordamları, bir defada 8 pikselde etki etmek için Boolean işleçlerini kullanır. Maksimum verimlilik için bu, PWM döngüsünün farklı bölümleri için kullanılan çoklu ayrı çıkış rutinlerine sahip olmayı gerektirecektir; örneğin, biri 4 bitlik parlaklık değerleri kullanmak isterse, formun sekiz rutini kullanılır:

  movf bit0Comp, w; Karşılaştırıcının 0 bitine bağlı olarak 00 veya FF olmalıdır (eğer netse FF)
  iorwf POSTINCF, w; Veri biti 0; daima IORWF kullanın
  vewf POSTINCF, w; Veri 1 biti; Comparand'ın 1 biti ayarlanmışsa IORWF kullanın; ANDWF temizse
  vewf POSTINCF, w; Veri 2 biti; Comparand'ın 1 biti ayarlanmışsa, IORWF kullanın; ANDWF temizse
  vewf POSTINCF, w; Veri 2 biti; Comparand'ın 1 biti ayarlanmışsa, IORWF kullanın; ANDWF temizse
  movwf SPIREG; Elde edilen baytı sakla (eğer> = comparand ise ayarlanmış bit

Biri, karşılaştırıcının değerine bağlı olarak farklı IORWF ve ANDWF kombinasyonlarını kullanır. Bu yaklaşımı gösterildiği gibi kullanmanın, PWM döngüsünün herhangi bir noktasındaki piksel parlaklığı değerlerini titremeden titremeden güncelleyebileceğini unutmayın; ancak, dört bitin de ekran kaydırma rutinine çağrılar arasında yazılması veya piksel güncelleme rutininin belirleyip belirlemediğini belirlemesi sonraki vardiya, piksel için "1" veya "0" çıktısını verir ve pikselin tüm bitlerini (hangisi ne yaparsa yapsın işlem yapsın) ayarlayıp temizler ve sonra değeri olan bitleri yazar. karşı olmak. Ayrıca, ekran güncellemelerinin zamanlamasını değiştirerek veya bazı karşılaştırmalı değerleri bir PWM döngüsünde bir kereden fazla kullanarak isteğe bağlı doğrusal olmayan parlaklık ölçekleri elde edebileceğinizi unutmayın.


1

FPGA'lar veya CPLD'ler, birçok I / O pinleri sunduğundan bu tür görevler için iyi olabilir. En basit ve en ucuza gidin. Biri yeterli değilse, bir çift kullanın.


Bize neden bunun iyi bir seçenek olduğu hakkında biraz daha detay verebilir misiniz, şu anda bunu biliyorum, ama seçeneklerin ne olduğunu ve listelediğiniz önerilen teknolojilerin ne olduğunu biliyorum, Origial Poster (OP) muhtemelen böyle değil arka plan.
Kortuk

Bunun en iyi seçenek olduğundan emin değilim, ancak eksiksiz olması için belirtilmesini istedim. 500 LED'in PWM'lerle kontrol edilmesi durumunda, bir şekilde veya başka şekilde, sonunda 500 ayrı ayrı kontrol edilebilen tel gerekir. Çok fazla çıkış pinine sahip bir mikrodenetleyici bulmak zor. Bununla ilgili hala mikrodenetleyicileri kullanmanın pek çok yolu var, ancak bir veya birkaç ucuz CPLD / FPGA bu çıktı pinlerini kolayca verebilir.
Carl

1

Hemen hemen kesinlikle bir PSoC3 veya PSoC5 kullanarak kolayca yapabilirsiniz .

PSoC yongaları, bir FPGA veya CPLD gibi, yeniden yapılandırılabilir dijital donanım içeren mikrodenetleyicilerdir. Bu, PWM ile 500 LED'i sürmek gibi alışılmadık şeyler yapmak için karmaşık devreler yapabileceğiniz anlamına gelir. Dahası, muhtemelen yeniden yapılandırılabilir dijital blokları kullanarak her şeyi uygulayabilirsiniz, bu da çipin CPU kısmının sadece istenen LED parlaklıklarını bir diziye yazması gerektiği anlamına gelir.

504 LED, 21 x 24. bir dikdörtgene sığar. 24 PWM kanalınız ve 21 GPIO'nuz varsa, bu işlemi başarabilirsiniz. Bil bakalım ne oldu? PSoC'de bundan daha fazlası var.

PSoC'de 24 PWM kanalını kolayca ayarlayabilir ve diğer 21 pimi vardiya kaydının parçası olacak şekilde yapılandırabilirsiniz. Ardından, bazı DMA kanallarını bellekten PWM çıkışlarına bayt pompalamak için yapılandırın ve gülüyorsunuz. Şimdi CPU'nun yapması gereken tek şey grafikleri oluşturmak. PSoC3'ün 8 bitlik bir 8051 çekirdeği varken, PSoC5'in 32 bitlik bir ARM'ı var. İstediğini al. İhtiyacınız olacak tek harici IC, sıralara yüksek sürücü akımı sağlamak için bazı ULN2803'lerdir. PWM çıkışları, tek LED'ler için yeterli akım sürücüsüne sahip olmalıdır.


Bu, LED'leri sürmek için kullanılan toplam masraflardır. Her zaman devasa ekranlar için kullanılan bu kadar büyük miktarlarda zincirleme yapmak için üretilmiş özel, ucuz, önceden tasarlanmış LED sürücüleri bulunmaktadır. Tüm bunları yeniden icat etmeye gerek yok ve daha büyük maliyet.
nemik

@nemik - Aslında, cipslerin toplam maliyeti (pahalı Farnell'den) sadece 6,80 £.
Rocketmagnet

0

Ölçek ekonomisinden yararlanın. Aliexpress gibi çince siteler 50 LED'ler için ~ 15 $ karşılığında WS2811 tabanlı LED telleri satıyor. Ayrı ayrı adreslenebilir, parlak, genellikle su geçirmez ve parlaklık için PWM'ye sahiptirler. Hiçbir lehimleme veya kayma kaydı, ikisini de karıştırmaz. Bahse girerim bütün bunları kendin yapmak sana daha pahalıya mal olur, çok daha fazla zaman alır ve çok sinir bozucu olur. Ayrıca Oz'dasınız, bu yüzden Çin'den nakliye çok pahalı olmayacak.

Bunlar dev LED ekranlar yapmak için üretildi, böylece oldukça ucuz olma eğilimindeydiler. En iyi performans için her 50 LED'in üzerindeki gücü yeniden açtığınızdan emin olun.

Bunların kullanımını kolaylaştırmak için Arduino kütüphaneleri de vardır.


1
50 LED başına 15 dolar mı? Yani 500 LED için bu 150 $ 'a mı geliyor? Bana çözümümün pahalı olduğunu söyleme cesaretin var mı? -1
Rocketmagnet

Ayrıca, lütfen buna bir link verebilir misiniz? WS801 Google’ı iyi tanımıyor ve ayrıca bir Aliexpress
Rocketmagnet

Üzgünüm, WS2811'i, bu aliexpress.com/store/product/… veya PWM karartması olmadan, bu aliexpress.com/store/product/…
nemik

PWM karartma ile 50 LED'i sürmek için bir seri sinyal. Teşekkürler, bu tam olarak peşindeyim. Ancak standart bir kaydırma yazmacı, tam kare iletildikten sonra tamponlanmış verileri çıkışlara kopyalamak için bir "mandal" pimi sağlar. Mandal yok, bu yüzden yüksek yenileme hızlarında fark edilebilir bir gürültü bekliyorum. Çipler, piksel başına 15 bitlik 400 Kbps veriyi destekliyor, böylece çerçeve güncellenirken ekran 1.9 milisaniye için saçma görüntüler.
nialsh
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.