עין חכמה מבוססת על מסך עגול של DWIN

——מפורום המפתחים של DWIN

פרויקט הקוד הפתוח של פורום המפתחים DWIN המומלץ הפעם לכולם הוא שגרה מעניינת מאוד להדמיית תנועת עיניים אנושיות.המהנדס השתמש במספר חומרי תמונה של עין אנושית כדי לממש פונקציות כמו תנועת גלגל העין, מצמוץ, זיהוי פנים ומעקב.

מבוא לפתרונות קוד פתוח:

1. חומר תמונה של ממשק המשתמש

הערת העורך: מסך חכם DWIN מבוסס על תמונות להשלמת פיתוח ממשק המשתמש, שיכול לממש בקלות אפקטים שונים של תצוגה.

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

}

void blink_run()

{

סטטי 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)

{

eyeball_cnt = 20;

}

else if(eyeball_timer_cnt < 51)

{

eyeball_cnt = 50;

}

else if(eyeball_timer_cnt < 52)

{

eyeball_cnt = 80;

}

else if(eyeball_timer_cnt < 53)

{

eyeball_cnt = 94;

}

else if(eyeball_timer_cnt < 103)

{

eyeball_cnt = 94;

}

else if(eyeball_timer_cnt < 104)

{

eyeball_cnt = 80;

}

else if(eyeball_timer_cnt < 105)

{

eyeball_cnt = 50;

}

else if(eyeball_timer_cnt < 106)

{

eyeball_cnt = 20;

}

else if(eyeball_timer_cnt < 107)

{

eyeball_cnt = -10;

}

else if(eyeball_timer_cnt < 108)

{

eyeball_cnt = -40;

}

else if(eyeball_timer_cnt < 158)

{

eyeball_cnt = -54;

}

else if(eyeball_timer_cnt < 159)

{

eyeball_cnt = -40;

}

else if(eyeball_timer_cnt < 160)

{

eyeball_cnt = -10;

}

else if(eyeball_timer_cnt < 161)

{

eyeball_cnt = 20;

eyeball_timer_cnt = 0;

}

//זוז ימינה ושמאלה

// if(eyeball_flag == 0)

// {

// eyeball_cnt++;

// if(eyeball_cnt >= 94)

// {

// eyeball_flag = 1;

// }

// }

// אחר

// {

// eyeball_cnt–;

// if(eyeball_cnt <= -54)

// {

// eyeball_flag = 0;

// }

// }

if(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);

}

void eyeball_run()

{

סטטי 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(Type_Communication==1)

Describe_8283(st);

#elif(Type_Communication==2)

Describe_Modbus(st);

#endif

uart[st].Rx_F=0;

uart[st].Rx_Num=0;

}

}


זמן פרסום: 26 ביוני 2023