Màn hình LED RGB 64 pixel - Một bản sao Arduino khác: 12 bước (có hình ảnh)
Màn hình LED RGB 64 pixel - Một bản sao Arduino khác: 12 bước (có hình ảnh)
Anonim

Màn hình này dựa trên Ma trận LED RGB 8x8. Đối với mục đích thử nghiệm, nó được kết nối với một bảng Arduino tiêu chuẩn (Diecimila) bằng cách sử dụng 4 thanh ghi dịch chuyển. Sau khi làm cho nó hoạt động, tôi đã hoán vị nó trên một PCB được mài mòn. Các thanh ghi dịch chuyển có chiều rộng 8 bit và dễ dàng giao tiếp với giao thức SPI. Điều chế độ rộng xung được sử dụng để trộn các màu sắc, sau đó sẽ bổ sung thêm. Một phần RAM của MCU được sử dụng làm bộ đệm khung để lưu giữ hình ảnh. Video RAM được phân tích cú pháp theo quy trình ngắt trong nền, vì vậy người dùng có thể làm những việc hữu ích khác như nói chuyện với PC, đọc các nút và chiết áp. Thông tin thêm về "Arduino": www.arduino.cc

Bước 1: Điều chế độ rộng xung để trộn màu

Điều chế độ rộng xung - CÁI GÌ? Điều chế độ rộng xung về cơ bản là BẬT và TẮT nguồn cấp cho một thiết bị điện khá nhanh chóng. Công suất khả dụng là kết quả từ giá trị trung bình toán học của hàm sóng vuông được lấy trong khoảng thời gian của một chu kỳ. Chức năng ở vị trí BẬT càng lâu, bạn càng nhận được nhiều điện năng hơn. PWM có tác dụng tương tự đối với độ sáng của đèn LED như bộ điều chỉnh độ sáng trên đèn AC. Nhiệm vụ phía trước là điều khiển riêng độ sáng của 64 LED RGB (= 192 đèn LED đơn!) Một cách rẻ tiền và dễ dàng, vì vậy người ta có thể có được toàn bộ quang phổ của màu sắc. Tốt hơn là không có hiện tượng nhấp nháy hoặc các hiệu ứng khó chịu khác. Cảm nhận phi tuyến về độ sáng do mắt người thể hiện sẽ không được tính đến ở đây (ví dụ: sự khác biệt giữa độ sáng 10% và 20% có vẻ "lớn hơn" so với giữa 90% và 100%). Hình ảnh (1) minh họa nguyên lý hoạt động của thuật toán PWM. Giả sử mã được cung cấp giá trị 7 cho độ sáng của đèn LED (0, 0). Hơn nữa, nó biết có độ sáng tối đa là N bước. Mã chạy N vòng lặp cho tất cả các mức độ sáng có thể có và tất cả các vòng lặp cần thiết để phục vụ mọi đèn LED đơn lẻ trong tất cả các hàng. Trong trường hợp bộ đếm vòng lặp x trong vòng lặp độ sáng nhỏ hơn 7, đèn LED được bật. Nếu nó lớn hơn 7, đèn LED sẽ tắt. Thực hiện điều này rất nhanh chóng đối với tất cả các đèn LED, mức độ sáng và màu cơ bản (RGB), mỗi đèn LED có thể được điều chỉnh riêng để hiển thị màu mong muốn. Phần còn lại có thể được sử dụng để thực hiện giao tiếp nối tiếp với PC, đọc các nút, nói chuyện với đầu đọc RFID, gửi I2Dữ liệu C đến các mô-đun khác…

Bước 2: Nói chuyện với Thanh ghi Shift và đèn LED

