——З форуму распрацоўшчыкаў DWIN
Праект з адкрытым зыходным кодам на форуме распрацоўшчыкаў DWIN, рэкамендаваны ўсім на гэты раз, - гэта вельмі цікавая праграма для мадэлявання руху чалавечых вачэй.Інжынер выкарыстаў некалькі малюнкаў чалавечага вока, каб рэалізаваць такія функцыі, як рух вочнага яблыка, мірганне, распазнаванне твару і сачэнне.
Уводзіны ў рашэнні з адкрытым зыходным кодам:
1. Матэрыял малюнка карыстацкага інтэрфейсу
Заўвага рэдактара: разумны экран DWIN заснаваны на малюнках для завяршэння распрацоўкі карыстацкага інтэрфейсу, які можа лёгка рэалізаваць розныя эфекты адлюстравання.
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();
Затрымка_мс(30);
blink_animat();
Затрымка_мс(30);
blink_animat();
Затрымка_мс(30);
blink_animat();
Затрымка_мс(30);
blink_animat();
Затрымка_мс(30);
blink_animat();
Затрымка_мс(30);
blink_animat();
Затрымка_мс(30);
blink_animat();
Затрымка_мс(30);
}
}
4. Зразумейце, што вочныя яблыкі глядзяць налева і направа натуральным чынам.
Гэта падобна на мірганне, але для кіравання рухам вачэй трэба параўноўваць час кварцавага генератара.Пасля шматразовай адладкі інжынер распрацаваў наступны набор кодаў.
//Анімацыя вочнага яблыка
пустата eyeball_animat(пустата)
{
eyeball_timer_cnt++;
if(yeyeball_timer_cnt < 50)
{
вочны яблык_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;
}
інакш, калі (yeyeball_timer_cnt < 105)
{
eyeball_cnt = 50;
}
інакш, калі (eyeball_timer_cnt < 106)
{
вочны яблык_cnt = 20;
}
інакш, калі (eyeball_timer_cnt < 107)
{
eyeball_cnt = -10;
}
інакш, калі (yeyeball_timer_cnt < 108)
{
eyeball_cnt = -40;
}
інакш, калі (yeyeball_timer_cnt < 158)
{
eyeball_cnt = -54;
}
інакш, калі (eyeball_timer_cnt < 159)
{
eyeball_cnt = -40;
}
інакш, калі (eyeball_timer_cnt < 160)
{
eyeball_cnt = -10;
}
інакш, калі (eyeball_timer_cnt < 161)
{
вочны яблык_cnt = 20;
eyeball_timer_cnt = 0;
}
// Рух налева і направа
// калі (сцяг_вочнага яблыка == 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 >= 20000)
{
run_timer_cnt = 0;
анімат_вочнага яблыка();
}
}
5. Дадайце функцыю распазнання твару ESP32, каб усвядоміць рух вачэй, якія сочаць за тварам.
Метад апрацоўкі тут заключаецца ў тым, што пры выяўленні твару вочы не рухаюцца самі па сабе, а зменная вызначаецца для павелічэння ў цыкле while.Калі прырост дасягне пэўнага значэння, вочныя яблыкі будуць рухацца самі.Калі паслядоўны порт атрымае дадзеныя, гэтая зменная будзе ачышчана, а затым толькі рухаць вачыма ў адпаведнасці з становішчам твару.Асноўны код выглядае наступным чынам:
калі (rec_data_timer_cnt < 1000000)
{
rec_data_timer_cnt++;
}
яшчэ
{
вочны_яблык_бег();
}
extern u32 rec_data_timer_cnt;
extern u16 eyeball_timer_cnt;
несапраўдны 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(Тып_сувязі==1)
Апісаць_8283(ст);
#elif(Тып_сувязі==2)
Апісаць_Modbus(st);
#endif
uart[st].Rx_F=0;
uart[st].Rx_Num=0;
}
}
Час публікацыі: 26 чэрвеня 2023 г