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
}
}
Không có nhận xét nào:
Đăng nhận xét