Isi kandungan:

Matriks LED RGB: 5 Langkah
Matriks LED RGB: 5 Langkah

Video: Matriks LED RGB: 5 Langkah

Video: Matriks LED RGB: 5 Langkah
Video: LED Matrix - Connect, Power & Control - Setup Guide 2024, Julai
Anonim
Image
Image
Reka Bentuk Perkakasan
Reka Bentuk Perkakasan

Cari diajar, dan anda boleh menemui banyak projek matriks LED. Tidak satu pun dari mereka yang saya mahukan, iaitu meneroka interaksi reka bentuk perkakasan dan perisian untuk menghasilkan sesuatu, dan menghasilkan produk akhir dalam PCB yang kemas dengan pemandu yang membolehkan saya menarik ke "skrin LED" menggunakan tahap tinggi membina (contohnya, melukis garis berbanding menetapkan piksel tertentu). Bahagian ini penting bagi saya, kerana banyak pemacu matriks LED adalah tulang kosong dan tidak banyak menyediakan cara membuat gambar atau animasi secara program. Ini tidak bermaksud anda tidak dapat membuat gambar dan animasi dengan pemacu lain, cuma anda perlu melakukan kerja yang lebih berulang dari projek ke projek.

Oleh itu, saya berusaha untuk mencapai visi saya. Langkah pertama adalah merancang perkakasan. Ini mungkin yang paling mencabar bagi saya, kerana latar belakang saya lebih banyak perisian. Sekali lagi, terdapat banyak reka bentuk yang telah dipanggang, dan saya pasti menggunakannya untuk inspirasi, tetapi saya ingin belajar melakukannya, jadi saya membuat prototaip matriks 4x4 di papan roti. Saya belajar banyak melalui proses itu, kerana beberapa lelaran pertama saya tidak berjaya. Tetapi, saya membuat reka bentuk perkakasan yang berfungsi, yang seterusnya membolehkan saya mula mengembangkan pemacu.

Saya memilih Arduino sebagai platform pemandu saya kerana tersedia secara meluas dan mempunyai banyak rujukan dalam talian. Walaupun pengalaman kerjaya membolehkan saya menggunakan versi pemacu yang lebih baik daripada usaha perkakasan saya, masih terdapat banyak lelaran sementara saya mengoptimumkan prestasi pemacu untuk pengawal mikro ATMega dan mengembangkan API pengaturcaraan yang saya suka.

Instructable ini mendokumentasikan reka bentuk dan beberapa pembelajaran penting dari projek saya. Maklumat lebih lanjut mengenai projek ini boleh didapati di laman web saya di sini, termasuk kit penuh yang boleh anda beli untuk membina matriks LED RGB anda sendiri.

Langkah 1: Reka Bentuk Perkakasan

Matlamat utama reka bentuk perkakasan saya adalah untuk membuat pelbagai LED RGB yang dapat saya atur, tetapi saya juga tidak mahu menghabiskan banyak wang. Pendekatan yang saya gunakan adalah menggunakan register shift 74HC595 untuk mengawal LED. Untuk meminimumkan jumlah register shift yang diperlukan, saya menyusun LED RGB ke susun atur matriks di mana anod biasa diikat bersama dalam baris dan petunjuk katod merah, hijau, dan biru diikat bersama dalam lajur. Untuk matriks 4x4, gambarajah litar kelihatan seperti gambarajah litar yang dilampirkan.

Satu perkara yang akan anda perhatikan dengan segera adalah bahawa memandangkan litar matriks, terdapat beberapa konfigurasi pencahayaan LED yang tidak dapat dilakukan dengan semua LED yang diinginkan menyala pada masa yang sama. Sebagai contoh, matriks tidak dapat secara bersamaan menyalakan dua LED yang saling menyerong antara satu sama lain kerana mengaktifkan kedua baris dan lajur akan menyebabkan kedua-dua LED bertentangan menyala pada pepenjuru tegak lurus ke LED yang dikehendaki. Untuk mengatasi masalah ini, kami akan menggunakan multiplexing untuk mengimbas setiap baris. Terdapat banyak sumber di web yang merangkumi teknik multiplexing, saya tidak akan cuba menirunya di sini.

