Smart Eye baseado na pantalla circular DWIN

——Do DWIN Developer Forum

O proxecto de código aberto do foro de desenvolvedores DWIN recomendado para todos nesta ocasión é unha rutina moi interesante para simular o movemento dos ollos humanos.O enxeñeiro utilizou varios materiais de imaxe do ollo humano para realizar funcións como o movemento do globo ocular, o pestanexo, o recoñecemento facial e o seguimento.

Introdución ás solucións de código aberto:

1. Material de imaxe da IU

Nota do editor: a pantalla intelixente DWIN baséase en imaxes para completar o desenvolvemento da IU, que pode realizar facilmente varios efectos de visualización.

dytrgf (1)

2. Desenvolvemento da interface

É relativamente sinxelo desenvolver a interface a través do software DGUS e só se necesitan dous controis gráficos.Nesta rutina, o enxeñeiro escolleu unha pantalla intelixente redonda de 2,1 polgadas.

dytrgf (2)

3. Realizar animación de parpadeo

Deixa que as imaxes das pálpebras se mostren por turnos a intervalos:

//Animación de parpadeo

void blink_animat(void)

{

if(bandeira_parpadeante == 0)

{

blink_cnt++;

if(blink_cnt >= 4)

{

palpebrar_bandeira = 1;

}

}

outra cousa

{

blink_cnt–;

if(blink_cnt <= 0)

{

palpebrar_bandeira = 0;

}

}

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

}

void blink_run()

{

estático u32 run_timer_cnt = 0;

run_timer_cnt++;

if(run_timer_cnt >= 2000000)

{

run_timer_cnt = 0;

blink_animat();

Retraso_ms(30);

blink_animat();

Retraso_ms(30);

blink_animat();

Retraso_ms(30);

blink_animat();

Retraso_ms(30);

blink_animat();

Retraso_ms(30);

blink_animat();

Retraso_ms(30);

blink_animat();

Retraso_ms(30);

blink_animat();

Retraso_ms(30);

}

}

4. Dáse conta de que os globos oculares miran á esquerda e á dereita de forma natural.

Isto é semellante ao parpadeo, pero cómpre comparar o tempo do oscilador de cristal para controlar o movemento dos ollos.Despois de moitas veces de depuración, o enxeñeiro deseñou o seguinte conxunto de códigos.

//Animación do globo ocular

void eyeball_animat(void)

{

eyeball_timer_cnt++;

if(eyeball_timer_cnt < 50)

{

globo ocular_cnt = 20;

}

else if(eyeball_timer_cnt < 51)

{

globo ocular_cnt = 50;

}

else if(eyeball_timer_cnt < 52)

{

globo ocular_cnt = 80;

}

else if(eyeball_timer_cnt < 53)

{

globo ocular_cnt = 94;

}

else if(eyeball_timer_cnt < 103)

{

globo ocular_cnt = 94;

}

else if(eyeball_timer_cnt < 104)

{

globo ocular_cnt = 80;

}

else if(eyeball_timer_cnt < 105)

{

globo ocular_cnt = 50;

}

else if(eyeball_timer_cnt < 106)

{

globo ocular_cnt = 20;

}

else if(eyeball_timer_cnt < 107)

{

globo ocular_cnt = -10;

}

else if(eyeball_timer_cnt < 108)

{

globo ocular_cnt = -40;

}

else if(eyeball_timer_cnt < 158)

{

globo ocular_cnt = -54;

}

else if(eyeball_timer_cnt < 159)

{

globo ocular_cnt = -40;

}

else if(eyeball_timer_cnt < 160)

{

globo ocular_cnt = -10;

}

else if(eyeball_timer_cnt < 161)

{

globo ocular_cnt = 20;

eyeball_timer_cnt = 0;

}

//Move á esquerda e á dereita

// if(bandeira_ollo == 0)

// {

// globo ocular_cnt++;

// if(eyeball_cnt >= 94)

// {

// bandeira_globo_ocular = 1;

//}

//}

// senón

// {

// globo ocular_cnt–;

// if(cnt_globo_ocular <= -54)

// {

// bandeira_globo_ocular = 0;

//}

//}

if(eyeball_cnt >= 0)

{

eyeball_pos[0] = 0×00;

eyeball_pos[1] = eyeball_cnt;

}

outra cousa

{

eyeball_pos[0] = 0xFF;

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

}

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

}

void eyeball_run()

{

estático u32 run_timer_cnt = 0;

run_timer_cnt++;

if(run_timer_cnt >= 20000)

{

run_timer_cnt = 0;

globo_ocular_animat();

}

}

5. Engade o recoñecemento facial ESP32 para realizar o movemento dos ollos que seguen a cara.

O método de procesamento aquí é que cando se detecta a cara, os ollos non se moven por si mesmos e defínese unha variable para incrementar no bucle while.Cando o incremento alcanza un determinado valor, os globos oculares moveranse por si sós.Cando o porto serie reciba datos, esta variable borrarase e, a continuación, só moverá os ollos segundo a posición da cara.O código principal é o seguinte:

if(rec_data_timer_cnt < 1000000)

{

rec_data_timer_cnt++;

}

outra cousa

{

globo_ocular();

}

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

Describe_8283(st);

#elif(Tipo_Comunicación==2)

Describe_Modbus(st);

#endif

uart[st].Rx_F=0;

uart[st].Rx_Num=0;

}

}


Hora de publicación: 26-Xun-2023