Smart Eye basat en la pantalla circular DWIN

——Del Fòrum de desenvolupadors de DWIN

El projecte de codi obert del fòrum de desenvolupadors DWIN recomanat per a tothom aquesta vegada és una rutina molt interessant per simular el moviment dels ulls humans.L'enginyer va utilitzar diversos materials d'imatge d'ulls humans per realitzar funcions com el moviment del globus ocular, el parpelleig, el reconeixement facial i el seguiment.

Introducció a les solucions de codi obert:

1. Material d'imatge de la IU

Nota de l'editor: la pantalla intel·ligent DWIN es basa en imatges per completar el desenvolupament de la interfície d'usuari, que pot realitzar fàcilment diversos efectes de visualització.

dytrgf (1)

2. Desenvolupament de la interfície

És relativament senzill desenvolupar la interfície mitjançant el programari DGUS i només es necessiten dos controls gràfics.En aquesta rutina, l'enginyer va triar una pantalla intel·ligent rodona de 2,1 polzades.

dytrgf (2)

3. Realitza l'animació de parpelleig

Deixeu que les imatges de les parpelles es mostrin al seu torn a intervals:

//Animació de parpelleig

void blink_animat(void)

{

if(bandera_parpellejar == 0)

{

blink_cnt++;

if(blink_cnt >= 4)

{

blink_flag = 1;

}

}

altra cosa

{

blink_cnt–;

if(blink_cnt <= 0)

{

blink_flag = 0;

}

}

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

}

void blink_run()

{

estàtic 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. Adonar-se que els globus oculars es veuen a esquerra i dreta de manera natural.

Això és similar al parpelleig, però cal comparar el temps de l'oscil·lador de cristall per controlar el moviment dels ulls.Després de moltes vegades de depuració, l'enginyer va dissenyar el següent conjunt de codis.

//Animació del globus ocular

void eyeball_animat(void)

{

eyeball_timer_cnt++;

if(eyeball_timer_cnt < 50)

{

globus ocular_cnt = 20;

}

else if(eyeball_timer_cnt < 51)

{

globus ocular_cnt = 50;

}

else if(eyeball_timer_cnt < 52)

{

globus ocular_cnt = 80;

}

else if(eyeball_timer_cnt < 53)

{

globus ocular_cnt = 94;

}

else if(eyeball_timer_cnt < 103)

{

globus ocular_cnt = 94;

}

else if(eyeball_timer_cnt < 104)

{

globus ocular_cnt = 80;

}

else if(eyeball_timer_cnt < 105)

{

globus ocular_cnt = 50;

}

else if(eyeball_timer_cnt < 106)

{

globus ocular_cnt = 20;

}

else if(eyeball_timer_cnt < 107)

{

globus ocular_cnt = -10;

}

else if(eyeball_timer_cnt < 108)

{

globus ocular_cnt = -40;

}

else if(eyeball_timer_cnt < 158)

{

globus ocular_cnt = -54;

}

else if(eyeball_timer_cnt < 159)

{

globus ocular_cnt = -40;

}

else if(eyeball_timer_cnt < 160)

{

globus ocular_cnt = -10;

}

else if(eyeball_timer_cnt < 161)

{

globus ocular_cnt = 20;

eyeball_timer_cnt = 0;

}

//Moveu cap a l'esquerra i la dreta

// if(bandera_eyeball == 0)

// {

// globus ocular_cnt++;

// if(eyeball_cnt >= 94)

// {

// eyeball_flag = 1;

// }

// }

// altrament

// {

// globus ocular_cnt–;

// if(eyeball_cnt <= -54)

// {

// eyeball_flag = 0;

// }

// }

if(eyeball_cnt >= 0)

{

eyeball_pos[0] = 0×00;

eyeball_pos[1] = eyeball_cnt;

}

altra cosa

{

eyeball_pos[0] = 0xFF;

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

}

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

}

void eyeball_run()

{

estàtic u32 run_timer_cnt = 0;

run_timer_cnt++;

if(run_timer_cnt >= 20000)

{

run_timer_cnt = 0;

eyeball_animat();

}

}

5. Afegiu el reconeixement facial ESP32 per adonar-vos del moviment dels ulls que segueixen la cara.

El mètode de processament aquí és que quan es detecta la cara, els ulls no es mouen per si mateixos i es defineix una variable per augmentar en el bucle while.Quan l'increment arriba a un cert valor, els globus oculars es mouran per si mateixos.Quan el port sèrie rebi dades, aquesta variable s'esborrarà i només mourà els ulls segons la posició de la cara.El codi principal és el següent:

if(rec_data_timer_cnt < 1000000)

{

rec_data_timer_cnt++;

}

altra cosa

{

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(Tipus_Comunicació==1)

Descriure_8283(st);

#elif(Tipus_Comunicació==2)

Descriure_Modbus(st);

#endif

uart[st].Rx_F=0;

uart[st].Rx_Num=0;

}

}


Hora de publicació: 26-juny-2023