——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.
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.
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