——DWINi arendajafoorumist
Seekord kõigile soovitatud DWIN arendajafoorumi avatud lähtekoodiga projekt on väga huvitav rutiin inimese silmade liikumise simuleerimiseks.Insener kasutas mitmeid inimsilma pildimaterjale, et realiseerida selliseid funktsioone nagu silmamuna liikumine, pilgutamine, näotuvastus ja jälgimine.
Sissejuhatus avatud lähtekoodiga lahendustesse:
1. UI pildimaterjal
Toimetaja märkus: DWIN-i nutiekraan põhineb kasutajaliidese arendamise lõpuleviimiseks piltidel, mis võivad hõlpsasti realiseerida erinevaid kuvaefekte.
2. Liidese arendamine
Liidese arendamine DGUS-i tarkvara kaudu on suhteliselt lihtne ja vaja on ainult kahte graafilist juhtelementi.Selle rutiini käigus valis insener 2,1-tollise ümara nutiekraani.
3. Teostage vilkumise animatsioon
Laske silmalaugude pilte kuvada järjest intervallidega:
//Pilgutuse animatsioon
void blink_animat(void)
{
if(blink_lipp == 0)
{
blink_cnt++;
if(blink_cnt >= 4)
{
vilkumise_lipp = 1;
}
}
muidu
{
blink_cnt–;
if(blink_cnt <= 0)
{
vilkumise_lipp = 0;
}
}
write_dgus_vp(0×3000, (u8 *)&blink_cnt, 2);
}
void blink_run()
{
staatiline u32 run_timer_cnt = 0;
run_timer_cnt++;
if(run_timer_cnt >= 2000000)
{
run_timer_cnt = 0;
blink_animat();
Viivitus_ms(30);
blink_animat();
Viivitus_ms(30);
blink_animat();
Viivitus_ms(30);
blink_animat();
Viivitus_ms(30);
blink_animat();
Viivitus_ms(30);
blink_animat();
Viivitus_ms(30);
blink_animat();
Viivitus_ms(30);
blink_animat();
Viivitus_ms(30);
}
}
4. Mõistke, et silmamunad näevad loomulikult vasakule ja paremale.
See sarnaneb vilkumisega, kuid silmade liikumise kontrollimiseks tuleb võrrelda kristallostsillaatori aega.Pärast mitmekordset silumist kujundas insener järgmise koodikomplekti.
//Silmamuna animatsioon
tühi silmamuna_animat(tühine)
{
eyeball_timer_cnt++;
if(eyeball_timer_cnt < 50)
{
silmamuna_cnt = 20;
}
else if(eyeball_timer_cnt < 51)
{
silmamuna_cnt = 50;
}
else if(eyeball_timer_cnt < 52)
{
silmamuna_cnt = 80;
}
else if(eyeball_timer_cnt < 53)
{
silmamuna_cnt = 94;
}
else if(eyeball_timer_cnt < 103)
{
silmamuna_cnt = 94;
}
else if(eyeball_timer_cnt < 104)
{
silmamuna_cnt = 80;
}
else if(eyeball_timer_cnt < 105)
{
silmamuna_cnt = 50;
}
else if(eyeball_timer_cnt < 106)
{
silmamuna_cnt = 20;
}
else if(eyeball_timer_cnt < 107)
{
silmamuna_cnt = -10;
}
else if(eyeball_timer_cnt < 108)
{
silmamuna_cnt = -40;
}
else if(eyeball_timer_cnt < 158)
{
silmamuna_cnt = -54;
}
else if(eyeball_timer_cnt < 159)
{
silmamuna_cnt = -40;
}
else if(eyeball_timer_cnt < 160)
{
silmamuna_cnt = -10;
}
else if(eyeball_timer_cnt < 161)
{
silmamuna_cnt = 20;
eyeball_timer_cnt = 0;
}
//Liikuge vasakule ja paremale
// if(silmamuna_lipp == 0)
// {
// eyeball_cnt++;
// if(eyeball_cnt >= 94)
// {
// silmamuna_lipp = 1;
// }
// }
// muidu
// {
// eyeball_cnt–;
// if(eyeball_cnt <= -54)
// {
// silmamuna_lipp = 0;
// }
// }
if(eyeball_cnt >= 0)
{
eyeball_pos [0] = 0 × 00;
silmamuna_pos[1] = silmamuna_cnt;
}
muidu
{
silmamuna_pos[0] = 0xFF;
silmamuna_pos[1] = (silmamuna_cnt & 0xFF);
}
write_dgus_vp(0×3111, (u8 *)&eyeball_pos, 2);
}
void eyeball_run()
{
staatiline u32 run_timer_cnt = 0;
run_timer_cnt++;
if(run_timer_cnt >= 20000)
{
run_timer_cnt = 0;
eyeball_animat();
}
}
5. Lisage ESP32 näotuvastus, et tajuda nägu järgivate silmade liikumist.
Töötlemismeetod seisneb siin selles, et näo tuvastamisel silmad ise ei liigu ja tsüklis on defineeritud muutuja, mis suurendab while-tsüklit.Kui juurdekasv jõuab teatud väärtuseni, hakkavad silmamunad ise liikuma.Kui jadaport saab andmeid, kustutatakse see muutuja ja seejärel liigutatakse silmi ainult vastavalt näo asendile.Peamine kood on järgmine:
if(rec_data_timer_cnt < 1000000)
{
rec_data_timer_cnt++;
}
muidu
{
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)
Kirjelda_8283(st);
#elif(Type_Communication==2)
Kirjelda_Modbus(st);
#endif
uart[st].Rx_F=0;
uart[st].Rx_Num=0;
}
}
Postitusaeg: 26. juuni 2023