——Do Fórum de Desenvolvedores DWIN
O projeto de código aberto do fórum de desenvolvedores DWIN recomendado a todos desta vez é uma rotina muito interessante para simular o movimento dos olhos humanos. O engenheiro usou vários materiais de imagem do olho humano para realizar funções como movimento do globo ocular, piscar, reconhecimento facial e seguimento.
Introdução às soluções de código aberto:
1. Material de imagem da IU
Nota do editor: A tela inteligente DWIN é baseada em imagens para completar o desenvolvimento da UI, que pode facilmente realizar vários efeitos de exibição.
2. Desenvolvimento de interfaces
É relativamente simples desenvolver a interface através do software DGUS, sendo necessários apenas dois controles gráficos. Nessa rotina, o engenheiro optou por uma tela inteligente redonda de 2,1 polegadas.
3. Realize animação piscante
Deixe as imagens das pálpebras serem exibidas sucessivamente em intervalos:
//Animação de piscar
vazio blink_animat(vazio)
{
if(piscar_flag == 0)
{
piscar_cnt++;
se(piscar_cnt >= 4)
{
pisca_flag = 1;
}
}
outro
{
piscar_cnt–;
if(piscar_cnt
{
pisca_flag = 0;
}
}
write_dgus_vp(0×3000, (u8 *)&blink_cnt, 2);
}
vazio piscar_run()
{
estático u32 run_timer_cnt = 0;
run_timer_cnt++;
if(run_timer_cnt >= 2000000)
{
run_timer_cnt = 0;
piscar_animado();
Atraso_ms(30);
piscar_animado();
Atraso_ms(30);
piscar_animado();
Atraso_ms(30);
piscar_animado();
Atraso_ms(30);
piscar_animado();
Atraso_ms(30);
piscar_animado();
Atraso_ms(30);
piscar_animado();
Atraso_ms(30);
piscar_animado();
Atraso_ms(30);
}
}
4. Perceba que os globos oculares olham para a esquerda e para a direita naturalmente.
Isso é semelhante a piscar, mas precisa comparar o tempo do oscilador de cristal para controlar o movimento dos olhos. Depois de muitas vezes de depuração, o engenheiro projetou o seguinte conjunto de códigos.
//animação do globo ocular
vazio eyeball_animat(vazio)
{
eyeball_timer_cnt++;
if(eyeball_timer_cnt
{
globo ocular_cnt = 20;
}
senão if(eyeball_timer_cnt
{
globo ocular_cnt = 50;
}
senão if(eyeball_timer_cnt
{
globo ocular_cnt = 80;
}
senão if(eyeball_timer_cnt
{
globo ocular_cnt = 94;
}
senão if(eyeball_timer_cnt
{
globo ocular_cnt = 94;
}
senão if(eyeball_timer_cnt
{
globo ocular_cnt = 80;
}
senão if(eyeball_timer_cnt
{
globo ocular_cnt = 50;
}
senão if(eyeball_timer_cnt
{
globo ocular_cnt = 20;
}
senão if(eyeball_timer_cnt
{
globo ocular_cnt = -10;
}
senão if(eyeball_timer_cnt
{
globo ocular_cnt = -40;
}
senão if(eyeball_timer_cnt
{
globo ocular_cnt = -54;
}
senão if(eyeball_timer_cnt
{
globo ocular_cnt = -40;
}
senão if(eyeball_timer_cnt
{
globo ocular_cnt = -10;
}
senão if(eyeball_timer_cnt
{
globo ocular_cnt = 20;
eyeball_timer_cnt = 0;
}
//Mover para esquerda e direita
// if(eyeball_flag == 0)
// {
// globo ocular_cnt++;
// if(eyeball_cnt >= 94)
// {
// eyeball_flag = 1;
// }
// }
// outro
// {
// globo ocular_cnt–;
// if(eyeball_cnt
// {
// eyeball_flag = 0;
// }
// }
if(eyeball_cnt >= 0)
{
globo ocular_pos[0] = 0×00;
globo ocular_pos[1] = globo ocular_cnt;
}
outro
{
globo ocular_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;
animado_eyeball();
}
}
5. Adicione o reconhecimento facial ESP32 para perceber o movimento dos olhos seguindo o rosto.
O método de processamento aqui é que quando o rosto é detectado, os olhos não se movem sozinhos e uma variável é definida para incrementar no loop while. Quando o incremento atinge um determinado valor, os globos oculares se moverão sozinhos. Quando a porta serial receber dados, esta variável será zerada, passando apenas a movimentar os olhos de acordo com a posição do rosto. O código principal é o seguinte:
se(rec_data_timer_cnt
{
rec_data_timer_cnt++;
}
outro
{
eyeball_run();
}
externo u32 rec_data_timer_cnt;
externo u16 eyeball_timer_cnt;
comunicação nula_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_Comunicação==1)
Descrever_8283(st);
#elif(Tipo_Comunicação==2)
Descrever_Modbus(st);
#fim se
uart[st].Rx_F=0;
uart[st].Rx_Num=0;
}
}
Horário da postagem: 26 de junho de 2023