Smart Eye basado en pantalla circular DWIN

——Del foro de desarrolladores de DWIN

El proyecto de código abierto del foro de desarrolladores DWIN recomendado para todos esta vez es una rutina muy interesante para simular el movimiento de los ojos humanos. El ingeniero utilizó varios materiales de imágenes del ojo humano para realizar funciones como el movimiento del globo ocular, el parpadeo, el reconocimiento facial y el seguimiento.

Introducción a las soluciones de código abierto:

1. Material de imagen de la interfaz de usuario

Nota del editor: la pantalla inteligente DWIN se basa en imágenes para completar el desarrollo de la interfaz de usuario, que puede realizar fácilmente varios efectos de visualización.

dytrgf (1)

2. Desarrollo de interfaz

Es relativamente sencillo desarrollar la interfaz a través del software DGUS y sólo se necesitan dos controles gráficos. En esta rutina, el ingeniero eligió una pantalla inteligente redonda de 2,1 pulgadas.

dytrgf (2)

3. Realiza una animación de parpadeo.

Deje que las imágenes de los párpados se muestren sucesivamente a intervalos:

//animación de parpadeo

vacío parpadeo_animat (vacío)

{

si(blink_flag == 0)

{

parpadeo_cnt++;

si(blink_cnt >= 4)

{

bandera_parpadeo = 1;

}

}

demás

{

parpadeo_cnt–;

si(blink_cnt

{

bandera_parpadeo = 0;

}

}

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

}

vacío parpadeo_run()

{

estático u32 run_timer_cnt = 0;

run_timer_cnt++;

si(run_timer_cnt >= 2000000)

{

run_timer_cnt = 0;

parpadeo_animado();

Retraso_ms(30);

parpadeo_animado();

Retraso_ms(30);

parpadeo_animado();

Retraso_ms(30);

parpadeo_animado();

Retraso_ms(30);

parpadeo_animado();

Retraso_ms(30);

parpadeo_animado();

Retraso_ms(30);

parpadeo_animado();

Retraso_ms(30);

parpadeo_animado();

Retraso_ms(30);

}

}

4. Date cuenta de que los globos oculares miran hacia la izquierda y hacia la derecha de forma natural.

Esto es similar al parpadeo, pero es necesario comparar el tiempo del oscilador de cristal para controlar el movimiento ocular. Después de muchas depuraciones, el ingeniero diseñó el siguiente conjunto de códigos.

//Animación del globo ocular

globo ocular vacío_animat (vacío)

{

eyeball_timer_cnt++;

si(eyeball_timer_cnt

{

globo ocular_cnt = 20;

}

de lo contrario si (eyeball_timer_cnt

{

globo ocular_cnt = 50;

}

de lo contrario si (eyeball_timer_cnt

{

globo ocular_cnt = 80;

}

de lo contrario si (eyeball_timer_cnt

{

globo ocular_cnt = 94;

}

de lo contrario si (eyeball_timer_cnt

{

globo ocular_cnt = 94;

}

de lo contrario si (eyeball_timer_cnt

{

globo ocular_cnt = 80;

}

de lo contrario si (eyeball_timer_cnt

{

globo ocular_cnt = 50;

}

de lo contrario si (eyeball_timer_cnt

{

globo ocular_cnt = 20;

}

de lo contrario si (eyeball_timer_cnt

{

globo ocular_cnt = -10;

}

de lo contrario si (eyeball_timer_cnt

{

globo ocular_cnt = -40;

}

de lo contrario si (eyeball_timer_cnt

{

globo ocular_cnt = -54;

}

de lo contrario si (eyeball_timer_cnt

{

globo ocular_cnt = -40;

}

de lo contrario si (eyeball_timer_cnt

{

globo ocular_cnt = -10;

}

de lo contrario si (eyeball_timer_cnt

{

globo ocular_cnt = 20;

eyeball_timer_cnt = 0;

}

//Mover hacia la izquierda y hacia la derecha

// si(bandera_globo ocular == 0)

// {

// globo ocular_cnt++;

// si(globo_ojo_cnt >= 94)

// {

// bandera_globo ocular = 1;

// }

// }

// demás

// {

// globo ocular_cnt–;

// si(globo_ojo_cnt

// {

// bandera_globo ocular = 0;

// }

// }

si(globo_ojo_cnt >= 0)

{

eyeball_pos[0] = 0×00;

eyeball_pos[1] = eyeball_cnt;

}

demás

{

globo ocular_pos[0] = 0xFF;

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

}

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

}

vacío eyeball_run()

{

estático u32 run_timer_cnt = 0;

run_timer_cnt++;

si(run_timer_cnt >= 20000)

{

run_timer_cnt = 0;

eyeball_animat();

}

}

5. Agregue reconocimiento facial ESP32 para realizar el movimiento de los ojos siguiendo el rostro.

El método de procesamiento aquí es que cuando se detecta la cara, los ojos no se mueven por sí solos y se define una variable para incrementar en el ciclo while. Cuando el incremento alcanza un cierto valor, los globos oculares se moverán solos. Cuando el puerto serie reciba datos, esta variable se borrará y luego solo moverá los ojos según la posición de la cara. El código principal es el siguiente:

si(rec_data_timer_cnt

{

rec_data_timer_cnt++;

}

demás

{

globo ocular_run();

}

externo u32 rec_data_timer_cnt;

externo u16 eyeball_timer_cnt;

anular comunicación_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)

Describir_8283(st);

#elif(Tipo_Comunicación==2)

Describir_Modbus(st);

#terminara si

uart[st].Rx_F=0;

uart[st].Rx_Num=0;

}

}


Hora de publicación: 26 de junio de 2023