Oleh kerana saya menggunakan LED anod biasa, ini bermaksud baris memberikan daya positif dan lajur tenggelam ke tanah. Berita baiknya ialah daftar pergeseran 74HC595 dapat sumber dan tenggelam kuasa, tetapi berita buruknya ialah mereka mempunyai had berapa banyak kuasa yang dapat mereka sumber atau tenggelam. Pin individu 74HC595 mempunyai tarikan arus maksimum 70 mA, tetapi sebaiknya simpan kurang dari 20 mA. Setiap warna dalam LED RGB kami mempunyai kira-kira 20 mA. Ini bermaksud bahawa 74HC595 tidak dapat menyalakan secara langsung seluruh barisan LED jika saya mahu menyalakannya semua.

Oleh itu, bukannya mengaktifkan baris secara langsung, 74HC595 sebaliknya akan menggerakkan transistor untuk setiap baris, dan transistor akan menghidupkan atau mematikan arus yang menghidupkan baris. Oleh kerana reka bentuk menggunakan LED anod biasa, transistor beralih akan menjadi PNP. Sekiranya kita menggunakan katod LED biasa, transistor beralih adalah NPN. Perhatikan bahawa dengan menggunakan transistor PNP untuk menggerakkan berturut-turut, tetapan shift shift untuk menghidupkannya sekarang menjadi rendah kerana transistor PNP memerlukan voltan negatif antara pemancar dan pangkalan untuk dihidupkan, yang akan membolehkan arus positif mengalir ke barisan.

Satu perkara lain yang perlu dipertimbangkan ialah susun atur bit register shift yang diinginkan. Iaitu, di antara register shift, bit mana yang mengawal baris atau lajur dalam matriks. Reka bentuk yang saya kirimkan adalah di mana bit pertama, atau "bit paling penting", dihantar ke register pergeseran daisy yang mengawal lajur elemen merah LED, bit kedua mengawal elemen hijau lajur pertama, bit ketiga mengawal lajur pertama elemen biru, bit keempat mengendalikan elemen merah lajur kedua, … corak ini diulang melintasi lajur dari kiri ke kanan. Kemudian bit seterusnya yang dihantar mengawal baris terakhir, atau bawah, yang berikutnya baris kedua hingga baris terakhir, … ini diulang sehingga bit terakhir dihantar, atau "bit paling tidak penting", mengawal baris pertama atau atas dalam matriks.

Akhirnya, saya perlu menentukan perintang apa yang akan saya gunakan untuk setiap LED dalam LED RGB. Walaupun anda boleh menggunakan formula standard yang menggabungkan voltan ke hadapan dan arus yang diinginkan untuk mengira perintang yang diperlukan, saya dapati bahawa menetapkan setiap arus LED hingga 20 miliamp menghasilkan warna putih ketika semua LED merah, hijau, dan biru menyala. Oleh itu, saya mula memerhatikannya. Terlalu banyak warna putih bermaksud meningkatkan ohm perintang LED merah untuk mengurangkan arus. Saya berulang kali menukar perintang dengan ohm berbeza sehingga saya menemui gabungan yang menghasilkan warna putih yang saya rasa betul. Gabungan terakhir ialah 180 Ω untuk LED merah, 220 Ω untuk LED hijau dan 100 Ω untuk LED biru.

Langkah 2: Pembinaan Perkakasan - Papan Roti

Pembinaan Perkakasan - Papan Roti
Pembinaan Perkakasan - Papan Roti
Pembinaan Perkakasan - Papan Roti
Pembinaan Perkakasan - Papan Roti

