Làm cách nào tôi có thể điều khiển nhiều đèn LED chỉ bằng một vài chân trên micro của mình?


10

Tôi đang sử dụng Atmel ATtiny13 có I / O 6 chân. Tôi muốn điều khiển khoảng 15 đèn LED nhưng không chắc chắn cách kết nối mọi thứ. Không có nhiều loại, dường như tôi chỉ có thể điều khiển 6 đèn LED cùng một lúc. Tôi có bị giới hạn chỉ 6 đèn LED vì kích thước của vi điều khiển không?


Tôi đã không nhìn thấy. Có thể trùng lặp: Electronics.stackexchange.com/questions/9860/
mẹo

3
Đừng quên so sánh các tùy chọn của bạn với chi phí mua một bộ vi điều khiển cao hơn một chút. Cũng chú ý đến mỗi cổng và tổng giới hạn hiện tại.
joeforker

Khi tôi bắt đầu làm việc với micros một thời gian trước đây, đây là một câu hỏi tôi muốn có thể dễ dàng tìm thấy với câu trả lời rõ ràng. Tôi đã xoay sở để tìm hiểu về charlieplexing và thực hiện thành công nó, nhưng tôi muốn tạo lại câu hỏi ở đây với chất lượng tuyệt vời của các câu trả lời của cộng đồng SE.
JYelton

1
@joeforker Bạn nói đúng, chi phí cho một micro có nhiều chân là khá nhỏ, coi dự án của tôi là một lần. Tôi đã nghĩ tại một thời điểm về việc sử dụng một micro có khoảng 20 chân IO để hoàn thành công việc, nhưng một trong những mục tiêu của tôi là một dấu chân bảng mạch rất nhỏ. Ngoài ra, pinnier tính từ tuyệt vời !
JYelton

Câu trả lời:


18

Có một số phương pháp có thể được sử dụng để điều khiển số lượng lớn đèn LED từ một vài chân IO.

Đơn giản nhất là ghép kênh hiển thị hàng / cột tiêu chuẩn. Với kỹ thuật này, bạn có thể lái đèn LED với n chân IO. Về mặt toán học, chu trình nhiệm vụ là:(n/2)2n

1mTôinTôimbạnm(mẫu hàng độc đáo, mẫu cột độc đáo)

Điều này có nghĩa là kỹ thuật này có chu kỳ nhiệm vụ 100% khi tất cả các đèn LED đều sáng (hoặc tất cả các hàng hoặc tất cả các cột giống hệt nhau) và chu kỳ nhiệm vụ là khi một đường chéo cần được thắp sáng (hoặc tất cả các hàng khác nhau ). Bạn chỉ được đảm bảo chu kỳ nhiệm vụ 100% khi chiếu sáng mỗi đèn LED hoặc một đèn LED (hoặc đèn LED bằng 0, nhưng điều đó không thực sự được tính đến nhiều).1/n

Hơi phức tạp hơn một chút là Charlieplexing . Với kỹ thuật này, bạn có thể điều khiển đèn LED với n chân IO. Chỉ có n - 1 đèn LED có thể được thắp sáng đồng thời với kỹ thuật này. Về mặt toán học, chu trình nhiệm vụ là:n2-nnn-1

1bộ đồng thời tối thiểu

trong đó một bộ đồng thời là một nhóm đèn LED duy nhất có cực dương chung hoặc cực âm chung. (Điều này chưa được chứng minh, đó chỉ là những gì tôi đạt được sau khi suy nghĩ vấn đề trong một phút. Nếu chu kỳ nhiệm vụ là quan trọng đối với bạn, bạn sẽ muốn xem xét thêm về vấn đề này.) Đây là một phép tính phức tạp hơn nhiều về mặt trí tuệ và tính toán hơn so với tính toán tương đương cho ghép kênh tiêu chuẩn. Thực tế, bạn có được chu kỳ hoạt động là khi tất cả các đèn LED đều sáng nhưng một số (chỉ một số) mẫu đèn LED n-1 trở xuống có thể có chu kỳ hoạt động 100%. Bạn chỉ được đảm bảo chu kỳ làm việc 100% khi chiếu sáng 1 đèn LED.1/n

Phương pháp cuối cùng tôi sẽ đề cập là sử dụng thanh ghi thay đổi hoặc mở rộng IO. Với hai chân (Giao diện dữ liệu / đồng hồ thô, I2C hoặc SPI đơn hướng), bạn có thể điều khiển một số lượng lớn đèn LED tùy ý. Chu kỳ nhiệm vụ cho bất kỳ mẫu nào là 100%, nhưng tốc độ cập nhật tỷ lệ nghịch với số lượng đèn LED. Đây là phương pháp tốn kém nhất. Đối với 15 đèn LED, có thể sẽ rẻ hơn nếu chỉ nâng cấp lên một micro có nhiều chân IO.


+1 để giải thích một chút về khía cạnh chu kỳ nhiệm vụ. Trong câu thứ hai về Charlieplexing, bạn có nghĩa là "lái n ^ 2-n LED với n chân IO?
JYelton

