Inteligentne oko oparte na okrągłym ekranie DWIN

——Z forum programistów DWIN

Polecany wszystkim tym razem projekt open source na forum programistów DWIN jest bardzo interesującą procedurą symulowania ruchu ludzkich oczu.Inżynier użył kilku materiałów obrazu ludzkiego oka, aby zrealizować funkcje, takie jak ruch gałek ocznych, mruganie, rozpoznawanie twarzy i śledzenie.

Wprowadzenie do rozwiązań open source:

1. Materiał obrazu interfejsu użytkownika

Uwaga edytora: Inteligentny ekran DWIN jest oparty na obrazach, aby ukończyć rozwój interfejsu użytkownika, który może z łatwością realizować różne efekty wyświetlania.

dytrgf (1)

2. Rozwój interfejsu

Opracowanie interfejsu za pomocą oprogramowania DGUS jest stosunkowo proste i potrzebne są tylko dwie kontrolki graficzne.W tej procedurze inżynier wybrał okrągły inteligentny ekran o przekątnej 2,1 cala.

dytrgf (2)

3. Realizuj animację migania

Niech obrazy powiek będą wyświetlane po kolei w odstępach:

//Animacja migania

void blink_animat(void)

{

if(flaga_mrugania == 0)

{

miga_cnt++;

if(blink_cnt >= 4)

{

migająca flaga = 1;

}

}

w przeciwnym razie

{

miga_cnt–;

if(blink_cnt <= 0)

{

migająca flaga = 0;

}

}

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

}

unieważnienie blink_run()

{

statyczny u32 run_timer_cnt = 0;

run_timer_cnt++;

if(run_timer_cnt >= 2000000)

{

run_timer_cnt = 0;

miga_animat();

Delay_ms(30);

miga_animat();

Delay_ms(30);

miga_animat();

Delay_ms(30);

miga_animat();

Delay_ms(30);

miga_animat();

Delay_ms(30);

miga_animat();

Delay_ms(30);

miga_animat();

Delay_ms(30);

miga_animat();

Delay_ms(30);

}

}

4. Uświadom sobie, że gałki oczne patrzą naturalnie w lewo iw prawo.

Jest to podobne do mrugania, ale wymaga porównania czasu oscylatora kwarcowego, aby kontrolować ruch gałek ocznych.Po wielu próbach debugowania inżynier zaprojektował następujący zestaw kodów.

//Animacja gałki ocznej

void eyeball_animat(void)

{

eyeball_timer_cnt++;

if(eyeball_timer_cnt < 50)

{

gałka oczna_cnt = 20;

}

inaczej if(eyeball_timer_cnt < 51)

{

gałka oczna_cnt = 50;

}

inaczej if(eyeball_timer_cnt < 52)

{

gałka oczna_cnt = 80;

}

inaczej if(eyeball_timer_cnt < 53)

{

gałka oczna_cnt = 94;

}

inaczej if(eyeball_timer_cnt < 103)

{

gałka oczna_cnt = 94;

}

inaczej if(eyeball_timer_cnt < 104)

{

gałka oczna_cnt = 80;

}

inaczej if(eyeball_timer_cnt < 105)

{

gałka oczna_cnt = 50;

}

inaczej if(eyeball_timer_cnt < 106)

{

gałka oczna_cnt = 20;

}

inaczej if(eyeball_timer_cnt < 107)

{

gałka oczna_cnt = -10;

}

inaczej if(eyeball_timer_cnt < 108)

{

gałka oczna_cnt = -40;

}

inaczej if(eyeball_timer_cnt < 158)

{

gałka oczna_cnt = -54;

}

inaczej if(eyeball_timer_cnt < 159)

{

gałka oczna_cnt = -40;

}

inaczej if(eyeball_timer_cnt < 160)

{

gałka oczna_cnt = -10;

}

inaczej if(eyeball_timer_cnt < 161)

{

gałka oczna_cnt = 20;

eyeball_timer_cnt = 0;

}

//Przesuń w lewo iw prawo

// if(eyeball_flag == 0)

// {

// gałka oczna_cnt++;

// if(eyeball_cnt >= 94)

// {

// flaga gałki ocznej = 1;

// }

// }

// w przeciwnym razie

// {

// gałka oczna_cnt–;

// if(eyeball_cnt <= -54)

// {

// flaga gałki ocznej = 0;

// }

// }

if(gałka oczna_cnt >= 0)

{

pozycja_gałki ocznej[0] = 0×00;

pozycja_gałki ocznej[1] = punkt_gałki ocznej;

}

w przeciwnym razie

{

pozycja_gałki ocznej[0] = 0xFF;

pozycja_gałki ocznej[1] = (cnt_gałki ocznej & 0xFF);

}

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

}

unieważnienie eyeball_run()

{

statyczny u32 run_timer_cnt = 0;

run_timer_cnt++;

if(run_timer_cnt >= 20000)

{

run_timer_cnt = 0;

gałka oczna_animat();

}

}

5. Dodaj rozpoznawanie twarzy ESP32, aby uświadomić sobie ruch oczu podążający za twarzą.

Metoda przetwarzania polega na tym, że po wykryciu twarzy oczy nie poruszają się same, a zmienna jest zdefiniowana tak, aby zwiększała się w pętli while.Kiedy przyrost osiągnie określoną wartość, gałki oczne same się poruszą.Kiedy port szeregowy odbiera dane, ta zmienna zostanie wyczyszczona, a następnie tylko przesuń oczy zgodnie z pozycją twarzy.Główny kod jest następujący:

if(rec_data_timer_cnt < 1000000)

{

rec_data_timer_cnt++;

}

w przeciwnym razie

{

eyeball_run();

}

extern u32 rec_data_timer_cnt;

extern u16 eyeball_timer_cnt;

unieważnienie komunikacji_CMD (u8 st)

{

if((uart[st].Rx_F==1 )&&(uart[st].Rx_T==0))

{

rec_data_timer_cnt = 0;

eyeball_timer_cnt = 0;

#if(Typ_Komunikacja==1)

Opisz_8283(st);

#elif(Typ_Komunikacja==2)

Opisz_Modbus(st);

#endif

uart[st].Rx_F=0;

uart[st].Rx_Num=0;

}

}


Czas postu: 26 czerwca 2023 r