Fasa pertama pembina perkakasan adalah pengambilan roti. Di sini saya membuat matriks 4x4 dengan LED RGB. Matriks ini memerlukan 16 bit untuk dikawal, 12 untuk lajur RGB, dan 4 untuk setiap baris. Dua register shift 74HC595 dapat menangani semuanya. Saya mula-mula meneliti dan merancang litar yang saya fikir akan berfungsi, kemudian membinanya di atas papan roti.

Mungkin cabaran terbesar membina papan roti adalah menguruskan semua wayar. Saya mengambil alat dawai yang telah dibentuk untuk papan roti, tetapi pada masa itu agak sukar. Satu muslihat yang saya dapat membantu ialah membuat "port" untuk menyambung ke papan Arduino. Maksudnya, daripada menyambungkan pin di Arduino secara langsung ke pelbagai pin IC di papan roti, dedikasikan beberapa baris di papan roti untuk menjadi titik sambungan untuk Arduino, dan kemudian sambungkan pin ID yang berkaitan ke baris tersebut. Untuk projek ini, anda hanya memerlukan lima sambungan ke Arduino: + 5V, ground, data, jam, dan kait.

Setelah pembuatan papan roti selesai, saya perlu mengujinya. Walau bagaimanapun, tanpa beberapa jenis pemandu untuk menghantar isyarat yang betul ke register shift, saya tidak dapat menguji untuk melihat sama ada susun atur perkakasan berfungsi.

Langkah 3: Reka Bentuk Perisian Pemandu

Image
Image

Memandangkan pengalaman kerjaya saya sendiri dengan pembangunan perisian, inilah bahagian projek yang mungkin paling jelas saya jalani. Saya meninjau banyak pemacu matriks LED berasaskan Arduino yang lain. Walaupun sudah tentu ada pemacu yang baik, tidak ada reka bentuk yang saya mahukan. Tujuan reka bentuk pemandu saya adalah:

  • Sediakan API peringkat tinggi untuk dapat membuat gambar dan animasi secara program. Kebanyakan pemandu yang saya lihat lebih tertumpu pada gambar yang dikodkan keras. Juga, kerana saya adalah pengaturcara C ++ berdasarkan perdagangan, saya ingin menggunakan reka bentuk berorientasikan objek yang baik untuk melaksanakan dan menguruskan aktiviti menggambar ke matriks LED.
  • Gunakan pendekatan double-buffered untuk menguruskan gambar di skrin. Satu penyangga adalah apa yang dimasukkan ke dalam program, sementara yang lain mewakili keadaan piksel matriks pada saat tertentu. Kelebihan pendekatan ini adalah bahawa anda tidak perlu membuat pembaruan bingkai berikutnya untuk layar di antara kitaran pembaruan multiplexing.
  • Gunakan PWM untuk membolehkan lebih daripada tujuh warna primitif yang dapat dihasilkan RGB melalui kombinasi sederhana elemen merah, hijau, dan biru.
  • Tulis pemacu sedemikian sehingga "hanya berfungsi" dengan matriks LED RGB bersaiz berbeza yang mengikuti pendekatan reka bentuk matriks umum saya. Perhatikan bahawa walaupun reka bentuk perkakasan saya menggunakan register geser 74HC595, saya mengharapkan pemandu saya dapat bekerja dengan mana-mana mekanisme hidup / mati gaya daftar pergeseran yang dibentangkan menggunakan susun atur bit yang serupa dengan reka bentuk perkakasan saya. Sebagai contoh, saya mengharapkan pemandu saya bekerja dengan reka bentuk perkakasan yang menggunakan cip DM13A untuk mengawal lajur dan cip 74HC595 untuk mengawal baris.

Sekiranya anda ingin terus melihat kod pemacu, anda boleh mendapatkannya di GitHub di sini.

Iterasi pertama pemandu saya adalah sedikit keluk pembelajaran mengenai keupayaan platform Arduino. Batasan yang paling jelas adalah RAM, iaitu 2K bait untuk Arduino Uno dan Nano. Menggunakan objek C ++ dalam senario seperti ini sering tidak disarankan kerana ingatan atas objek. Namun, saya rasa jika dilakukan dengan betul, kelebihan objek dalam C ++ melebihi kosnya (dalam RAM).

