8×8×8 LED CUBE 製作記(18) -- 「柱」と「層」を個別制御

8×8×8 LED CUBE の制御基板が正しく出来てるのかを確認するためのプログラムですが、苦労しています。前回の電源投入時のみ発生する挙動不審な動作の原因は未解決のまま。

実は、一旦解決策が見つかったと思った瞬間もあったんです。そのプログラムの修正部分。

プログラム変更後
こっちは、前回のプログラムの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の光が流れていたので気がつかなかった。今回、ループとループとの間に待機時間が生じたので、これが表面に現れてきたわけ。

うーむ。回路含めアレコレ検討してみたけど、回答が見つからない。さらに迷宮の奥へと入り込んでいくことになりそうです。



8×8×8 LED CUBE 製作記(17) -- シフトレジスタの使い方

8×8×8 LED CUBE 製作も前回でハード的にほぼ完成した積りでいるけれど、配線は間違えていないかとか、はんだ付けをミスっていないかみたいな点はまだ未確認。

ということで、今回はハードが設計通り出来上がっているのかを確認していきます。

LED群のはんだ付けに関しては、製作途上で何度も確認しながら進めて来たけど、4×4×4CUBE製作の経験から言うと、ある日なんの前触れも無くはんだ付けが外れてるってことも。

なので、制御基板と接続して、LED群の確認を兼ねながら基板の確認をしていこうと思います。ただ、まだキチンと動かせるソフトが完成していないので、取り敢えず簡易的なソフトで確認を。

ブレッドボード上でシフトレジスタ74HC595の動作確認から

先ずはシフトレジスタ74HC595の動作確認からいこうかな。

シフトレジスタの使い方はなんとなく理解した積りではいるけれど、実際にプログラムを組んだことはないので、その具体的な中身はブラックボックス状態。

ブレッドボード上に回路を組み、Arduinoからの信号でLEDの点灯制御を行ってみます。

回路はこんな感じ。LED CUBE の74HC595×8個、LED×512個への橋渡しとして、今回は取り敢えず2個の74HC595で、10個のLED(一部、配線省略)を制御してみようと思います。

74HC595動作実験回路

プログラムはArduinoのリファレンスで、「shiftOut」に掲載されている例を微妙に変更して使用。


20行目のシフト演算で、i=8以上になると、データは2バイトの大きさ(1 0000 0000 とか)となり、1度には送れません。そこで、23行目、24行目のshiftOut関数にて1バイトずつ送ります。

実際にブレッドボード上に回路を組み上げ、上記プログラムを走らせると無事に動き出しました。静止画なので伝えようがありませんが、LEDの光が右から左へと流れていきます。

シフトレジスタ動作確認

今度は制作した制御基板上のシフトレジスタ74HC595を使って

さて、これを踏まえて、今度はLED10個をキューブの制御基板に繋げて、制御基板上のシフトレジスタ経由で動くのかを試してみましょう。

プログラムは、先のものをシフトレジスタ8個として改変していきます。

Arduinoのリファレンスの例から私の理解したところで言えば、今度はデータが8バイトとなるので8個の変数を用意し、それを8回のshiftOut関数にて1バイトずつ送ればいいのではないかと。


まあ、もっとスマートな記述方法があるとは思うけど、考え方的にはこれであってるんではないかと。

さて、LEDを制御基板に繋げ、基板の電源も、PCからArduinoへのデータ信号も、今回製作したベースボックスのUSBプラグ経由で行います。

ただし、GNDラインはトランジスタ(2N2222)経由ではなく、制御基板の電源のGNDラインへと直接接続します。そのために、基板にもう一つピンソケットをはんだ付けしました。

「+と-、逆じゃないよな!」とか配線を何度も確認しましたが、それでも初めての電源投入には緊張した。長時間の労力が一瞬で消えてしまったりしないよね、って。

さて、結果は?

動き出しました。Arduinoへのプログラム送信も無事に行えたし、取り敢えず一安心。

10個のLEDを、8個のシフトレジスタからの出力ピンに適当に割り振って接続してますが、どのシフトレジスタもキチンと機能してくれているようです。

ただし問題が。起動時のみ、LEDが意味不明な点滅を繰り返し、それがひと段落すると、何事も無かったかのように(想定通りに)端から順番にLEDが点灯し、消灯していきます。

基板にLED接続して2

さて、何が間違っているのでしょうか? 回答は次回のお楽しみ(解決出来るのか不安だけど)。


4*4*4 LED CUBE 今回はArduinoと74HC595を使って

4×4×4のLEDキューブをArduinoで制御するのには、大きく分けて2つの方法があるようです。
  1. LEDとArduinoとを(抵抗を介して)直結(4×4×4まではピン数がギリギリ足りる)
  2. LEDとArduinoとの間に74HC595等のICを入れて、出力ピンを増やす
1.の方が考え方としてはシンプルですよね。なので、前作の4×4×4 LEDキューブは、こちらの方法を取り入れて製作しました。

