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

——DWIN Geliştirici Forumundan

Bu kez herkese önerilen DWIN geliştirici forumu açık kaynak projesi, insan gözünün hareketini simüle etmek için çok ilginç bir rutin.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 malzemeleri kullandı.

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

1. UI resim malzemesi

Editörün notu: DWIN akıllı ekranı, çeşitli görüntü efektlerini kolayca gerçekleştirebilen UI geliştirmeyi 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 gereklidir.Mühendis bu rutinde 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 resimleri sırayla ve aralıklarla gösterilsin:

//Yanıp sönme animasyonu

geçersiz flash_animat(geçersiz)

{

if(blink_flag == 0)

{

yanıp sönen_cnt++;

eğer(blink_cnt >= 4)

{

yanıp sönen_bayrak = 1;

}

}

başka

{

yanıp sönme_cnt–;

eğer(blink_cnt <= 0)

{

yanıp sönen_bayrak = 0;

}

}

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

}

geçersiz flash_run()

{

statik u32 run_timer_cnt = 0;

run_timer_cnt++;

if(run_timer_cnt >= 2000000)

{

run_timer_cnt = 0;

flash_animat();

Gecikme_ms(30);

flash_animat();

Gecikme_ms(30);

flash_animat();

Gecikme_ms(30);

flash_animat();

Gecikme_ms(30);

flash_animat();

Gecikme_ms(30);

flash_animat();

Gecikme_ms(30);

flash_animat();

Gecikme_ms(30);

flash_animat();

Gecikme_ms(30);

}

}

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

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

//Göz küresi animasyonu

geçersiz eyeball_animat(void)

{

eyeball_timer_cnt++;

eğer(eyeball_timer_cnt < 50)

{

göz küresi_cnt = 20;

}

başka if(eyeball_timer_cnt < 51)

{

göz küresi_cnt = 50;

}

başka if(eyeball_timer_cnt < 52)

{

göz küresi_cnt = 80;

}

başka if(eyeball_timer_cnt < 53)

{

göz küresi_cnt = 94;

}

başka if(eyeball_timer_cnt < 103)

{

göz küresi_cnt = 94;

}

başka if(eyeball_timer_cnt < 104)

{

göz küresi_cnt = 80;

}

başka if(eyeball_timer_cnt < 105)

{

göz küresi_cnt = 50;

}

başka if(eyeball_timer_cnt < 106)

{

göz küresi_cnt = 20;

}

başka if(eyeball_timer_cnt < 107)

{

göz küresi_cnt = -10;

}

başka if(eyeball_timer_cnt < 108)

{

eyeball_cnt = -40;

}

başka if(eyeball_timer_cnt < 158)

{

göz küresi_cnt = -54;

}

başka if(eyeball_timer_cnt < 159)

{

eyeball_cnt = -40;

}

başka if(eyeball_timer_cnt < 160)

{

göz küresi_cnt = -10;

}

başka if(eyeball_timer_cnt < 161)

{

göz küresi_cnt = 20;

eyeball_timer_cnt = 0;

}

//Sola ve sağa hareket et

// if(eyeball_flag == 0)

// {

// göz küresi_cnt++;

// if(eyeball_cnt >= 94)

// {

// eyeball_flag = 1;

// }

// }

// başka

// {

// göz küresi_cnt–;

// if(eyeball_cnt <= -54)

// {

// eyeball_flag = 0;

// }

// }

if(eyeball_cnt >= 0)

{

eyeball_pos[0] = 0×00;

eyeball_pos[1] = eyeball_cnt;

}

başka

{

eyeball_pos[0] = 0xFF;

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

}

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

}

geçersiz eyeball_run()

{

statik u32 run_timer_cnt = 0;

run_timer_cnt++;

if(run_timer_cnt >= 20000)

{

run_timer_cnt = 0;

eyeball_animat();

}

}

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 algılandığında gözler kendiliğinden hareket etmiyor ve while döngüsünde artacak bir değişken tanımlanıyor.Artış belirli bir değere ulaştığında, gözbebekleri kendiliğinden hareket edecektir.Seri bağlantı noktası veri aldığında, bu değişken temizlenecek ve ardından gözleri yalnızca yüzün konumuna göre hareket ettirecektir.Ana kod aşağıdaki gibidir:

eğer(rec_data_timer_cnt < 1000000)

{

rec_data_timer_cnt++;

}

başka

{

eyeball_run();

}

harici u32 rec_data_timer_cnt;

harici u16 eyeball_timer_cnt;

geçersiz İletişim_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ı: 26 Haziran 2023