Vui lòng đọc tất cả bài trước đó trong tutorial Ma trận LED thì các bạn mới hiểu bài này
Tải toàn bộ tài liệu và tool: (Download the source code and the tool)
Source Stm32 (KeilC + CubeMX) https://drive.google.com/file/d/18dnq10WQFYxnt5RkTBZ_0zaiA8WWUA8p/view?usp=sharing
Tool play desktop: https://github.com/daonguyen207/USB_CDC_Stream_video
Tool video file stream: https://drive.google.com/file/d/18ighDevgvxg4YTdrZODp3VrXfbJtUB3M/view?usp=sharing
Để chạy video, chúng ta chỉ cần truyền từng frame ảnh xuống từ máy tính là được. Vì chỉ chạy 1 tấm matrix P5 có độ phân giải 64×32 nên mình sẽ sử dụng giao tiếp USB CDC để truyền dữ liệu
Các bản chuẩn bị kit stm32 và kết nối với module P5 như đã làm ở bài 15 hoặc sử dụng kit clock led p5 mà mình bán tại đây
Nếu sử dụng kit led của mình thì hãy nhớ để chân GPIO B15 là ouput mức cao thì máy tính mới nhận USB nhé 😛
Cấu hình trên cubemx
Chúng ta sử dụng project đã làm ở bài 16 và chỉ việc cấu hình thêm USB CDC
Trong file Main.c
Khai báo 1 biến toàn cục
1 |
char flag_display; |
Trong vòng lặp while(1) mình sẽ kiểm tra biến flag_display để gọi hàm display()
1 2 3 4 5 |
if(flag_display==1) { flag_display=0; display(); } |
Trong file usbd_custom_hid_if.c
Ở bài 16 mình đã cho các hàm điều khiển led matrix ra 1 file thư viện riêng tên là P5.h, cho nên bây giờ mình sẽ include thư viện này vào file usbd_custom_hid_if.c để từ file này chúng ta sẽ truy cập trực tiếp vào Buffer_RGB
1 2 3 |
#include "P5.h" int USB_mau,USB_demhang; extern char flag_display; |
Cuối cùng, trong hàm CDC_Receive_FS chúng ta sẽ đón dữ liệu và đưa vào Buffer_RGB
1 2 3 |
for(char i=0;i<64;i++)Buffer_RGB[USB_mau*arrD1 + USB_demhang*arrD2 + i] = Buf[i]; USB_demhang ++; if(USB_demhang == 32) {USB_demhang=0;USB_mau++;if(USB_mau == 3){USB_mau=0;flag_display=1;}} |
Về nguyên tắc truyền nhận dữ liệu, trên máy tính mình sẽ truyền mỗi đợt 64 byte data lần lượt từ phải sang trái, từ trên xuống dưới và từ R -> G -> B. Sau khi nhận đủ 1 khung hình sẽ set biến flag_display lên để chương trình main gọi hàm display show dữ liệu đã nhận được ra ngoài
Softwave PC
Đương nhiên sẽ không có sẵn phần mềm cho chúng ta mà sẽ phải tự viết, về vấn đề này thì khỏi lo lắng vì mình đã viết sẵn 2 phần mềm demo
1, Stream desktop
Phần mềm thứ 1 dùng để stream màn hình desktop, các bạn ấn vào nút Get sau đó click lần lượt vào 2 điểm trên màn hình để khoanh vùng mà các bạn muốn truyền xuống màn hình led
Download source c# here
2, Play video file
Download source c# here
DEMO
Stream desktop
Play video file
When the function execution time of the timer interrupt service routine for driving the LED MATRIX becomes long, an error occurs in the FATFS API used to read the data format of the video file from the SD card.
So, currently, I only temporarily prevent interrupts when executing the FATFS API (f_read, f_lseek etc…).
(Alternatively, I know that I can use DMA when using SDIO.)
I am looking forward to the next post because you have driven video on LED_MATRIX without using DMA.
right ! I have used dma for sdio
anh ơi cho em hỏi xíu ạ
số khung truyền trên giây mà mình có thể hiện thị lên bảng led nó phụ thuộc vào yếu tố nào ạ. mình có thể chỉnh được không ạ. vì khi em làm với bảng led to hơn thì khung truyền nó giảm xuống quá thấp làm cho quét khung hình ko đủ nó không ra theo video mình chiếu ạ.
phụ thuộc vào tốc độ truyền, lượng dự liệu cần truyền …
có thế nén jpeg lại có thể giảm lượng dự liệu xuống 99 lần đó , nhưng chất lượng màu sắc sẻ giảm