Thanh ghi dịch chuyển là một thiết bị cho phép tải dữ liệu nối tiếp và một đầu ra song song. Hoạt động ngược lại cũng có thể thực hiện được với chip thích hợp. Mỗi cổng có thể cấp nguồn hoặc chìm dòng điện khoảng 25mA. Tổng dòng điện trên mỗi chip chìm hoặc có nguồn không được vượt quá 70mA. Những con chip này cực kỳ rẻ, vì vậy đừng trả nhiều hơn khoảng 40 xu mỗi miếng. Vì đèn LED có đặc tính dòng điện / điện áp hàm mũ, nên cần có điện trở giới hạn dòng điện Sử dụng định luật Ohm: R = (V - Vf) / IR = điện trở giới hạn, V = 5V, Vf = điện áp thuận của đèn LED, I = dòng điện mong muốn có điện áp chuyển tiếp khoảng 1,8V, màu xanh lam và xanh lục từ 2,5V đến 3,5V. Sử dụng một đồng hồ vạn năng đơn giản để xác định điều đó. Để tái tạo màu thích hợp, người ta nên tính đến một số điều sau: độ nhạy quang phổ của mắt người (đỏ / xanh lam: xấu, xanh lục: tốt), hiệu suất của đèn LED ở một bước sóng và dòng điện nhất định. Trong thực tế, người ta chỉ cần lấy 3 chiết áp và điều chỉnh chúng cho đến khi đèn LED hiển thị ánh sáng trắng thích hợp. Tất nhiên dòng điện LED tối đa không được vượt quá. Điều quan trọng ở đây là thanh ghi chuyển số điều khiển các hàng phải cung cấp dòng điện cho đèn LED 3x8, vì vậy tốt hơn là không đẩy dòng điện lên quá cao. Tôi đã thành công với việc giới hạn điện trở 270Ohm cho tất cả các đèn LED, nhưng điều đó tất nhiên phụ thuộc vào cấu tạo của ma trận LED. Các thanh ghi dịch chuyển được giao tiếp với nối tiếp SPI. SPI = Giao diện ngoại vi nối tiếp (Hình ảnh (1)). Ngược lại với các cổng nối tiếp trên PC (không đồng bộ, không có tín hiệu xung nhịp), SPI cần một đường xung nhịp (SRCLK). Sau đó, có một đường tín hiệu cho thiết bị biết khi dữ liệu hợp lệ (chip select / latch / RCLK). Cuối cùng có hai dòng dữ liệu, một dòng được gọi là MOSI (master out slave in), dòng còn lại được gọi là MISO (master in slave out). SPI được sử dụng để giao tiếp các mạch tích hợp, giống như I2C. Dự án này cần MOSI, SRCLK và RCLK. Ngoài ra, dòng cho phép (G) cũng được sử dụng. Một chu kỳ SPI được bắt đầu bằng cách kéo dòng RCLK đến THẤP (Hình ảnh (2)). MCU gửi dữ liệu của nó trên đường MOSI. Trạng thái logic của nó được lấy mẫu bởi thanh ghi dịch chuyển ở cạnh lên của dòng SRCLK. Chu kỳ được kết thúc bằng cách kéo dòng RCLK trở lại mức CAO. Bây giờ dữ liệu có sẵn ở đầu ra.

Bước 3: Sơ đồ

Hình ảnh (1) cho thấy cách các thanh ghi shift được nối dây. Chúng được liên kết với nhau, do đó, dữ liệu có thể được chuyển vào chuỗi này và cũng thông qua nó. Do đó việc thêm nhiều thanh ghi dịch chuyển rất dễ dàng.

Hình ảnh (2) cho thấy phần còn lại của sơ đồ với MCU, các đầu nối, thạch anh … Tệp PDF đính kèm chứa toàn bộ các tác phẩm, tốt nhất để in.

Bước 4: Mã nguồn C ++

Trong C / C ++ thường người ta phải tạo nguyên mẫu các hàm trước khi mã hóa chúng. # Include int main (void); void do_something (void); int main (void) {do_something ();} void do_something (void) {/ * comment * / } Arduino IDE không yêu cầu bước này, vì các nguyên mẫu hàm được tạo tự động. Do đó, các nguyên mẫu hàm sẽ không hiển thị trong mã được hiển thị ở đây. Hình ảnh (1): setup () functionImage (2): spi_transfer () sử dụng SPI phần cứng của chip ATmega168 (chạy nhanh hơn) ngắt tràn timer1. Các đoạn mã có giao diện hơi khó hiểu cho người mới bắt đầu, ví dụ: while (! (SPSR & (1 << SPIF))) {} sử dụng trực tiếp các thanh ghi của MCU. Ví dụ này bằng từ ngữ: "trong khi SPIF-bit trong thanh ghi SPSR không được đặt thì không làm gì cả". Tôi chỉ muốn nhấn mạnh rằng đối với các dự án tiêu chuẩn, thực sự không cần thiết phải xử lý những thứ này liên quan chặt chẽ đến phần cứng. Những người mới bắt đầu không nên sợ hãi vì điều này.

Bước 5: Hoàn thành Tiện ích

Sau khi giải quyết tất cả các vấn đề và mã chạy, tôi chỉ cần tạo một bố cục PCB và gửi nó đến một ngôi nhà fab. Nó trông gọn gàng hơn rất nhiều:-) Hình ảnh (1): bảng điều khiển được điền đầy đủ Hình ảnh (2): mặt trước của PC trần Hình ảnh (2): mặt sau Có các đầu nối phá vỡ PORTC và PORTD của chip ATmega168 / 328 và 5V / GND. Các cổng này chứa các dòng RX, TX nối tiếp, I2C đường, đường I / O kỹ thuật số và 7 đường ADC. Điều này nhằm mục đích xếp các tấm chắn ở mặt sau của bảng. Khoảng cách phù hợp để sử dụng perfboard (0,1in). Bộ nạp khởi động có thể được flash bằng tiêu đề ICSP (hoạt động với USBtinyISP của adafruit). Ngay sau khi hoàn tất, chỉ cần sử dụng bộ điều hợp nối tiếp FTDI USB / TTL tiêu chuẩn hoặc tương tự. Tôi cũng đã thêm một jumper tự động đặt lại-vô hiệu hóa. Tôi cũng đã tạo ra một tập lệnh Perl nhỏ (xem blog của tôi), cho phép tự động đặt lại bằng cáp FTDI thường không hoạt động ngoài hộp (dòng RTS so với DTR). Tính năng này hoạt động trên Linux, có thể trên MAC. Các bảng mạch in và một vài bộ KIT tự làm có sẵn trên blog của tôi. Yêu cầu hàn SMD! Xem các tệp PDF để biết hướng dẫn xây dựng và nguồn cho ma trận LED.

