Smart Eye на основе круглого экрана DWIN

—— С форума разработчиков DWIN

Рекомендованный всем на этот раз проект с открытым исходным кодом форума разработчиков DWIN представляет собой очень интересную процедуру для моделирования движения человеческих глаз. Инженер использовал несколько материалов для изображения человеческого глаза, чтобы реализовать такие функции, как движение глазных яблок, моргание, распознавание лиц и следование.

Введение в решения с открытым исходным кодом:

1. Материал изображения пользовательского интерфейса

Примечание редактора: интеллектуальный экран DWIN основан на изображениях для завершения разработки пользовательского интерфейса, который позволяет легко реализовать различные эффекты отображения.

dytrgf (1)

2. Разработка интерфейса

Разработать интерфейс с помощью программного обеспечения DGUS относительно просто, и необходимы только два графических элемента управления. В этом случае инженер выбрал круглый смарт-экран с диагональю 2,1 дюйма.

dytrgf (2)

3. Реализовать анимацию моргания

Пусть изображения век отображаются по очереди с интервалами:

//Анимация моргания

недействительный блинк_анимат (недействительный)

{

если (blink_flag == 0)

{

блинк_cnt++;

если (blink_cnt >= 4)

{

блинк_флаг = 1;

}

}

еще

{

блинк_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;

блинк_анимированный();

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 (пустота)

{

глазное яблоко_timer_cnt++;

если (eyeball_timer_cnt

{

глазное яблоко_cnt = 20;

}

иначе, если (eyeball_timer_cnt

{

глазное яблоко_cnt = 50;

}

иначе, если (eyeball_timer_cnt

{

глазное яблоко_cnt = 80;

}

иначе, если (eyeball_timer_cnt

{

глазное яблоко_cnt = 94;

}

иначе, если (eyeball_timer_cnt

{

глазное яблоко_cnt = 94;

}

иначе, если (eyeball_timer_cnt

{

глазное яблоко_cnt = 80;

}

иначе, если (eyeball_timer_cnt

{

глазное яблоко_cnt = 50;

}

иначе, если (eyeball_timer_cnt

{

глазное яблоко_cnt = 20;

}

иначе, если (eyeball_timer_cnt

{

глазное яблоко_cnt = -10;

}

иначе, если (eyeball_timer_cnt

{

глазное яблоко_cnt = -40;

}

иначе, если (eyeball_timer_cnt

{

глазное яблоко_cnt = -54;

}

иначе, если (eyeball_timer_cnt

{

глазное яблоко_cnt = -40;

}

иначе, если (eyeball_timer_cnt

{

глазное яблоко_cnt = -10;

}

иначе, если (eyeball_timer_cnt

{

глазное яблоко_cnt = 20;

глазное яблоко_timer_cnt = 0;

}

//Двигаемся влево и вправо

// if(eyeball_flag == 0)

// {

// глазное яблоко_cnt++;

// if(eyeball_cnt >= 94)

// {

// флаг_глаза = 1;

// }

// }

// еще

// {

// глазное яблоко_cnt–;

// if(eyeball_cnt

// {

// флаг_глаза = 0;

// }

// }

если (eyeball_cnt >= 0)

{

глазное яблоко_pos[0] = 0×00;

глазное яблоко_поз[1] = глазное яблоко_cnt;

}

еще

{

глазное яблоко_pos[0] = 0xFF;

Eyeball_pos[1] = (eyeball_cnt & 0xFF);

}

write_dgus_vp(0×3111, (u8 *)&eyeball_pos, 2);

}

void 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++;

}

еще

{

глазное яблоко_run();

}

внешний u32 Rec_data_timer_cnt;

внешний u16 Eyeball_timer_cnt;

void Communication_CMD(u8 st)

{

if((uart[st].Rx_F==1 )&&(uart[st].Rx_T==0))

{

Rec_data_timer_cnt = 0;

глазное яблоко_timer_cnt = 0;

#if(Тип_Связи==1)

Описать_8283(ст);

#elif(Тип_коммуникации==2)

Описать_Modbus(ст);

#endif

uart[st].Rx_F=0;

uart[st].Rx_Num=0;

}

}


Время публикации: 26 июня 2023 г.