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é pour 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 clignotement, la reconnaissance faciale et le suivi.

Présentation des 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, ce qui permet de réaliser facilement 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 être affichées à tour de rôle à intervalles:

//Animation clignotante

annuler blink_animat (annuler)

{

si(blink_flag == 0)

{

cnt_clignotant++ ;

si (clignotement_cnt >= 4)

{

drapeau_clignotant = 1 ;

}

}

autre

{

clignote_cnt– ;

si (clignotement_cnt <= 0)

{

clignotant_flag = 0 ;

}

}

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

}

annuler blink_run()

{

statique u32 run_timer_cnt = 0 ;

run_timer_cnt++ ;

si(run_timer_cnt >= 2000000)

{

run_timer_cnt = 0 ;

clignote_animat();

Délai_ms(30);

clignote_animat();

Délai_ms(30);

clignote_animat();

Délai_ms(30);

clignote_animat();

Délai_ms(30);

clignote_animat();

Délai_ms(30);

clignote_animat();

Délai_ms(30);

clignote_animat();

Délai_ms(30);

clignote_animat();

Délai_ms(30);

}

}

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

Ceci est similaire au clignotement, mais il doit comparer le temps de l'oscillateur à cristal pour contrôler le mouvement des yeux.Après plusieurs fois de débogage, 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 < 50)

{

eyeball_cnt = 20 ;

}

sinon si(eyeball_timer_cnt < 51)

{

eyeball_cnt = 50 ;

}

sinon si(eyeball_timer_cnt < 52)

{

eyeball_cnt = 80 ;

}

sinon si(eyeball_timer_cnt < 53)

{

eyeball_cnt = 94 ;

}

sinon si(eyeball_timer_cnt < 103)

{

eyeball_cnt = 94 ;

}

sinon si(eyeball_timer_cnt < 104)

{

eyeball_cnt = 80 ;

}

sinon si(eyeball_timer_cnt < 105)

{

eyeball_cnt = 50 ;

}

sinon si(eyeball_timer_cnt < 106)

{

eyeball_cnt = 20 ;

}

sinon si(eyeball_timer_cnt < 107)

{

eyeball_cnt = -10 ;

}

sinon si(eyeball_timer_cnt < 108)

{

eyeball_cnt = -40 ;

}

sinon si(eyeball_timer_cnt < 158)

{

eyeball_cnt = -54 ;

}

sinon si(eyeball_timer_cnt < 159)

{

eyeball_cnt = -40 ;

}

sinon si(eyeball_timer_cnt < 160)

{

eyeball_cnt = -10 ;

}

sinon si(eyeball_timer_cnt < 161)

{

eyeball_cnt = 20 ;

eyeball_timer_cnt = 0 ;

}

// Se déplacer à gauche et à droite

// if(eyeball_flag == 0)

// {

// globe_oculaire_cnt++ ;

// si(eyeball_cnt >= 94)

// {

// eyeball_flag = 1;

// }

// }

// autre

// {

// eyeball_cnt– ;

// si(eyeball_cnt <= -54)

// {

// eyeball_flag = 0;

// }

// }

si(eyeball_cnt >= 0)

{

eyeball_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 ;

eyeball_animat();

}

}

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 se déplacent d'eux-mêmes.Lorsque le port série reçoit des données, cette variable sera effacée, puis ne déplacera les yeux qu'en fonction de la position du visage.Le code principal est le suivant :

si(rec_data_timer_cnt < 1000000)

{

rec_data_timer_cnt++ ;

}

autre

{

eyeball_run();

}

externe u32 rec_data_timer_cnt ;

externe u16 eyeball_timer_cnt ;

annuler 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)

Décrire_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