——Från DWIN Developer Forum
DWIN-utvecklarforumet med öppen källkod som rekommenderas för alla denna gång är en mycket intressant rutin för att simulera mänskliga ögons rörelse. Ingenjören använde flera bildmaterial för mänskliga ögon för att realisera funktioner som ögonglobsrörelse, blinkning, ansiktsigenkänning och efterföljande.
Introduktion till lösningar med öppen källkod:
1. UI-bildmaterial
Redaktörens anmärkning: DWIN-smartskärmen är baserad på bilder för att slutföra UI-utvecklingen, som enkelt kan realisera olika visningseffekter.
2. Gränssnittsutveckling
Det är relativt enkelt att utveckla gränssnittet genom DGUS-mjukvara, och endast två grafiska kontroller behövs. I denna rutin valde ingenjören en 2,1-tums rund smart skärm.
3. Förverkliga blinkanimering
Låt bilderna av ögonlocken visas i tur och ordning med intervaller:
//Blink animation
void blink_animat(void)
{
if(blink_flagga == 0)
{
blink_cnt++;
if(blink_cnt >= 4)
{
blink_flagga = 1;
}
}
annan
{
blink_cnt–;
if(blink_cnt
{
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_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. Inse att ögongloberna ser naturligt åt vänster och höger.
Detta liknar att blinka, men det måste jämföra tiden för kristalloscillatorn för att kontrollera ögonrörelsen. Efter många gånger av felsökning utformade ingenjören följande uppsättning koder.
//Ögonglobsanimation
void eyeball_animat(void)
{
eyeball_timer_cnt++;
if(eyeball_timer_cnt
{
eyeball_cnt = 20;
}
else if(eyeball_timer_cnt
{
eyeball_cnt = 50;
}
else if(eyeball_timer_cnt
{
eyeball_cnt = 80;
}
else if(eyeball_timer_cnt
{
eyeball_cnt = 94;
}
else if(eyeball_timer_cnt
{
eyeball_cnt = 94;
}
else if(eyeball_timer_cnt
{
eyeball_cnt = 80;
}
else if(eyeball_timer_cnt
{
eyeball_cnt = 50;
}
else if(eyeball_timer_cnt
{
eyeball_cnt = 20;
}
else if(eyeball_timer_cnt
{
eyeball_cnt = -10;
}
else if(eyeball_timer_cnt
{
eyeball_cnt = -40;
}
else if(eyeball_timer_cnt
{
eyeball_cnt = -54;
}
else if(eyeball_timer_cnt
{
eyeball_cnt = -40;
}
else if(eyeball_timer_cnt
{
eyeball_cnt = -10;
}
else if(eyeball_timer_cnt
{
eyeball_cnt = 20;
eyeball_timer_cnt = 0;
}
//Flytta åt vänster och höger
// if(ögonflagg == 0)
// {
// eyeball_cnt++;
// if(eyeball_cnt >= 94)
// {
// eyeball_flag = 1;
// }
// }
// annat
// {
// eyeball_cnt–;
// if(eyeball_cnt
// {
// eyeball_flag = 0;
// }
// }
if(eyeball_cnt >= 0)
{
eyeball_pos[0] = 0×00;
eyeball_pos[1] = eyeball_cnt;
}
annan
{
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;
animated_eyeball();
}
}
5. Lägg till ESP32 ansiktsigenkänning för att se hur ögonen rör sig efter ansiktet.
Bearbetningsmetoden här är att när ansiktet detekteras, rör sig ögonen inte av sig själva, och en variabel definieras för att öka i while-slingan. När ökningen når ett visst värde kommer ögongloberna att röra sig av sig själva. När den seriella porten tar emot data kommer denna variabel att rensas, och sedan flyttar bara ögonen enligt ansiktets position. Huvudkoden är som följer:
if(rec_data_timer_cnt
{
rec_data_timer_cnt++;
}
annan
{
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(Typ_Communication==2)
Describe_Modbus(st);
#endif
uart[st].Rx_F=0;
uart[st].Rx_Num=0;
}
}
Posttid: 2023-jun-26