عين ذكية تعتمد على شاشة DWIN الدائرية

——من منتدى مطوري DWIN

يعد مشروع منتدى مطوري DWIN مفتوح المصدر الموصى به للجميع هذه المرة روتينًا مثيرًا للاهتمام لمحاكاة حركة عيون الإنسان. استخدم المهندس العديد من مواد صور العين البشرية لتحقيق وظائف مثل حركة مقلة العين، والوميض، والتعرف على الوجه والمتابعة.

مقدمة للحلول مفتوحة المصدر:

1. مادة صورة واجهة المستخدم

ملاحظة المحرر: تعتمد شاشة DWIN الذكية على الصور لإكمال تطوير واجهة المستخدم، والتي يمكنها بسهولة تحقيق تأثيرات العرض المختلفة.

ديترجف (1)

2. تطوير الواجهة

من السهل نسبيًا تطوير الواجهة من خلال برنامج DGUS، ولا يلزم سوى عنصري تحكم رسوميين. وفي هذا الروتين اختار المهندس شاشة ذكية مستديرة بقياس 2.1 بوصة.

ديترجف (2)

3. تحقيق الرسوم المتحركة الوامضة

لتظهر صور الجفون تباعا على فترات:

// وميض الرسوم المتحركة

blink_animat باطلة (باطلة)

{

إذا (blink_flag == 0)

{

blink_cnt++;

إذا (blink_cnt >= 4)

{

blink_flag = 1؛

}

}

آخر

{

blink_cnt–;

إذا (blink_cnt

{

blink_flag = 0؛

}

}

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

}

blink_run() باطلة

{

ثابت u32 run_timer_cnt = 0;

run_timer_cnt++;

إذا (run_timer_cnt >= 2000000)

{

run_timer_cnt = 0;

blink_animated();

Delay_ms(30);

blink_animated();

Delay_ms(30);

blink_animated();

Delay_ms(30);

blink_animated();

Delay_ms(30);

blink_animated();

Delay_ms(30);

blink_animated();

Delay_ms(30);

blink_animated();

Delay_ms(30);

blink_animated();

Delay_ms(30);

}

}

4. أدرك أن مقل العيون تبدو يمينًا ويسارًا بشكل طبيعي.

وهذا يشبه الرمش، لكنه يحتاج إلى مقارنة وقت المذبذب البلوري للتحكم في حركة العين. بعد عدة مرات من التصحيح، قام المهندس بتصميم مجموعة الرموز التالية.

// الرسوم المتحركة مقلة العين

باطلة Eyeball_animat(باطلة)

{

Eyeball_timer_cnt++;

إذا (eyeball_timer_cnt

{

Eyeball_cnt = 20;

}

وإلا إذا (eyeball_timer_cnt

{

Eyeball_cnt = 50;

}

وإلا إذا (eyeball_timer_cnt

{

Eyeball_cnt = 80;

}

وإلا إذا (eyeball_timer_cnt

{

Eyeball_cnt = 94؛

}

وإلا إذا (eyeball_timer_cnt

{

Eyeball_cnt = 94؛

}

وإلا إذا (eyeball_timer_cnt

{

Eyeball_cnt = 80;

}

وإلا إذا (eyeball_timer_cnt

{

Eyeball_cnt = 50;

}

وإلا إذا (eyeball_timer_cnt

{

Eyeball_cnt = 20;

}

وإلا إذا (eyeball_timer_cnt

{

Eyeball_cnt = -10;

}

وإلا إذا (eyeball_timer_cnt

{

Eyeball_cnt = -40;

}

وإلا إذا (eyeball_timer_cnt

{

Eyeball_cnt = -54;

}

وإلا إذا (eyeball_timer_cnt

{

Eyeball_cnt = -40;

}

وإلا إذا (eyeball_timer_cnt

{

Eyeball_cnt = -10;

}

وإلا إذا (eyeball_timer_cnt

{

Eyeball_cnt = 20;

Eyeball_timer_cnt = 0;

}

// تحرك لليسار واليمين

// إذا (eyeball_flag == 0)

// {

//eyeball_cnt++;

// إذا (eyeball_cnt >= 94)

// {

// Eyeball_flag = 1؛

// }

// }

// آخر

// {

//eyeball_cnt–;

// إذا (eyeball_cnt

// {

// Eyeball_flag = 0؛

// }

// }

إذا (eyeball_cnt >= 0)

{

Eyeball_pos[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);

}

باطلةeyeball_run ()

{

ثابت u32 run_timer_cnt = 0;

run_timer_cnt++;

إذا (run_timer_cnt >= 20000)

{

run_timer_cnt = 0;

Animation_eyeball();

}

}

5. أضف ميزة التعرف على الوجه ESP32 لإدراك حركة العيون التي تتبع الوجه.

طريقة المعالجة هنا هي أنه عند اكتشاف الوجه، لا تتحرك العيون من تلقاء نفسها، ويتم تحديد متغير للزيادة في حلقة while. عندما تصل الزيادة إلى قيمة معينة، ستتحرك مقل العيون من تلقاء نفسها. عندما يستقبل المنفذ التسلسلي البيانات، سيتم مسح هذا المتغير، ثم قم بتحريك العينين فقط وفقًا لموضع الوجه. الرمز الرئيسي هو كما يلي:

إذا (rec_data_timer_cnt

{

rec_data_timer_cnt++;

}

آخر

{

Eyeball_run();

}

u32 الخارجي rec_data_timer_cnt;

u16 الخارجيeyeball_timer_cnt;

اتصال فارغ_CMD(u8 st)

{

إذا ((uart[st].Rx_F==1 )&&(uart[st].Rx_T==0))

{

rec_data_timer_cnt = 0;

Eyeball_timer_cnt = 0;

#إذا(نوع_الاتصال==1)

Describe_8283(st);

#elif(Type_Communication==2)

Describe_Modbus(st);

#إنهاء إذا

uart[st].Rx_F=0;

uart[st].Rx_Num=0;

}

}


وقت النشر: 26 يونيو 2023