騎士のライダー。 マイクロコントローラでスムーズなアニメーションをプログラムします

良い一日。

今日は、LEDを使用してマイクロコントローラーでスムーズなアニメーションを作成する方法を説明します。 Atmel attiny2313チップがベースとして採用されました;まさにこれが私が横たわっているのを見つけたのです 。 ファームウェア、プログラマーの詳細については掘り下げません。これらはすべてハブにありました Linuxの ここここ

ほとんどの人が映画を覚えており、シリーズ「ナイトライダー」(ナイトライダー)を覚えています。 子供の頃、誰がそのような機械を夢見ていないのですか? ええと、例えば、私は機械自体の前などでアニメーションを作成することにしました。

画像



次の原理に従って回路をはんだ付けしました。
スキーム

Electron TVのLED付きのバーを取りましたが、ちょうど8個ありました。 3ボルトのLEDがあったので、私のバージョンでは、ダイオードに200オームの抵抗を直列に追加しました。

理論



些細なことですが、出力ポートに書き込まれた場合、ダイオードは点灯し、ゼロの場合は消灯します。 部分的に光る(光るが、フルパワーではない)ためには、各ポートでPWMをエミュレートする必要があります。

私は、パルス形成の精度を10回繰り返すことを決めました。 つまり、ダイオードの強度には10種類のオプションがあります。 すべての反復の出力が1の場合、これは最大グローです。10のうち5つであれば、半分になります。 つまり、出力1では点灯しますが、その後0になり、フェードします。 このようなPWM信号には数百キロヘルツがあり、ダイオード自体の慣性によって望ましい効果が得られます。

実装



アニメーション全体をマトリックスに配置します。これにより、アニメーション自体を簡単かつ簡単にプログラムできます。

const char mat[] =
{
10,0,0,0,0,0,0,0,
6,10,0,0,0,0,0,0,
2,6,10,0,0,0,0,0,
0,2,6,10,0,0,0,0,
0,0,2,6,10,0,0,0,
0,0,0,2,6,10,0,0,
0,0,0,0,2,6,10,0,
0,0,0,0,0,2,6,10,
0,0,0,0,0,0,2,6,
0,0,0,0,0,0,0,2,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,10,
0,0,0,0,0,0,10,6,
0,0,0,0,0,10,6,2,
0,0,0,0,10,6,2,0,
0,0,0,10,6,2,0,0,
0,0,10,6,2,0,0,0,
0,10,6,2,0,0,0,0,
10,6,2,0,0,0,0,0,
6,2,0,0,0,0,0,0,
2,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0
};

short timeAnim = 3000;


* This source code was highlighted with Source Code Highlighter .


したがって、timeAnimはアニメーション全体の時間です。 各行は1フレームの10回の繰り返しで、各セルはダイオードの「光パワー」です。

1フレーム(マトリックスの1行)のアニメーション時間を計算し、結果を作成してポートに出力するだけです。

//
sPeriodTime = timeAnim * 4 / sizeof (mat) * 8;
iCycle = 0;

//
iMaxCycle = sizeof (mat) / 8;

while (1)
{
PORTB = 0;
TCNT1 = 0;
iCycle = 0;
while (iCycle < iMaxCycle)
{
while (TCNT1 < (iCycle + 1)*sPeriodTime) //,
{
for (i = 0; i < 10; i++) // 10
{
iTemp = 0;
for (j = 0; j < 8; j++) //
{
iTemp <<= 1;
iTemp |= (mat[iCycle*8 + j] - i) > 0;
}
PORTB = iTemp; //
}
};
iCycle++;
}
};

* This source code was highlighted with Source Code Highlighter .


結果







まあ、誰が気に、 ソース

Habrの伝統によると、これは私の最初の記事です。あまり蹴らないでください。

成功。

Source: https://habr.com/ru/post/J79481/


All Articles