16×16ドットマトリックスLEDでテトリス

昔は、「C++」なんてのクチでしたが、ここ数年は、C++ を改めて勉強するようになり、ようやくやりたい事が表現出来るようになってきました。

C++ は非常に難しい言語なので独学では難しい側面もあり、習得には時間がかかりますが、複雑な処理を安全で判り易く記述する事が可能だと思います。
※自分は、友人のおかげでスマートに学習する事が出来ました。

C++ の場合、記述方法として「かなり強く従わせる」ような風潮があります、しかしこれには「意味」があります、多くの人はそれが自分のスタイルに合わないとか、馴染まないとか言って、避けてしまい、本当の価値を見失っている事が多々あり、誤解されている事を多くみかけます。
又、不合理で自分勝手な方法論で実装された、クズ同然のコードも多くみられます、非常に残念ですが、良い「先生」を見つける事は難しいのです。

今まで、AVRではメモリーが少ないとか、組み込みマイコンでとか、やった事無いとかなどの理由で「C」言語での開発でしたが、WinAVR で、C++ も使える事が判り、C++ に移行しています。
WinAVR では、STL は標準ではサポートしていないようですが、boost も一部使う事が出来ます、一番の問題は、メモリーが少ない点で、それさえ設計の段階で考えておけばコード効率も優れているようです。
普段のプログラムを C++ で創るのが日常的になると、C ではもはや満足出来ないところまできています(精神的)しかし良い時代です、512 バイトの RAM と 8 キロバイトの ROM を持った 8 ビットの RISC でも C++ で実装出来るのですから。

今回、ATMega88 でドットマトリックス LED を制御するに辺り、スイッチを付けたので、何か、ゲームでも作ってみたくなり、「テトリス」を作ってみました。
※バグが色々ありますがww

ATMega88 LED DotMatrix 16x16
ATMega88 LED DotMatrix 16x16

Dot Matrix LED TETRIS

ソースコード一式

16×16ドット・マトリックスLED

以前に、秋葉原の「鈴商」で赤色 LED の16×16のドットマトリックスが安く売られていた。
※確か400円くらいだったと思う、今でもまだ在庫があれば売られていると思う、緑もあったと思う。
LT-5013T

この手の物はジャンクに近いものだが、一応新品で、簡単なピンアサインをメモした紙が付いている。
16×16くらいの物だと、普通に買うとかなり高価で、このくらいの解像度があれば、かなり面白い表現も出来る。
丁度、キッチンタイマーを作ってみたくて、1個買っておいたーーー
それから数ヶ月、ようやく時間が取れたので、ドライブしてみた。

最初の問題は、このモジュールから出ているピンの間隔だ、「2mmピッチ」うーーん、ユニバーサル基板には不満な間隔・・
他の8×8とかは2.54mmピッチなのに、しかも32本を格納出来ない事も無いのにーー(それが安い理由かもしれないww)
まぁ、このモジュールの設計者(タコ)は、自作する立場を考える必要も無いので、適当に選んだ結果なのだろうけど・・・
しかた無いので、まずピッチ変換基板を作って、作業性を良くする事から始めた。

DotMatrixBottom

かなり強引だけど、とりあえずインチピッチのコネクタで接続出来るようにした。

次にドライバーの仕様を考えた、16×16のダイナミックスキャンだけど、全てのLEDを点灯した場合、1個に2mAでも512mAも必要。
ダイナミック点灯なので duty は1/16となる、たまたま秋月で、8ビットのシフトレジスターとラッチが合体したIC「NJU3711D」を売っていたので2個購入。
残念なのは、このICは5V動作で、電流も最大25mA、3.3Vで駆動出来ない、でもまぁいいか・・・
※買った後で見つけたのだけど、TIにまさにLEDドライブの為のICがあったTLC5940これを知っていたら、これにしたのに・・・

さて、気を取り直して、仕様の続き、25mAだと、1/16で、1.5625mA、少し暗いかなぁーと思って、テストしてみたが、そんなに暗く無い事が判り、全体で25×16=400mAの消費となった、これならUSBの電源でも駆動できる。(ソフトを作る時を考えるとUSBの電源でまかなえるのは正しい!)

キッチンタイマーにしたいので、なるべく小さく作りたい。
デコーダーに74HC138を2個使い、4to16のデコーダーとした、マイコンは、おなじみのAVRとした、在庫が沢山あったATmega88にする。(168や328に交換できるので便利)
74HC138で25mAを吸わすのは厳しいと思い、PチャネルデュアルMOSFETFDS4935Aをドライブしている。

