Smart Eye ขึ้นอยู่กับ DWIN Circular Screen

—— จากฟอรัมนักพัฒนา DWIN

โครงการโอเพ่นซอร์สฟอรัมนักพัฒนา DWIN ที่แนะนำสำหรับทุกคนในครั้งนี้เป็นกิจวัตรที่น่าสนใจมากสำหรับการจำลองการเคลื่อนไหวของดวงตามนุษย์วิศวกรใช้วัสดุรูปภาพจากดวงตามนุษย์หลายชิ้นเพื่อรับรู้การทำงานต่างๆ เช่น การเคลื่อนไหวของลูกตา การกะพริบตา การจดจำใบหน้า และการติดตาม

บทนำเกี่ยวกับโซลูชันโอเพ่นซอร์ส:

1. วัสดุรูปภาพ UI

หมายเหตุบรรณาธิการ: หน้าจออัจฉริยะ DWIN อิงตามรูปภาพเพื่อพัฒนา UI ให้สมบูรณ์ ซึ่งสามารถรับรู้เอฟเฟกต์การแสดงผลต่างๆ ได้อย่างง่ายดาย

ไดเทอร์ฟ (1)

2. การพัฒนาอินเทอร์เฟซ

การพัฒนาอินเทอร์เฟซผ่านซอฟต์แวร์ DGUS นั้นค่อนข้างง่าย และจำเป็นต้องมีการควบคุมกราฟิกเพียงสองตัวเท่านั้นในขั้นตอนนี้ วิศวกรเลือกหน้าจออัจฉริยะทรงกลมขนาด 2.1 นิ้ว

ไดเทอร์ฟ (2)

3. ตระหนักถึงภาพเคลื่อนไหวกะพริบ

ให้ภาพของเปลือกตาปรากฏขึ้นเป็นระยะๆ:

// ภาพเคลื่อนไหวกะพริบ

เป็นโมฆะ blink_animat (เป็นโมฆะ)

{

ถ้า (blink_flag == 0)

{

Blink_cnt++;

ถ้า(blink_cnt >= 4)

{

blink_flag = 1;

}

}

อื่น

{

Blink_cnt–;

ถ้า (blink_cnt <= 0)

{

blink_flag = 0;

}

}

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

}

เป็นโมฆะ blink_run()

{

คงที่ u32 run_timer_cnt = 0;

run_timer_cnt++;

ถ้า (run_timer_cnt >= 2000000)

{

run_timer_cnt = 0;

Blink_animat();

Delay_ms(30);

Blink_animat();

Delay_ms(30);

Blink_animat();

Delay_ms(30);

Blink_animat();

Delay_ms(30);

Blink_animat();

Delay_ms(30);

Blink_animat();

Delay_ms(30);

Blink_animat();

Delay_ms(30);

Blink_animat();

Delay_ms(30);

}

}

4. สังเกตการมองซ้ายขวาของลูกตาอย่างเป็นธรรมชาติ

ลักษณะนี้คล้ายกับการกะพริบตา แต่จำเป็นต้องเปรียบเทียบเวลาของคริสตัลออสซิลเลเตอร์เพื่อควบคุมการเคลื่อนไหวของดวงตาหลังจากการดีบักหลายครั้ง วิศวกรได้ออกแบบชุดโค้ดต่อไปนี้

// แอนิเมชั่นลูกตา

เป็นโมฆะ eyeball_animat (เป็นโมฆะ)

{

eyeball_timer_cnt++;

ถ้า (eyeball_timer_cnt < 50)

{

eyeball_cnt = 20;

}

อื่นถ้า(eyeball_timer_cnt < 51)

{

eyeball_cnt = 50;

}

อื่นถ้า(eyeball_timer_cnt < 52)

{

eyeball_cnt = 80;

}

อื่นถ้า(eyeball_timer_cnt < 53)

{

eyeball_cnt = 94;

}

อื่นถ้า(eyeball_timer_cnt < 103)

{

eyeball_cnt = 94;

}

อื่นถ้า(eyeball_timer_cnt < 104)

{

eyeball_cnt = 80;

}

อื่นถ้า(eyeball_timer_cnt < 105)

{

eyeball_cnt = 50;

}

อื่นถ้า(eyeball_timer_cnt < 106)

{

eyeball_cnt = 20;

}

อื่นถ้า(eyeball_timer_cnt < 107)

{

eyeball_cnt = -10;

}

อื่นถ้า(eyeball_timer_cnt < 108)

{

eyeball_cnt = -40;

}

อื่นถ้า(eyeball_timer_cnt < 158)

{

eyeball_cnt = -54;

}

อื่นถ้า(eyeball_timer_cnt < 159)

{

eyeball_cnt = -40;

}

อื่นถ้า(eyeball_timer_cnt < 160)

{

eyeball_cnt = -10;

}

อื่นถ้า(eyeball_timer_cnt < 161)

{

eyeball_cnt = 20;

eyeball_timer_cnt = 0;

}

// เลื่อนไปทางซ้ายและขวา

// ถ้า (eyeball_flag == 0)

// {

// eyeball_cnt++;

// ถ้า(eyeball_cnt >= 94)

// {

// eyeball_flag = 1;

// }

// }

// อื่น

// {

//eyeball_cnt–;

// ถ้า (eyeball_cnt <= -54)

// {

// eyeball_flag = 0;

// }

// }

ถ้า(eyeball_cnt >= 0)

{

eyeball_pos[0] = 0×00;

eyeball_pos[1] = eyeball_cnt;

}

อื่น

{

eyeball_pos[0] = 0xFF;

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

}

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

}

เป็นโมฆะ eyeball_run()

{

คงที่ u32 run_timer_cnt = 0;

run_timer_cnt++;

ถ้า (run_timer_cnt >= 20,000)

{

run_timer_cnt = 0;

ลูกตา_animat();

}

}

5. เพิ่มการจดจำใบหน้า ESP32 เพื่อรับรู้การเคลื่อนไหวของดวงตาตามใบหน้า

วิธีการประมวลผลคือเมื่อตรวจพบใบหน้า ดวงตาจะไม่ขยับเอง และกำหนดตัวแปรให้เพิ่มขึ้นในลูป whileเมื่อเพิ่มขึ้นถึงค่าหนึ่ง ลูกตาจะขยับเองเมื่อพอร์ตอนุกรมได้รับข้อมูล ตัวแปรนี้จะถูกล้าง จากนั้นจะขยับตาตามตำแหน่งของใบหน้าเท่านั้นรหัสหลักมีดังนี้:

ถ้า (rec_data_timer_cnt < 1000000)

{

rec_data_timer_cnt++;

}

อื่น

{

eyeball_run();

}

ภายนอก u32 rec_data_timer_cnt;

ภายนอก u16 eyeball_timer_cnt;

เป็นโมฆะ Communication_CMD (u8 st)

{

ถ้า((uart[st].Rx_F==1 )&&(uart[st].Rx_T==0))

{

rec_data_timer_cnt = 0;

eyeball_timer_cnt = 0;

#if(ประเภท_การสื่อสาร==1)

Describe_8283(เซนต์);

#elif(ประเภท_การสื่อสาร==2)

Describe_Modbus(เซนต์);

#เอนดิฟ

uart[st].Rx_F=0;

uart[st].Rx_Num=0;

}

}


เวลาโพสต์: มิ.ย.-26-2023