Smart Eye DWIN kör alakú képernyőn

——A DWIN fejlesztői fórumról

Az ezúttal mindenkinek ajánlott DWIN fejlesztői fórum nyílt forráskódú projektje egy nagyon érdekes rutin az emberi szem mozgásának szimulálására. A mérnök számos emberi szem képanyagot használt olyan funkciók megvalósítására, mint a szemgolyó mozgása, pislogás, arcfelismerés és követés.

Bevezetés a nyílt forráskódú megoldásokba:

1. UI képanyag

A szerkesztő megjegyzése: A DWIN intelligens képernyő képeken alapul, hogy befejezze a felhasználói felület fejlesztését, amely könnyen megvalósíthat különféle megjelenítési effektusokat.

dytrgf (1)

2. Interfész fejlesztés

Az interfész DGUS szoftverrel történő fejlesztése viszonylag egyszerű, és mindössze két grafikus vezérlőre van szükség. Ebben a rutinban a mérnök egy 2,1 hüvelykes, kerek okosképernyőt választott.

dytrgf (2)

3. Valósítsa meg a pislogó animációt

A szemhéjak képei felváltva jelenjenek meg időközönként:

//Pillantás animáció

void blink_animat(void)

{

if(villogó_zászló == 0)

{

blink_cnt++;

if(blink_cnt >= 4)

{

blink_flag = 1;

}

}

más

{

blink_cnt–;

if(blink_cnt

{

blink_flag = 0;

}

}

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

}

void blink_run()

{

statikus u32 run_timer_cnt = 0;

run_timer_cnt++;

if(run_timer_cnt >= 2000000)

{

run_timer_cnt = 0;

blink_animated();

Delay_ms(30);

blink_animated();

Delay_ms(30);

blink_animated();

Delay_ms(30);

blink_animated();

Delay_ms(30);

blink_animated();

Delay_ms(30);

blink_animated();

Delay_ms(30);

blink_animated();

Delay_ms(30);

blink_animated();

Delay_ms(30);

}

}

4. Vegye észre, hogy a szemgolyó természetesen jobbra és balra néz.

Ez hasonló a pislogáshoz, de össze kell hasonlítani a kristályoszcillátor idejét a szem mozgásának szabályozásához. Sokszori hibakeresés után a mérnök megtervezte a következő kódkészletet.

//Szemgolyó animáció

void eyeball_animat(void)

{

eyeball_timer_cnt++;

if(eyeball_timer_cnt

{

szemgolyó_cnt = 20;

}

else if(eyeball_timer_cnt

{

szemgolyó_cnt = 50;

}

else if(eyeball_timer_cnt

{

szemgolyó_cnt = 80;

}

else if(eyeball_timer_cnt

{

szemgolyó_cnt = 94;

}

else if(eyeball_timer_cnt

{

szemgolyó_cnt = 94;

}

else if(eyeball_timer_cnt

{

szemgolyó_cnt = 80;

}

else if(eyeball_timer_cnt

{

szemgolyó_cnt = 50;

}

else if(eyeball_timer_cnt

{

szemgolyó_cnt = 20;

}

else if(eyeball_timer_cnt

{

eyeball_cnt = -10;

}

else if(eyeball_timer_cnt

{

szemgolyó_cnt = -40;

}

else if(eyeball_timer_cnt

{

szemgolyó_cnt = -54;

}

else if(eyeball_timer_cnt

{

szemgolyó_cnt = -40;

}

else if(eyeball_timer_cnt

{

eyeball_cnt = -10;

}

else if(eyeball_timer_cnt

{

szemgolyó_cnt = 20;

eyeball_timer_cnt = 0;

}

//Mozgás balra és jobbra

// if(eyeball_flag == 0)

// {

// eyeball_cnt++;

// if(eyeball_cnt >= 94)

// {

// szemgolyó_zászlaja = 1;

// }

// }

// más

// {

// eyeball_cnt–;

// if(eyeball_cnt

// {

// szemgolyó_zászlaja = 0;

// }

// }

if(szemgolyó_cnt >= 0)

{

eyeball_pos[0] = 0×00;

eyeball_pos[1] = eyeball_cnt;

}

más

{

eyeball_pos[0] = 0xFF;

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

}

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

}

void eyeball_run()

{

statikus u32 run_timer_cnt = 0;

run_timer_cnt++;

if(run_timer_cnt >= 20000)

{

run_timer_cnt = 0;

animated_eyeball();

}

}

5. Adja hozzá az ESP32 arcfelismerést, hogy felismerje a szemek arcát követő mozgását.

A feldolgozási módszer itt az, hogy az arc észlelésekor a szemek nem mozognak maguktól, és egy változót definiálunk, amely növeli a while ciklust. Amikor a növekmény elér egy bizonyos értéket, a szemgolyók maguktól mozognak. Amikor a soros port fogad adatokat, ez a változó törlődik, és csak akkor mozgatja a szemeket az arc helyzetének megfelelően. A fő kód a következő:

if(rec_data_timer_cnt

{

rec_data_timer_cnt++;

}

más

{

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)

Leír_8283(st);

#elif(Communication_type==2)

Describe_Modbus(st);

#endif

uart[st].Rx_F=0;

uart[st].Rx_Num=0;

}

}


Feladás időpontja: 2023. június 26