ただ、これだと最大数で4×4×4 までなので、次に目指している8×8×8 のLEDキューブを製作するには、2.の方法をとる必要があります。

ってことで、ICの74HC595自体は既に購入して、その働き方も(少しは)分かった積りではいるのですが、なかなか着手するまでは至らずに、って感じですね。

ところで、いきなり8×8×8キューブに着手するにはハードルが高いので、取り敢えず前回と同じ4×4×4キューブを74HC595を使った回路にて製作してみようかと思います。

64個のLEDを組み上げて

64個のLEDを組み上げていくのは、前回経験済みなので、今回はあっさりと。LEDのカソード側(-側:通常は短い足の方)を90度曲げ、前回作った治具へとはめ、ハンダ付けしていきます。

治具にはめて

これを4回繰り返し、4段分の4×4 LEDが完成。

4段完成

続いて、LEDの曲げてないほうの足(アノード側)をハンダ付けしていってキューブの完成。

4段積み上げ

って感じであっさりと書いていますが、64個のLEDをハンダ付けして組み上げていくのは、本当に根気のいる作業。休み休み少しずつ組み上げていきました。

でも、8×8×8キューブを作るって事は、これを更に8回分繰り返すってことですから、考えるだけでも気の遠くなるような作業に思えて、今から気が重い。

74HC595を使った実体配線図

さて、今度は駆動回路の方に取りかかります。

ネットにて検索したいくつかの回路図を参考にして、下図のような実体配線図を描いてみました。使ったのは、フリーのプリント基板エディタ「PasS」。このソフト、本当に使いやすいです。

Arduinoと接続

ところで、今回回路の製作に使ったのは中華製の安いブレッドボードパターン基板。で、上図で横に走っている何本かの青い線(赤い線も1本)は横繋がりの電源ラインです。

この手の作業に慣れていない私にとってパーツ間を線材で結ぶのは本当に骨の折れる作業でしたが、このブレッドボードパターン基板のお陰で、どれだけ作業が楽になったことか。

上記実体配線図で、[F1]~[F4]は抵抗、トランジスタからカソード同士を繋げた各階層(Layer)へと接続され、一方でピンソケットを介してArduinoの[D5]~[D8]へと接続されます。

また[A0]~[A15]は、縦(Column)の16本のアノードから74HC595の該当ピンへと。

で、実際に出来上がったのがこちら(見せるのが恥ずかしいくらいグチャグチャですが)。

基板完成

ただ、実際に配線しながら気が付いたのは、表側からブレッドボードパターンが分からないのはかなり不便だってこと。これは事前に電源ラインの位置をマジック等で明記しておいた方が良さそう。

上の基板の赤い印のついた穴へと、先に出来上がったLEDキューブの16本の足を差し込んで(これが、結構大変)、ハンダ付けしていきます。

基板とLED合体

最後に、各階層から4本のスズメッキ線を基板上へと下ろして、ハンダ付けしてハードは完成。次回はソフトに取りかかります。


1本10円なのに想像以上に明るいフルカラーLEDに技術の

Arduino のアナログ出力を使って3本のLEDを調光(徐々に明るくしたり、暗くしたり)してみましたが、eBay にて注文していたフルカラー(RGB)LEDが届きました。

RGB LED
20本で約230円(送料込み)なので、1本10円ちょい。

一番長い足がカソードとは限らないのね

早速、どんな色で点灯するのか確認してみようと自作のLEDチェッカーに差し込んでみたら点灯しない。あれっ、不良品?って思いながら色々とやってみたけど点かない。

念のためにとプラスマイナス(アノードとカソードを)逆に接続してみたら点灯しました。

以前、4本足のRGB LEDのことを調べた時、一番長い足がカソード(コモンカソード)で、残りの3本が各色のアノードとあったので、全てこの配列なんだと思い込んでいたんです。

手元に届いた現物を調べてみたら、以下のような配置になっていました。

RGB LEDピン配置

この後、ネットで調べてみたら、4本足のRGB LEDにはコモンアノードのものと、コモンカソードの両方が普通に存在してるんですね。

eBay 辺りで買うとデータ表記等は無いことも多いので、今回も自分で調べてみるまで分かりませんでした。ついでに各色の電圧降下も測定してみたのが上の写真の「Vf」です。

微妙な色に拘るなら抵抗値に気を配る必要が?

ということで、前回3本のLEDのアノードをArduinoの9、10、11番ピンに接続して制御しましたが、今回は逆に3本のカソードをArduinoの出力ピンに接続する必要があります。

一番簡単な接続方法はこんな感じでしょうか。

RGB_LED 配線1

ただ、この接続方法だと各色のVfが異なるので、それぞれに流れる電流が同じではありません(明るさが同じにならない)。

例えば、赤を基準に10mAの電流が流れるように抵抗値を設定(320Ω)すると、青と緑にはそれぞれ7.6mA、8.6mAの電流が流れることになります(で、正しいのかな?)。

これを3色それぞれに10mAの電流を流すには、各色のVfにあわせた抵抗を接続する必要があり、その3種類の抵抗を接続したのか下の図。

RGB_LED 配線2

現実的にはこんな微妙な抵抗値を設定するのは難しいので、近似値の抵抗を接続して、あとはArduino からの出力値で調整することになるのでしょうね。

RGBの3色をフルに点灯した時、発光色は “白” になりますが、この白色の色に拘らなければ(微妙に違う色が混ざっても良ければ)それほど神経質になることもないのですが。

もう少し洗練させていく必要があるけれど

さて、この状態で前回作った(3本のLED用の)プログラムを走らせてみたら、発光色はキチンと変わっていきますが、アノード側とカソード側が逆なので、挙動がやっぱり少し変です。


コモンアノードに合わせてプログラムに手を加えていく必要がありますが、取り敢えずフルカラーLEDの制御が出来そうな雰囲気にはなってきたかな。


Arduino用のプログラムを流用してATtiny2313に書き込む

自作したArduinoのブレッドボード製プロトシールドを試しに使ってみようと3色のLEDの調光にトライしてみたら、これが想像以上に美しい。最後にLEDの上に被せた琉球ガラスの小片が効いてる。

結構イイ感じに出来上がり、このままバラしてしまうのはもったいないので、これを電池駆動にしてランタン風のものを作ってみようと思います。折角なので、メロディーも流してみようかな。

とは言っても大して難しい話ではなく、Arduinoで制御しているのを1個のマイコンで置き換えるだけ。今回はATtiny2313を使ってみましょう。

ArduinoとATtiny2313とでは、PWMのpin番号が異なるので

プログラム自体は、前回作ったものをほぼそのまんま使います。ただ、前回も説明したとおり、LEDの調光をするには PWM出力で行うので、pin番号が変わってきます。

ATtiny2313ではPB2、PB3、PB4、そしてPD5がPWM対応のpinとなっています。pin番号で言うと、11、12、13、そして9番となります。

今回は11~13番のpinを使いますので、それに合わせてプログラムに変更を加えますが、僅か一箇所だけの変更でOK。3行目の {9, 10, 11} を {11,12,13} に変更するだけ。

ところで、Arduino用のスケッチを(ほとんど)そのままATtiny2313で使うには、Arduino IDE (Arduinoの開発環境)からATtiny2313に書き込むための環境を構築する必要があります。

以前、kosakalabさんのArduino IDEでATtiny他の開発(Arduino-ISP編)という記事を参考にこの環境を構築しましたが、(ハード的には)一旦バラしてしまったので再構築。

ブレッドボード製プロトシールド上の「3色LED調光回路」をバラし、ここにパーツを配置して配線をして完了。すごく簡単。

ATtiny2313書き込み装置

Arduino IDEで [ツール] > [マイコンボード] > [ATtiny2313] を選択し、続いて [ツール] > 書込装置] > [Arduino as ISP] として、[マイコンボードに書き込む]であっさりと書込み完了。

って思っていたら、なぜか書き込み出来ていませんでした。なぜ?

Arduino IDEの下の小窓に書き込まれているのを見てみたら、こんな表示が。

not in sync
この「not in sync: resp=0×00」ってのは何?って調べてみたら、Arduinoでこのエラーメッセージはどうやら珍しい現象ではないようで、検索結果もたくさんヒットします。

が、どうやら決定的な解決策が無いらしい。困ったな。以前、ArduinoからATtiny2313に書き込みをしたときは、何の問題もなく書き込めたのに、何がどうなってしまったんでしょうか?

Arduino の not in sync を解決するには時間がかかりそうなので

一旦この方法は諦め、もう一つある書込み装置HIDaspxを使うことに。ここで軽く触れましたが、こちらで公開されている「私家版 Ardublock」をダウンロードし、インストールすることで、Arduino IDEからHIDaspx経由でATtiny2313に書き込むことが出来ます。

ArduinoとHIDaspx組合

今度は何のエラーも発生することなく無事に書き込み完了(多分)。

取り敢えず動作確認のために、ブレッドボード上に回路を組み上げました。ミニブレッドボードは、こうしたちっちゃな回路を組むには小回りが利いて重宝します。

ATtiny2313で制御
が、電源ラインが無いのが玉に瑕。なので、ブレッドボード製プロトシールドを作った時に、切り離して不要になったブレッドボードの電源ラインを活用してみたら、これが以外に便利かも。

プログラムの方も無事に書き込めていたようで、単三電池3本の電源でATtiny2313が3色のLEDを順にボワーって点灯させ、そしてボワーって消灯させという動作を繰り返しています。

次回、この回路をユニバーサル基板上に組み上げていきます。


<< topページへこのページの先頭へ >> 次のページへ >>