Smart Eye basato sullo schermo circolare DWIN

——Dal forum degli sviluppatori DWIN

Il progetto open source del forum per sviluppatori DWIN consigliato a tutti questa volta è una routine molto interessante per simulare il movimento degli occhi umani.L'ingegnere ha utilizzato diversi materiali per immagini dell'occhio umano per realizzare funzioni come il movimento del bulbo oculare, il battito delle palpebre, il riconoscimento facciale e l'inseguimento.

Introduzione alle soluzioni open source:

1. Materiale dell'immagine dell'interfaccia utente

Nota del redattore: lo schermo intelligente DWIN si basa su immagini per completare lo sviluppo dell'interfaccia utente, che può facilmente realizzare vari effetti di visualizzazione.

dytrgf (1)

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.

dytrgf (2)

3. Realizza l'animazione lampeggiante

Lascia che le immagini delle palpebre vengano visualizzate a turno a intervalli:

//Animazione lampeggiante

vuoto lampeggiante_animato(vuoto)

{

se(blink_flag == 0)

{

lampeggia_cnt++;

se(blink_cnt >= 4)

{

lampeggio_flag = 1;

}

}

altro

{

lampeggia_cnt–;

if(blink_cnt <= 0)

{

lampeggio_flag = 0;

}

}

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

}

void lampeggiante()

{

statico u32 run_timer_cnt = 0;

run_timer_cnt++;

if(run_timer_cnt >= 2000000)

{

run_timer_cnt = 0;

lampeggia_animat();

Ritardo_ms(30);

lampeggia_animat();

Ritardo_ms(30);

lampeggia_animat();

Ritardo_ms(30);

lampeggia_animat();

Ritardo_ms(30);

lampeggia_animat();

Ritardo_ms(30);

lampeggia_animat();

Ritardo_ms(30);

lampeggia_animat();

Ritardo_ms(30);

lampeggia_animat();

Ritardo_ms(30);

}

}

4. Rendersi conto che i bulbi oculari guardano a sinistra ea destra in modo naturale.

Questo è simile al battito delle palpebre, ma è necessario confrontare il tempo dell'oscillatore a cristallo per controllare il movimento degli occhi.Dopo molte volte di debug, l'ingegnere ha progettato il seguente set di codici.

//Animazione del bulbo oculare

void eyeball_animat(void)

{

bulbo_timer_cnt++;

if(eyeball_timer_cnt < 50)

{

bulbo_oculare = 20;

}

altrimenti se (eyeball_timer_cnt < 51)

{

bulbo_oculare = 50;

}

altrimenti se (eyeball_timer_cnt < 52)

{

eyeball_cnt = 80;

}

altrimenti se (eyeball_timer_cnt < 53)

{

eyeball_cnt = 94;

}

altrimenti se (eyeball_timer_cnt < 103)

{

eyeball_cnt = 94;

}

altrimenti se (eyeball_timer_cnt < 104)

{

eyeball_cnt = 80;

}

altrimenti se (eyeball_timer_cnt < 105)

{

bulbo_oculare = 50;

}

altrimenti se (eyeball_timer_cnt < 106)

{

bulbo_oculare = 20;

}

altrimenti se (eyeball_timer_cnt < 107)

{

eyeball_cnt = -10;

}

altrimenti se (eyeball_timer_cnt < 108)

{

eyeball_cnt = -40;

}

altrimenti se (eyeball_timer_cnt < 158)

{

bulbo_oculare = -54;

}

altrimenti se (eyeball_timer_cnt < 159)

{

eyeball_cnt = -40;

}

altrimenti se (eyeball_timer_cnt < 160)

{

eyeball_cnt = -10;

}

altrimenti se (eyeball_timer_cnt < 161)

{

bulbo_oculare = 20;

eyeball_timer_cnt = 0;

}

//Spostati a sinistra ea destra

// if(eyeball_flag == 0)

// {

// bulbo_oculare++;

// if(eyeball_cnt >= 94)

// {

// eyeball_flag = 1;

// }

// }

// altro

// {

// eyeball_cnt–;

// if(eyeball_cnt <= -54)

// {

// eyeball_flag = 0;

// }

// }

if(eyeball_cnt >= 0)

{

eyeball_pos[0] = 0×00;

eyeball_pos[1] = eyeball_cnt;

}

altro

{

eyeball_pos[0] = 0xFF;

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

}

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

}

void eyeball_run()

{

statico u32 run_timer_cnt = 0;

run_timer_cnt++;

if(run_timer_cnt >= 20000)

{

run_timer_cnt = 0;

bulbo_animato();

}

}

5. Aggiungi il riconoscimento facciale ESP32 per realizzare il movimento degli occhi che seguono il viso.

Il metodo di elaborazione qui è che quando viene rilevato il volto, gli occhi non si muovono da soli e viene 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, quindi muoverà gli occhi solo in base alla posizione del viso.Il codice principale è il seguente:

if(rec_data_timer_cnt < 1000000)

{

rec_data_timer_cnt++;

}

altro

{

eyeball_run();

}

extern u32 rec_data_timer_cnt;

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

}

}


Tempo di pubblicazione: 26-giu-2023