今日は、LEDを使用してマイクロコントローラーでスムーズなアニメーションを作成する方法を説明します。 Atmel attiny2313チップがベースとして採用されました;まさにこれが私が
ほとんどの人が映画を覚えており、シリーズ「ナイトライダー」(ナイトライダー)を覚えています。 子供の頃、誰がそのような機械を夢見ていないのですか? ええと、例えば、私は機械自体の前などでアニメーションを作成することにしました。
次の原理に従って回路をはんだ付けしました。
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の伝統によると、これは私の最初の記事です。あまり蹴らないでください。
成功。