Matalinong Mata Batay sa DWIN Circular Screen

——Mula sa DWIN Developer Forum

Ang DWIN developer forum open source project na inirerekomenda para sa lahat sa pagkakataong ito ay isang napaka-interesante na gawain para sa pagtulad sa paggalaw ng mga mata ng tao.Gumamit ang inhinyero ng ilang materyal sa larawan ng mata ng tao upang mapagtanto ang mga function tulad ng paggalaw ng eyeball, pagkislap, pagkilala sa mukha at pagsunod.

Panimula sa mga open source na solusyon:

1. Materyal ng imahe ng UI

Tala ng editor: Ang DWIN smart screen ay nakabatay sa mga larawan upang makumpleto ang pag-develop ng UI, na madaling matanto ang iba't ibang mga epekto sa pagpapakita.

dytrgf (1)

2. Pag-unlad ng interface

Ito ay medyo simple upang bumuo ng interface sa pamamagitan ng DGUS software, at dalawang graphic na kontrol lamang ang kailangan.Sa ganitong gawain, pumili ang engineer ng 2.1-pulgadang bilog na smart screen.

dytrgf (2)

3. Napagtanto blink animation

Hayaang ipakita ang mga larawan ng mga talukap ng mata nang magkakasunod:

//Blink animation

walang bisa blink_animat(walang bisa)

{

kung(blink_flag == 0)

{

blink_cnt++;

kung(blink_cnt >= 4)

{

blink_flag = 1;

}

}

iba pa

{

blink_cnt–;

kung(blink_cnt <= 0)

{

blink_flag = 0;

}

}

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

}

walang bisa blink_run()

{

static na 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. Napagtanto ang mga eyeballs tumingin kaliwa at kanan natural.

Ito ay katulad ng pagkurap, ngunit kailangan nitong ikumpara ang oras ng crystal oscillator upang makontrol ang paggalaw ng mata.Pagkatapos ng maraming beses ng pag-debug, idinisenyo ng engineer ang sumusunod na hanay ng mga code.

//Eyeball animation

walang bisa eyeball_animat(walang bisa)

{

eyeball_timer_cnt++;

kung(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;

}

//Ilipat sa kaliwa at kanan

// if(eyeball_flag == 0)

// {

// eyeball_cnt++;

// kung(eyeball_cnt >= 94)

// {

// eyeball_flag = 1;

// }

// }

// iba pa

// {

// eyeball_cnt–;

// kung(eyeball_cnt <= -54)

// {

// eyeball_flag = 0;

// }

// }

kung(eyeball_cnt >= 0)

{

eyeball_pos[0] = 0×00;

eyeball_pos[1] = eyeball_cnt;

}

iba pa

{

eyeball_pos[0] = 0xFF;

eyeball_pos[1] = (eyeball_cnt & 0xFF);

}

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

}

void eyeball_run()

{

static na u32 run_timer_cnt = 0;

run_timer_cnt++;

if(run_timer_cnt >= 20000)

{

run_timer_cnt = 0;

eyeball_animat();

}

}

5. Magdagdag ng ESP32 face recognition upang mapagtanto ang paggalaw ng mga mata na sumusunod sa mukha.

Ang paraan ng pagpoproseso dito ay kapag ang mukha ay nakita, ang mga mata ay hindi gumagalaw nang mag-isa, at ang isang variable ay tinukoy na tumaas sa while loop.Kapag ang pagtaas ay umabot sa isang tiyak na halaga, ang mga eyeballs ay gagalaw nang mag-isa.Kapag ang serial port ay nakatanggap ng data, ang variable na ito ay iki-clear, at pagkatapos ay ilipat lamang ang mga mata ayon sa posisyon ng mukha.Ang pangunahing code ay ang mga sumusunod:

if(rec_data_timer_cnt < 1000000)

{

rec_data_timer_cnt++;

}

iba pa

{

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)

Ilarawan_8283(st);

#elif(Type_Communication==2)

Describe_Modbus(st);

#tapusin kung

uart[st].Rx_F=0;

uart[st].Rx_Num=0;

}

}


Oras ng post: Hun-26-2023