DWIN सर्कुलर स्क्रीन पर आधारित स्मार्ट आई

——DWIN डेवलपर फोरम से

इस बार सभी के लिए अनुशंसित DWIN डेवलपर फोरम ओपन सोर्स प्रोजेक्ट मानव आंखों की गति का अनुकरण करने के लिए एक बहुत ही दिलचस्प दिनचर्या है।इंजीनियर ने नेत्रगोलक की गति, पलक झपकाने, चेहरे की पहचान और अनुसरण करने जैसे कार्यों को साकार करने के लिए कई मानव नेत्र चित्र सामग्रियों का उपयोग किया।

ओपन सोर्स समाधानों का परिचय:

1. यूआई छवि सामग्री

संपादक का नोट: DWIN स्मार्ट स्क्रीन यूआई विकास को पूरा करने के लिए चित्रों पर आधारित है, जो विभिन्न प्रदर्शन प्रभावों को आसानी से महसूस कर सकती है।

dytrgf (1)

2. इंटरफ़ेस विकास

डीजीयूएस सॉफ्टवेयर के माध्यम से इंटरफ़ेस विकसित करना अपेक्षाकृत सरल है, और केवल दो ग्राफिक नियंत्रण की आवश्यकता है।इस रूटीन में इंजीनियर ने 2.1 इंच की गोल स्मार्ट स्क्रीन को चुना।

dytrgf (2)

3. ब्लिंक एनिमेशन का एहसास करें

पलकों की तस्वीरें बारी-बारी से अंतराल पर प्रदर्शित होने दें:

//ब्लिंक एनिमेशन

शून्य ब्लिंक_एनिमैट(शून्य)

{

यदि(ब्लिंक_फ्लैग == 0)

{

ब्लिंक_सीएनटी++;

यदि(ब्लिंक_सीएनटी >=4)

{

ब्लिंक_फ्लैग = 1;

}

}

अन्य

{

ब्लिंक_सीएनटी–;

यदि(ब्लिंक_सीएनटी <= 0)

{

ब्लिंक_फ्लैग = 0;

}

}

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

}

शून्य ब्लिंक_रन()

{

स्थिर u32 run_timer_cnt = 0;

run_timer_cnt++;

यदि(run_timer_cnt >= 2000000)

{

run_timer_cnt = 0;

ब्लिंक_एनिमैट();

विलंब_एमएस(30);

ब्लिंक_एनिमैट();

विलंब_एमएस(30);

ब्लिंक_एनिमैट();

विलंब_एमएस(30);

ब्लिंक_एनिमैट();

विलंब_एमएस(30);

ब्लिंक_एनिमैट();

विलंब_एमएस(30);

ब्लिंक_एनिमैट();

विलंब_एमएस(30);

ब्लिंक_एनिमैट();

विलंब_एमएस(30);

ब्लिंक_एनिमैट();

विलंब_एमएस(30);

}

}

4. महसूस करें कि नेत्रगोलक स्वाभाविक रूप से बाएँ और दाएँ देखते हैं।

यह पलक झपकाने के समान है, लेकिन इसमें आंखों की गति को नियंत्रित करने के लिए क्रिस्टल ऑसिलेटर के समय की तुलना करने की आवश्यकता होती है।कई बार डिबगिंग के बाद, इंजीनियर ने कोड का निम्नलिखित सेट डिज़ाइन किया।

//नेत्रगोलक एनीमेशन

शून्य नेत्रगोलक_निमैट(शून्य)

