Bagaimana saya bisa mengontrol banyak LED hanya dengan beberapa pin pada mikro saya?

10

Saya menggunakan Atmel ATtiny13 yang memiliki 6-pin I / O. Saya ingin mengontrol sekitar 15 LED tetapi tidak yakin bagaimana menghubungkan semuanya. Tanpa multiplexing dalam bentuk apa pun, tampaknya saya hanya dapat mengontrol 6 LED dalam satu waktu. Apakah saya terbatas hanya 6 LED karena ukuran mikrokontroler?

JYelton
sumber
Saya belum melihat. Kemungkinan diduplikasi: electronics.stackexchange.com/questions/9860/…
Daniel Grillo
3
Jangan lupa untuk membandingkan opsi Anda dengan biaya membeli mikrokontroler yang sedikit pinnier. Juga perhatikan batas per-port dan total saat ini.
joeforker
Ketika saya mulai bekerja dengan micros beberapa waktu lalu, ini adalah pertanyaan yang saya harap mudah ditemukan dengan jawaban yang jelas. Saya berhasil belajar tentang charlieplexing dan berhasil mengimplementasikannya, tetapi saya ingin membuat kembali pertanyaan di sini dengan kualitas jawaban komunitas-SE yang sangat baik.
JYelton
1
@ Joeforker Anda benar, biaya untuk micro dengan lebih banyak pin sangat minim, mengingat proyek saya hanya sekali. Saya berpikir pada satu titik tentang menggunakan mikro dengan sekitar 20 pin IO untuk menyelesaikan pekerjaan, tetapi salah satu tujuan saya adalah jejak papan sirkuit yang sangat kecil. Juga, pinnier kata sifat yang mengagumkan !
JYelton

Jawaban:

18

Ada beberapa metode yang dapat digunakan untuk menggerakkan sejumlah besar LED dari beberapa pin IO.

Yang paling sederhana adalah multiplexing tampilan baris / kolom standar. Dengan teknik ini, Anda dapat mengendarai LED dengan n pin IO. Secara matematis, siklus kerjanya adalah:(n/2)2n

1minimum(unique row patterns, unique column patterns)

Ini berarti bahwa teknik ini memiliki siklus tugas 100% ketika semua LED menyala (atau semua baris atau semua kolom identik) dan siklus tugas ketika garis diagonal perlu dinyalakan (atau semua baris berbeda ). Anda hanya dijamin 100% siklus kerja saat menyalakan setiap LED atau satu LED (atau nol LED, tapi itu tidak terlalu berarti).1/n

Sedikit lebih kompleks adalah Charlieplexing . Dengan teknik ini, Anda dapat mengarahkan LED dengan n IO pin. Hanya n - 1 LED yang dapat menyala bersamaan dengan teknik ini. Secara matematis, siklus kerjanya adalah:n2nnn1

1minimum simultaneous sets

di mana satu set simultan adalah sekelompok unik LED yang memiliki anoda umum atau katoda umum. (Ini belum terbukti, hanya saja saya tiba setelah merenungkan masalah sebentar. Jika siklus tugas penting bagi Anda, Anda akan ingin melihat lebih jauh ini.) Ini adalah perhitungan yang jauh lebih kompleks baik secara intelektual dan secara komputasi dari perhitungan yang setara untuk multiplexing standar. Secara efektif, Anda mendapatkan siklus kerja ketika semua LED menyala tetapi beberapa (hanya beberapa) pola n-1 atau lebih sedikit LED dapat memiliki siklus kerja 100%. Anda hanya dijamin 100% siklus kerja saat menyalakan 1 LED.1/n

Metode terakhir yang akan saya sebutkan adalah menggunakan shift register atau IO expander. Dengan dua pin (Baik antarmuka data mentah / jam, I2C, atau SPI searah), Anda dapat mengontrol sejumlah besar LED yang sewenang-wenang. Siklus tugas untuk pola apa pun adalah 100%, tetapi tingkat pembaruan berbanding terbalik dengan jumlah LED. Ini adalah metode yang paling mahal. Untuk 15 LED, mungkin akan lebih murah untuk hanya memutakhirkan ke mikro dengan banyak pin IO.

Kevin Vermeer
sumber
+1 untuk menjelaskan sedikit tentang aspek siklus tugas. Dalam kalimat kedua tentang Charlieplexing, apakah maksud Anda "mengarahkan n ^ 2-n LED dengan n IO pin?
JYelton
Charlieplexing dapat dilakukan sangat mirip dengan multiplexing, jika seseorang hanya menghilangkan satu cahaya dari setiap baris. Sebenarnya, dimungkinkan untuk "mendapatkan kembali" cahaya itu dengan menambahkan dioda, meskipun kecuali driver kolom adalah output arus konstan, membuatnya cocok dengan kecerahan yang lain mungkin sulit.
supercat
11

n×(n1)n

Contoh:

Six LED ada di 3 Pin:

