Mengontrol 500 LED dengan PWM

26

Saya sedang mempertimbangkan mengambil proyek yang akan melibatkan secara individual menangani 500 LED, secara optimal dengan dukungan PWM untuk masing-masing.

Saya berencana menggunakan Arduino karena saya sudah memilikinya, tetapi saya terbuka untuk saran jika ada yang berpikir platform yang berbeda akan menjadi pertandingan yang lebih baik.

Register shift perlu dipekerjakan. Apa register geser yang baik untuk digunakan dalam situasi ini? Jika PWM membuat proyek ini jauh lebih mahal, saya bisa melakukannya tanpa itu. Saya ingin mencoba menghabiskan kurang dari $ 100. Saya akan membeli secara massal 500 LED dari ebay.

Apa pendapat Anda tentang cara terbaik untuk mengendalikan sejumlah besar LED? Juga, bagaimana saya menyediakan tenaga? Saya menghargai bantuan apa pun. Saya cukup berpengalaman dengan elektronik, saya tidak pernah melakukan apa pun dalam skala besar.

littlebirdceo
sumber

Jawaban:

14

Saya adalah penulis perpustakaan ShiftPWM dan saya baru saja memperbarui dokumentasi untuk memasukkan skema dan lebih banyak info umum untuk LED normal, strip LED dan LED daya tinggi.

Anda mungkin sudah memulai proyek Anda, tetapi karena halaman ini mendapat banyak pengunjung, saya masih ingin memberikan jawaban yang terperinci.

Jika Anda ingin mengontrol 500 LED dengan ShiftPWM, Anda bisa mendapatkan sekitar 64 tingkat kecerahan per LED pada 60 Hz. Anda akan menggunakan 64 register geser. Driver PWM perangkat keras khusus akan memberi Anda lebih banyak tingkat kecerahan, tetapi akan sedikit lebih mahal. Saya pikir keuntungan utama dari perpustakaan saya adalah kemudahan penggunaan, karena termasuk fungsi RGB dan HSV dan banyak contoh.

Saya pribadi akan memilih TLC5916 dari TLC5917 bukan register geser normal, karena mereka memiliki built in driver LED konstan saat ini. Ini akan menghemat banyak penyolderan, karena Anda tidak perlu resistor.

Di situs web saya ( http://www.elcojacobs.com/shiftpwm ) saya memiliki lebih banyak info tentang cara menghubungkan LED dan cara menangani mengemudi kabel sinyal panjang dengan Arduino dengan kecepatan tinggi.

Jika Anda memiliki pertanyaan lagi, silakan tanyakan.

ElcoJacobs
sumber
Sudahkah Anda melihat jawaban saya di bawah ini? Meskipun teknik yang saya jelaskan menggunakan perangkat keras tambahan, pendekatan yang sama mungkin dapat digunakan untuk meningkatkan kecepatan perpustakaan Anda. Saya belum memprogram Arduino, jadi saya tidak terbiasa dengan pengaturan waktu instruksinya, tetapi dalam bentuk yang paling sederhana Anda dapat mengurangi pemuatan CPU Anda menjadi apa pun yang diperlukan untuk meledakkan bit SPI (jika saat ini Anda berada pada 5 siklus) per bit dan SPI Anda membutuhkan 16 siklus per byte, itu akan menjadi speedup 2.5x). Anda bahkan mungkin dapat melakukan beberapa hal yang lebih canggih sambil tetap berlari pada kecepatan itu.
supercat
Sebagai contoh, misalkan Anda ingin memiliki delapan tingkat kecerahan yang mewakili full-on, 1/2, 1/4, 1/8, 1/16, 1/32, 1/64, dan 1/128. Jika Arduino dapat melakukan operasi "AND" atau "OR" pada nilai yang diambil dari sebuah pointer dan meningkatkan pointer itu dalam waktu kurang dari empat siklus, Anda mungkin bisa menggunakan tiga bit per pixel untuk menyimpan informasi kecerahan Anda dan masih mencapai kecepatan transfer dari 16 siklus per 8 LED.
supercat
Menghitung nilai PWM tumpang tindih dengan output SPI di perpustakaan saya. Saya menjalankan SPI pada 4MHz dan perhitungannya hanya memakan waktu sedikit lebih lama dari keluaran SPI. Dibutuhkan 43 clock cycle per byte, jadi per 8 output. Ini cukup cepat untuk sebagian besar pengaturan. Anda bisa mendapatkan kecepatan lebih dengan menggunakan modulasi kode bit, di mana Anda memiliki 8 periode pembaruan, masing-masing periode berikutnya setengah durasi dari sebelumnya. Saya telah menulis versi BCM, tetapi lebih sensitif saat Anda memperbarui pengaturan kecerahan. Ini dapat menyebabkan kedipan saat tidak sejajar. Saya mungkin akan menggunakannya dalam versi matriks.
ElcoJacobs
BCM memiliki keuntungan dari pendekatan Anda sehingga Anda dapat menggunakan pengaturan waktu 1 / 2,1 / 4 ..., tetapi hanya membutuhkan satu pin per LED. Jika Anda memiliki latar belakang ilmu komputer, Anda mungkin tertarik dengan bagaimana cara byte SPI dihitung. Saya menerima siklus tugas dari memori (2 jam) dan melakukan perbandingan (1 jam). Hasil perbandingan disimpan dalam carry, jadi saya bisa menggesernya ke byte dengan rotate over carry (1 jam). Melakukannya 8 kali menempatkan semua hasil perbandingan dalam satu byte yang siap dikirim ke SPI.
ElcoJacobs
13