Charlieplexing có thể được thực hiện rất giống với ghép kênh, nếu chỉ cần bỏ qua một ánh sáng từ mỗi hàng. Trên thực tế, có thể "lấy lại" ánh sáng đó bằng cách thêm một diode, mặc dù trừ khi trình điều khiển cột là đầu ra dòng không đổi, làm cho nó phù hợp với độ sáng của các đèn khác có thể khó khăn.
supercat

11

n×(n-1)n

Ví dụ:

Sáu đèn LED trên 3 chân:

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

Sơ đồ của Charlieplexing với 3 chân đầu ra


Cảm ơn bạn cho bộ dữ liệu pin đầu ra cũng như một sơ đồ hữu ích.
JYelton

1
Một cách khác để vẽ sơ đồ là dạng lưới NxN, nhưng chỉ lái các cột và thay thế đường chéo chính bằng quần short cột hàng.
supercat

có nghĩa là tôi không thể bật tất cả chúng cùng một lúc? Điều đó có nghĩa là nếu tôi muốn bật tất cả chúng cùng một lúc, tôi phải làm đủ thời gian để đánh lừa mắt?
MaNyYaCk

@MaNyYaCk Vâng. Bạn đúng.
Daniel Grillo

8

Nếu không có ghép kênh (ổ đĩa trực tiếp), bạn bị giới hạn ở 6 đèn LED.

Với charlieplexing, bạn có thể điều khiển đèn LED n * (n-1) từ n chân.

Với bộ mở rộng I / O hoặc thanh ghi thay đổi, bạn có thể lái một số lượng đèn LED hầu như không giới hạn.
Ví dụ: MCP23008 8-bit I2C I / O Expander


Bạn có thể nói rõ hơn về các bộ mở rộng I / O sẽ là gì không?
JYelton

3
Bộ mở rộng I / O là chip bên ngoài có chứa các chân và thanh ghi I / O. Bạn có thể sử dụng bus truyền thông tiêu chuẩn như I2C hoặc SPI để liên lạc với họ.
mjh2007

+1 Bạn có thể lái rất nhiều đèn LED với TLC594 của TI ( Focus.ti.com/lit/ds/symlink/tlc5940.pdf ), nhưng nó có thể quá mức cần thiết cho nhiều công việc. search.digikey.com/scripts/DkSearch/ từ
kenny

Cảm ơn - Tôi nên thiết kế một dự án sử dụng các bộ mở rộng I / O để buộc tôi học cách sử dụng chúng.
JYelton


2

Đây là một ví dụ về charlieplexing mà tôi đã xây dựng.

Đó là một trình mô phỏng chùm ngọn hải đăng và sử dụng một loạt 12 đèn LED được ghép thành 4 GPIO để quét một chùm ánh sáng xung quanh một đĩa. Có một video về nó ở đây .

Dự án dựa trên PIC, tôi sử dụng PIC12f683 cũng là uP 8pin và có thể được coi là tương đương với các AVR 8pin.

Cường độ của đèn LED được điều khiển bởi một bộ ngắt cung cấp một xung 32 bước ở khoảng 60Hz. Chỉ có hai đèn LED được phép bật sáng bất cứ lúc nào với mức thuế 50% cho mỗi đèn LED là tất cả những gì tôi cần. Nó cũng mang lại sự đánh đổi tốt về tốc độ làm mới của PWM so với độ phân giải.

Việc mã hóa để sử dụng charlieplexing thực sự khá đơn giản nếu bạn sử dụng phương pháp "cổ điển" chỉ chiếu sáng một đèn LED duy nhất tại bất kỳ thời điểm nào với tốc độ làm mới rất nhanh. Trước tiên, tôi tìm ra PORT và TRIS (thanh ghi cụ thể pic) cần thiết trên giấy sau đó lưu kết quả vào một mảng tĩnh. Để bật đèn LED x, PIC chỉ cần tra cứu giá trị tại chỉ mục của mảng [x] và ghi chúng trực tiếp vào PORT (với một chút mặt nạ để duy trì trạng thái của các chân khác không được sử dụng trong charliplex)

Dự án của tôi chỉ có 12 đèn LED chứ không phải 15 hoặc tối đa 20 GPIO 5 sẽ cho phép vì tôi muốn giữ một GPIO dự phòng để phát triển trong tương lai.

Dù sao ... tôi chỉ nghĩ rằng nó có thể hữu ích để có một ví dụ hoạt động tương tự như yêu cầu của bạn.

Mã nguồn đầy đủ và sơ đồ có sẵn trên blog của tôi.


0

Một lựa chọn khác là sử dụng đèn LED Neopixel. Chúng có IC điều khiển tích hợp và bạn chỉ cần một pin để điều khiển bao nhiêu đèn LED tùy thích. Tất nhiên bạn sẽ cần một nguồn năng lượng LED riêng biệt đầy đủ sau đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.