——DWIN Developer Forum-ից
DWIN ծրագրավորողների ֆորումի բաց կոդով նախագիծը, որն այս անգամ առաջարկվում է բոլորին, շատ հետաքրքիր առօրյա է մարդու աչքերի շարժումը մոդելավորելու համար:Ինժեներն օգտագործել է մարդու աչքի պատկերման մի քանի նյութեր՝ իրականացնելու այնպիսի գործառույթներ, ինչպիսիք են ակնագնդի շարժումը, թարթելը, դեմքի ճանաչումը և հետևելը:
Բաց կոդով լուծումների ներածություն.
1. UI պատկերի նյութ
Խմբագրի նշում. DWIN խելացի էկրանը հիմնված է նկարների վրա՝ UI-ի մշակումն ավարտելու համար, որը կարող է հեշտությամբ իրականացնել ցուցադրման տարբեր էֆեկտներ:
2. Ինտերֆեյսի մշակում
Համեմատաբար պարզ է ինտերֆեյսի մշակումը DGUS ծրագրաշարի միջոցով, և անհրաժեշտ է ընդամենը երկու գրաֆիկական կառավարում:Այս առօրյայում ինժեներն ընտրեց 2,1 դյույմանոց կլոր խելացի էկրան:
3. Իրականացնել թարթել անիմացիա
Թող կոպերի նկարները հերթով ցուցադրվեն ընդմիջումներով.
//Թարթել անիմացիա
void blink_animat (անվավեր)
{
եթե (blink_flag == 0)
{
blink_cnt++;
եթե (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(անվավեր)
{
eyeball_timer_cnt++;
եթե (աչքի_ժմչփ_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;
ակնագնդիկ_ժմչփ_cnt = 0;
}
//Տեղափոխել աջ և ձախ
// եթե (ակնագնդի_դրոշ == 0)
// {
// eyeball_cnt++;
// եթե (աչքի_cnt >= 94)
// {
// ակնագնդի_դրոշ = 1;
// }
// }
// ուրիշ
// {
// ակնագնդիկ_cnt–;
// եթե (ակնագնդիկ_cnt <= -54)
// {
// ակնագնդի_դրոշ = 0;
// }
// }
if (ակնագնդիկ_cnt >= 0)
{
ակնագնդիկ_pos[0] = 0×00;
ակնագնդիկ_pos[1] = ակնագնդիկ_cnt;
}
ուրիշ
{
ակնագնդիկ_pos[0] = 0xFF;
ակնագնդիկ_pos[1] = (ակնագնդիկ_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;
ակնագնդիկ_animat();
}
}
5. Ավելացրեք ESP32 դեմքի ճանաչում՝ դեմքին հետևող աչքերի շարժումը հասկանալու համար:
Այստեղ մշակման մեթոդն այն է, որ երբ դեմքը հայտնաբերվում է, աչքերն ինքնուրույն չեն շարժվում, և որոշվում է փոփոխական, որը մեծացնում է while հանգույցը:Երբ աճը հասնում է որոշակի արժեքի, ակնագնդերն ինքնուրույն կշարժվեն:Երբ սերիական նավահանգիստը ստանա տվյալներ, այս փոփոխականը կջնջվի, այնուհետև միայն աչքերը կշարժվի՝ ըստ դեմքի դիրքի:Հիմնական կոդը հետևյալն է.
if (rec_data_timer_cnt < 1000000)
{
rec_data_timer_cnt++;
}
ուրիշ
{
ակնագնդիկ_վազք ();
}
extern u32 rec_data_timer_cnt;
արտաքին 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;
ակնագնդիկ_ժմչփ_cnt = 0;
#if (Տեսակ_Հաղորդակցում==1)
Նկարագրել_8283(st);
#elif (Տիպ_Հաղորդակցություն==2)
Describe_Modbus(st);
#վերջ
uart[st].Rx_F=0;
uart[st].Rx_Num=0;
}
}
Հրապարակման ժամանակը՝ հունիս-26-2023