Smart Eye baseret på DWIN Circular Screen

——Fra DWIN Developer Forum

DWIN Developer Forum open source-projektet, der anbefales til alle denne gang, er en meget interessant rutine til at simulere bevægelsen af ​​menneskelige øjne.Ingeniøren brugte adskillige billedmaterialer for menneskelige øjne til at realisere funktioner som øjeæblebevægelse, blink, ansigtsgenkendelse og følge.

Introduktion til open source-løsninger:

1. UI billedmateriale

Redaktørens note: DWIN-smartskærm er baseret på billeder for at fuldføre UI-udvikling, som nemt kan realisere forskellige visningseffekter.

dytrgf (1)

2. Interface udvikling

Det er relativt enkelt at udvikle grænsefladen gennem DGUS-software, og der er kun brug for to grafiske kontroller.I denne rutine valgte ingeniøren en 2,1-tommer rund smartskærm.

dytrgf (2)

3. Realiser blink-animation

Lad billederne af øjenlågene blive vist på skift med mellemrum:

//Blink-animation

void blink_animat(void)

{

if(blink_flag == 0)

{

blink_cnt++;

if(blink_cnt >= 4)

{

blink_flag = 1;

}

}

andet

{

blink_cnt–;

if(blink_cnt <= 0)

{

blink_flag = 0;

}

}

write_dgus_vp(0×3000, (u8 *)&blink_cnt, 2);

}

void blink_run()

{

statisk 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. Indse, at øjeæblerne ser naturligt til venstre og højre.

Dette svarer til at blinke, men det skal sammenlignes med krystaloscillatorens tid for at kontrollere øjenbevægelsen.Efter mange ganges fejlretning designede ingeniøren følgende sæt koder.

//Øjenæble-animation

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;

}

//Flyt til venstre og højre

// if(øjeæble_flag == 0)

// {

// eyeball_cnt++;

// if(eyeball_cnt >= 94)

// {

// eyeball_flag = 1;

// }

// }

// andet

// {

// eyeball_cnt–;

// if(øjeæble_cnt <= -54)

// {

// eyeball_flag = 0;

// }

// }

if(eyeball_cnt >= 0)

{

eyeball_pos[0] = 0×00;

eyeball_pos[1] = eyeball_cnt;

}

andet

{

eyeball_pos[0] = 0xFF;

eyeball_pos[1] = (eyeball_cnt & 0xFF);

}

write_dgus_vp(0×3111, (u8 *)&eyeball_pos, 2);

}

void eyeball_run()

{

statisk u32 run_timer_cnt = 0;

run_timer_cnt++;

if(run_timer_cnt >= 20000)

{

run_timer_cnt = 0;

eyeball_animat();

}

}

5. Tilføj ESP32 ansigtsgenkendelse for at indse bevægelsen af ​​øjne, der følger ansigtet.

Behandlingsmetoden her er, at når ansigtet detekteres, bevæger øjnene sig ikke af sig selv, og en variabel er defineret til at øges i while-løkken.Når stigningen når en vis værdi, vil øjeæblerne bevæge sig af sig selv.Når den serielle port modtager data, vil denne variabel blive ryddet, og derefter flyttes kun øjnene i henhold til ansigtets position.Hovedkoden er som følger:

if(rec_data_timer_cnt < 1000000)

{

rec_data_timer_cnt++;

}

andet

{

eyeball_run();

}

ekstern u32 rec_data_timer_cnt;

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

Beskriv_8283(st);

#elif(Type_Communication==2)

Beskriv_Modbus(st);

#Afslut Hvis

uart[st].Rx_F=0;

uart[st].Rx_Num=0;

}

}


Indlægstid: 26-jun-2023