{

नेत्रगोलक_टाइमर_सीएनटी++;

यदि(आईबॉल_टाइमर_सीएनटी <50)

{

नेत्रगोलक_सीएनटी = 20;

}

अन्यथा यदि(आईबॉल_टाइमर_सीएनटी <51)

{

नेत्रगोलक_सीएनटी = 50;

}

अन्यथा यदि(आईबॉल_टाइमर_सीएनटी <52)

{

नेत्रगोलक_सीएनटी = 80;

}

अन्यथा यदि(आईबॉल_टाइमर_सीएनटी <53)

{

नेत्रगोलक_सीएनटी = 94;

}

अन्यथा यदि(आईबॉल_टाइमर_सीएनटी <103)

{

नेत्रगोलक_सीएनटी = 94;

}

अन्यथा यदि(आईबॉल_टाइमर_सीएनटी <104)

{

नेत्रगोलक_सीएनटी = 80;

}

अन्यथा यदि(आईबॉल_टाइमर_सीएनटी <105)

{

नेत्रगोलक_सीएनटी = 50;

}

अन्यथा यदि(आईबॉल_टाइमर_सीएनटी <106)

{

नेत्रगोलक_सीएनटी = 20;

}

अन्यथा यदि(आईबॉल_टाइमर_सीएनटी <107)

{

नेत्रगोलक_सीएनटी = -10;

}

अन्यथा यदि(आईबॉल_टाइमर_सीएनटी <108)

{

नेत्रगोलक_सीएनटी = -40;

}

अन्यथा यदि(आईबॉल_टाइमर_सीएनटी <158)

{

नेत्रगोलक_सीएनटी = -54;

}

अन्यथा यदि(आईबॉल_टाइमर_सीएनटी <159)

{

नेत्रगोलक_सीएनटी = -40;

}

अन्यथा यदि(आईबॉल_टाइमर_सीएनटी < 160)

{

नेत्रगोलक_सीएनटी = -10;

}

अन्यथा यदि(आईबॉल_टाइमर_सीएनटी <161)

{

नेत्रगोलक_सीएनटी = 20;

नेत्रगोलक_टाइमर_सीएनटी = 0;

}

// बाएँ और दाएँ ले जाएँ

// यदि(नेत्र_ध्वज == 0)

// {

//आईबॉल_सीएनटी++;

// यदि(आईबॉल_सीएनटी >= 94)

// {

//नेत्रगोलक_ध्वज = 1;

// }

// }

// अन्य

// {

//eyeball_cnt–;

// यदि(आईबॉल_सीएनटी <= -54)

// {

//नेत्रगोलक_ध्वज = 0;

// }

// }

यदि(आईबॉल_सीएनटी >= 0)

{

नेत्रगोलक_pos[0] = 0×00;

आईबॉल_पॉज़[1] = आईबॉल_सीएनटी;

}

अन्य

{

नेत्रगोलक_pos[0] = 0xFF;

आईबॉल_पॉज़[1] = (आईबॉल_सीएनटी और 0xFF);

}

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

}

शून्य नेत्रगोलक_रन()

{

स्थिर u32 run_timer_cnt = 0;

run_timer_cnt++;

यदि(run_timer_cnt >= 20000)

{

run_timer_cnt = 0;

नेत्रगोलक_एनिमैट();

}

}

5. चेहरे के पीछे आंखों की गति का एहसास करने के लिए ESP32 चेहरा पहचान जोड़ें।

यहां प्रसंस्करण विधि यह है कि जब चेहरे का पता लगाया जाता है, तो आंखें अपने आप नहीं चलती हैं, और while लूप में वृद्धि के लिए एक चर को परिभाषित किया जाता है।जब वृद्धि एक निश्चित मूल्य तक पहुंच जाती है, तो आंखें अपने आप हिलने लगेंगी।जब सीरियल पोर्ट डेटा प्राप्त करता है, तो यह वेरिएबल साफ़ हो जाएगा, और उसके बाद केवल चेहरे की स्थिति के अनुसार आंखों को घुमाएं।मुख्य कोड इस प्रकार है:

यदि(rec_data_timer_cnt <1000000)

{

rec_data_timer_cnt++;

}

अन्य

{

नेत्रगोलक_रन();

}

बाहरी u32 rec_data_timer_cnt;

बाहरी यू16 आईबॉल_टाइमर_सीएनटी;

शून्य संचार_सीएमडी(यू8 सेंट)

{

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

{

rec_data_timer_cnt = 0;

नेत्रगोलक_टाइमर_सीएनटी = 0;

#यदि(प्रकार_संचार==1)

वर्णन_8283(सेंट);

#elif(प्रकार_संचार==2)

वर्णन_मोडबस(सेंट);

#अगर अंत

uart[st].Rx_F=0;

uart[st].Rx_Num=0;

}

}


पोस्ट समय: जून-26-2023