DWIN 원형 스크린 기반의 스마트 아이

——DWIN 개발자 포럼에서

이번에 모두에게 추천하는 DWIN 개발자 포럼 오픈 소스 프로젝트는 인간의 눈의 움직임을 시뮬레이션하는 매우 흥미로운 루틴입니다.엔지니어는 안구 운동, 깜박임, 얼굴 인식 및 팔로우와 같은 기능을 구현하기 위해 여러 사람의 눈 그림 자료를 사용했습니다.

오픈 소스 솔루션 소개:

1. UI 이미지 소재

편집자 주: DWIN 스마트 스크린은 그림을 기반으로 UI 개발을 완료하여 다양한 디스플레이 효과를 쉽게 구현할 수 있습니다.

dytrgf (1)

2. 인터페이스 개발

DGUS 소프트웨어를 통해 인터페이스를 개발하는 것은 비교적 간단하며 두 개의 그래픽 컨트롤만 필요합니다.이 루틴에서 엔지니어는 2.1인치 원형 스마트 스크린을 선택했습니다.

dytrgf (2)

3. 깜박임 애니메이션 구현

눈꺼풀 사진을 간격을 두고 차례로 표시합니다.

//깜박임 애니메이션

무효 blink_animat(공허)

{

if(blink_flag == 0)

{

blink_cnt++;

if(blink_cnt >= 4)

{

blink_플래그 = 1;

}

}

또 다른

{

blink_cnt-;

if(blink_cnt <= 0)

{

blink_플래그 = 0;

}

}

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

}

무효 깜박임 실행()

{

정적 u32 run_timer_cnt = 0;

run_timer_cnt++;

if(run_timer_cnt >= 2000000)

{

run_timer_cnt = 0;

blink_animat();

지연_ms(30);

blink_animat();

지연_ms(30);

blink_animat();

지연_ms(30);

blink_animat();

지연_ms(30);

blink_animat();

지연_ms(30);

blink_animat();

지연_ms(30);

blink_animat();

지연_ms(30);

blink_animat();

지연_ms(30);

}

}

4. 안구가 좌우로 자연스럽게 보입니다.

이것은 깜박임과 비슷하지만 눈의 움직임을 제어하기 위해 수정 발진기의 시간을 비교해야 합니다.여러 번 디버깅한 후 엔지니어는 다음 코드 세트를 설계했습니다.

//안구 애니메이션

void eyeball_animat(보이드)

{

eyeball_timer_cnt++;

if(eyeball_timer_cnt < 50)

{

eyeball_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;

}

그렇지 않으면(eyeball_timer_cnt < 105)

{

eyeball_cnt = 50;

}

그렇지 않으면(eyeball_timer_cnt < 106)

{

eyeball_cnt = 20;

}

그렇지 않으면(eyeball_timer_cnt < 107)

{

eyeball_cnt = -10;

}

그렇지 않으면(eyeball_timer_cnt < 108)

{

eyeball_cnt = -40;

}

그렇지 않으면(eyeball_timer_cnt < 158)

{

eyeball_cnt = -54;

}

그렇지 않으면(eyeball_timer_cnt < 159)

{

eyeball_cnt = -40;

}

그렇지 않으면(eyeball_timer_cnt < 160)

{

eyeball_cnt = -10;

}

그렇지 않으면(eyeball_timer_cnt < 161)

{

eyeball_cnt = 20;

eyeball_timer_cnt = 0;

}

//좌우로 이동

// if(eyeball_flag == 0)

// {

// eyeball_cnt++;

// if(eyeball_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] = 안구_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++;

if(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();

}

외부 u32 rec_data_timer_cnt;

외부 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)

describe_8283(st);

#elif(유형_통신==2)

Describe_Modbus(st);

#endif

uart[st].Rx_F=0;

uart[st].Rx_Num=0;

}

}


게시 시간: 2023년 6월 26일