2016-01-20 17:19 | カテゴリ:1/8モデル
CPU内蔵のLED発光テストが無事終了しました。
いろいろご質問も頂き、自分自身にとっても、プログラムの動作を確認する良い機会になりました。

さて、LED1個の動作確認が成功しましたので、このCPU付きLEDの最大の特徴である。シリアル接続による多LED発光のプログラムを検討してみました。
このCPU付きLEDを扱う上での最大のネックは、LEDへの表示データのシリアル転送です。
転送速度が速く、シリアル通信規格も厳密に設定されています。

DSC01714.jpg

LEDが一つの場合は、予め設定されたRGBの3バイトのデータを順次24ビット送信し、リセット信号を送ればよいのですが、複数のLEDの場合は、5個分のRGBのデータ(15バイト=120ビット)を予め用意して、それらを連続して出力しなければなりません。
プログラム中の、変数のr、g、bに一つずつ値をセットする為に、その都度設定していては間に合いません。

そこで、5個のLEDのRBGデータを配列変数に格納してそれを利用することにしました。
先ほど製作したプログラムの一部を改定して、5個のLEDをシリアル接続するハードに対応するようにする計画です。

Cプログラムの最初に、

unsigned char red[5], green[5], blue[5];

で配列を定義します。

また、アセンブラプログラム部分の最初に記述してあった、リセット信号送出部を取り去り、後のwihile文の中に移動します。
mainの最初には、配列変数の初期化を行う記述をします。

そして、データ送出部分は、配列変数に置き換えると共に、LED5個分に変更します。
結果、この様になりました。

//-----------------------------------------------
// CPU内蔵LEDへの各RGBの値を40づつ変化させてカラーを変更する
//-----------------------------------------------
while (1) {

for (red[0] = 0; red[0] <= 230; red[0] = red[0] + 40) {
for (green[0] = 0; green[0] <= 230; green[0] = green[0] + 40) {
for (blue[0] = 0; blue[0] <= 230; blue[0] = blue[0] + 40) {

RC1 = 0; // RC0をLにして
__delay_us(50); // LEDのリセット信号とする


disp_rgb(red[0], green[0], blue[0]); //1個目のLED
disp_rgb(red[1], green[1], blue[1]); //2個目のLED
disp_rgb(red[2], green[2], blue[2]); //3個目のLED
disp_rgb(red[3], green[3], blue[3]); //4個目のLED
disp_rgb(red[4], green[4], blue[4]); //5個目のLED

red[4] = red[3]; //配列データを順送りする
green[4] = green[3];
blue[4] = blue[3];

red[3] = red[2];
green[3] = green[2];
blue[3] = blue[2];

red[2] = red[1];
green[2] = green[1];
blue[2] = blue[1];

red[1] = red[0];
green[1] = green[0];
blue[1] = blue[0];

__delay_ms(100);

}
}
}
}


これで、たぶん上手く動作するはずです。
実際の動作ビデオがこれです。



うーん、何か時々違和感が。
プログラム上は、最初のLEDの色が、2番目、3番目、、、と流れていくはずですが、時々何か変な感じがします。
考えるに、連続シリアル送信のデータ数が多く、ひょっとしたら途中でシリアルデータのデューティーは微妙にずれて言っているのかも知れません。

プログラムを確認し、実際のオシロで波形を確認しました。
LEDに対する送信データのデューティー比は、当初の設計値と若干ずれていましたので、その部分を修正。
これで、OKかと思いましたが、やはり時々、「不良分子」が悪さをしています。

色データを白色(RGB共に255)にしても、どうも暖白色の発光に見えます。
何か不具合がある感じです。
電圧が足りないのか?
と思いつつ、LED電源に直列に抵抗(150Ω)を挿入していることに気づきました。
マニュアルには、電源にパスコンと抵抗が入った図が出ています。
ひょっとしてと思い、この抵抗を取り去ってみました。



大正解。
綺麗に白色発色はもちろん、データのシリアル転送がちゃんとされています。
「不良分子」もいません。
良かった良かった!!

と言う事で、CPU付きのLEDの点滅回路とプログラムは完成しました。

管理者のみに表示する