8×8×8 LED CUBE 製作記(18) -- 「柱」と「層」を個別制御
8×8×8 LED CUBE の制御基板が正しく出来てるのかを確認するためのプログラムですが、苦労しています。前回の電源投入時のみ発生する挙動不審な動作の原因は未解決のまま。
実は、一旦解決策が見つかったと思った瞬間もあったんです。そのプログラムの修正部分。
こっちは、前回のプログラムの18行目から26行目。
前回のプログラムとの違いはこの部分だけで、19行目から26行目でシフト演算したデータに「0xff」をビット論理積するという演算処理を加えています。
その意図するところは、シフトされてはみ出た余分なデータ(それがあるのかどうかも私には分からないけど)を削除して(0にして)、出力に必要な8ビットのデータのみを取り出そうというもの。
実際、これで暫くの間は想定通りの動きをしていたんです。
それなのに、時間が経って、電源のオンオフをしてみると、また元の “訳の分からん状態” に逆戻り。但し、前回とは症状が異なっているようだけど。
何となく、ソフト的なものではなくハードに起因してるものかも、なんて疑念も。ま、取り敢えずコレはコレで置いておいて、先に進んでみようと思います。
今度は、カソード側もArduinoからの出力で制御してみようと思います。これによって、基板でいうとトランジスタ2N2222回りの配線の確認が行えます。
別の言い方をすると、これまではキューブのColumn側のみにデータ出力していたのを、今度はLayer側にもデータを出力することで、両側の状態でLEDのオンオフが制御されることになります。
実際の配線はこんな感じ。LEDが10個しか用意していないので、+側は適当な間隔で8個のシフトレジスタに割り当て、-側はLED5個ずつ2グループに分け、Layer1とLayer2に接続しています。
で、これに合わせてプログラムを組み直してみました。
基板上のLayer1~8をArduinoのpin5~12に割り当てているので、前回のプログラムをベースにして、pin5~12をOUTPUTにし、Layerを順番にHIGHにしながら、そこにlatchPinのHIGHを組合せて512個のLEDを1個ずつ順番に点灯していきます(実際のLEDは10個だけですが)。
上のプログラムで24行目は、実際(の現時点のハード的)にはLayre1と2にしか接続されていないので、Layer_pinも5と6のみでループするようにしてあります。
トランジスタ側の回路に電気を流すのは初めてなので、今回も最初のスイッチオンは緊張しましたが、取り敢えずは動き出しました。少なくとも回路に大きな間違いはないようで一安心。
が、プログラム的には(もしかしたらハード的?)問題有りのようです。起動直後のLEDの不規則な点灯現象は残ったまま、さらにLEDの点灯順番が狂っていることを発見。
端から順番に点灯、消灯を繰り返していると思っていたら、7番Layerからスタートし、8番Layer、そして1番に戻って2、3となっていました。
これまでは連続ループでLEDの光が流れていたので気がつかなかった。今回、ループとループとの間に待機時間が生じたので、これが表面に現れてきたわけ。
うーむ。回路含めアレコレ検討してみたけど、回答が見つからない。さらに迷宮の奥へと入り込んでいくことになりそうです。
実は、一旦解決策が見つかったと思った瞬間もあったんです。そのプログラムの修正部分。
こっちは、前回のプログラムの18行目から26行目。
前回のプログラムとの違いはこの部分だけで、19行目から26行目でシフト演算したデータに「0xff」をビット論理積するという演算処理を加えています。
その意図するところは、シフトされてはみ出た余分なデータ(それがあるのかどうかも私には分からないけど)を削除して(0にして)、出力に必要な8ビットのデータのみを取り出そうというもの。
実際、これで暫くの間は想定通りの動きをしていたんです。
それなのに、時間が経って、電源のオンオフをしてみると、また元の “訳の分からん状態” に逆戻り。但し、前回とは症状が異なっているようだけど。
何となく、ソフト的なものではなくハードに起因してるものかも、なんて疑念も。ま、取り敢えずコレはコレで置いておいて、先に進んでみようと思います。
LEDの+側も-側もArduinoからの出力で制御する
ここまでは、Arduinoからシフトレジスタを経由してLEDのアノード(+側)に信号を出力してLEDを制御していますが、カソード(-側)は直接基板の電源(GND)へと接続していました。今度は、カソード側もArduinoからの出力で制御してみようと思います。これによって、基板でいうとトランジスタ2N2222回りの配線の確認が行えます。
別の言い方をすると、これまではキューブのColumn側のみにデータ出力していたのを、今度はLayer側にもデータを出力することで、両側の状態でLEDのオンオフが制御されることになります。
実際の配線はこんな感じ。LEDが10個しか用意していないので、+側は適当な間隔で8個のシフトレジスタに割り当て、-側はLED5個ずつ2グループに分け、Layer1とLayer2に接続しています。
で、これに合わせてプログラムを組み直してみました。
基板上のLayer1~8をArduinoのpin5~12に割り当てているので、前回のプログラムをベースにして、pin5~12をOUTPUTにし、Layerを順番にHIGHにしながら、そこにlatchPinのHIGHを組合せて512個のLEDを1個ずつ順番に点灯していきます(実際のLEDは10個だけですが)。
上のプログラムで24行目は、実際(の現時点のハード的)にはLayre1と2にしか接続されていないので、Layer_pinも5と6のみでループするようにしてあります。
トランジスタ側の回路に電気を流すのは初めてなので、今回も最初のスイッチオンは緊張しましたが、取り敢えずは動き出しました。少なくとも回路に大きな間違いはないようで一安心。
が、プログラム的には(もしかしたらハード的?)問題有りのようです。起動直後のLEDの不規則な点灯現象は残ったまま、さらにLEDの点灯順番が狂っていることを発見。
端から順番に点灯、消灯を繰り返していると思っていたら、7番Layerからスタートし、8番Layer、そして1番に戻って2、3となっていました。
これまでは連続ループでLEDの光が流れていたので気がつかなかった。今回、ループとループとの間に待機時間が生じたので、これが表面に現れてきたわけ。
うーむ。回路含めアレコレ検討してみたけど、回答が見つからない。さらに迷宮の奥へと入り込んでいくことになりそうです。
- 関連記事
-
- との粉とパテって似たようなものだと思ってたら、全然誤解してた
- 100均で見つけた桐の箱を素材に、正統的オルゴールを目指し
- 8×8×8 LED CUBE 製作記(18) -- 「柱」と「層」を個別制御
- はんだの煙を吸い取る吸煙実験装置を作ってみた
- 8×8×8 LED CUBE 製作記(17) -- シフトレジスタの使い方