Cukup salin :-)

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

Hari ini kami merilis pembaruan untuk proyek Pegboard LED open-source "Peggy" kami. Peggy versi 2 telah dirancang ulang dari bawah ke atas. Dan sepertinya ... hampir persis sama. Namun, perubahan di balik tudung adalah substansial, dan kami pikir ini merupakan peningkatan besar dalam banyak hal.

Pertama dan terpenting, Peggy 2.0 masih melakukan hal yang sama: ia memberikan daya yang efisien ke berbagai lokasi LED 25 x 25. Peggy dirancang untuk menghilangkan sengatan, kompleksitas, dan kekacauan bermain dengan LED. Ini adalah pegboard pemancar cahaya yang serba guna dan kuat yang memungkinkan Anda menggerakkan ratusan LED secara efisien dalam konfigurasi apa pun yang Anda suka, tanpa menghitung penghambat beban tunggal. Anda dapat memasang di mana saja dari satu hingga 625 LED, dan Peggy akan menyalakannya untuk Anda.


Peggy 2.0 sekarang juga kompatibel dengan Arduino: mendukung pemrograman melalui kabel USB-TTL, menggunakan lingkungan perangkat lunak Arduino yang populer.

Axeman
sumber
Tautan yang luar biasa! Ditandai. Saya tidak berencana untuk mengerjakan proyek seperti ini, tetapi saya harus membuatnya sekarang saya melihat video kecil itu :-)
Wouter Simons
@NicolaeSurdu Tidak rusak. Saya membukanya sekarang.
Axeman
3
Sementara ini secara teoritis dapat menjawab pertanyaan, akan lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini, dan menyediakan tautan untuk referensi.
6

Tata letak apa yang Anda inginkan dari LED? Anda dapat menghemat banyak pekerjaan jika Anda membeli beberapa matriks LED, Anda bisa mendapatkan matriks LED 8x8 warna tunggal (64 LED) seharga satu atau dua dolar .

Anda tidak akan mendapatkan PWM nyata dengan AVR dan menggeser register pada banyak LED ini, tetapi Anda mungkin bisa menekan 2-4 tingkat kecerahan. Anda harus menjalankan angka dan melihat apa yang mungkin.

Allegro membuat beberapa register shift arus konstan berguna yang secara khusus dirancang untuk mengendalikan array LED, sehingga Anda tidak perlu resistor ekstra, yang akan membuat semuanya menjadi lebih sederhana juga. Anda mungkin tidak dapat mengarahkan LED langsung dari output AVR jika itu tidak memberikan daya yang cukup, jadi Anda harus menggunakan transistor. Anda bisa mendapatkannya dalam array dalam satu IC , yang menghemat beberapa pekerjaan juga.

davr
sumber
semua poin yang sangat bagus!
Jason S
5

Saya tidak tahu kisaran PWM yang Anda butuhkan untuk LED, tetapi saya telah bekerja pada kontroler PWM 64 saluran untuk aplikasi kontrol servo yang dapat memberi saya pulsa antara 600us dan 2,4ms. Ini menggunakan CD74HCT238E (3-8 line demultiplexors) untuk menghasilkan 64 saluran dari 8 pin I / O pada ATMega168 dan dapat dikontrol melalui perintah serial sederhana. Saya kira Anda dapat membuat beberapa versi versi yang dimodifikasi dari pengontrol ini bersama-sama pada garis serial dan mengatasi semua 500 LED ... Anda mungkin bisa menggunakan versi ATTiny2313 dari pengontrol karena persyaratan firmware Anda akan lebih sederhana.