DotMatrixTop

基板の裏はこんな感じ

DotMatrixBottom2

かなり苦しいけど、とりあえず1品物なので、まぁいいかーーーって感じ。

とりあえず、0.5秒間隔ランダムで表示してみた。

これから本格的にソフト開発なのだが、スイッチ類と音をどうするかを考えないといけない・・・

-----
文字の表示を行ってみた、リソースは以前に作った液晶用の6×12ピクセルのフォントなど。
文字のスクロール

RX マイコン

今更感が強いが、秋月のRXマイコンボードを動かしてみた。

AKI-RX62
AKI-RX62

コストや開発環境、性能、その他色々な点を考えると、ARM マイコンを使う方が「筋」なのかもしれない・・
しかし、個人的な理由で、RX マイコン「推し」なのである。
・国産だから。(昔から日立のマイコンを多く使ってきている)
・ルネサスには頑張って欲しい。(逆風の中、色々頑張っている様子が伺える)
※プロダクトは悪く無い、折角伸びしろがあるのに、単純なコストの勝負で無くなってしまうのは残念・・
・比較的安く入手できるようになった。
※以前は、個人には売ってくれなかったが、最近は、1個でも購入可能となっている。
・周辺のペリフェラルが扱いやすい。
・ドキュメントが日本語である。(別に英語でもいいけどww)

など、「推し」の理由はいろいろとあるけど・・

「日本人だろ!、RX使えRX!」みたいなww

・開発環境の整備
まずは開発環境、ルネサスには統合環境もあるし、フリーで使えるものもある、しかし、しかしである・・・
自分はどうも IDE と呼ばれるところの統合環境があまり好きでは無い、gcc と make emacs があればそれで良いと思ってる。
エクリプスとかは最悪だと思う。
確かに、Visual Studio は、本当に良く出来ているし、デバッグ環境は素晴らしい~、しかし、常にあそこまでの環境は必要無いと思う。
※まぁ、考え方は人それぞれであるし、強制は出来ないけど~

趣味程度の遊びで、C コンパイラに10万とかありえないので、開発環境にコストはかけられない、そこで、当然のように gcc !
て言うか gcc が好き!
※Windows のプログラム開発でも gcc をメインに使っている~
組み込みのプログラムであっても C++ を多用するつもりなので、boost とかも部分的に動かすつもり、なので g++ も動作可能な事。
※将来的には C++11 も使いたい!

1)cygwin の整備
gcc を使う場合には、この環境が一番扱いやすい
※ make、makedepend を入れておく事

2)RX 用 gcc の準備
自分でソースコードから作ろうかと思ったが、コンパイル済みのバイナリーを入手出来るので、とりあえず、それを落とすのが良いと思う。
rx-elf-gcc

※展開は以下のように行う
$ cd /usr
$ tar xjvf tkdn-20110720-gcc.tar.bz2
.bashrc にパスを通しておく
> PATH=$PATH:/usr/tkdn-20110720/rx-elf/bin

3)RX マイコン用フラッシュプログラムツールのインストール
現在、フラッシュのプログラムツールは2種類あるようだ、「FDT(Flash Development Toolkit)」と、「Renesas Flash Programmer」
で、後者の方が、フラッシュの書き込みだけなら簡単で判りやすい。
※ツールのダウンロードにはアカウントが必要(無償評価版をダウンロード)
※ FDT でも書き込めます。

4)サンプルプログラムの入手
動作確認を行う為のサンプルプログラムを用意しました。
LED テストの簡単なサンプル

5)コンパイルと実行
$ make
でコンパイルされ、フラッシュ書き込み用モトローラー形式のファイルが出来ます。
AKI-RX62 に確認用 LED(赤) をCN1、25番(P30) に接続します。
※抵抗は 680 程度
「Renesas Flash Programmer」を起動します。
AKI-RX62 は、DIP スイッチの 1(BOOT)、2(リトルエンディアン)を ON 、3、4を OFF とします。
USB ケーブルを PC と接続し、電源を入れます。
※最初に接続した時は、ドライバーのインストールなど多少時間がかかります
※ アプリケーションの設定では、USB Direct で接続し、12.0MHz、x8、x4 とします。
mot ファイルを選択して、「スタート」すれば、書き込みが開始されます。
電源を OFF にして、DIP スイッチの1(boot)を OFF にしてから電源を入れると、LED が点滅すると思います。

次回は、もっと実用的なプログラムを紹介します。