DWIN Dairesel Ekrana Dayalı Akıllı Göz

——DWIN Geliştirici Forumundan

Bu sefer herkese önerilen DWIN geliştirici forumu açık kaynak projesi, insan gözünün hareketini simüle etmeye yönelik çok ilginç bir rutindir. Mühendis, göz küresi hareketi, göz kırpma, yüz tanıma ve takip etme gibi işlevleri gerçekleştirmek için çeşitli insan gözü resim materyallerini kullandı.

Açık kaynak çözümlerine giriş:

1. Kullanıcı arayüzü görüntü malzemesi

Editörün notu: DWIN akıllı ekranı, çeşitli ekran efektlerini kolayca gerçekleştirebilen UI gelişimini tamamlamak için resimlere dayanmaktadır.

dytrgf (1)

2. Arayüz geliştirme

Arayüzü DGUS yazılımı aracılığıyla geliştirmek nispeten basittir ve yalnızca iki grafik kontrolüne ihtiyaç vardır. Bu rutinde mühendis 2,1 inçlik yuvarlak bir akıllı ekran seçti.

dytrgf (2)

3. Göz kırpma animasyonunu gerçekleştirin

Göz kapaklarının resimlerinin aralıklarla gösterilmesine izin verin:

//Yanıp sönme animasyonu

void Blink_animat(geçersiz)

{

if(yanıp sönme_flag == 0)

{

göz kırpma_cnt++;

if(blink_cnt >= 4)

{

göz kırpma_bayrağı = 1;

}

}

başka

{

göz kırpma_cnt–;

if(blink_cnt

{

göz kırpma_bayrağı = 0;

}

}

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

}

geçersiz göz kırpma_run()

{

statik u32 run_timer_cnt = 0;

run_timer_cnt++;

if(run_timer_cnt >= 2000000)

{

run_timer_cnt = 0;

göz kırpma_animated();

Gecikme_ms(30);

göz kırpma_animated();

Gecikme_ms(30);

göz kırpma_animated();

Gecikme_ms(30);

göz kırpma_animated();

Gecikme_ms(30);

göz kırpma_animated();

Gecikme_ms(30);

göz kırpma_animated();

Gecikme_ms(30);

göz kırpma_animated();

Gecikme_ms(30);

göz kırpma_animated();

Gecikme_ms(30);

}

}

4. Gözbebeklerinin doğal olarak sola ve sağa baktığını fark edin.

Bu, göz kırpmaya benzer ancak göz hareketini kontrol etmek için kristal osilatörün zamanını karşılaştırması gerekir. Birçok kez hata ayıklamanın ardından mühendis aşağıdaki kod setini tasarladı.

//Göz küresi animasyonu

void eyeball_animat(void)

{

eyeball_timer_cnt++;

if(eyeball_timer_cnt

{

eyeball_cnt = 20;

}

else if(eyeball_timer_cnt

{

eyeball_cnt = 50;

}

else if(eyeball_timer_cnt

{

göztopu_cnt = 80;

}

else if(eyeball_timer_cnt

{

eyeball_cnt = 94;

}

else if(eyeball_timer_cnt

{

eyeball_cnt = 94;

}

else if(eyeball_timer_cnt

{

göztopu_cnt = 80;

}

else if(eyeball_timer_cnt

{

eyeball_cnt = 50;

}

else if(eyeball_timer_cnt

{

eyeball_cnt = 20;

}

else if(eyeball_timer_cnt

{

göztopu_cnt = -10;

}

else if(eyeball_timer_cnt

{

göztopu_cnt = -40;

}

else if(eyeball_timer_cnt

{

eyeball_cnt = -54;

}

else if(eyeball_timer_cnt

{

göztopu_cnt = -40;

}

else if(eyeball_timer_cnt

{

göztopu_cnt = -10;

}

else if(eyeball_timer_cnt

{

eyeball_cnt = 20;

eyeball_timer_cnt = 0;

}

//Sola ve sağa hareket ettir

// if(göz küresi_bayrağı == 0)

// {

// göz küresi_cnt++;

// if(gözküresi_cnt >= 94)

// {

// göz küresi_bayrağı = 1;

// }

// }

// başka

// {

// göz küresi_cnt–;

// if(gözküresi_cnt

// {

// göz küresi_bayrağı = 0;

// }

// }

if(gözküresi_cnt >= 0)

{

göz küresi_pos[0] = 0×00;

göztopu_pos[1] = göztopu_cnt;

}

başka

{

eyeball_pos[0] = 0xFF;

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

}

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

}

void eyeball_run()

{

statik u32 run_timer_cnt = 0;

run_timer_cnt++;

if(run_timer_cnt >= 20000)

{

run_timer_cnt = 0;

animasyonlu_göztopu();

}

}

5. Yüzü takip eden gözlerin hareketini gerçekleştirmek için ESP32 yüz tanıma özelliğini ekleyin.

Buradaki işleme yöntemi, yüz tespit edildiğinde gözlerin kendiliğinden hareket etmemesi ve while döngüsünde artacak bir değişken tanımlanmasıdır. Artış belli bir değere ulaştığında gözbebekleri kendiliğinden hareket edecektir. Seri port veri aldığında bu değişken silinecek ve ardından gözler yalnızca yüzün konumuna göre hareket ettirilecektir. Ana kod aşağıdaki gibidir:

if(rec_data_timer_cnt

{

rec_data_timer_cnt++;

}

başka

{

göztopu_run();

}

harici u32 rec_data_timer_cnt;

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

Tanımla_8283(st);

#elif(Type_Communication==2)

Tanımla_Modbus(st);

#endif

uart[st].Rx_F=0;

uart[st].Rx_Num=0;

}

}


Gönderim zamanı: Haz-26-2023