Cabaran utama kedua adalah mencari cara kita untuk melaksanakan modulasi lebar nadi melalui register shift sehingga saya dapat menghasilkan lebih dari tujuh warna primitif LED RGB. Setelah diprogram selama bertahun-tahun di platform Linux, saya terbiasa menggunakan konstruk seperti utas untuk menguruskan proses yang memerlukan masa yang konsisten. Masa operasi kemas kini daftar peralihan akhirnya menjadi sangat kritikal ketika membuat pemacu untuk matriks LED yang menggunakan multiplexing. Sebabnya adalah bahawa walaupun multiplexing berlaku dengan begitu pantas sehingga mata anda tidak dapat melihat LED individu berkelip dan mati, mata anda dapat mengambil perbezaan dalam jumlah keseluruhan masa LED mana-mana. Sekiranya satu baris LED secara konsisten menyala untuk jangka masa yang lebih lama daripada yang lain, ia akan kelihatan lebih terang semasa multiplexing. Ini boleh menyebabkan kecerahan tidak rata di matriks atau strobing berkala matriks secara keseluruhan (ini berlaku apabila satu kitaran kemas kini mengambil masa lebih lama daripada yang lain).

Oleh kerana saya memerlukan mekanisme pemasaan yang konsisten untuk menyebabkan kemas kini daftar pergeseran menjadi persetujuan, tetapi Arduino tidak secara rasmi menyokong utas, saya harus membuat mekanisme seperti threading saya sendiri. Pengulangan pertama saya adalah dengan hanya membuat pemasa gelung yang bergantung pada fungsi gelung Arduino () dan akan mengaktifkan tindakan apabila sejumlah waktu telah berlalu sejak kali terakhir tindakan itu dipecat. Ini adalah bentuk "multitasking koperasi". Kedengarannya baik tetapi dalam praktiknya ini terbukti tidak konsisten ketika kadar pembakaran diukur dalam mikrodetik. Sebabnya adalah bahawa jika saya mempunyai dua pemasa gelung ini, salah satu tindakan mereka sering mengambil masa yang cukup lama untuk menyebabkan aksi kedua melepaskan api lebih lama daripada yang diinginkan.

Saya dapati bahawa penyelesaian untuk masalah ini adalah dengan menggunakan mekanisme gangguan jam asli Arduino. Mekanisme ini membolehkan anda menjalankan sedikit kod pada selang waktu yang sangat konsisten. Oleh itu, saya merancang kod pemacu di sekitar elemen reka bentuk menggunakan gangguan jam untuk mencetuskan kod untuk menghantar daftar pergeseran matriks kemas kini seterusnya dalam kitaran multipleks. Untuk melakukan ini dan membiarkan kemas kini berlaku pada gambar layar agar tidak mengganggu pembuangan aktif ke register shift (sesuatu yang kita sebut sebagai "keadaan perlumbaan"), saya menggunakan pendekatan untuk mempunyai penyangga kembar untuk bit register shift, satu untuk menulis dan satu untuk membaca. Semasa pengguna mengemas kini gambar matriks, operasi ini berlaku pada buffer tulis. Apabila operasi tersebut selesai, gangguan ditangguhkan buat sementara waktu (ini bermaksud gangguan jam tidak dapat dinyalakan) dan penyangga tulis ditukar dengan penyangga baca sebelumnya dan bukan penyangga baca baru, maka penafsiran diaktifkan semula. Kemudian, apabila jam berhenti menyala menunjukkan bahawa sudah waktunya untuk menghantar konfigurasi bit seterusnya ke register shift, maklumat tersebut dibaca dari buffer baca semasa. Dengan cara ini, tidak ada penulisan yang berlaku pada penyangga yang mungkin sedang dibaca ketika gangguan jam, yang boleh merosakkan maklumat yang dikirim ke daftar shift.

