——З форуму розробників DWIN
Проект з відкритим кодом на форумі розробників DWIN, рекомендований усім цього разу, є дуже цікавою програмою для моделювання руху людських очей.Інженер використовував кілька зображень людського ока, щоб реалізувати такі функції, як рух очного яблука, моргання, розпізнавання обличчя та слідування.
Вступ до рішень з відкритим кодом:
1. Інтерфейс зображення матеріалу
Примітка редактора: розумний екран DWIN базується на зображеннях для завершення розробки інтерфейсу користувача, який може легко реалізувати різні ефекти відображення.
2. Розробка інтерфейсу
Розробити інтерфейс за допомогою програмного забезпечення DGUS відносно просто, і потрібні лише два графічні елементи керування.У цій рутині інженер вибрав 2,1-дюймовий круглий смарт-екран.
3. Реалізуйте анімацію миготіння
Нехай зображення повік відображаються по черзі з інтервалами:
//Анімація миготіння
void blink_animat(void)
{
if(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);
}
void 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. Усвідомте, що очні яблука дивляться вліво і вправо природним чином.
Це схоже на моргання, але для контролю руху очей потрібно порівнювати час кварцевого генератора.Після багаторазового налагодження інженер розробив наступний набір кодів.
//Анімація очного яблука
void eyeball_animat(void)
{
eyeball_timer_cnt++;
if(eyeball_timer_cnt < 50)
{
eyeball_cnt = 20;
}
інакше якщо (yeball_timer_cnt < 51)
{
eyeball_cnt = 50;
}
інакше якщо (yeball_timer_cnt < 52)
{
eyeball_cnt = 80;
}
інакше якщо (yeball_timer_cnt < 53)
{
eyeball_cnt = 94;
}
інакше якщо (yeball_timer_cnt < 103)
{
eyeball_cnt = 94;
}
інакше якщо (yeball_timer_cnt < 104)
{
eyeball_cnt = 80;
}
інакше якщо (yeball_timer_cnt < 105)
{
eyeball_cnt = 50;
}
інакше якщо (yeball_timer_cnt < 106)
{
eyeball_cnt = 20;
}
інакше якщо (yeball_timer_cnt < 107)
{
eyeball_cnt = -10;
}
інакше якщо (yeball_timer_cnt < 108)
{
eyeball_cnt = -40;
}
інакше якщо (yeball_timer_cnt < 158)
{
eyeball_cnt = -54;
}
інакше якщо (yeball_timer_cnt < 159)
{
eyeball_cnt = -40;
}
інакше якщо (yeball_timer_cnt < 160)
{
eyeball_cnt = -10;
}
інакше якщо (yeball_timer_cnt < 161)
{
eyeball_cnt = 20;
eyeball_timer_cnt = 0;
}
//Переміщення вліво і вправо
// if(eyeball_flag == 0)
// {
// eyeball_cnt++;
// якщо (yeball_cnt >= 94)
// {
// eyeball_flag = 1;
// }
// }
// ще
// {
// eyeball_cnt–;
// if(eyeball_cnt <= -54)
// {
// eyeball_flag = 0;
// }
// }
if(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 *)&yeball_pos, 2);
}
void eyeball_run()
{
статичний u32 run_timer_cnt = 0;
run_timer_cnt++;
якщо (run_timer_cnt >= 20000)
{
run_timer_cnt = 0;
eyeball_animat();
}
}
5. Додайте функцію розпізнавання обличчя ESP32, щоб усвідомити рух очей за обличчям.
Метод обробки тут полягає в тому, що коли виявляється обличчя, очі не рухаються самі по собі, а змінна визначається для збільшення в циклі while.Коли приріст досягне певного значення, очні яблука рухатимуться самі.Коли послідовний порт отримує дані, ця змінна буде очищена, а потім лише рухайте очі відповідно до положення обличчя.Основний код виглядає наступним чином:
if(rec_data_timer_cnt < 1000000)
{
rec_data_timer_cnt++;
}
інше
{
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)
Описати_8283(st);
#elif(Type_Communication==2)
Описати_Modbus(st);
#endif
uart[st].Rx_F=0;
uart[st].Rx_Num=0;
}
}
Час публікації: 26 червня 2023 р