——Dal forum degli sviluppatori DWIN
Il progetto open source del forum degli sviluppatori DWIN consigliato a tutti questa volta è una routine molto interessante per simulare il movimento degli occhi umani. L'ingegnere ha utilizzato diversi materiali visivi dell'occhio umano per realizzare funzioni come il movimento del bulbo oculare, il battito delle palpebre, il riconoscimento del volto e il seguire.
Introduzione alle soluzioni open source:
1. Materiale immagine dell'interfaccia utente
Nota dell'editore: lo schermo intelligente DWIN si basa su immagini per completare lo sviluppo dell'interfaccia utente, che può facilmente realizzare vari effetti di visualizzazione.
2. Sviluppo dell'interfaccia
È relativamente semplice sviluppare l'interfaccia tramite il software DGUS e sono necessari solo due controlli grafici. In questa routine, l'ingegnere ha scelto uno schermo intelligente rotondo da 2,1 pollici.
3. Realizza l'animazione del battito di ciglia
Lascia che le immagini delle palpebre vengano visualizzate a turno a intervalli:
//Animazione lampeggiante
vuoto lampeggia_animat(vuoto)
{
if(lampeggio_flag == 0)
{
lampeggia_cnt++;
se(cnt_lampeggio >= 4)
{
lampeggia_flag = 1;
}
}
altro
{
lampeggia_cnt–;
se(cnt_lampeggio
{
lampeggia_flag = 0;
}
}
write_dgus_vp(0×3000, (u8 *)&blink_cnt, 2);
}
vuoto lampeggia_run()
{
statico u32 run_timer_cnt = 0;
esegui_timer_cnt++;
if(run_timer_cnt >= 2000000)
{
run_timer_cnt = 0;
lampeggia_animato();
Ritardo_ms(30);
lampeggia_animato();
Ritardo_ms(30);
lampeggia_animato();
Ritardo_ms(30);
lampeggia_animato();
Ritardo_ms(30);
lampeggia_animato();
Ritardo_ms(30);
lampeggia_animato();
Ritardo_ms(30);
lampeggia_animato();
Ritardo_ms(30);
lampeggia_animato();
Ritardo_ms(30);
}
}
4. Renditi conto che i bulbi oculari guardano a destra e a sinistra in modo naturale.
È simile al battito delle palpebre, ma è necessario confrontare il tempo dell'oscillatore del cristallo per controllare il movimento degli occhi. Dopo molte volte di debug, l'ingegnere ha progettato la seguente serie di codici.
//Animazione del bulbo oculare
vuoto eyeball_animat(vuoto)
{
eyeball_timer_cnt++;
if(eyeball_timer_cnt
{
bulbo_oculare_cnt = 20;
}
altrimenti se (eyeball_timer_cnt
{
bulbo_oculare_cnt = 50;
}
altrimenti se (eyeball_timer_cnt
{
bulbo_oculare_cnt = 80;
}
altrimenti se (eyeball_timer_cnt
{
bulbo_oculare_cnt = 94;
}
altrimenti se (eyeball_timer_cnt
{
bulbo_oculare_cnt = 94;
}
altrimenti se (eyeball_timer_cnt
{
bulbo_oculare_cnt = 80;
}
altrimenti se (eyeball_timer_cnt
{
bulbo_oculare_cnt = 50;
}
altrimenti se (eyeball_timer_cnt
{
bulbo_oculare_cnt = 20;
}
altrimenti se (eyeball_timer_cnt
{
bulbo_oculare = -10;
}
altrimenti se (eyeball_timer_cnt
{
bulbo_oculare_cnt = -40;
}
altrimenti se (eyeball_timer_cnt
{
bulbo_oculare_cnt = -54;
}
altrimenti se (eyeball_timer_cnt
{
bulbo_oculare_cnt = -40;
}
altrimenti se (eyeball_timer_cnt
{
bulbo_oculare = -10;
}
altrimenti se (eyeball_timer_cnt
{
bulbo_oculare_cnt = 20;
eyeball_timer_cnt = 0;
}
//Spostati a sinistra e a destra
// if(eyeball_flag == 0)
// {
// bulbo oculare_cnt++;
// se(bulbo_oculare_cnt >= 94)
// {
// bandiera_bulbo_oculare = 1;
// }
// }
// altro
// {
// bulbo oculare_cnt–;
// if(bulbo_oculare
// {
// bandiera_bulbo_oculare = 0;
// }
// }
if(bulbo_oculare >= 0)
{
bulbo_oculare[0] = 0×00;
bulbo_oculare[1] = bulbo_oculare cnt;
}
altro
{
bulbo_oculare[0] = 0xFF;
bulbo_oculare[1] = (bulbo_oculare & 0xFF);
}
write_dgus_vp(0×3111, (u8 *)&eyeball_pos, 2);
}
vuoto eyeball_run()
{
statico u32 run_timer_cnt = 0;
esegui_timer_cnt++;
if(run_timer_cnt >= 20000)
{
run_timer_cnt = 0;
bulbo_oculare animato();
}
}
5. Aggiungi il riconoscimento facciale ESP32 per realizzare il movimento degli occhi che seguono il viso.
Il metodo di elaborazione in questo caso prevede che quando viene rilevato il volto, gli occhi non si muovano da soli e venga definita una variabile da incrementare nel ciclo while. Quando l'incremento raggiunge un certo valore, i bulbi oculari si muoveranno da soli. Quando la porta seriale riceve i dati, questa variabile verrà cancellata, e quindi si muoveranno solo gli occhi in base alla posizione del viso. Il codice principale è il seguente:
if(rec_data_timer_cnt
{
rec_data_timer_cnt++;
}
altro
{
bulbo_oculare();
}
esterno u32 rec_data_timer_cnt;
esterno u16 eyeball_timer_cnt;
void Comunicazione_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_Comunicazione==1)
Descrivi_8283(st);
#elif(Tipo_Comunicazione==2)
Descrivi_Modbus(st);
#finisci se
uart[st].Rx_F=0;
uart[st].Rx_Num=0;
}
}
Orario di pubblicazione: 26 giugno 2023