Bước 6: Ứng dụng: CPU Load Monitor cho Linux bằng Perl

Đây là một bộ theo dõi tải rất cơ bản với một sơ đồ lịch sử. Nó dựa trên một tập lệnh Perl thu thập "tải trung bình" của hệ thống cứ sau 1 giây bằng cách sử dụng iostat. Dữ liệu được lưu trữ trong một mảng được thay đổi theo mỗi lần cập nhật. Dữ liệu mới được thêm vào đầu danh sách, mục nhập cũ nhất sẽ bị đẩy ra ngoài. Thông tin chi tiết hơn và tải xuống (mã…) có sẵn trên blog của tôi.

Bước 7: Ứng dụng: Nói chuyện với các mô-đun khác bằng I²C

Đây chỉ là một bằng chứng về nguyên tắc và cho đến nay không phải là giải pháp đơn giản nhất cho công việc này.2C cho phép định địa chỉ trực tiếp lên đến 127 bo mạch "nô lệ". Ở đây bảng ở phía bên phải trong video là "chủ" (bắt đầu tất cả các chuyển giao), bảng bên trái là nô lệ (chờ dữ liệu). tôi2C cần 2 đường tín hiệu và đường nguồn thông thường (+, -, SDA, SCL). Vì nó là một xe buýt, tất cả các thiết bị được kết nối song song với nó.

Bước 8: Ứng dụng: "Game Cube":-)

Chỉ là một suy nghĩ quái đản. Ý tưởng này cũng phù hợp với bao vây bằng gỗ được hiển thị trên trang giới thiệu. Nó có 5 nút ở mặt sau, có thể được sử dụng để chơi một trò chơi đơn giản.

Bước 9: Hiển thị Hình ảnh / Hoạt ảnh trên Ma trận - Hack nhanh

Vì vậy, nó chỉ có 8x8 pixel và một vài màu sắc. Trước tiên, hãy sử dụng một cái gì đó như Gimp để thu nhỏ hình ảnh yêu thích của bạn xuống chính xác 8x8 pixel và lưu nó dưới dạng định dạng thô ".ppm" (không phải ASCII). PPM rất dễ đọc và xử lý trong tập lệnh Perl. Sử dụng ImageMagick và công cụ dòng lệnh "convert" sẽ không hoạt động bình thường. Hãy tải mã arduino mới, sau đó sử dụng tập lệnh Perl để tải lên bộ điều khiển. Hiện tượng nhấp nháy chỉ là sự không phù hợp giữa việc làm mới đèn LED và tốc độ khung hình của máy ảnh của tôi. Sau khi cập nhật mã một chút, nó chạy khá nhanh. Tất cả các hình ảnh được truyền trực tiếp qua nối tiếp như bạn thấy. Hình ảnh động dài hơn có thể được lưu trữ trong một EEPROM bên ngoài giống như nó được thực hiện trong các bảng nói-pov khác nhau.

Bước 10: Kiểm soát tương tác các hoạt ảnh được lưu trữ

Tại sao lại để bộ vi điều khiển có tất cả niềm vui? Sự sùng bái Arduino là tất cả về tính toán vật lý và tương tác, vì vậy chỉ cần thêm một chiết áp và kiểm soát! Sử dụng một trong 8 đầu vào của bộ chuyển đổi tín hiệu tương tự sang kỹ thuật số làm cho điều đó trở nên rất đơn giản.

Bước 11: Hiển thị Video Trực tiếp

Sử dụng tập lệnh Perl và một vài mô-đun giúp dễ dàng hiển thị video gần như trực tiếp trên hệ thống X11. Nó được mã hóa trên linux và cũng có thể hoạt động trên MAC, nó hoạt động như sau: - lấy vị trí con trỏ chuột- chụp một hộp pixel NxN ở giữa con trỏ- chia tỷ lệ hình ảnh thành 8x8 pixel- gửi nó đến bảng LED- lặp lại

Bước 12: Nhiều ánh sáng hơn gần như miễn phí

Chỉ với hai bước, độ sáng có thể được tăng lên một chút. Thay các điện trở 270Ω bằng các điện trở 169Ω và cõng một thanh ghi dịch chuyển 74HC595 khác vào IC5.