Blog saya berisi sumber rakitan dan skema serta detail proses desain.

Len Holgate
sumber
5

Lihatlah IC "driver LED" pada mouser / digikey. TI, misalnya, membuat banyak driver dengan berbagai antarmuka (I2C, SPI) yang tentunya akan memenuhi kebutuhan Anda. Sebagian besar driver ini dirancang untuk dirantai daisy sehingga seri keluar dari satu dimasukkan ke dalam seri di yang lain.

Misalnya, sesuatu seperti TLC5940 menawarkan kontrol PWM 16 saluran. Jadi, pada dasarnya ini adalah register geser 16-bit saat ini yang konstan dengan kontrol PWM skala abu-abu 12-bit. Saya dapat merekomendasikan IC tersebut karena saya membantu mendesain layar 80x16 dengannya.

David Brenner
sumber
4

Mondomatrix membuat beberapa papan driver LED beralamat serial (rs-485), dan didasarkan pada platform Arduino: http://www.displayduino.com/ Anda mungkin dapat menyusun sistem menggunakan perangkat keras itu dengan cukup mudah


sumber
4

Jika Anda tidak ingin terlalu banyak bit kontrol PWM untuk setiap LED, dan Anda ingin menghindari harus memiliki prosesor yang gagal dengan 500 LED setiap siklus PWM, Anda dapat mengontrol 8 LED dengan kecerahan N bit menggunakan N 74HC595 atau chip yang setara. . Sambungkan output dari semua chip N bersamaan, dan kabel memungkinkan untuk beberapa sirkuit yang hanya akan memungkinkan satu per satu dengan waktu yang sesuai. Atur sehingga chip pertama akan diaktifkan separuh waktu, yang kedua akan diaktifkan untuk separuh sisanya, dll.

Setiap reload dari register shift harus disinkronkan dengan laju PWM, sehingga untuk meminimalkan efek aliasing (misalnya jika tingkat kecerahan beralih dengan cepat antara 0111 dan 1000, titik dalam siklus PWM ketika sakelar terjadi sesaat dapat mengubah kecerahan yang tampak sesaat. ).

Walaupun harus menggunakan beberapa output 74HC595 untuk setiap LED mungkin mengganggu, pendekatan ini mungkin yang paling sederhana yang dapat mempertahankan tingkat kecerahan yang berbeda tanpa intervensi CPU yang sedang berlangsung.

supercat
sumber
3

Ini tidak langsung menjawab pertanyaan, tetapi aspek lain yang perlu Anda pertimbangkan adalah kemungkinan variabilitas kecerahan di antara LED dalam 500 batch Anda. Itu sangat penting jika LED ini dipasang berdekatan, seperti dalam matriks atau tampilan 7-segmen. Lihat jawaban ini untuk detail lebih lanjut tentang cara mengatasi masalah ini, khususnya, menggunakan koreksi titik untuk mengkompensasi variasi dalam kecerahan LED.

Saya mengalami masalah ini ketika saya mendapatkan 200 LED merah 1mm untuk satu set display 7-segmen besar yang saya bangun. Solusi murah saya untuk mengatasi masalah ini mencakup hal-hal berikut:

  1. Saya membangun tester LED di papan tempat memotong roti untuk mengklasifikasikan set leds dalam berbagai kategori cerah
  2. Saya memasang setiap segmen menggunakan LED dalam kategori yang sama (dalam desain saya, setiap segmen terdiri dari 5 LED yang dipasang secara seri)
  3. Saya mengkompensasi perbedaan dalam setiap kecerahan segmen menggunakan resistor pembatas arus yang berbeda. Misalnya, untuk segmen dengan LED yang lebih terang, saya akan menggunakan resistor 100 ohm, sementara, untuk segmen lain dengan LED yang lebih redup, saya akan menggunakan resistor 120 ohm.
Ricardo
sumber
1
Poin yang valid, tetapi tidak menjawab pertanyaan.
Matt Young
1
@MattYoung Setuju. Pertanyaan ini sebagian besar dijawab oleh semua jawaban lainnya. Saya hanya ingin melengkapi jawaban-jawaban itu, mengatasi masalah sampingan yang dapat memengaruhi desain OP.
Ricardo
1

