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 to bardzo interesująca procedura symulująca ruch ludzkich oczu. Inżynier wykorzystał kilka materiałów obrazujących ludzkie oko, aby zrealizować takie funkcje, jak ruch gałek ocznych, mruganie, rozpoznawanie twarzy i śledzenie.

Wprowadzenie do rozwiązań open source:

1. Materiał obrazu interfejsu użytkownika

Nota wydawcy: Inteligentny ekran DWIN opiera się 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 dwa elementy sterujące graficzne. W ramach tej procedury inżynier wybrał okrągły, inteligentny ekran o przekątnej 2,1 cala.

dytrgf (2)

3. Zrealizuj animację mrugnięcia

Niech zdjęcia powiek będą wyświetlane kolejno w odstępach czasu:

//Animacja mrugnięcia

unieważnij miganie_animat(pustka)

{

if(blink_flag == 0)

{

mrugnięcie_cnt++;

if(blink_cnt >= 4)

{

flaga_mrugania = 1;

}

}

w przeciwnym razie

{

mrugnięcie_cnt–;

if(blink_cnt

{

flaga_mrugania = 0;

}

}

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

}

unieważnij miganie_run()

{

statyczny u32 run_timer_cnt = 0;

run_timer_cnt++;

if(run_timer_cnt >= 2000000)

{

run_timer_cnt = 0;

mrugnięcie_animowane();

Opóźnienie_ms(30);

mrugnięcie_animowane();

Opóźnienie_ms(30);

mrugnięcie_animowane();

Opóźnienie_ms(30);

mrugnięcie_animowane();

Opóźnienie_ms(30);

mrugnięcie_animowane();

Opóźnienie_ms(30);

mrugnięcie_animowane();

Opóźnienie_ms(30);

mrugnięcie_animowane();

Opóźnienie_ms(30);

mrugnięcie_animowane();

Opóźnienie_ms(30);

}

}

4. Zdaj sobie sprawę, że gałki oczne naturalnie patrzą w lewo i w prawo.

Przypomina to mruganie, ale wymaga porównania czasu oscylatora kwarcowego, aby kontrolować ruch gałek ocznych. Po wielokrotnym debugowaniu inżynier zaprojektował następujący zestaw kodów.

//Animacja gałki ocznej

void eyeball_animat(void)

{

timer_gałki ocznej_cnt++;

if(eyeball_timer_cnt

{

gałka oczna_cnt = 20;

}

else if(eyeball_timer_cnt

{

gałka oczna_cnt = 50;

}

else if(eyeball_timer_cnt

{

gałka oczna_cnt = 80;

}

else if(eyeball_timer_cnt

{

gałka oczna_cnt = 94;

}

else if(eyeball_timer_cnt

{

gałka oczna_cnt = 94;

}

else if(eyeball_timer_cnt

{

gałka oczna_cnt = 80;

}

else if(eyeball_timer_cnt

{

gałka oczna_cnt = 50;

}

else if(eyeball_timer_cnt

{

gałka oczna_cnt = 20;

}

else if(eyeball_timer_cnt

{

gałka oczna_cnt = -10;

}

else if(eyeball_timer_cnt

{

gałka oczna_cnt = -40;

}

else if(eyeball_timer_cnt

{

gałka oczna_cnt = -54;

}

else if(eyeball_timer_cnt

{

gałka oczna_cnt = -40;

}

else if(eyeball_timer_cnt

{

gałka oczna_cnt = -10;

}

else if(eyeball_timer_cnt

{

gałka oczna_cnt = 20;

timer_gałki ocznej_cnt = 0;

}

//Poruszaj się w lewo i w prawo

// if(flaga_gałki ocznej == 0)

// {

// gałka oczna_cnt++;

// if(eyeball_cnt >= 94)

// {

//flaga_gałki ocznej = 1;

// }

// }

// w przeciwnym razie

// {

// gałka oczna_cnt–;

// if(gałka oczna_cnt

// {

//flaga_gałki ocznej = 0;

// }

// }

if(gałka oczna_cnt >= 0)

{

gałka oczna_pos[0] = 0×00;

gałka oczna_pos[1] = gałka oczna_cnt;

}

w przeciwnym razie

{

gałka oczna_pos[0] = 0xFF;

gałka oczna_pos[1] = (gałka oczna_cnt & 0xFF);

}

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

}

unieważnij eyeball_run()

{

statyczny u32 run_timer_cnt = 0;

run_timer_cnt++;

if(run_timer_cnt >= 20000)

{

run_timer_cnt = 0;

animowana_gałka oczna();

}

}

5. Dodaj rozpoznawanie twarzy ESP32, aby zrealizować ruch oczu podążających za twarzą.

Metoda przetwarzania polega na tym, że po wykryciu twarzy oczy same się nie poruszają, a w pętli while zdefiniowana jest zmienna, która będzie zwiększana. Kiedy przyrost osiągnie określoną wartość, gałki oczne same się poruszą. Gdy port szeregowy odbierze dane, zmienna ta zostanie wyczyszczona, a następnie poruszone zostaną jedynie oczy zgodnie z pozycją twarzy. Główny kod jest następujący:

if(rec_data_timer_cnt

{

rec_data_timer_cnt++;

}

w przeciwnym razie

{

gałka oczna_run();

}

zewnętrzny u32 rec_data_timer_cnt;

zewnętrzny u16 eyeball_timer_cnt;

nieważna komunikacja_CMD(u8 st)

{

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

{

rec_data_timer_cnt = 0;

timer_gałki ocznej_cnt = 0;

#if(Type_Communication==1)

Opisz_8283(st);

#elif(Typ_komunikacji==2)

Opisz_Modbus(st);

#endif

uart[st].Rx_F=0;

uart[st].Rx_Num=0;

}

}


Czas publikacji: 26 czerwca 2023 r