Hiện nay, e thấy LED Cube khá là hot, và hầu hết các bạn đều pí ở một chỗ là hiệu ứng, nên e mở 2pic này nhằm giúp một số bạn biết một số hiệu ứng cơ bản cho LED Cube 8x8x8 (có thể mở rộng nếu bạn thông minh hơn một chút). Video LED Cube của mình và các hiệu ứng:
Có nhiều project sử dụng nhiều loại MCU khác nhau: 89xx, ATMEL, PIC, hay thậm chí là kết nối PC giống e, vì vậy, e sẽ mô tả thuật toán cơ bản trước, và sau đó là code bằng C (bạn nào xài ASM thì đổi sớm đi nhá).
Kết quả xuất ra của mình sẽ là một mảng chứa các điểm LED sáng, và mỗi phần tử sẽ có 3 số là x, y, z tương ứng tọa độ của LED sáng đó. Mã thêm LED sáng sẽ là Add(x, y, z). [Hy vọng các bạn hỉu đc phần này]
Ngoài ra mình còn sử dụng lệnh Get_time() để lấy thời gian, tùy vào compiler của bạn mà thay đổi.
Hiệu ứng sóng:
Hiệu ứng này mô tả một điểm dao động theo hàm sin làm mặt phẳng xung quanh dao động theo gây nên cảm giác sóng. Hiệu ứng này e góp nhặt trên trang instructable và đc nhiều ng xài vì tính đơn giản nhưng đẹp của nó.
Cơ bản về thuật toán:
Gọi chu kỳ sóng là T, bước sóng L, biên độ A.
Vs 8x8x8, L là 7, A là 3.5, tọa độ O là (3.5, 3.5), còn T là 1s. Việc lấy t tùy vào cách các bạn lấy, có thể dùng timer, có thể đếm frame.
Code C:
Ngoài ra, bạn có thể tạo ra 1 hiệu ứng sóng khác bằng một thay đổi nho nhỏ. Bằng việc di chuyển điểm O ra rất xa (cỡ 5000), chúng ta có sóng song song (điểm phát sóng rất xa), và nếu quay điểm O quay một điểm nào đó, chúng ta có hiệu ứng thú vị như sau. (Trong video là hiệu ứng số 2)
Hum nay mệt quá, mai viết típ nha mọi người.
Có nhiều project sử dụng nhiều loại MCU khác nhau: 89xx, ATMEL, PIC, hay thậm chí là kết nối PC giống e, vì vậy, e sẽ mô tả thuật toán cơ bản trước, và sau đó là code bằng C (bạn nào xài ASM thì đổi sớm đi nhá).
Kết quả xuất ra của mình sẽ là một mảng chứa các điểm LED sáng, và mỗi phần tử sẽ có 3 số là x, y, z tương ứng tọa độ của LED sáng đó. Mã thêm LED sáng sẽ là Add(x, y, z). [Hy vọng các bạn hỉu đc phần này]
Ngoài ra mình còn sử dụng lệnh Get_time() để lấy thời gian, tùy vào compiler của bạn mà thay đổi.
Hiệu ứng sóng:
Hiệu ứng này mô tả một điểm dao động theo hàm sin làm mặt phẳng xung quanh dao động theo gây nên cảm giác sóng. Hiệu ứng này e góp nhặt trên trang instructable và đc nhiều ng xài vì tính đơn giản nhưng đẹp của nó.
Cơ bản về thuật toán:
Gọi chu kỳ sóng là T, bước sóng L, biên độ A.
- Chọn một điểm trong mặt phẳng xy làm gốc, đặt tên là O
- Quét tất cả mọi điểm trong mặt phẳng xy, gọi từng điểm là A
- Tính khoảng cách AO theo định lý Pytago, gọi là R
- Dùng công thức sóng u = A*Cos (2*PI*t/T - 2*PI*R/L)
- Add từng điểm vào mảng sáng
Vs 8x8x8, L là 7, A là 3.5, tọa độ O là (3.5, 3.5), còn T là 1s. Việc lấy t tùy vào cách các bạn lấy, có thể dùng timer, có thể đếm frame.
Code C:
Code:
float L = 7; // Bước sóng float T = 1; // Chu kỳ float A = 3.5; // Biên độ float xo = 3.5; // Tọa độ điểm gốc O float yo = 3.5; for (byte y = 0; y < 8; y++) // Quét Y { for (byte x = 0; x < 8; x++) // Quét X { float r = Sqrt(Pow(x - xo, 2) + Pow(y - yo, 2)); // Lấy bán kính, Sqrt là căn bậc 2, Pow(x, y) là x mũ y float t = get_time(); // Lấy thời gian byte z = (byte)(A * Cos(2*PI*t/T - 2*PI*r/L) + 3.5); // Lấy cao độ z, 3.5 là vị trí cân bằng Add(x, y, z); // Lưu vị trí LED sáng } }
Code:
float L = 7; // Bước sóng float T = 1; // Chu kỳ float A = 3.5; // Biên độ float ro = 5000; // Điểm O rất xa LED Cube float To = 8; // Chu kỳ quay của O quanh trục float xo, yo; float t = get_time(); //Lấy thời gian xo = ro*Cos(2*PI*t/To) + 3.5; // Cho điểm O quay yo = ro*Sin(2*PI*t/To) + 3.5; for (byte y = 0; y < 8; y++) // Quét Y { for (byte x = 0; x < 8; x++) // Quét X { float r = Sqrt(Pow(x - xo, 2) + Pow(y - yo, 2)); // Lấy bán kính, Sqrt là căn bậc 2, Pow(x, y) là x mũ y byte z = (byte)(A * Cos(2*PI*t/T - 2*PI*r/L) + 3.5); // Lấy cao độ z, 3.5 là vị trí cân bằng Add(x, y, z); // Lưu vị trí LED sáng } }
Comment