Smart Eye DWIN шеңбер экранына негізделген

——DWIN әзірлеушілер форумынан

Бұл жолы барлығына ұсынылатын DWIN әзірлеушілер форумы ашық бастапқы коды жобасы адам көзінің қозғалысын имитациялаудың өте қызықты тәртібі.Инженер көз алмасының қозғалысы, жыпылықтау, бетті тану және артынан жүру сияқты функцияларды жүзеге асыру үшін адам көзінің бірнеше суретін пайдаланды.

Ашық бастапқы шешімдерге кіріспе:

1. UI кескін материалы

Редактордың ескертпесі: DWIN смарт экраны әртүрлі дисплей әсерлерін оңай жүзеге асыра алатын UI әзірлеуді аяқтау үшін суреттерге негізделген.

dytrgf (1)

2. Интерфейсті дамыту

Интерфейсті DGUS бағдарламалық құралы арқылы әзірлеу салыстырмалы түрде қарапайым және тек екі графикалық басқару элементі қажет.Бұл тәртіпте инженер 2,1 дюймдік дөңгелек смарт экранды таңдады.

dytrgf (2)

3. Жыпылықтау анимациясын жүзеге асыру

Қабақтардың суреттері аралықпен кезекпен көрсетілсін:

//Жыпылықтау анимациясы

void blink_animat(жарамсыз)

{

егер(жыпылықтау_жалауы == 0)

{

blink_cnt++;

егер(blink_cnt >= 4)

{

жыпылықтау_жалауы = 1;

}

}

басқа

{

blink_cnt–;

егер(blink_cnt <= 0)

{

жыпылықтау_жалауы = 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++;

егер(көз алмасының_таймері_cnt < 50)

{

eyeball_cnt = 20;

}

басқа болса (көз алмасының_таймері_cnt < 51)

{

eyeball_cnt = 50;

}

басқа болса (көз алмасының_таймері_cnt < 52)

{

eyeball_cnt = 80;

}

басқа болса (көз алмасының_таймері_cnt < 53)

{

eyeball_cnt = 94;

}

басқа болса (көз алмасының_таймері_cnt < 103)

{

eyeball_cnt = 94;

}

басқа болса (көз алмасының_таймері_cnt < 104)

{

eyeball_cnt = 80;

}

басқа болса (көз алмасының_таймері_cnt < 105)

{

eyeball_cnt = 50;

}

басқа болса (көз алмасының_таймері_cnt < 106)

{

eyeball_cnt = 20;

}

басқа болса (көз алмасының_таймері_cnt < 107)

{

eyeball_cnt = -10;

}

басқа болса (көз алмасының_таймері_cnt < 108)

{

eyeball_cnt = -40;

}

басқа болса (көз алмасының_таймері_cnt < 158)

{

eyeball_cnt = -54;

}

басқа болса (көз алмасының_таймері_cnt < 159)

{

eyeball_cnt = -40;

}

басқа болса (көз алмасының_таймері_cnt < 160)

{

eyeball_cnt = -10;

}

басқа болса (көз алмасының_таймері_cnt < 161)

{

eyeball_cnt = 20;

eyeball_timer_cnt = 0;

}

//Солға және оңға жылжытыңыз

// егер(көз алмасының_жалауы == 0)

// {

// eyeball_cnt++;

// егер(көз алмасының_cnt >= 94)

// {

// көз алмасының_жалауы = 1;

// }

// }

// басқа

// {

// eyeball_cnt–;

// егер(көз алмасының_cnt <= -54)

// {

// көз алмасының_жалауы = 0;

// }

// }

егер(көз алмасы_cnt >= 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;

eyeball_animat();

}

}

5. Беттен кейінгі көз қозғалысын анықтау үшін ESP32 бетті тану мүмкіндігін қосыңыз.

Мұндағы өңдеу әдісі - бет анықталған кезде көздер өздігінен қозғалмайды және while циклінде өсу үшін айнымалы мән анықталады.Өсу белгілі бір мәнге жеткенде, көз алмалары өздігінен қозғалады.Сериялық порт деректерді қабылдағанда, бұл айнымалы мән жойылады, содан кейін тек беттің орнына сәйкес көзді жылжытыңыз.Негізгі код келесідей:

егер(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((уарт[ст].Rx_F==1 )&&(уарт[ст].Rx_T==0))

{

rec_data_timer_cnt = 0;

eyeball_timer_cnt = 0;

#if(Байланыс_түрі==1)

Сипаттама_8283(st);

#elif(Байланыс_түрі==2)

Describe_Modbus(st);

#endif

uart[st].Rx_F=0;

uart[st].Rx_Num=0;

}

}


Жіберу уақыты: 26 маусым 2023 ж