عين ذكية على أساس شاشة 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 <= 0)

{

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_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. أدرك أن مقل العيون تبدو يسارًا ويمينًا بشكل طبيعي.

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

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

باطل eyeball_animat (باطل)

{

eyeball_timer_cnt ++ ؛

إذا (eyeball_timer_cnt <50)

{

eyeball_cnt = 20 ؛

}

وإلا إذا (eyeball_timer_cnt <51)

{

eyeball_cnt = 50 ؛

}

وإلا إذا (eyeball_timer_cnt <52)

{

eyeball_cnt = 80 ؛

}

وإلا إذا (eyeball_timer_cnt <53)

{

eyeball_cnt = 94 ؛

}

وإلا إذا (eyeball_timer_cnt <103)

{

eyeball_cnt = 94 ؛

}

وإلا إذا (eyeball_timer_cnt <104)

{

eyeball_cnt = 80 ؛

}

وإلا إذا (eyeball_timer_cnt <105)

{

eyeball_cnt = 50 ؛

}

وإلا إذا (eyeball_timer_cnt <106)

{

eyeball_cnt = 20 ؛

}

وإلا إذا (eyeball_timer_cnt <107)

{

eyeball_cnt = -10 ؛

}

وإلا إذا (eyeball_timer_cnt <108)

{

eyeball_cnt = -40 ؛

}

وإلا إذا (eyeball_timer_cnt <158)

{

eyeball_cnt = -54 ؛

}

وإلا إذا (eyeball_timer_cnt <159)

{

eyeball_cnt = -40 ؛

}

وإلا إذا (eyeball_timer_cnt <160)

{

eyeball_cnt = -10 ؛

}

وإلا إذا (eyeball_timer_cnt <161)

{

eyeball_cnt = 20 ؛

eyeball_timer_cnt = 0 ؛

}

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

// إذا (eyeball_flag == 0)

// {

// eyeball_cnt ++ ؛

// إذا (eyeball_cnt> = 94)

// {

// eyeball_flag = 1 ؛

//}

//}

// آخر

// {

// eyeball_cnt– ؛

// إذا (eyeball_cnt <= -54)

// {

// 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 ؛

eyeball_animat () ؛

}

}

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

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

إذا (rec_data_timer_cnt <1000000)

{

rec_data_timer_cnt ++ ؛

}

آخر

{

eyeball_run () ،

}

خارجي u32 rec_data_timer_cnt ؛

خارجي u16 eyeball_timer_cnt ؛

باطل Communication_CMD (u8 st)

{

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

{

rec_data_timer_cnt = 0 ؛

eyeball_timer_cnt = 0 ؛

#if (Type_C Communication == 1)

وصف_8283 (شارع) ؛

#elif (Type_C Communication == 2)

وصف_مودبوس (شارع) ؛

#إنهاء إذا

uart [st] .Rx_F = 0 ؛

uart [st] .Rx_Num = 0 ؛

}

}


الوقت ما بعد: 26 يونيو - 2023