Merancang pemandu yang lain adalah reka bentuk berorientasikan objek yang agak mudah. Sebagai contoh, saya membuat objek untuk menguruskan gambar bit shift register untuk keadaan skrin tertentu. Dengan merangkum kod yang berkaitan dengan pengurusan gambar bit, membuat pendekatan penyangga kembar yang disebutkan di atas adalah latihan yang mudah. Tetapi saya tidak menulis Instructable ini untuk memuji kebaikan reka bentuk berorientasikan objek. Elemen reka bentuk lain merangkumi konsep Glyph dan RGB Image. Glyph adalah konstruksi gambar asas yang tidak mempunyai maklumat warna bawaan. Anda boleh menganggapnya sebagai gambar hitam putih. Apabila Glyph ditarik ke layar LED, informasi warna diberikan untuk menunjukkan bagaimana piksel "putih" harus diwarnai. Imej RGB adalah gambar di mana setiap piksel mempunyai maklumat warnanya sendiri.

Saya mendorong anda untuk mengkaji contoh lakaran Arduino dan menyemak dokumentasi tajuk pemandu untuk menjadi biasa dengan cara menggunakan pemacu untuk membuat gambar dan animasi pada matriks LED RGB.

Langkah 4: Ghosting LED

LED Ghosting
LED Ghosting
LED Ghosting
LED Ghosting

Dalam matriks LED, "ghosting" adalah fenomena LED dalam matriks yang menyala apabila tidak diinginkan, biasanya tahap yang sangat berkurang. Reka bentuk perkakasan asal saya terdedah kepada hantu, terutama di barisan terakhir. Punca ini disebabkan oleh dua perkara: transistor tidak segera dimatikan dan kapasitans parasit pada LED RGB.

Semasa kita mengimbas baris, kerana transistor tidak segera dimatikan, baris sebelumnya dalam kitaran imbasan masih diaktifkan sebahagian ketika baris seterusnya dihidupkan. Sekiranya lajur tertentu yang dimatikan di baris sebelumnya baru dihidupkan ketika baris baru dihidupkan, LED lajur di baris sebelumnya akan menyala sebentar sementara transistor pensuisan baris sebelumnya masih dalam proses putaran mati. Apa yang menyebabkan transistor mengambil masa yang ketara untuk mematikan adalah ketepuan di dasar transistor. Ini menyebabkan jalan pemungut transistor-emiter terus bergerak apabila arus dikeluarkan dari dasar, sekurang-kurangnya sehingga ketepuan hilang. Memandangkan kitaran kemas kini multiplexing kami menyebabkan baris dihidupkan dengan sengaja untuk jangka masa yang diukur dalam mikrodetik, jumlah masa bahawa transistor tepu baris sebelumnya tetap konduktif boleh menjadi pecahan yang ketara. Akibatnya, mata anda dapat melihat jumlah masa yang sangat kecil ketika LED baris sebelumnya dihidupkan.

Untuk menyelesaikan masalah ketepuan transistor, dioda Schottky dapat ditambahkan ke transistor antara dasar dan pemungut menyebabkan arus balik sedikit ke pangkalan ketika transistor dihidupkan, mencegah transistor tidak tepu. Ini seterusnya akan menyebabkan transistor mati lebih cepat apabila arus dikeluarkan dari dasar. Lihat artikel ini untuk penjelasan mendalam mengenai kesan ini. Seperti yang anda dapat lihat dari gambar di bahagian ini, tanpa dioda ghosting cukup ketara, tetapi menambahkan dioda ke litar untuk setiap baris secara signifikan menghilangkan ghosting.

