Mắt thông minh dựa trên màn hình tròn DWIN

——Từ Diễn đàn nhà phát triển DWIN

Dự án nguồn mở của diễn đàn nhà phát triển DWIN được đề xuất cho mọi người lần này là một thói quen rất thú vị để mô phỏng chuyển động của mắt người.Kỹ sư đã sử dụng một số tài liệu hình ảnh của mắt người để thực hiện các chức năng như chuyển động nhãn cầu, chớp mắt, nhận dạng khuôn mặt và theo dõi.

Giới thiệu về các giải pháp mã nguồn mở:

1. Tài liệu hình ảnh giao diện người dùng

Lưu ý của biên tập viên: Màn hình thông minh DWIN dựa trên hình ảnh để hoàn thiện quá trình phát triển giao diện người dùng, có thể dễ dàng nhận ra các hiệu ứng hiển thị khác nhau.

dytrgf (1)

2. Phát triển giao diện

Việc phát triển giao diện thông qua phần mềm DGUS tương đối đơn giản và chỉ cần hai điều khiển đồ họa.Trong thói quen này, kỹ sư đã chọn một màn hình thông minh tròn 2,1 inch.

dytrgf (2)

3. Nhận ra hoạt hình nhấp nháy

Hãy để hình ảnh của mí mắt được hiển thị lần lượt trong khoảng thời gian:

// Hoạt ảnh nhấp nháy

khoảng trống nháy_animat(khoảng trống)

{

nếu (blink_flag == 0)

{

nháy mắt_cnt ++;

nếu (blink_cnt >= 4)

{

nháy_cờ = 1;

}

}

khác

{

nháy_cnt–;

nếu (nháy_cnt <= 0)

{

nháy_cờ = 0;

}

}

write_dgus_vp(0×3000, (u8 *)&blink_cnt, 2);

}

vô hiệu nháy_run()

{

u32 tĩnh run_timer_cnt = 0;

run_timer_cnt++;

nếu (run_timer_cnt >= 2000000)

{

run_timer_cnt = 0;

nháy_animat();

độ trễ_ms(30);

nháy_animat();

độ trễ_ms(30);

nháy_animat();

độ trễ_ms(30);

nháy_animat();

độ trễ_ms(30);

nháy_animat();

độ trễ_ms(30);

nháy_animat();

độ trễ_ms(30);

nháy_animat();

độ trễ_ms(30);

nháy_animat();

độ trễ_ms(30);

}

}

4. Nhận thấy nhãn cầu nhìn trái phải một cách tự nhiên.

Điều này tương tự như chớp mắt, nhưng nó cần so sánh thời gian của bộ dao động tinh thể để điều khiển chuyển động của mắt.Sau nhiều lần gỡ lỗi, kỹ sư đã thiết kế bộ mã sau.

// Hoạt hình nhãn cầu

khoảng trống nhãn cầu_animat(khoảng trống)

{

nhãn cầu_timer_cnt++;

nếu (nhãn cầu_timer_cnt < 50)

{

nhãn cầu_cnt = 20;

}

khác nếu (eyeball_timer_cnt < 51)

{

nhãn cầu_cnt = 50;

}

khác nếu (eyeball_timer_cnt < 52)

{

nhãn cầu_cnt = 80;

}

khác nếu (eyeball_timer_cnt < 53)

{

nhãn cầu_cnt = 94;

}

khác nếu (eyeball_timer_cnt < 103)

{

nhãn cầu_cnt = 94;

}

khác nếu (eyeball_timer_cnt < 104)

{

nhãn cầu_cnt = 80;

}

khác nếu (eyeball_timer_cnt < 105)

{

nhãn cầu_cnt = 50;

}

khác nếu (eyeball_timer_cnt < 106)

{

nhãn cầu_cnt = 20;

}

khác nếu (eyeball_timer_cnt < 107)

{

nhãn cầu_cnt = -10;

}

khác nếu (eyeball_timer_cnt < 108)

{

nhãn cầu_cnt = -40;

}

khác nếu (eyeball_timer_cnt < 158)

{

nhãn cầu_cnt = -54;

}

khác nếu (eyeball_timer_cnt < 159)

{

nhãn cầu_cnt = -40;

}

khác nếu (eyeball_timer_cnt < 160)

{

nhãn cầu_cnt = -10;

}

khác nếu (eyeball_timer_cnt < 161)

{

nhãn cầu_cnt = 20;

nhãn cầu_timer_cnt = 0;

}

// Di chuyển sang trái và phải

// nếu (nhãn cầu_flag == 0)

// {

// nhãn_cnt++;

// nếu(nhãn cầu_cnt >= 94)

// {

// nhãn cầu_flag = 1;

// }

// }

// khác

// {

// nhãn cầu_cnt–;

// if(nhãn cầu_cnt <= -54)

// {

// nhãn cầu_flag = 0;

// }

// }

nếu (nhãn cầu_cnt >= 0)

{

eyeball_pos[0] = 0×00;

nhãn cầu_pos[1] = nhãn cầu_cnt;

}

khác

{

nhãn cầu_pos[0] = 0xFF;

nhãn cầu_pos[1] = (nhãn cầu_cnt & 0xFF);

}

write_dgus_vp(0×3111, (u8 *)&nhãn cầu_pos, 2);

}

khoảng trống eyeball_run()

{

u32 tĩnh run_timer_cnt = 0;

run_timer_cnt++;

nếu (run_timer_cnt >= 20000)

{

run_timer_cnt = 0;

nhãn cầu_animat();

}

}

5. Thêm nhận dạng khuôn mặt ESP32 để nhận ra chuyển động của mắt theo khuôn mặt.

Phương pháp xử lý ở đây là khi nhận diện khuôn mặt, mắt sẽ không tự di chuyển và một biến được xác định để tăng dần trong vòng lặp while.Khi mức tăng đạt đến một giá trị nhất định, nhãn cầu sẽ tự di chuyển.Khi cổng nối tiếp nhận dữ liệu, biến này sẽ bị xóa và sau đó chỉ di chuyển mắt theo vị trí của khuôn mặt.Mã chính như sau:

nếu (rec_data_timer_cnt < 1000000)

{

rec_data_timer_cnt++;

}

khác

{

eyeball_run();

}

bên ngoài u32 rec_data_timer_cnt;

nhãn cầu u16 bên ngoài_timer_cnt;

void Giao tiếp_CMD(u8 st)

{

if((uart[st].Rx_F==1 )&&(uart[st].Rx_T==0))

{

rec_data_timer_cnt = 0;

nhãn cầu_timer_cnt = 0;

#if(Loại_Giao_tiếp==1)

Mô tả_8283(st);

#elif(Kiểu_Giao tiếp==2)

Mô tả_Modbus(st);

#endif

uart[st].Rx_F=0;

uart[st].Rx_Num=0;

}

}


Thời gian đăng: 26-Jun-2023