Chytré oko založené na kruhové obrazovce DWIN

——Z DWIN Developer Forum

Open source projekt DWIN developer forum tentokrát doporučený všem je velmi zajímavou rutinou pro simulaci pohybu lidských očí.Inženýr použil několik obrazových materiálů lidského oka k realizaci funkcí, jako je pohyb oční bulvy, mrkání, rozpoznávání obličeje a sledování.

Úvod do open source řešení:

1. Obrazový materiál uživatelského rozhraní

Poznámka editora: Inteligentní obrazovka DWIN je založena na obrázcích pro dokončení vývoje uživatelského rozhraní, které může snadno realizovat různé efekty zobrazení.

dytrgf (1)

2. Vývoj rozhraní

Vývoj rozhraní pomocí softwaru DGUS je poměrně jednoduchý a jsou potřeba pouze dva grafické ovládací prvky.V této rutině inženýr zvolil 2,1palcovou kulatou inteligentní obrazovku.

dytrgf (2)

3. Realizujte animaci mrknutí

Nechte obrázky očních víček postupně zobrazovat v intervalech:

//Blikání animace

void blink_animat(void)

{

if(blink_flag == 0)

{

blink_cnt++;

if(blink_cnt >= 4)

{

blink_flag = 1;

}

}

jiný

{

blink_cnt–;

if(blink_cnt <= 0)

{

blink_flag = 0;

}

}

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

}

void blink_run()

{

statický 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. Uvědomte si, že oční bulvy vypadají přirozeně vlevo a vpravo.

Je to podobné mrkání, ale pro ovládání pohybu očí je potřeba porovnat čas krystalového oscilátoru.Po mnoha časech ladění inženýr navrhl následující sadu kódů.

//Animace oční bulvy

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;

}

//Pohyb doleva a doprava

// if(eyeball_flag == 0)

// {

// eyeball_cnt++;

// if(eyeball_cnt >= 94)

// {

// vlajka oční bulvy = 1;

// }

// }

// jinak

// {

// eyeball_cnt–;

// if(eyeball_cnt <= -54)

// {

// příznak_oční bulvy = 0;

// }

// }

if(eyeball_cnt >= 0)

{

eyeball_pos[0] = 0×00;

eyeball_pos[1] = eyeball_cnt;

}

jiný

{

eyeball_pos[0] = 0xFF;

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

}

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

}

void eyeball_run()

{

statický u32 run_timer_cnt = 0;

run_timer_cnt++;

if(run_timer_cnt >= 20000)

{

run_timer_cnt = 0;

eyeball_animat();

}

}

5. Přidejte rozpoznávání obličeje ESP32, abyste si uvědomili pohyb očí sledujících obličej.

Metoda zpracování zde spočívá v tom, že když je detekován obličej, oči se samy nepohybují a ve smyčce while je definována proměnná, která se má zvyšovat.Když přírůstek dosáhne určité hodnoty, oční bulvy se budou samy pohybovat.Když sériový port přijme data, tato proměnná se vymaže a pak už jen pohybujte očima podle polohy obličeje.Hlavní kód je následující:

if(rec_data_timer_cnt < 1000000)

{

rec_data_timer_cnt++;

}

jiný

{

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;

}

}


Čas odeslání: 26. června 2023