Pametno oko zasnovano na DWIN kružnom ekranu

——Sa DWIN Developer Foruma

Projekat otvorenog koda za programere DWIN koji se ovaj put preporučuje svima je vrlo zanimljiva rutina za simulaciju kretanja ljudskih očiju.Inženjer je koristio nekoliko materijala za slike ljudskog oka za realizaciju funkcija 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 ekran je zasnovan na slikama za kompletan razvoj korisničkog sučelja, koji lako može realizovati različite efekte prikaza.

dytrgf (1)

2. Razvoj interfejsa

Relativno je jednostavno razviti interfejs preko DGUS softvera, a potrebne su samo dve grafičke kontrole.U ovoj rutini, inženjer je izabrao okrugli pametni ekran od 2,1 inča.

dytrgf (2)

3. Realizirajte animaciju treptaja

Neka se slike očnih kapaka prikazuju redom u intervalima:

//Animacija treptanja

void blink_animat(void)

{

if(blink_flag == 0)

{

blink_cnt++;

if(blink_cnt >= 4)

{

blink_flag = 1;

}

}

ostalo

{

blink_cnt–;

if(blink_cnt <= 0)

{

blink_flag = 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();

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. Shvatite da očne jabučice prirodno izgledaju lijevo i desno.

Ovo je slično treptanju, ali treba uporediti vrijeme kristalnog oscilatora kako bi se kontroliralo kretanje očiju.Nakon mnogo puta otklanjanja grešaka, inženjer je dizajnirao sljedeći skup kodova.

//Animacija očne jabučice

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;

}

//Pomicanje lijevo i desno

// if(eyeball_flag == 0)

// {

// eyeball_cnt++;

// if(eyeball_cnt >= 94)

// {

// eyeball_flag = 1;

// }

// }

// else

// {

// eyeball_cnt–;

// if(eyeball_cnt <= -54)

// {

// eyeball_flag = 0;

// }

// }

if(eyeball_cnt >= 0)

{

eyeball_pos[0] = 0×00;

eyeball_pos[1] = eyeball_cnt;

}

ostalo

{

eyeball_pos[0] = 0xFF;

eyeball_pos[1] = (eyeball_cnt & 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;

eyeball_animat();

}

}

5. Dodajte ESP32 prepoznavanje lica da ostvarite kretanje očiju koje prate lice.

Metoda obrade je da kada se lice detektuje, oči se ne pomiču same, a promenljiva je definisana za povećanje u while petlji.Kada prirast dostigne određenu vrijednost, očne jabučice će se same pomicati.Kada serijski port primi podatke, ova varijabla će biti obrisana, a zatim će se oči pomicati samo prema položaju lica.Glavni kod je sljedeći:

if(rec_data_timer_cnt < 1000000)

{

rec_data_timer_cnt++;

}

ostalo

{

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)

Opis_8283(st);

#elif(Type_Communication==2)

Opis_Modbus(st);

#endif

uart[st].Rx_F=0;

uart[st].Rx_Num=0;

}

}


Vrijeme objave: Jun-26-2023