Olho Inteligente Baseado na Tela Circular DWIN

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

dytrgf (1)

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.

dytrgf (2)

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