——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.
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.
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