——Do Fórum de Desenvolvedores DWIN
O projeto de código aberto do fórum de desenvolvedores DWIN recomendado para 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 acompanhamento.
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 interface do usuário, que pode facilmente realizar vários efeitos de exibição.
2. Desenvolvimento de interface
É 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 a animação intermitente
Deixe as imagens das pálpebras serem exibidas em intervalos:
//Animação intermitente
void blink_animat(void)
{
if(blink_flag == 0)
{
blink_cnt++;
if(blink_cnt >= 4)
{
blink_flag = 1;
}
}
outro
{
blink_cnt–;
if(blink_cnt <= 0)
{
blink_flag = 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();
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. Perceba que os globos oculares olham para a esquerda e para a direita naturalmente.
Isso é semelhante ao piscar, mas precisa comparar o tempo do oscilador de cristal para controlar o movimento do olho.Depois de muitas depurações, o engenheiro projetou o seguinte conjunto de códigos.
//Animação do globo ocular
void eyeball_animat(void)
{
eyeball_timer_cnt++;
if(eyeball_timer_cnt < 50)
{
globoocular_cnt = 20;
}
senão if(eyeball_timer_cnt < 51)
{
globoocular_cnt = 50;
}
senão if(eyeball_timer_cnt < 52)
{
eyeball_cnt = 80;
}
senão if(eyeball_timer_cnt < 53)
{
globoocular_cnt = 94;
}
senão if(eyeball_timer_cnt < 103)
{
globoocular_cnt = 94;
}
senão if(eyeball_timer_cnt < 104)
{
eyeball_cnt = 80;
}
senão if (eyeball_timer_cnt < 105)
{
globoocular_cnt = 50;
}
senão if (eyeball_timer_cnt < 106)
{
globoocular_cnt = 20;
}
senão if (eyeball_timer_cnt < 107)
{
globo_ocular = -10;
}
senão if(eyeball_timer_cnt < 108)
{
globo_ocular = -40;
}
senão if (eyeball_timer_cnt < 158)
{
globo_ocular = -54;
}
senão if(eyeball_timer_cnt < 159)
{
globo_ocular = -40;
}
senão if (eyeball_timer_cnt < 160)
{
globo_ocular = -10;
}
senão if (eyeball_timer_cnt < 161)
{
globoocular_cnt = 20;
eyeball_timer_cnt = 0;
}
//Move para a esquerda e para a direita
// if(eyeball_flag == 0)
// {
// globo ocular_cnt++;
// if(eyeball_cnt >= 94)
// {
// sinalizador_ocular = 1;
// }
// }
// outro
// {
// globo ocular_cnt–;
// if(eyeball_cnt <= -54)
// {
// sinalizador_ocular = 0;
// }
// }
if(eyeball_cnt >= 0)
{
globo ocular[0] = 0×00;
eyeball_pos[1] = eyeball_cnt;
}
outro
{
globo ocular[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;
eyeball_animat();
}
}
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 atingir um determinado valor, os globos oculares se moverão sozinhos.Quando a porta serial receber os dados, esta variável será apagada, passando então a movimentar apenas os olhos de acordo com a posição do rosto.O código principal é o seguinte:
if(rec_data_timer_cnt < 1000000)
{
rec_data_timer_cnt++;
}
outro
{
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(Type_Communication==1)
Descreva_8283(st);
#elif(Type_Communication==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