——De la DWIN Developer Forum
Proiectul open source forum pentru dezvoltatori DWIN recomandat tuturor de data aceasta este o rutină foarte interesantă pentru simularea mișcării ochilor umani.Inginerul a folosit mai multe materiale de imagine pentru ochi umani pentru a realiza funcții precum mișcarea globului ocular, clipirea, recunoașterea feței și urmărirea.
Introducere în soluțiile open source:
1. Material de imagine UI
Nota editorului: ecranul inteligent DWIN se bazează pe imagini pentru a finaliza dezvoltarea interfeței de utilizare, care poate realiza cu ușurință diverse efecte de afișare.
2. Dezvoltarea interfeței
Este relativ simplu să dezvoltați interfața prin software-ul DGUS și sunt necesare doar două controale grafice.În această rutină, inginerul a ales un ecran inteligent rotund de 2,1 inchi.
3. Realizați animația clipit
Lasă imaginile pleoapelor să fie afișate pe rând la intervale:
// Animație clipită
void blink_animat(void)
{
if(blink_flag == 0)
{
blink_cnt++;
if(blink_cnt >= 4)
{
blink_flag = 1;
}
}
altfel
{
blink_cnt–;
if(blink_cnt <= 0)
{
blink_flag = 0;
}
}
write_dgus_vp(0×3000, (u8 *)&blink_cnt, 2);
}
void blink_run()
{
static 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. Realizează-ți că globii oculari arată în stânga și în dreapta în mod natural.
Acest lucru este similar cu clipirea, dar trebuie să compare timpul oscilatorului cu cristal pentru a controla mișcarea ochilor.După multe ori de depanare, inginerul a proiectat următorul set de coduri.
//animație globul ocular
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)
{
globul_ocular = -10;
}
else if(eyeball_timer_cnt < 108)
{
globul_ocular = -40;
}
else if(eyeball_timer_cnt < 158)
{
globul_ocular = -54;
}
else if(eyeball_timer_cnt < 159)
{
globul_ocular = -40;
}
else if(eyeball_timer_cnt < 160)
{
globul_ocular = -10;
}
else if(eyeball_timer_cnt < 161)
{
eyeball_cnt = 20;
eyeball_timer_cnt = 0;
}
//Deplasați la stânga și la dreapta
// if(eyeball_flag == 0)
// {
// eyeball_cnt++;
// if(eyeball_cnt >= 94)
// {
// eyeball_flag = 1;
// }
// }
// altfel
// {
// globul ocular_cnt–;
// if(eyeball_cnt <= -54)
// {
// eyeball_flag = 0;
// }
// }
if(eyeball_cnt >= 0)
{
eyeball_pos[0] = 0×00;
eyeball_pos[1] = eyeball_cnt;
}
altfel
{
eyeball_pos[0] = 0xFF;
eyeball_pos[1] = (eyeball_cnt & 0xFF);
}
write_dgus_vp(0×3111, (u8 *)&eyeball_pos, 2);
}
void eyeball_run()
{
static u32 run_timer_cnt = 0;
run_timer_cnt++;
if(run_timer_cnt >= 20000)
{
run_timer_cnt = 0;
eyeball_animat();
}
}
5. Adăugați recunoașterea feței ESP32 pentru a realiza mișcarea ochilor care urmăresc fața.
Metoda de procesare aici este că atunci când fața este detectată, ochii nu se mișcă singuri și o variabilă este definită pentru a crește în bucla while.Când creșterea atinge o anumită valoare, globii oculari se vor mișca singuri.Când portul serial primește date, această variabilă va fi ștearsă și apoi mișcă ochii numai în funcție de poziția feței.Codul principal este următorul:
if(rec_data_timer_cnt < 1000000)
{
rec_data_timer_cnt++;
}
altfel
{
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)
Descrie_8283(st);
#elif(Type_Communication==2)
Descriere_Modbus(st);
#endif
uart[st].Rx_F=0;
uart[st].Rx_Num=0;
}
}
Ora postării: 26-jun-2023