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

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

1. Chất 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 quy trình này, kỹ sư đã chọn màn hình thông minh hình tròn 2,1 inch.

dytrgf (2)

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

Để các hình ảnh về mí mắt lần lượt được hiển thị theo từng khoảng thời gian:

//Hoạt hình nhấp nháy

khoảng trống nhấp nháy_animat(void)

{

if(blink_flag == 0)

{

chớp mắt_cnt++;

nếu(nháy_cnt >= 4)

{

chớp_flag = 1;

}

}

khác

{

chớp mắt_cnt–;

if(blink_cnt

{

chớp_flag = 0;

}

}

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

}

khoảng trống nhấp nháy_run()

{

u32 tĩnh run_timer_cnt = 0;

run_timer_cnt++;

if(run_timer_cnt >= 2000000)

{

run_timer_cnt = 0;

chớp_animated();

Độ trễ_ms(30);

chớp_animated();

Độ trễ_ms(30);

chớp_animated();

Độ trễ_ms(30);

chớp_animated();

Độ trễ_ms(30);

chớp_animated();

Độ trễ_ms(30);

chớp_animated();

Độ trễ_ms(30);

chớp_animated();

Độ trễ_ms(30);

chớp_animated();

Độ trễ_ms(30);

}

}

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

Điều này tương tự như việc chớp mắt nhưng 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, người kỹ sư đã thiết kế được bộ mã sau.

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

void eyeball_animat(void)

{

nhãn cầu_timer_cnt++;

if(eyeball_timer_cnt

{

nhãn cầu_cnt = 20;

}

khác nếu(eyeball_timer_cnt

{

nhãn cầu_cnt = 50;

}

khác nếu(eyeball_timer_cnt

{

nhãn cầu_cnt = 80;

}

khác nếu(eyeball_timer_cnt

{

nhãn cầu_cnt = 94;

}

khác nếu(eyeball_timer_cnt

{

nhãn cầu_cnt = 94;

}

khác nếu(eyeball_timer_cnt

{

nhãn cầu_cnt = 80;

}

khác nếu(eyeball_timer_cnt

{

nhãn cầu_cnt = 50;

}

khác nếu(eyeball_timer_cnt

{

nhãn cầu_cnt = 20;

}

khác nếu(eyeball_timer_cnt

{

nhãn cầu_cnt = -10;

}

khác nếu(eyeball_timer_cnt

{

nhãn cầu_cnt = -40;

}

khác nếu(eyeball_timer_cnt

{

nhãn cầu_cnt = -54;

}

khác nếu(eyeball_timer_cnt

{

nhãn cầu_cnt = -40;

}

khác nếu(eyeball_timer_cnt

{

nhãn cầu_cnt = -10;

}

khác nếu(eyeball_timer_cnt

{

nhãn cầu_cnt = 20;

nhãn cầu_timer_cnt = 0;

}

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

// if(eyeball_flag == 0)

// {

// nhãn cầu_cnt++;

// if(eyeball_cnt >= 94)

// {

// nhãn cầu_flag = 1;

// }

// }

// khác

// {

// nhãn cầu_cnt–;

// if(eyeball_cnt

// {

// nhãn cầu_flag = 0;

// }

// }

if(eyeball_cnt >= 0)

{

nhãn cầu_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] = (eyeball_cnt & 0xFF);

}

write_dgus_vp(0×3111, (u8 *)&eyeball_pos, 2);

}

void nhãn cầu_run()

{

u32 tĩnh run_timer_cnt = 0;

run_timer_cnt++;

if(run_timer_cnt >= 20000)

{

run_timer_cnt = 0;

hoạt hình_eyeball();

}

}

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

Phương pháp xử lý ở đây là khi khuôn mặt được phát hiện, mắt 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:

if(rec_data_timer_cnt

{

rec_data_timer_cnt++;

}

khác

{

nhãn cầu_run();

}

bên ngoài u32 rec_data_timer_cnt;

bên ngoài u16 eyeball_timer_cnt;

void Communication_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(Loại_Giao tiếp==2)

Mô tả_Modbus(st);

#endif

uart[st].Rx_F=0;

uart[st].Rx_Num=0;

}

}


Thời gian đăng: 26/06/2023