PINS        LEDS
0 1 2   1 2 3 4 5 6
0 0 0   0 0 0 0 0 0
0 1 Z   1 0 0 0 0 0
1 0 Z   0 1 0 0 0 0
Z 0 1   0 0 1 0 0 0
Z 1 0   0 0 0 1 0 0
0 Z 1   0 0 0 0 1 0
1 Z 0   0 0 0 0 0 1
0 0 1   0 0 1 0 1 0
0 1 0   1 0 0 1 0 0
0 1 1   1 0 0 0 1 0
1 0 0   0 1 0 0 0 1
1 0 1   0 1 1 0 0 0
1 1 0   0 0 0 1 0 1
1 1 1   0 0 0 0 0 0

Skema Charlieplexing dengan 3 pin output

Daniel Grillo
sumber
Terima kasih atas pin pin dataset serta skema yang membantu.
JYelton
1
Cara lain untuk menggambar skema adalah sebagai kisi NxN, tetapi hanya menggerakkan kolom, dan mengganti diagonal primer dengan celana pendek baris-kolom.
supercat
berarti saya tidak bisa mengaktifkan semuanya sekaligus? Apakah itu berarti Jika saya ingin mengaktifkan semuanya sekaligus, saya harus melakukan cukup banyak waktu untuk menipu mata?
MaNyYaCk
@MaNyYaCk Ya. Kamu benar.
Daniel Grillo
8

Tanpa multiplexing (drive langsung) Anda dibatasi hingga 6 LED.

Dengan charlieplexing Anda dapat mengarahkan n * (n-1) LED dari n pin.

Dengan I / O ekspander atau register geser, Anda dapat mengendarai LED yang jumlahnya hampir tak terbatas.
Contoh: MCP23008 8-bit I2C I / O Expander

mjh2007
sumber
Bisakah Anda menguraikan tentang apa I / O akan menjadi ekspander?
JYelton
3
I / O expander adalah chip eksternal yang berisi pin dan register I / O. Anda dapat menggunakan bus komunikasi standar seperti I2C atau SPI untuk berkomunikasi dengan mereka.
mjh2007
+1 Anda dapat mengendarai banyak LED dengan TI TLC594 ( focus.ti.com/lit/ds/symlink/tlc5940.pdf ), tetapi mungkin membutuhkan banyak pekerjaan untuk banyak pekerjaan. search.digikey.com/scripts/DkSearch/…
kenny
Terima kasih - saya harus merancang proyek yang memanfaatkan I / O ekspander untuk memaksa saya belajar penggunaannya.
JYelton
4

Seperti @ mjh2007 menyarankan dengan expander I2C. Tetapi ada beberapa yang secara khusus untuk menggerakkan LED yang akan menghindari perlunya resistor pembatas arus eksternal.

Brian Carlton
sumber
2

Ini adalah contoh dari charlieplexing yang saya buat.

Ini adalah simulator sinar mercusuar dan menggunakan serangkaian 12 LED yang dipadukan ke 4 GPIO untuk menyapu seberkas cahaya di sekitar disk. Ada video di sini .

Proyek ini berbasis PIC, saya menggunakan PIC12f683 yang juga merupakan 8pin uP dan dapat dianggap sebanding dengan AVR 8pin.

Intensitas LED didorong oleh interupsi yang menyediakan PWM 32 langkah pada sekitar 60Hz. Hanya dua LED yang diizinkan menyala setiap saat, memberikan tugas 50% untuk setiap LED karena hanya itulah yang saya butuhkan. Ini juga memberikan trade off dari refresh rate PWM terhadap resolusi.

Pengkodean untuk menggunakan charlieplexing sebenarnya cukup sederhana jika Anda tetap menggunakan metode "klasik" dengan hanya menyalakan satu LED pada satu titik waktu dengan kecepatan refresh yang sangat cepat. Saya mengerjakan PORT dan TRIS yang diperlukan (register khusus gambar) terlebih dahulu di atas kertas kemudian menyimpan hasilnya dalam array statis. Untuk menyalakan LED x PIC hanya perlu mencari nilai pada indeks array [x] dan menuliskannya langsung ke PORT (dengan sedikit masking untuk mempertahankan status pin lain yang tidak digunakan dalam charliplex)

Proyek saya hanya memiliki 12 LED bukan 15 atau maksimum 20 GPIO 5 akan memungkinkan karena saya ingin menyimpan satu cadangan GPIO untuk pengembangan di masa depan.

Pokoknya ... Saya hanya berpikir mungkin ada gunanya memiliki contoh kerja yang mirip dengan permintaan Anda.

Kode sumber lengkap dan skema tersedia di blog saya.

Matt Casey
sumber
0

Pilihan lain adalah menggunakan LED Neopixel. Mereka memiliki IC kontrol bawaan dan Anda hanya perlu satu pin untuk mengontrol LED sebanyak yang Anda suka. Tentu saja Anda akan membutuhkan sumber daya LED terpisah yang memadai.

sesuatu yang perlu
sumber