LEDマトリックスで遊ぶ
LEDマトリックスにはまる その1 (5/28/08)
この1週間、お遊びのLEDマトリックスに夢中になっている(まあ、電子工作自体がお遊びだが)。 二色の8×8のLEDマトリックスは、秋月で見つけ、安い(\200)こともあって、大分前に、つい目的もないのに2つ買ってしまってある。ダイナミック表示とか、シフトレジスタで線をへらすテクニックなどは、昔、時計の針を刻む歯車に何故か心がわくわくしたのと同じような、工作心(ごころ)を刺激する。今までロガーとか電源制御とか実用的なことばかりやってきたので息抜きということもある。ちょっと遊んでみた。いや、単に作りたかっただけだけど。
ところが、これが難物だったのである。最初軽く考えて、どうせなら一つでなく、電光掲示板のように2つ並べてスクロールさせてやろうと欲張ったのがいけない。赤緑の2色とも配線するのはとても大変になることがわかった。
一応シフトレジスタの74HC595は4つ買ってあり(マルツが一番安く\94だった)、小さな基板にも一応そのスペースはぎりぎりとったが、最初は1色だけ実装することにした。LEDはスクロールを考えて、ピンを少し曲げて境目なくピッタリつけて固定する。LEDのドライブは、定番のトランジスタアレイ(TD62083)で、ダイナミック表示なら2色の8×8マトリックスを3つくらいまで1ヶでドライブ出来そうだ。
石はとりあえず、ポートが8本連続しているTiny2313にした。これがうまく行ったら、フォントデータをSDカードに入れてMegaクラスで8ビットの、昔のPDAで流行っていた、エリサフォントなどで漢字の電光掲示板にしてやろうというのが最終的な計画である。
実装は、UEW線でも良いが、UEW線を交叉させて配線するのに抵抗があったので、もうひとつのジュンフロン線を試してみた。これで、これまで買いたいのを我慢していた、Engineer製のワイヤストリッパーが買える。秋葉原駅前のラジオストアの入り口の工具店が意外に安く\2760で手に入った。それでも最近買った工具では電動工具を除けば一番の値段だ。これまでのニッパーとは格段の生産性で面白いように被覆がむける。細い線の皮むきにはやはり必須の工具であることがわかった。
工具のおかげもあって配線は順調に終わり、早速ブレッドボードにヘッダーピンで直結する。 ソフトは下書きもしないで気楽に、これまでの部品ソフトを寄せ集めて3ms単位で8バイトのフォントデータをシフトレジスタに流し込むプログラムを組んだ。スクロールさせる必要があるので、少し本格的に、昔を思い出しながら構造体(struct)にフォントデータを入れた。
動かしてみたら、これが全くうんともすんとも言わない。まあ、こういうのには慣れている。プログラムにはUARTが組んであるのでデバッグは簡単だと考えていたら、これが暴走するのである。原因はわからない。LEDは全く光もしない。ハードは組み込む前、すべてテストでLEDが点くことを確認してあるのにどこも光らない。
UARTが暴走するのは、構造体のポインタの不正の疑いが強い。単なる変数ではなく、構造体はポインタを多用するのでデバッグが済んでいないときはどうしようもない。泣く泣く、構造体をやめて8バイトの配列に戻す。何とかUARTの暴走は止まった。
ところがそれでもLEDは全く点灯しない。途方に暮れてロジックアナライザーで出力を確かめる。何とピンの出力は全く問題なく見事に出ている。8ビットクロックとともにデータを出し、最後にラッチパルスを出し、コモンのトランジスタアレイのドライブはちゃんと切り替わっている。こりゃあ、ハードだ。ここで深夜も3時をまわったので心残りだが追及を諦めた。
次の朝、事務所に出かける電車の中でもLEDマトリックスのことが頭から離れない。昨夜のテストの思い出したくない光景が目に浮かぶ。トランジスタアレイのソース側に試しにVccをかけたときに一瞬電源のパイロットランプがわりにしているLEDが暗くなったのが気になってならない。また、こわしてしまったのだろうか。いやいや大丈夫だ。ウェブにはシフトレジスタのリセットピンにはVccをかけた回路図が商品になっている。
あっ、そう言えば、確かリセットピンはグランドにつないで半田付けしたぞ。ああー、反対にOE(output enable)にはVccをかけて配線した。ここはすべて負論理だ。アートワークのときからそうなっていた。やれやれ、これではシフトレジスタは動きようがない。二重に止まっている。ICはこわれていないのだ。良かった。全部、こちらのせいだ。
仕事を終えて帰宅し、食事もそこそこに配線のやり直し。点いた。喜んだのも束の間、
このあとも泥沼が続いたのである。
LEDマトリックスにはまる その2 (5/30/08)
点灯したLEDは何とも不可思議な動きで全く安定しない。これはこれで見ていて飽きないが、目的は文字をダイナミック表示で固定して出すことである。ソースを何度も調べるが、こんなランダムな動きになるようなところは見当たらない。頭を抱える。気に入らないのは、コードを少し換えるだけでまたUARTが暴走したりする。
タイマーがおかしいのかと間隔を変えるが全く変化がない。念のためロジアナで調べてみたら、パラメータを変えても時間間隔が変わっていないことがわかる。外部変数のスイッチが機能していない。これは例の外部変数がこわれるトラブルがここでも発生しているようだ。場所を換えたり、コンパイルオプションを換えて、何とか用意したアルファベットのAとBが表示できるようになった。しかし、後半のフォントビットがどうしても設定どおりの位置におさまらない。フォントデータは内部変数域にあり、あのトラブルとは関係ないはずだ。
一日を無駄に過ごして、次の日、気持ちを新たに解決に取り組む。タイマでダイナミック表示をしているから解析が難しいことに気づく。デバッガーのようにタイマを止めて1ステップづつ調べていけば良い。幸い、きめられた時間にやらないとまずい処理はシフトレジスタにシリアルにデータを送るときだけだ。
タイマの代わりに、コマンドで進むコードの改修はわずかで済んだ。やってみる。おお、これは便利だ。タイマのときは入れられなかったテストステートメントがいくらでも入れられる。LEDも一列づつ律義に表示されわかりやすい。
テストステートメントで変数の表示をして行って驚くべき事実が明らかになった。外部変数だけでなく、内部変数までいたるところでデータが破壊されている。これでは暴走するはずである。AVRのサイト(AVRWiki)に外部変数だけだと書いたけれどそれどころではない。犯人を追跡する刑事の気分で、地道にひとつづつ破壊しているところを追及する。
たどり着いたところは、Tiny2313の標準UARTの受信部分で、受信レジスタからデータをユーザー側に受け取るところである。これはもうどうしようもない。標準UARTが使っているSRAMデータとユーザーデータがぶつかっているのだ。コンパイラのバグである。
ただ、前から気になることがある。コンパイルの出力結果が示すSRAMの消費量が、配列で確保したバッファ量より小さいことである。こいつ、定義した分だけデータをとっていないのかもしれない。もしかしたらと半信半疑で、バッファの大きさ80バイトを半分の40バイトにしてテストしてみた。
やった。これまでのすべてのトラブルはうそのように消えて別人のように正確にLEDは表示された。急いでタイマを戻しダイナミック表示にする。ピタリとあらかじめ作ってあったA、Bの文字が表示される。いやあ嬉しい。1ドットづつ点けたり消したりするコマンドもきれいに動く。解決したときの喜びは今までの苦労が多ければ多いほどそれだけ大きくなる。75才でエベレストに登った三浦雄一郎の気持ちと同じだ。
勢いに乗って、これまでの配列から構造体に変更し、スクロールに挑戦する。リングバッファーのロジックと同じでこれは簡単にコードが書けた。まだAとBしかキャラクタがないが、それらしく横スクロールする文字を眺めてひとり悦に入る。
LEDマトリックスにはまる その3 (5/31/08)
いや、スクロールも手強かった。前にスクロールできたと書いたが、実は1文字づつ独立してスクロールするだけで文字が2文字分流れていく電光掲示板の形ではスクロールできていない。シフトレジスタは2段にカスケードになっていて、16ビットで2文字の縦データを送る。横データはトランジスタアレイ一つで同時に2つのLEDマトリックスの同じ列が点灯するようになっている。
これで2文字分のスクロールをするのは結構大変である。しかし、これがプログラミングの醍醐味である。人のソースコードを見れば簡単だろうが、このところ人のコードを頼りにしすぎる。久しぶりにメモを書き散らしてロジックに頭を捻った。年をとっても直感的な分析力は落ちていないが、こういう解析力は確実に落ちているのを痛感する。集中が効かない。あるところまで論理をつめていくと最初の前提条件を忘れてしまって論理が閉じていかないのだ。
まあ、年齢相応に色々なアプローチの手法だけは山ほど知っているので、そう悲観はしていないが、思い通り動かないと最後はソースリストの前で、定数を足したり引いたりする不毛なデバッグになり、暫くお休みをとるという繰り返しである。
こういうときは気分転換が一番である。風呂などが一番良い。行き詰ってもう寝ようと風呂に入ったとき、はっと気がついてうまく行ったことが何度もある。このときもそうだった。トランジスタアレイが並行して点灯していくことに気を取られ、その順番と最後まで行ったときの処理をあれこれ考えていたが、黙ってそれぞれの点灯すべきアドレスだけ計算していけばそれでスクロールができることに気づく。そのために配列は並んでいるはずだ。アドレスが表示データを越えれば素直に最初のアドレスに戻ればよい。
風呂に入ったのが午前3時近く、今さらまたデバッグするのも何なので寝たが、夢にまでVccだグランドだと基板配線の光景がでてきて夢の中で苦笑する。やることがあるときの朝の目覚めは早い。朝食もそこそこにPCの開発環境を立ち上げる。
これで決まりと考えたロジックは最初動かなかった。がっくりくる。スクロールの指定もしていないのにそもそも文字が静止しない。あれこれいじるが改善しない。ミリセカンドのオーダーで表示を繰り返し、なおかつ少しづつその表示をずらすというのは確かにそう簡単ではない。
これも一休みして原因が判明した。ポインターを止めて別の変数で8バイト分ダイナミック表示をしているときにポインタそのものも動かしていたのである。これでは静止しないはずである。ステートメントでいえば、++の記号をひとつはずすだけ。これでLEDマトリックスは完全に想定どおりのスクロールを開始した。万歳。
表示フィールドを大きくして少し電光掲示板風にしてみる。家族に自慢する(いつも馬鹿にされるのだけれど吹聴せずにはおられない)。ウェブデザインをバイトにしている次女だけが、「すごい」と驚いてくれた。お世辞でも嬉しい。まあ、次女はよく大学まで車で送ってやっているからな。
LEDマトリックスの次の目標は文字フォントの導入である。これでこのあいだのSDカードのプロジェクトと合体する。
ここにTiny2313を使ったLEDマトリックスをドライブするプログラムを置きます。回路図がないので読みにくいと思いますが、ソースにコメントがありますので、ダイナミック表示やスクロールの参考にしてください。EEPROMにフォントを溜めて16字まで表示できます。なお、本格的な8ビット漢字を表示する電光掲示板(Mega128)のソースはこのあと公開します。
| 固定リンク
「AVR」カテゴリの記事
- ソフトI2Cはクロックストレッチまで手を出してあえなく沈没(2017.09.02)
- オシロのテストどころかソフト開発で大はまり(2017.07.26)
- 超音波方式の人感センサーI2C化と新しいオシロ(2017.06.29)
- motionの動体検知はRaspi3の電源が安定しない(2017.04.16)
- 赤外線学習リモコンはデータ再現で挫折したまま進まず(2016.07.21)
コメント