——Fra DWIN Developer Forum
DWIN utviklerforum åpen kildekode-prosjektet anbefalt for alle denne gangen er en veldig interessant rutine for å simulere bevegelsen av menneskelige øyne.Ingeniøren brukte flere bildematerialer for menneskelige øyne for å realisere funksjoner som øyeeplebevegelse, blinking, ansiktsgjenkjenning og følge.
Introduksjon til åpen kildekode-løsninger:
1. UI bildemateriale
Redaktørens merknad: DWIN-smartskjerm er basert på bilder for å fullføre UI-utvikling, som enkelt kan realisere ulike skjermeffekter.
2. Grensesnittutvikling
Det er relativt enkelt å utvikle grensesnittet gjennom DGUS-programvare, og det trengs kun to grafiske kontroller.I denne rutinen valgte ingeniøren en 2,1-tommers rund smartskjerm.
3. Realiser blink-animasjon
La bildene av øyelokkene vises etter tur med intervaller:
//Blink-animasjon
void blink_animat(void)
{
if(blink_flag == 0)
{
blink_cnt++;
if(blink_cnt >= 4)
{
blink_flag = 1;
}
}
ellers
{
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. Innse at øyeeplene ser naturlig til venstre og høyre.
Dette ligner på å blinke, men det må sammenlignes med tiden til krystalloscillatoren for å kontrollere øyebevegelsen.Etter mange ganger med feilsøking, designet ingeniøren følgende sett med koder.
//Øyeeplet-animasjon
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;
}
//Flytt til venstre og høyre
// if(eyeball_flag == 0)
// {
// eyeball_cnt++;
// if(eyeball_cnt >= 94)
// {
// eyeball_flag = 1;
// }
// }
// annet
// {
// eyeball_cnt–;
// if(eyeball_cnt <= -54)
// {
// eyeball_flag = 0;
// }
// }
if(eyeball_cnt >= 0)
{
eyeball_pos[0] = 0×00;
eyeball_pos[1] = eyeball_cnt;
}
ellers
{
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. Legg til ESP32 ansiktsgjenkjenning for å oppdage bevegelsen til øynene som følger ansiktet.
Behandlingsmetoden her er at når ansiktet oppdages, beveger ikke øynene seg av seg selv, og en variabel er definert til å øke i while-løkken.Når økningen når en viss verdi, vil øyeeplene bevege seg av seg selv.Når den serielle porten mottar data, vil denne variabelen bli slettet, og deretter flyttes bare øynene i henhold til ansiktsposisjonen.Hovedkoden er som følger:
if(rec_data_timer_cnt < 1000000)
{
rec_data_timer_cnt++;
}
ellers
{
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);
#slutt om
uart[st].Rx_F=0;
uart[st].Rx_Num=0;
}
}
Innleggstid: 26. juni 2023