Smart Eye basierend auf dem DWIN-Rundbildschirm

——Vom DWIN-Entwicklerforum

Das Open-Source-Projekt des DWIN-Entwicklerforums, das dieses Mal allen empfohlen wird, ist eine sehr interessante Routine zur Simulation der Bewegung menschlicher Augen.Der Ingenieur nutzte mehrere Bildmaterialien des menschlichen Auges, um Funktionen wie Augapfelbewegung, Blinzeln, Gesichtserkennung und Verfolgung zu realisieren.

Einführung in Open-Source-Lösungen:

1. UI-Bildmaterial

Anmerkung des Herausgebers: Der DWIN Smart Screen basiert auf Bildern, um die Entwicklung der Benutzeroberfläche abzuschließen, wodurch verschiedene Anzeigeeffekte problemlos realisiert werden können.

dytrgf (1)

2. Schnittstellenentwicklung

Die Entwicklung der Schnittstelle über die DGUS-Software ist relativ einfach und es werden nur zwei grafische Steuerelemente benötigt.In dieser Routine wählte der Ingenieur einen runden 2,1-Zoll-Smart-Screen.

dytrgf (2)

3. Realisieren Sie eine Blinkanimation

Lassen Sie die Bilder der Augenlider abwechselnd in Abständen anzeigen:

//Blinkanimation

void blink_animat(void)

{

if(blink_flag == 0)

{

blink_cnt++;

if(blink_cnt >= 4)

{

blink_flag = 1;

}

}

anders

{

blink_cnt–;

if(blink_cnt <= 0)

{

blink_flag = 0;

}

}

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

}

void blink_run()

{

static u32 run_timer_cnt = 0;

run_timer_cnt++;

if(run_timer_cnt >= 2000000)

{

run_timer_cnt = 0;

blink_animat();

Verzögerung_ms(30);

blink_animat();

Verzögerung_ms(30);

blink_animat();

Verzögerung_ms(30);

blink_animat();

Verzögerung_ms(30);

blink_animat();

Verzögerung_ms(30);

blink_animat();

Verzögerung_ms(30);

blink_animat();

Verzögerung_ms(30);

blink_animat();

Verzögerung_ms(30);

}

}

4. Erkennen Sie, dass die Augäpfel auf natürliche Weise nach links und rechts schauen.

Dies ähnelt dem Blinzeln, erfordert jedoch einen Vergleich der Zeit des Quarzoszillators, um die Augenbewegung zu steuern.Nach mehrmaligem Debuggen entwarf der Ingenieur den folgenden Codesatz.

//Augapfelanimation

void eyeball_animat(void)

{

eyeball_timer_cnt++;

if(eyeball_timer_cnt < 50)

{

eyeball_cnt = 20;

}

sonst wenn(eyeball_timer_cnt < 51)

{

eyeball_cnt = 50;

}

sonst wenn(eyeball_timer_cnt < 52)

{

eyeball_cnt = 80;

}

sonst wenn(eyeball_timer_cnt < 53)

{

eyeball_cnt = 94;

}

sonst if(eyeball_timer_cnt < 103)

{

eyeball_cnt = 94;

}

sonst if(eyeball_timer_cnt < 104)

{

eyeball_cnt = 80;

}

sonst if(eyeball_timer_cnt < 105)

{

eyeball_cnt = 50;

}

sonst if(eyeball_timer_cnt < 106)

{

eyeball_cnt = 20;

}

sonst if(eyeball_timer_cnt < 107)

{

eyeball_cnt = -10;

}

sonst if(eyeball_timer_cnt < 108)

{

eyeball_cnt = -40;

}

sonst if(eyeball_timer_cnt < 158)

{

eyeball_cnt = -54;

}

sonst if(eyeball_timer_cnt < 159)

{

eyeball_cnt = -40;

}

sonst if(eyeball_timer_cnt < 160)

{

eyeball_cnt = -10;

}

sonst if(eyeball_timer_cnt < 161)

{

eyeball_cnt = 20;

eyeball_timer_cnt = 0;

}

//Nach links und rechts bewegen

// if(eyeball_flag == 0)

// {

// eyeball_cnt++;

// if(eyeball_cnt >= 94)

// {

// eyeball_flag = 1;

// }

// }

// anders

// {

// eyeball_cnt–;

// if(eyeball_cnt <= -54)

// {

// eyeball_flag = 0;

// }

// }

if(eyeball_cnt >= 0)

{

eyeball_pos[0] = 0×00;

eyeball_pos[1] = eyeball_cnt;

}

anders

{

eyeball_pos[0] = 0xFF;

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

}

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

}

void eyeball_run()

{

static u32 run_timer_cnt = 0;

run_timer_cnt++;

if(run_timer_cnt >= 20000)

{

run_timer_cnt = 0;

eyeball_animat();

}

}

5. Fügen Sie die ESP32-Gesichtserkennung hinzu, um die Bewegung der Augen zu erkennen, die dem Gesicht folgt.

Die Verarbeitungsmethode besteht hier darin, dass sich die Augen nicht von selbst bewegen, wenn das Gesicht erkannt wird, und eine Variable definiert wird, die in der while-Schleife inkrementiert wird.Wenn das Inkrement einen bestimmten Wert erreicht, bewegen sich die Augäpfel von selbst.Wenn die serielle Schnittstelle Daten empfängt, wird diese Variable gelöscht und die Augen werden dann nur noch entsprechend der Gesichtsposition bewegt.Der Hauptcode lautet wie folgt:

if(rec_data_timer_cnt < 1000000)

{

rec_data_timer_cnt++;

}

anders

{

eyeball_run();

}

extern u32 rec_data_timer_cnt;

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

Describe_8283(st);

#elif(Type_Communication==2)

Describe_Modbus(st);

#endif

uart[st].Rx_F=0;

uart[st].Rx_Num=0;

}

}


Zeitpunkt der Veröffentlichung: 26. Juni 2023