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

——DWIN 개발자 포럼에서

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

오픈 소스 솔루션 소개:

1. UI 이미지 자료

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

dytrgf (1)

2. 인터페이스 개발

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

dytrgf (2)

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

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

//깜박임 애니메이션

깜박임_animat 무효(무효)

{

if(blink_flag == 0)

{

깜박임_cnt++;

if(blink_cnt >= 4)

{

깜박임_플래그 = 1;

}

}

또 다른

{

깜박임_cnt–;

if(blink_cnt

{

깜박임_플래그 = 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;

깜박임_애니메이션();

Delay_ms(30);

깜박임_애니메이션();

Delay_ms(30);

깜박임_애니메이션();

Delay_ms(30);

깜박임_애니메이션();

Delay_ms(30);

깜박임_애니메이션();

Delay_ms(30);

깜박임_애니메이션();

Delay_ms(30);

깜박임_애니메이션();

Delay_ms(30);

깜박임_애니메이션();

Delay_ms(30);

}

}

4. 눈알이 좌우로 자연스럽게 보이는 것을 느껴보세요.

이는 깜박임과 유사하지만 눈의 움직임을 제어하려면 수정진동자의 시간을 비교해야 합니다. 여러 번의 디버깅 끝에 엔지니어는 다음 코드 세트를 설계했습니다.

//눈알 애니메이션

void eyeball_animat(void)

{

eyeball_timer_cnt++;

if(eyeball_timer_cnt

{

eyeball_cnt = 20;

}

그렇지 않은 경우(eyeball_timer_cnt

{

eyeball_cnt = 50;

}

그렇지 않은 경우(eyeball_timer_cnt

{

eyeball_cnt = 80;

}

그렇지 않은 경우(eyeball_timer_cnt

{

eyeball_cnt = 94;

}

그렇지 않은 경우(eyeball_timer_cnt

{

eyeball_cnt = 94;

}

그렇지 않은 경우(eyeball_timer_cnt

{

eyeball_cnt = 80;

}

그렇지 않은 경우(eyeball_timer_cnt

{

eyeball_cnt = 50;

}

그렇지 않은 경우(eyeball_timer_cnt

{

eyeball_cnt = 20;

}

그렇지 않은 경우(eyeball_timer_cnt

{

eyeball_cnt = -10;

}

그렇지 않은 경우(eyeball_timer_cnt

{

eyeball_cnt = -40;

}

그렇지 않은 경우(eyeball_timer_cnt

{

eyeball_cnt = -54;

}

그렇지 않은 경우(eyeball_timer_cnt

{

eyeball_cnt = -40;

}

그렇지 않은 경우(eyeball_timer_cnt

{

eyeball_cnt = -10;

}

그렇지 않은 경우(eyeball_timer_cnt

{

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

// {

// 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 *)&eyeball_pos, 2);

}

무효 eyeball_run()

{

정적 u32 run_timer_cnt = 0;

run_timer_cnt++;

if(run_timer_cnt >= 20000)

{

run_timer_cnt = 0;

animation_eyeball();

}

}

5. ESP32 얼굴 인식을 추가하여 얼굴을 따라가는 눈의 움직임을 실현합니다.

여기서 처리 방법은 얼굴이 감지되면 눈이 스스로 움직이지 않고 while 루프에서 증가하도록 변수를 정의하는 것입니다. 증분량이 특정 값에 도달하면 안구가 스스로 움직입니다. 직렬 포트가 데이터를 수신하면 이 변수가 지워지고 얼굴 위치에 따라 눈만 움직입니다. 주요 코드는 다음과 같습니다.

if(rec_data_timer_cnt

{

rec_data_timer_cnt++;

}

또 다른

{

eyeball_run();

}

extern u32 rec_data_timer_cnt;

외부 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(Type_Communication==2)

Description_Modbus(st);

#endif

uart[st].Rx_F=0;

uart[st].Rx_Num=0;

}

}


게시 시간: 2023년 6월 26일