——DWIN 開発者フォーラムより
今回皆さんにお勧めする DWIN 開発者フォーラムのオープンソース プロジェクトは、人間の目の動きをシミュレートするための非常に興味深いルーチンです。エンジニアは、いくつかの人間の目の画像素材を使用して、眼球の動き、まばたき、顔認識、追従などの機能を実現しました。
オープンソース ソリューションの紹介:
1.UI画像素材
編集者注: DWIN スマート スクリーンは、画像に基づいて UI 開発を完了し、さまざまな表示効果を簡単に実現できます。
2. インターフェース開発
DGUS ソフトウェアを使用してインターフェイスを開発するのは比較的簡単で、必要なグラフィック コントロールは 2 つだけです。このルーチンでは、エンジニアは 2.1 インチの円形スマート スクリーンを選択しました。
3.まばたきアニメーションを実現
まぶたの写真を一定の間隔で順番に表示します。
//点滅アニメーション
void flash_animat(void)
{
if(ブリンクフラグ == 0)
{
まばたき_cnt++;
if(blink_cnt >= 4)
{
ブリンクフラグ = 1;
}
}
それ以外
{
瞬き_cnt–;
if(blink_cnt <= 0)
{
ブリンクフラグ = 0;
}
}
write_dgus_vp(0×3000, (u8 *)&blink_cnt, 2);
}
void flash_run()
{
静的 u32 run_timer_cnt = 0;
run_timer_cnt++;
if(run_timer_cnt >= 2000000)
{
run_timer_cnt = 0;
まばたき_animat();
遅延_ms(30);
まばたき_animat();
遅延_ms(30);
まばたき_animat();
遅延_ms(30);
まばたき_animat();
遅延_ms(30);
まばたき_animat();
遅延_ms(30);
まばたき_animat();
遅延_ms(30);
まばたき_animat();
遅延_ms(30);
まばたき_animat();
遅延_ms(30);
}
}
4. 眼球が自然に左右に見えることを認識します。
これはまばたきに似ていますが、目の動きを制御するには水晶発振器の時間を比較する必要があります。何度もデバッグを行った後、エンジニアは次のコード セットを設計しました。
//目玉のアニメーション
void eyeball_animat(void)
{
eyeball_timer_cnt++;
if(eyeball_timer_cnt < 50)
{
目玉_cnt = 20;
}
else if(eyeball_timer_cnt < 51)
{
目玉_cnt = 50;
}
else if(eyeball_timer_cnt < 52)
{
目玉_cnt = 80;
}
else if(eyeball_timer_cnt < 53)
{
目玉_cnt = 94;
}
else if(eyeball_timer_cnt < 103)
{
目玉_cnt = 94;
}
else if(eyeball_timer_cnt < 104)
{
目玉_cnt = 80;
}
else if(eyeball_timer_cnt < 105)
{
目玉_cnt = 50;
}
else if(eyeball_timer_cnt < 106)
{
目玉_cnt = 20;
}
else if(eyeball_timer_cnt < 107)
{
eyeball_cnt = -10;
}
else if(eyeball_timer_cnt < 108)
{
eyeball_cnt = -40;
}
else if(eyeball_timer_cnt < 158)
{
eyeball_cnt = -54;
}
else if(eyeball_timer_cnt < 159)
{
eyeball_cnt = -40;
}
else if(eyeball_timer_cnt < 160)
{
eyeball_cnt = -10;
}
else if(eyeball_timer_cnt < 161)
{
目玉_cnt = 20;
eyeball_timer_cnt = 0;
}
//左右に移動
// if(目玉フラグ == 0)
// {
// 目玉_cnt++;
// if(eyeball_cnt >= 94)
// {
// 目玉フラグ = 1;
// }
// }
// それ以外
// {
// eyeball_cnt–;
// if(eyeball_cnt <= -54)
// {
// 目玉フラグ = 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);
}
void 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();
}
extern u32 rec_data_timer_cnt;
extern u16 eyeball_timer_cnt;
void 通信_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 日