Smart Eye basé sur l'écran circulaire DWIN

——Depuis le forum des développeurs DWIN

Le projet open source du forum des développeurs DWIN recommandé à tout le monde cette fois est une routine très intéressante pour simuler le mouvement des yeux humains. L'ingénieur a utilisé plusieurs matériaux d'image de l'œil humain pour réaliser des fonctions telles que le mouvement du globe oculaire, le clignement des yeux, la reconnaissance faciale et le suivi.

Introduction aux solutions open source :

1. Matériel d'image de l'interface utilisateur

Note de l'éditeur : l'écran intelligent DWIN est basé sur des images pour compléter le développement de l'interface utilisateur, qui peut facilement réaliser divers effets d'affichage.

dytrgf (1)

2. Développement d'interfaces

Il est relativement simple de développer l'interface via le logiciel DGUS, et seuls deux contrôles graphiques sont nécessaires. Dans cette routine, l’ingénieur a choisi un écran intelligent rond de 2,1 pouces.

dytrgf (2)

3. Réaliser une animation clignotante

Laissez les images des paupières s'afficher tour à tour à intervalles :

//Animation de clignement

vide clignotant_animat (vide)

{

si (blink_flag == 0)

{

clignotant_cnt++;

si (blink_cnt >= 4)

{

clignotant_flag = 1 ;

}

}

autre

{

clignotant_cnt– ;

si (blink_cnt

{

clignotant_flag = 0 ;

}

}

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

}

vide clignotant_run()

{

statique u32 run_timer_cnt = 0 ;

run_timer_cnt++;

si (run_timer_cnt >= 2000000)

{

run_timer_cnt = 0 ;

clignotant_animé();

Delay_ms(30);

clignotant_animé();

Delay_ms(30);

clignotant_animé();

Delay_ms(30);

clignotant_animé();

Delay_ms(30);

clignotant_animé();

Delay_ms(30);

clignotant_animé();

Delay_ms(30);

clignotant_animé();

Delay_ms(30);

clignotant_animé();

Delay_ms(30);

}

}

4. Réalisez que les globes oculaires regardent naturellement à gauche et à droite.

Ceci est similaire au clignement des yeux, mais il faut comparer le temps de l'oscillateur à cristal pour contrôler le mouvement des yeux. Après plusieurs débogages, l’ingénieur a conçu l’ensemble de codes suivant.

//Animation du globe oculaire

vide eyeball_animat (vide)

{

eyeball_timer_cnt++;

si (eyeball_timer_cnt

{

globe oculaire_cnt = 20 ;

}

sinon si (eyeball_timer_cnt

{

globe oculaire_cnt = 50 ;

}

sinon si (eyeball_timer_cnt

{

globe oculaire_cnt = 80 ;

}

sinon si (eyeball_timer_cnt

{

globe oculaire_cnt = 94 ;

}

sinon si (eyeball_timer_cnt

{

globe oculaire_cnt = 94 ;

}

sinon si (eyeball_timer_cnt

{

globe oculaire_cnt = 80 ;

}

sinon si (eyeball_timer_cnt

{

globe oculaire_cnt = 50 ;

}

sinon si (eyeball_timer_cnt

{

globe oculaire_cnt = 20 ;

}

sinon si (eyeball_timer_cnt

{

globe oculaire_cnt = -10 ;

}

sinon si (eyeball_timer_cnt

{

globe oculaire_cnt = -40 ;

}

sinon si (eyeball_timer_cnt

{

globe oculaire_cnt = -54 ;

}

sinon si (eyeball_timer_cnt

{

globe oculaire_cnt = -40 ;

}

sinon si (eyeball_timer_cnt

{

globe oculaire_cnt = -10 ;

}

sinon si (eyeball_timer_cnt

{

globe oculaire_cnt = 20 ;

eyeball_timer_cnt = 0;

}

// Se déplacer à gauche et à droite

// si (eyeball_flag == 0)

// {

// globe oculaire_cnt++;

// si (eyeball_cnt >= 94)

// {

// globe oculaire_flag = 1;

// }

// }

// autre

// {

// globe oculaire_cnt–;

// si (eyeball_cnt

// {

// globe oculaire_flag = 0;

// }

// }

si (eyeball_cnt >= 0)

{

globe oculaire_pos[0] = 0×00 ;

eyeball_pos[1] = eyeball_cnt;

}

autre

{

eyeball_pos[0] = 0xFF;

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

}

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

}

vide eyeball_run()

{

statique u32 run_timer_cnt = 0 ;

run_timer_cnt++;

si (run_timer_cnt >= 20000)

{

run_timer_cnt = 0 ;

animé_eyeball();

}

}

5. Ajoutez la reconnaissance faciale ESP32 pour réaliser le mouvement des yeux suivant le visage.

La méthode de traitement ici est que lorsque le visage est détecté, les yeux ne bougent pas d'eux-mêmes et une variable est définie pour s'incrémenter dans la boucle while. Lorsque l'incrément atteint une certaine valeur, les globes oculaires bougent d'eux-mêmes. Lorsque le port série reçoit des données, cette variable sera effacée, puis déplacera uniquement les yeux en fonction de la position du visage. Le code principal est le suivant :

si (rec_data_timer_cnt

{

rec_data_timer_cnt++;

}

autre

{

globe oculaire_run();

}

externe u32 rec_data_timer_cnt;

externe u16 eyeball_timer_cnt;

void Communication_CMD (u8 st)

{

si((uart[st].Rx_F==1 )&&(uart[st].Rx_T==0))

{

rec_data_timer_cnt = 0 ;

eyeball_timer_cnt = 0;

#if(Type_Communication==1)

Describe_8283(st);

#elif(Type_Communication==2)

Describe_Modbus(st);

#fin si

uart[st].Rx_F=0;

uart[st].Rx_Num=0;

}

}


Heure de publication : 26 juin 2023