2011年3月20日日曜日

LEDバーサライタ再評価

前回のバーサライタでは、

・一方にしか文字が表示できない
・文字をあらかじめ決めておかなければならない
・文字が小さいので遠くから読みづらい
(バーサライタは遠くからの方がよく見えると感じたので)


などの問題があると感じました。
今回はそれをできるだけ改善する方向でいきたいと思っています。

まずは表示方法。
前回はLEDを縦に1列9個でしたが、今回は18個と倍に増やすつもりです。

5mmLEDを使っているので9個だと感覚1mmでも、
(5+1)*9=54mm
なのでたいした大きさではありませんでしたが、
倍に増やすことで表示サイズを108mmまで大きくすることができます。

108mmというとかなり遠くからも見えると思うので、大きいだけで暗くならないように
LEDも赤色に変えることにします。
最近手に入ったから使ってみようと思っただけなのは内緒。


大きくなったからと言って文字を書き換えるのも面倒なので出力はひとつでいきます。
つまり従来と同じ9ピンで18個を点灯させる予定です。

ここで問題になってくるのがマイコンからの出力可能電流で、
AVRの情報みてないですけどPICが±20mAらしいので同等かなーと。

今回LEDを10mA程度で使おうと思っているので、ちょっとオーバー気味かなと思い、
トランジスタを使うことにします。みんな大好き2SC1815!
まだ評価してないですけど、どうせスイッチング動作なので
あんまり気にしないでいいかなーと。(甘い?)


その次にプログラムのスケッチ(と言うと用語的には間違っているかも)。
いうなればアルゴリズムテスト用プログラムです。

今回は動的に表示するのが目標なのでそこを重点的に。

どうやら「関数ポインタ」とかいうので処理できるようです。
関数ポインタは関数に対するポインタでありアドレスを指し示し~なんて言っても
解る人には解るし、解らない人には解りません。

まあ今までのだと関数名(aとかbとか)を直接記入しないといけない
(=書き込み機で書き換えなければいけない)でしたが、関数ポインタを使うことで
関数をポインタの中に格納できます。(=プログラム中で選択できる)


たとえばA_writeという関数があったとして、
これを使用するには
A_write();
と記入する他ありませんでしたが、ポインタに入れると、
int (*pointer_name)();
pointer_name = A_write;
となり、呼び出しは
(*pointer_name)();
となります。カッコで囲んで先頭にアスタリスクです。

これだけだとあまりメリットは感じられませんが、真の使い道は配列にしてからだと思います。

同じく、関数A_writeとB_writeがあったとして、これを呼び出すならば、
A_write();
B_write();
となります。ちょっとC言語をさわったことがある人なら想像つくと思いますが、
これを例えばB_write→A_writeとしたいならば、一度プログラムを書き換えるしかありません。
実行中に選択するならばifとかforとかを使ってループさせれば実現出来ますが、
さらにCとかDとか増えてくるとifが増えてきたりともう大変なことになってきます。

上記を関数ポインタの配列として使うと、
int (*pointer_name[2])();
pointer_name[0] = A_write;
pointer_name[1] = B_write;
となります。呼び出しはもちろん、
(*pointer_name[0])();
(*pointer_name[1])();
となります。

こうするとちょっとメリットが見えてきました。
pointer_nameの配列番号を自由にいじることでfor 0 to 1やfor 1 to 0で
上からだったり下からだったり自由に選択出来ます。

こんな感じで今回はバーサライタに文字の選択を追加しようと思います。
しかしここで予想だにしない問題が!!!
続きます。

0 件のコメント:

コメントを投稿