こんばんは
ついに完成!
というか峠を越えました
8x8ドットマトリクスLEDを16bitI/Oエクスパンダで点灯する
という課題に取り組んでもう何日になるでしょうか、随分苦しみました
なぜこんなに苦しんだか、原因がわかってビックリ
まず、micro:bitではSPI用のライブラリがあって簡単にブロックを積み重ねればできました
ライブラリの中身はわからなくてもシコシコとSPIプロトコルを記述すればいいんだろ
とやっていたんですが、どうもうまく動いてくれない
LEDが点灯しても予定の文字を表示してくれない
あ〜でもない、こ~でもないと試行錯誤すること数日
考えられることはやり尽くして、次はどうしようかと何と無くLEDを見つめて同じパターンが何回表示されるか数えていた時です
あれ?・・・
7回しか変わらない、つまりデータが7個で周期している
おかしいじゃないか、データは8ビットが8個
プログラムも8回ループさせているハズじゃないか
For i in range(7)
i は0から7までループしているハズだ
もしかして・・・
Pythonの仕様をネットで調べてビックリポン
この文は0から7個繰り返すという意味で0から6までの7個になるらしい
思い込みというのは恐ろしいものですね(歳のせいもある)
このrange(7)は2箇所使っているデータ配列からデータを取り出すところと、そのデータを1ビットずつ取り出してSPIに送出するところ
この2箇所を修正して走らせてみると
あっけなく綺麗に表示しました
まあ、逆さまなんですけどここまでできれば後は簡単
データの上下をひっくり返して・・・
あれ?
今度は裏返しだ
そりゃそうだデータの上下をひっくり返しただけではこうなる
じゃあ左右も反転か・・・
待てよ、そんなことをしたらデータが何が何だかわからなくなる
データ定義はこんな感じ
dataArrayの「1」を目で追っていくとなんとなく「あ」に見えますよね
ただでさえ解りにくい文字定義、これを上下左右反転したら何の字かわからなくなるし新しい文字を作るのも大変なことになる
ここはやはりデータは崩さずに処理で反転させたほうがいい
ということになって、ロジックの方を少しいじって
あっというまに「あ」の完成です
いじったソースはこんな感じ
write8bitはデータを最上位ビットMSBから1ビットずつ取り出して1ならHigh0ならLOWを出力しています
追加したwite8bitReverseはその反対で最下位ビットLSBから取り出しています
データを表示するところでこれを使うと左右反転させられます
アンドを取る時の定数とシフトの方向が違うだけですが、関数としては分けました
もちろんrange(8)ですね
本当に思い込みというのは恐ろしいと思いました
歳をとれば取るほどそうなるのかもしれませんが、今までいろいろな言語をやってきてそれなりに自信を持って取り組んだんですが、「皆まで言うな、それぐらい分かっている」と言う奢りなんでしょうか、反省しています
Python独特の表現という感じもありますね
普通はループ変数の始まりと終わりの値がコード上に現れていますよね
まだ完成とは言えません
関数に無駄な引数があったり、無駄にピンのアップダウンをしていたり
ピンのアップダウンについては一見無駄なようでも安定動作には必要であったりするのですどね
あと、文字データはフォントファイルとしてライブラリ化してimportする形にしたいですね
ライブラリ化はどうやるんだろう、そこからまた調べないといけません
さらにはマトリクスLEDを複数個つないでもう少し文字数を増やしたり縦横スクロールとかもしたいですね
マトリクスLEDはアマゾンで安い中国産を10個(776円)頼んでいます(大丈夫かな?これ)
16bitI/Oエキスパンダは今使っている1個しか持ってないので何個か追加しないといけないし、ラインデコーダーやシフトレジスタといった別の方法もあるのでそちらも検討しておきたいですね
LEDを光らせて何が面白いの?と言われそうですが
面白いんですよ
当分ハマりそうです
長い趣味になるといいですね(神経痛でギターが弾けなくなったので)