XMOS menggunakan Macroblock MBI5026 dengan kit ubin LED mereka. Saya pikir mereka digunakan di sebagian besar sistem profesional lainnya.

Leon

Leon Heller
sumber
1

Chip driver khusus dengan antarmuka serial memang akan menjadi rute terbaik. Berurusan dengan register shift individu mungkin akan berarti sirkuit yang sangat kompleks. Setidaknya Maxim dan TI membuat beberapa. Saya tidak ingat apakah keduanya memiliki model yang sangat cocok untuk itu.

Masih membutuhkan banyak perangkat keras.

Sedangkan untuk daya, pemrograman, dan bus, lembar data untuk setiap driver mungkin akan memiliki sebagian besar informasi yang Anda perlukan.

XTL
sumber
1

Di dalam ranah perangkat lunak, jika jumlah pengaturan kecerahan berbeda yang dibutuhkan tidak terlalu besar, mungkin berguna untuk menyimpan data dalam format "bit-planar" (seperti yang dijelaskan dalam jawaban berbasis perangkat keras saya yang lain) dan kemudian memiliki rutinitas keluaran menggunakan operator Boolean untuk bertindak pada 8 piksel sekaligus. Untuk efisiensi maksimum, ini akan memerlukan memiliki beberapa rutinitas keluaran terpisah, yang digunakan untuk berbagai bagian siklus PWM; misalnya, jika seseorang ingin menggunakan nilai kecerahan 4-bit, orang akan menggunakan delapan rutinitas formulir:

  movf bit0Comp, w; Harus 00 atau FF tergantung pada bit 0 dari perbandingan (FF jika jelas)
  untuk POSTINCF, w; Bit 0 data; selalu gunakan IORWF
  dan jika POSTINCF, w; Bit 1 data; gunakan IORWF jika bit 1 dari comparand diatur; ANDWF jika jelas
  dan jika POSTINCF, w; Bit 2 data; Gunakan IORWF jika bit 1 dari perbandingan dan diset; ANDWF jika jelas
  dan jika POSTINCF, w; Bit 2 data; Gunakan IORWF jika bit 1 dari perbandingan dan diset; ANDWF jika jelas
  movwf SPIREG; Simpan byte hasil

Orang akan menggunakan kombinasi IORWF dan ANDWF yang berbeda, tergantung pada nilai perbandingan. Perhatikan bahwa menggunakan pendekatan ini seperti yang diilustrasikan, seseorang dapat memperbarui nilai kecerahan piksel pada titik mana pun dalam siklus PWM tanpa berkedip, asalkan keempat bit tersebut ditulis di antara panggilan ke rutinitas display-shift, atau dengan meminta rutinitas pembaruan piksel menentukan apakah Pergeseran berikutnya akan menampilkan "1" atau "0" untuk piksel, dan baik pengaturan atau menghapus semua bit piksel (operasi mana pun yang akan membuatnya melakukan apa pun yang akan dilakukan) dan kemudian menulis bit apa pun yang nilainya harus bertentang. Perhatikan juga bahwa seseorang dapat mencapai skala kecerahan non-linear sewenang-wenang dengan memvariasikan waktu pembaruan tampilan, atau dengan menggunakan beberapa nilai perbandingan dan nilai lebih dari sekali dalam siklus PWM.

supercat
sumber
1

FPGA atau CPLD bisa baik untuk tugas-tugas seperti itu karena mereka menawarkan banyak pin I / O. Gunakan yang paling sederhana dan termurah. Jika satu tidak cukup, gunakan pasangan.

Carl
sumber
Bisakah Anda memberi kami beberapa detail tentang mengapa ini adalah opsi yang baik, saat ini saya tahu tentang itu, tapi saya tahu apa pilihannya dan apa teknologi yang Anda sarankan, Origial Poster (OP) mungkin tidak memiliki sebuah latar belakang.
Kortuk
Saya tidak yakin itu pilihan terbaik tetapi saya ingin disebutkan untuk kelengkapannya. Jika mengendalikan 500 LED dengan PWM, dengan satu atau lain cara, pada akhirnya dibutuhkan 500 kabel yang dapat dikontrol secara terpisah. Sulit menemukan mikrokontroler dengan pin keluaran yang begitu banyak. Ada banyak cara untuk menggunakan mikrokontroler ini, tetapi satu atau beberapa CPLD / FPGA murah dapat dengan mudah memberikan pin output tersebut.
Carl
1

