—— จากฟอรัมนักพัฒนา DWIN
โครงการโอเพ่นซอร์สฟอรัมนักพัฒนา DWIN ที่แนะนำสำหรับทุกคนในครั้งนี้เป็นกิจวัตรที่น่าสนใจมากสำหรับการจำลองการเคลื่อนไหวของดวงตามนุษย์วิศวกรใช้วัสดุรูปภาพจากดวงตามนุษย์หลายชิ้นเพื่อรับรู้การทำงานต่างๆ เช่น การเคลื่อนไหวของลูกตา การกะพริบตา การจดจำใบหน้า และการติดตาม
บทนำเกี่ยวกับโซลูชันโอเพ่นซอร์ส:
1. วัสดุรูปภาพ UI
หมายเหตุบรรณาธิการ: หน้าจออัจฉริยะ DWIN อิงตามรูปภาพเพื่อพัฒนา UI ให้สมบูรณ์ ซึ่งสามารถรับรู้เอฟเฟกต์การแสดงผลต่างๆ ได้อย่างง่ายดาย
2. การพัฒนาอินเทอร์เฟซ
การพัฒนาอินเทอร์เฟซผ่านซอฟต์แวร์ DGUS นั้นค่อนข้างง่าย และจำเป็นต้องมีการควบคุมกราฟิกเพียงสองตัวเท่านั้นในขั้นตอนนี้ วิศวกรเลือกหน้าจออัจฉริยะทรงกลมขนาด 2.1 นิ้ว
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