چشم هوشمند مبتنی بر صفحه دایره ای DWIN

——از انجمن توسعه دهندگان DWIN

پروژه منبع باز انجمن توسعه دهندگان DWIN که این بار برای همه توصیه می شود، روال بسیار جالبی برای شبیه سازی حرکت چشم انسان است.این مهندس از چندین ماده تصویری چشم انسان برای درک عملکردهایی مانند حرکت کره چشم، پلک زدن، تشخیص چهره و دنبال کردن استفاده کرد.

مقدمه ای بر راه حل های متن باز:

1. مواد تصویر UI

یادداشت ویرایشگر: صفحه نمایش هوشمند DWIN مبتنی بر تصاویر برای تکمیل توسعه UI است که به راحتی می تواند جلوه های مختلف نمایش را درک کند.

dytrgf (1)

2. توسعه رابط

توسعه رابط از طریق نرم افزار DGUS نسبتا ساده است و تنها به دو کنترل گرافیکی نیاز است.در این روال، مهندس یک صفحه نمایش هوشمند گرد 2.1 اینچی را انتخاب کرد.

dytrgf (2)

3. انیمیشن چشمک زدن را درک کنید

اجازه دهید تصاویر پلک ها به ترتیب در فواصل زمانی نمایش داده شوند:

//انیمیشن پلک زدن

void blink_animat(void)

{

if(blink_flag == 0)

{

blink_cnt++;

if (blink_cnt >= 4)

{

blink_flag = 1;

}

}

دیگر

{

blink_cnt–;

if(blink_cnt <= 0)

{

blink_flag = 0;

}

}

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

}

بی اعتبار blink_run()

{

static u32 run_timer_cnt = 0;

run_timer_cnt++;

if(run_timer_cnt >= 2000000)

{

run_timer_cnt = 0;

blink_animat();

Delay_ms(30);

blink_animat();

Delay_ms(30);

blink_animat();

Delay_ms(30);

blink_animat();

Delay_ms(30);

blink_animat();

Delay_ms(30);

blink_animat();

Delay_ms(30);

blink_animat();

Delay_ms(30);

blink_animat();

Delay_ms(30);

}

}

4. متوجه شوید که کره چشم به طور طبیعی به چپ و راست نگاه می کند.

این شبیه به پلک زدن است، اما برای کنترل حرکت چشم نیاز به مقایسه زمان نوسانگر کریستالی دارد.پس از چندین بار اشکال زدایی، مهندس مجموعه کدهای زیر را طراحی کرد.

//انیمیشن کره چشم

void eyeball_animat(void)

{

eyeball_timer_cnt++;

if(eyeball_timer_cnt < 50)

{

چشم_cnt = 20;

}

else if(eyeball_timer_cnt < 51)

{

چشم_cnt = 50;

}

else if(eyeball_timer_cnt < 52)

{

چشم_cnt = 80;

}

else if(eyeball_timer_cnt < 53)

{

چشم_cnt = 94;

}

else if(eyeball_timer_cnt < 103)

{

چشم_cnt = 94;

}

else if(eyeball_timer_cnt < 104)

{

چشم_cnt = 80;

}

else if(eyeball_timer_cnt < 105)

{

چشم_cnt = 50;

}

else if(eyeball_timer_cnt < 106)

{

چشم_cnt = 20;

}

else if(eyeball_timer_cnt < 107)

{

چشم_cnt = -10;

}

else if(eyeball_timer_cnt < 108)

{

چشم_cnt = -40;

}

else if(eyeball_timer_cnt < 158)

{

چشم_cnt = -54;

}

else if(eyeball_timer_cnt < 159)

{

چشم_cnt = -40;

}

else if(eyeball_timer_cnt < 160)

{

چشم_cnt = -10;

}

else if(eyeball_timer_cnt < 161)

{

چشم_cnt = 20;

eyeball_timer_cnt = 0;

}

//حرکت به چپ و راست

// if(eyeball_flag == 0)

// {

// eyeball_cnt++;

// if(eyeball_cnt >= 94)

// {

// چشم_پرچم = 1;

//}

//}

//دیگر

// {

// eyeball_cnt–;

// if(eyeball_cnt <= -54)

// {

// چشم_پرچم = 0;

//}

//}

if(eyeball_cnt >= 0)

{

چشم_پوس[0] = 0×00;

eyeball_pos[1] = eyeball_cnt;

}

دیگر

{

eyeball_pos[0] = 0xFF;

eyeball_pos[1] = (eyeball_cnt & 0xFF);

}

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

}

void eyeball_run()

{

static u32 run_timer_cnt = 0;

run_timer_cnt++;

if(run_timer_cnt >= 20000)

{

run_timer_cnt = 0;

eyeball_animat();

}

}

5. تشخیص چهره ESP32 را اضافه کنید تا حرکت چشم ها را دنبال کنید.

روش پردازش در اینجا به این صورت است که وقتی صورت تشخیص داده می شود، چشم ها به خودی خود حرکت نمی کنند و یک متغیر برای افزایش در حلقه while تعریف می شود.هنگامی که افزایش به مقدار مشخصی رسید، کره چشم خود به خود حرکت می کند.هنگامی که پورت سریال داده ها را دریافت می کند، این متغیر پاک می شود و سپس فقط چشم ها را مطابق با موقعیت صورت حرکت می دهد.کد اصلی به شرح زیر است:

if(rec_data_timer_cnt < 1000000)

{

rec_data_timer_cnt++;

}

دیگر

{

eyeball_run();

}

extern u32 rec_data_timer_cnt;

extern 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;

eyeball_timer_cnt = 0;

#if(نوع_ارتباط==1)

Describe_8283(st);

#elif(نوع_ارتباط==2)

Describe_Modbus(st);

#endif

uart[st].Rx_F=0;

uart[st].Rx_Num=0;

}

}


زمان ارسال: ژوئن-26-2023