Anda hampir pasti dapat melakukan ini dengan mudah menggunakan PSoC3 atau PSoC5 .

Chip PSoC adalah mikrokontroler yang berisi perangkat keras digital yang dapat dikonfigurasi ulang, sedikit seperti FPGA atau CPLD. Ini berarti Anda dapat membuat sirkuit yang rumit untuk melakukan hal-hal yang tidak biasa seperti mengendarai 500 LED dengan PWM. Terlebih lagi, Anda mungkin dapat mengimplementasikan semuanya menggunakan blok digital yang dapat dikonfigurasi ulang, yang berarti bahwa bagian CPU dari chip hanya perlu menulis kecerahan LED yang diinginkan ke dalam array.

504 LED pas dalam persegi panjang 21 x 24. Jika Anda memiliki 24 saluran PWM, dan 21 GPIO, maka Anda bisa membuatnya berfungsi. Tebak apa? PSoC memiliki lebih dari itu.

Anda dapat mengatur 24 saluran PWM dengan mudah di PSoC, dan mengonfigurasi 21 pin lainnya untuk menjadi bagian dari register geser. Selanjutnya, konfigurasikan beberapa saluran DMA untuk memompa byte dari memori ke dalam output PWM, dan Anda tertawa. Yang perlu dilakukan CPU sekarang adalah menghasilkan grafik. PSoC3 memiliki inti 8.051 8-bit, sedangkan PSoC5 memiliki ARM 32-bit. Ambil pilihanmu. Satu-satunya IC eksternal yang Anda perlukan adalah beberapa ULN2803s untuk memberikan arus drive tinggi untuk baris. Output PWM harus memiliki drive saat ini yang cukup untuk LED tunggal.

Rocketmagnet
sumber
Ini total berlebihan untuk mengemudi LED. Ada driver LED berdedikasi, murah, dan dirancang khusus yang dibuat untuk meningkatkan jumlah besar seperti ini yang digunakan untuk tampilan raksasa sepanjang waktu. Tidak perlu menemukan kembali semua itu dan dengan biaya yang lebih besar.
nemik
@nemik - Sebenarnya, total biaya chip (dari Farnell yang mahal) hanya £ 6,80.
Rocketmagnet
0

Manfaatkan skala ekonomis. Situs Cina seperti Aliexpress menjual helai LED berbasis WS2811 seharga ~ $ 15 per 50 LED. Mereka dialamatkan secara individual, cerah, biasanya tahan air, dan memiliki PWM untuk kecerahan. Tidak ada solder atau register geser untuk mengacaukan keduanya. Melakukan semua ini sendiri, saya yakin akan dikenakan biaya lebih banyak, lebih banyak waktu dan sangat membuat frustrasi. Plus Anda di Oz sehingga pengiriman dari Cina tidak akan terlalu mahal.

Ini dibuat untuk membuat tampilan LED raksasa sehingga cenderung cukup murah. Pastikan untuk menyuntikkan kembali daya setiap 50 LED atau lebih untuk kinerja terbaik.

Ada juga perpustakaan Arduino untuk membuatnya mudah digunakan.

nemik
sumber
1
$ 15 per 50 LED? Jadi untuk 500 LED, ini menjadi $ 150? Dan Anda berani mengatakan solusi saya mahal? -1
Rocketmagnet
Anda juga dapat memberikan tautan ke ini. WS801 tidak Google dengan baik, dan juga tidak muncul pada pencarian Aliexpress
Rocketmagnet
Maaf, maksud saya WS2811, seperti ini aliexpress.com/store/product/… atau, tanpa peredupan PWM, aliexpress.com/store/product/…
nemik
Satu sinyal serial untuk mendorong 50 LED dengan peredupan PWM. Terima kasih, inilah yang saya cari. Tetapi register shift standar menyediakan pin "kait" untuk menyalin data yang disangga ke output setelah frame penuh ditransmisikan. Tidak ada kait di sini, jadi saya mengharapkan suara yang terlihat dengan kecepatan refresh yang tinggi. Chip tersebut mendukung data 400 Kbps dengan 15 bit per piksel, sehingga layar akan menampilkan omong kosong selama 1,9 milidetik saat frame diperbarui.
nialsh