——DWIN хөгжүүлэгчдийн форумаас
Энэ удаад хүн бүрт санал болгож буй DWIN хөгжүүлэгч форумын нээлттэй эхийн төсөл нь хүний нүдний хөдөлгөөнийг дуурайлган хийх маш сонирхолтой ажил юм. Инженер нүдний шилний хөдөлгөөн, анивчих, царай таних, дагах гэх мэт функцүүдийг хэрэгжүүлэхийн тулд хүний нүдний зургийн хэд хэдэн материалыг ашигласан.
Нээлттэй эхийн шийдлүүдийн танилцуулга:
1. UI зургийн материал
Редакторын тэмдэглэл: DWIN ухаалаг дэлгэц нь янз бүрийн дэлгэцийн эффектүүдийг хялбархан хэрэгжүүлэх боломжтой UI хөгжүүлэлтийг дуусгахын тулд зураг дээр суурилдаг.
2. Интерфейсийн хөгжүүлэлт
DGUS программ хангамжаар дамжуулан интерфейсийг хөгжүүлэх нь харьцангуй хялбар бөгөөд зөвхөн хоёр график удирдлага хэрэгтэй. Энэ горимд инженер 2.1 инчийн дугуй ухаалаг дэлгэц сонгосон.
3. Нүдээ анивчих хөдөлгөөнт дүрсийг хэрэгжүүлэх
Зовхины зургийг үе үе дараалан үзүүлээрэй.
// Анивчих хөдөлгөөнт дүрс
хүчингүй анивчих_анимал(хүчингүй)
{
хэрэв(анивчсан_туг == 0)
{
blink_cnt++;
хэрэв(blink_cnt >= 4)
{
анивчих_туг = 1;
}
}
өөр
{
blink_cnt–;
хэрэв(blink_cnt
{
анивчих_туг = 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_animated();
Delay_ms(30);
blink_animated();
Delay_ms(30);
blink_animated();
Delay_ms(30);
blink_animated();
Delay_ms(30);
blink_animated();
Delay_ms(30);
blink_animated();
Delay_ms(30);
blink_animated();
Delay_ms(30);
blink_animated();
Delay_ms(30);
}
}
4. Нүдний алим зүүн, баруун тийшээ байгалиасаа харагддаг гэдгийг ойлгоорой.
Энэ нь анивчихтай төстэй боловч нүдний хөдөлгөөнийг хянахын тулд болор осцилляторын цагийг харьцуулах шаардлагатай. Олон удаа дибаг хийсний дараа инженер дараах багц кодыг зохион бүтээжээ.
// Нүдний алимны хөдөлгөөнт дүрс
void eyeball_animat(void)
{
eyeball_timer_cnt++;
хэрэв(нүдний алимны_таймер_cnt
{
eyeball_cnt = 20;
}
Хэрэв өөр бол (нүдний алимны_таймер_cnt
{
eyeball_cnt = 50;
}
өөр бол (нүдний алимны_таймер_cnt
{
eyeball_cnt = 80;
}
өөрөөр бол (нүдний алимны_таймер_cnt
{
eyeball_cnt = 94;
}
өөрөөр бол (нүдний алимны_таймер_cnt
{
eyeball_cnt = 94;
}
өөр бол (нүдний алимны_таймер_cnt
{
eyeball_cnt = 80;
}
өөр бол (нүдний алимны_таймер_cnt
{
eyeball_cnt = 50;
}
өөрөөр бол (нүдний алимны_таймер_cnt
{
eyeball_cnt = 20;
}
өөр бол (нүдний алимны_таймер_cnt
{
eyeball_cnt = -10;
}
Хэрэв өөр бол (нүдний алимны_таймер_cnt
{
eyeball_cnt = -40;
}
өөрөөр бол (нүдний алимны_таймер_cnt
{
eyeball_cnt = -54;
}
өөрөөр бол (нүдний алимны_таймер_cnt
{
eyeball_cnt = -40;
}
Хэрэв өөр бол (нүдний алимны_таймер_cnt
{
eyeball_cnt = -10;
}
Хэрэв өөр бол (нүдний алимны_таймер_cnt
{
eyeball_cnt = 20;
eyeball_timer_cnt = 0;
}
//Зүүн, баруун тийш шилжих
// хэрэв (нүдний алимны_туг == 0)
// {
// eyeball_cnt++;
// хэрэв (нүдний алимны_cnt >= 94)
// {
// нүдний алимны_туг = 1;
// }
// }
// өөр
// {
// eyeball_cnt–;
// хэрэв (нүдний алимны_cnt
// {
// eyeball_flag = 0;
// }
// }
хэрэв (нүдний алим >= 0)
{
eyeball_pos[0] = 0×00;
eyeball_pos[1] = eyeball_cnt;
}
өөр
{
eyeball_pos[0] = 0xFF;
eyeball_pos[1] = (нүдний алимны_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
{
rec_data_timer_cnt++;
}
өөр
{
eyeball_run();
}
extern u32 rec_data_timer_cnt;
extern u16 eyeball_timer_cnt;
хүчингүй Харилцаа_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(st);
#elif(Холбооны_төрөл==2)
Тодорхойлох_Modbus(st);
#endif
uart[st].Rx_F=0;
uart[st].Rx_Num=0;
}
}
Шуудангийн цаг: 2023 оны 6-р сарын 26-ны хооронд