Pametno oko temeljeno na DWIN kružnom ekranu

——S DWIN Developer Foruma

DWIN developer forum open source projekt koji se ovaj put preporučuje svima vrlo je zanimljiva rutina za simulaciju kretanja ljudskih očiju.Inženjer je koristio nekoliko slikovnih materijala ljudskog oka kako bi realizirao funkcije kao što su kretanje očne jabučice, treptanje, prepoznavanje lica i praćenje.

Uvod u rješenja otvorenog koda:

1. UI slikovni materijal

Napomena urednika: DWIN pametni zaslon temelji se na slikama za dovršetak razvoja korisničkog sučelja, koje može lako ostvariti različite efekte prikaza.

dytrgf (1)

2. Razvoj sučelja

Relativno je jednostavno razviti sučelje putem DGUS softvera, a potrebne su samo dvije grafičke kontrole.U ovoj rutini, inženjer je odabrao okrugli pametni zaslon od 2,1 inča.

dytrgf (2)

3. Ostvarite animaciju treptanja

Neka se slike kapaka redom prikazuju u intervalima:

//Animacija treptanja

void blink_animat(void)

{

if(blink_flag == 0)

{

blink_cnt++;

if(blink_cnt >= 4)

{

zastavica_treperenja = 1;

}

}

drugo

{

blink_cnt–;

if(blink_cnt <= 0)

{

zastavica_treperenja = 0;

}

}

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

}

void blink_run()

{

statički u32 run_timer_cnt = 0;

run_timer_cnt++;

if(run_timer_cnt >= 2000000)

{

run_timer_cnt = 0;

blink_animat();

Odgoda_ms(30);

blink_animat();

Odgoda_ms(30);

blink_animat();

Odgoda_ms(30);

blink_animat();

Odgoda_ms(30);

blink_animat();

Odgoda_ms(30);

blink_animat();

Odgoda_ms(30);

blink_animat();

Odgoda_ms(30);

blink_animat();

Odgoda_ms(30);

}

}

4. Shvatite da očne jabučice prirodno gledaju lijevo i desno.

Ovo je slično treptanju, ali treba usporediti vrijeme kristalnog oscilatora za kontrolu pokreta oka.Nakon mnogo puta otklanjanja pogrešaka, inženjer je dizajnirao sljedeći skup kodova.

//Animacija očne jabučice

void očna jabučica_animat(void)

{

timer_očne jabučice_cnt++;

if(eyeball_timer_cnt < 50)

{

cnt očne jabučice = 20;

}

else if(eyeball_timer_cnt < 51)

{

cnt očne jabučice = 50;

}

else if(eyeball_timer_cnt < 52)

{

cnt očne jabučice = 80;

}

else if(eyeball_timer_cnt < 53)

{

cnt očne jabučice = 94;

}

else if(eyeball_timer_cnt < 103)

{

cnt očne jabučice = 94;

}

else if(eyeball_timer_cnt < 104)

{

cnt očne jabučice = 80;

}

else if(eyeball_timer_cnt < 105)

{

cnt očne jabučice = 50;

}

else if(eyeball_timer_cnt < 106)

{

cnt očne jabučice = 20;

}

else if(eyeball_timer_cnt < 107)

{

cnt očne jabučice = -10;

}

else if(eyeball_timer_cnt < 108)

{

cnt očne jabučice = -40;

}

else if(eyeball_timer_cnt < 158)

{

cnt očne jabučice = -54;

}

else if(eyeball_timer_cnt < 159)

{

cnt očne jabučice = -40;

}

else if(eyeball_timer_cnt < 160)

{

cnt očne jabučice = -10;

}

else if(eyeball_timer_cnt < 161)

{

cnt očne jabučice = 20;

eyeball_timer_cnt = 0;

}

//Pomicanje lijevo i desno

// if(eyeball_flag == 0)

// {

// eyeball_cnt++;

// if(eyeball_cnt >= 94)

// {

// zastavica_očnice = 1;

// }

// }

// drugo

// {

// eyeball_cnt–;

// if(eyeball_cnt <= -54)

// {

// zastavica očne jabučice = 0;

// }

// }

if(eyeball_cnt >= 0)

{

položaj_očnice[0] = 0×00;

položaj_očnice[1] = cnt_očnice;

}

drugo

{

položaj_očnice[0] = 0xFF;

položaj_očnice[1] = (cnt_očnice & 0xFF);

}

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

}

void eyeball_run()

{

statički u32 run_timer_cnt = 0;

run_timer_cnt++;

if(run_timer_cnt >= 20000)

{

run_timer_cnt = 0;

očna_jabučica_animat();

}

}

5. Dodajte ESP32 prepoznavanje lica kako biste shvatili kretanje očiju koje prate lice.

Metoda obrade ovdje je da kada se otkrije lice, oči se ne pomiču same od sebe, a varijabla je definirana za povećanje u while petlji.Kada prirast dosegne određenu vrijednost, očne jabučice će se pomicati same.Kada serijski priključak primi podatke, ova varijabla će se izbrisati, a zatim samo pomaknite oči prema položaju lica.Glavni kod je sljedeći:

if(rec_data_timer_cnt < 1000000)

{

rec_data_timer_cnt++;

}

drugo

{

trčanje_očne jabučice();

}

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)

Opišite_8283(st);

#elif(Type_Communication==2)

Opišite_Modbus(st);

#završi ako

uart[st].Rx_F=0;

uart[st].Rx_Num=0;

}

}


Vrijeme objave: 26. lipnja 2023