LED RGB rentan terhadap fenomena lain yang disebut kapasitansi parasit. Punca dari ini adalah kenyataan bahawa masing-masing dari tiga warna LED dalam unit LED RGB masing-masing mempunyai voltan hadapan yang berbeza. Perbezaan voltan hadapan ini boleh menyebabkan kesan kapasitans elektrik antara setiap warna LED individu. Oleh kerana cas elektrik ditumpukan di unit LED ketika dihidupkan, ketika daya dikeluarkan, kapasitansi parasit perlu dikeluarkan. Sekiranya lajur LED itu dihidupkan untuk pengaktifan baris yang lain, cas parasit akan keluar melalui LED lajur dan menyebabkannya menyala sebentar. Kesan ini dijelaskan dengan baik dalam artikel ini. Penyelesaiannya adalah dengan menambahkan jalan keluar untuk cas parasit ini selain melalui LED itu sendiri, dan kemudian memberi masa LED untuk melepaskan sebelum lajur dihidupkan semula. Dalam reka bentuk perkakasan saya, ini dapat dicapai dengan menambahkan perintang ke talian kuasa setiap baris yang menghubungkan kekuatan ke tanah. Ini akan menyebabkan arus lebih banyak ditarik dengan baris diaktifkan, tetapi memberikan jalan keluar untuk kapasitansi parasit ketika baris tidak diaktifkan.

Perlu diingat, bagaimanapun, bahawa dalam praktiknya saya mendapati kesan kapasitansi parasit hampir tidak dapat dilihat (jika anda mencarinya, anda dapat mencarinya), dan oleh itu saya menganggap menambahkan perintang tambahan ini sebagai pilihan. Kesan masa lambat untuk transistor tepu adalah jauh lebih kuat dan ketara. Walaupun begitu, jika anda memeriksa ketiga-tiga foto yang disediakan di bahagian ini, anda dapat melihat bahawa perintang menghilangkan sepenuhnya hantu yang masih berlaku di luar masa transistor lambat.

Langkah 5: Pembuatan Akhir dan Langkah Seterusnya

Image
Image

Fasa terakhir projek ini adalah untuk saya membuat papan litar bercetak (PCB). Saya menggunakan program sumber terbuka Fritzing untuk merancang PCB saya. Walaupun terdapat banyak tugas berulang yang harus diselesaikan untuk menyusun 100 LED pada papan 10x10, saya sebenarnya mendapati fasa projek ini sangat memuaskan. Memahami bagaimana setiap jalur elektrik akan disusun seperti teka-teki, dan menyelesaikan teka-teki itu menimbulkan rasa pencapaian. Oleh kerana saya tidak bersedia untuk membuat papan litar, saya menggunakan salah satu daripada banyak sumber dalam talian yang melakukan sedikit PCB khusus. Memateri bahagian bersama cukup lurus ke depan kerana reka bentuk saya menggunakan semua bahagian lubang.

Semasa menulis Instructable ini, saya mempunyai rancangan berikut untuk projek RGB LED Matrix saya:

  1. Terus meningkatkan pemacu pada lapisan API untuk membolehkan fungsi tahap lebih tinggi kepada pengaturcara, terutamanya tatal teks.
  2. Buat reka bentuk matriks yang lebih besar, seperti 16x16 atau bahkan 16x32.
  3. Terokai menggunakan MOSFET dan bukannya BJT untuk pertukaran kuasa baris
  4. Terokai menggunakan pemacu arus tetap DM13A dan bukannya 74HC595s untuk pertukaran lajur
  5. Buat pemacu untuk platform kawalan mikro lain, seperti Teensy, ODROID C2, atau Raspberry Pi.

Perhatikan bahawa reka bentuk perkakasan dan pemacu telah dilepaskan di bawah lesen sumber terbuka GPL v3 di repositori GitHub ini. Tambahan pula, kerana walaupun pembuatan PCB melakukan "rekaan kecil" reka bentuk PCB saya, saya masih mendapat lebih banyak daripada yang saya perlukan secara peribadi. Oleh itu, saya menjual kit penuh untuk pelbagai reka bentuk matriks LED RGB saya (PCB dan semua bahagian termasuk) dari laman web saya di sini.

Disyorkan: