2019年6月10日月曜日

Arduino+74HC595+8×8nマトリクスLED(6.1)

今回はメインテーマであるなんちゃって電光掲示板プロジェクトから少し脱線して、サブテーマ的な「行側制御にシフトレジスタ使うのもったいなくね?」問題について検討します。

【問題点の確認】

今回のなんちゃって掲示板プロジェクトは行側カソードのカソードコモンLEDマトリクスを使用していますので、ダイナミック制御時のスキャンは行側で実施しています。スキャンそのものは対象行(1行)を順次切り替えるだけですので、わざわざ8bitのパターン表現を送るのは大げさなのではないか、と考えました。
なにかしらのカウンタがあれば、そこにパルスを送るだけで代替できるはず。そうすれば制御用の8bitデータ送出を丸々削ることができます。将来的にマトリクスを追加した場合にも、マトリクスの駆動限界ごとに制御用8bitの送出を挟む必要がある、というプログラミング上の問題も解消します。




【解決方法の検討】

一応こんな感じの機能が実現できれば、行側制御のためにわざわざ8bitのデータを送る必要がなくなるはずです。

  1. 列側のシフトクロックを8×マトリクスの個数回カウントする
  2. 1をカウントし終わったら行側のカウンタを+1する
  3. 行側のカウンタに対応する行をスキャンする


この機能を実現するためには、クロックをカウントしてくれるICが必要ですね。ググってみたところバイナリカウンタというものが該当するようです。先日パーツ買い出しに行きましたら、74HC4040という12bitカウンタを見つけました。

74HC4040はビットカウンタですので、3の段階では3bitを10進数の1~8までに変換する必要があります。これは一番最初にシフトレジスタ的なものと勘違いして買った74HC138がうってつけです。

よって機能を実現するためには

  1. 一つ目の74HC4040にシフトクロックを入力し、8×n回カウントする
  2. カウントを判定して、一つ目の74HC4040をリセット。と同時に二つ目の74HC4040にクロックを送出
  3. 二つ目の74HC4040の出力ピン下位3本を74HC138に接続して入力とし、74HC138の出力ピンを各行に接続してスキャン。
  4. 二つ目の74HC4040のカウントを判定し、8カウントで二つ目の74HC4040をリセットする。


という感じの回路を組めばよいでしょうか。ど素人なので実現方法は推測にすぎませんが、この線で実験してみればよいかな。カウント判定にはロジックICを使うのでしょうか。多分74HC4040の各出力ピンのANDを取る形で判定することになりそうなので、それっぽいICをググっておくとしましょう。

【74HC4040の動作確認】

まぁ超初心者ですので、まずは74HC4040の動作を単純に確認することにしました。
Arduinoでは単純にループ内でIOピンをON/OFFするようなスケッチを書いてクロック送出をしてもらいます。これを74HC4040のクロックピンに入力します。74HC4040のリセットピンにはArduinoから明示的にリセットを掛けるようにしました。74HC4040の各出力ピンはLEDにつなぐのですが、今回はLEDバーというものを使っています。





2進数・12桁のカウントアップの様子がよくわかります。
※抵抗が極めて適当に接続されていますのでそっくりそのままマネしないように。LEDが死ぬかもしれません。

任意のタイミングでリセットする方法を調査しなくては。
ということで続きは次回。

【おまけ】
やろうとしていることに関して、恐ろしく参考になりそうな記事を発見。Raspberry PiというマイコンというよりはワンボードLinux(外部I/Oあるでよ)といったほうが実態を表していそうなものを使っているのですが、記事そのものがとても興味深い。
こじ研(Raspberry Pi)
リンク先の縦3/4辺りにある「カラー液晶ディスプレーの接続」の「SPI・パラレル変換」あたりがまさにやろうとしていることです。

0 件のコメント:

コメントを投稿

ESP32 Devkit C での疑問点

 前回の投稿から放置状態にあった当ブログですが、再び何かしら作ろうということで、スマートコンセントもどきに取り組んでいます。 回路なども一応動作するものができたのですが、ブレッドボードから移行するために基板に用意しておいたピンソケットにESP32を取り付けたところ、なぜか動作しま...