2012年10月30日火曜日

ArduinoにLCD表示器をつなぐ

Arduinoに秋月で500円で売ってるLCDキャラクタディスプレイをつなげてみた。
素直に4ビットで配線すれば、IDEのLiquidCrystalライブラリでそのまま表示できる。

しかしこれでは表示制御のために6本のピンが必要で、何だか無駄だ。シフトレジスタを使えばもっと少ない信号線で制御できると思って、ちょっとGoogleを検索すると、みんな同じ事を考えるようで、すでにちゃんと動作する配線方法と、そのためのライブラリまで存在する。

このシフトレジスタを使った制御方法だと3本、抵抗とダイオードを追加すれば2本、さらに工夫すればたった1本でLCDの表示を制御することもできる。しかも、4ビットでつなぐよりも、表示速度がずっと早い。

とりあえず先日、LEDの点灯にでも使おうかと思って買っておいた74595があったので、 これで3線接続と2線接続を試してみたけど、結果としてちゃんと表示させることができた。
ちょっとひっかかったのは、2本で制御する場合で、ANDゲートを入れるか、抵抗とダイオードでダイオードロジックを組まなければいけないのだが、ダイオードによってはうまくタイミングが取れないことがある。サイトのディスカッションによれば、接合容量が小さくないとダメとのこと。抵抗は、マイコン側ポートがHighで、シフトレジスタ側の出力がLowの時に、シフトレジスタ側に流れてしまう電流を制限する。ここで抵抗とダイオードの接合容量がローパスフィルタになっちゃうので、抵抗はできるだけ小さく、ダイオードの接合容量もできるだけ小さくないと、LCDのEnableのタイミングがずれてしまうということなんだと思う。
部品箱の中に転がってるダイオードの品番なんてわからないので、適当に付けてみたら、最初のトライでは表示が乱れたので、別のダイオードに変えたらオッケーでした。たった2本でつながるのはうれしい。
ただし、2線接続の場合、やや不安定。74595を使うんだったら3線接続の方が確実。2線接続をしたいんだったら74164を使うほうが安定していると思う(けど、似たようなものかもしれない)。上記のEnableのタイミングが乱れるんじゃないかと思う。ブレッドボードなんかを使ってると、シフトレジスタのVccとGND間のパスコンを入れなかったりとか、無意味に長い線で配線したりとか、つい不精してしまうのだけど、ちゃんと気を使ったほうがいいみたい。

なお、New Liquid Crystalライブラリは、標準のLiquidCrystalライブラリの上位互換で、そのうち、Arduino IDEの標準ライブラリになる予定だそうだ。
つまり従来通り、4ビットでつなぐときはそのままNew LiquidCrystalの4bitモードでつなげられる。
2wireと3wireを使いたい場合は、LCD.h(Wire.h?)とLiquidCrysatl_SR.hをインクルードして、LiquidCrystal_SRのインスタンスを作ればいい。

2線接続の場合
#include <LCD.h>
#include <LiquidCrystal_SR.h>

LiquidCrystal_SR lcd(2,3,TWO_WIRE); // data, clockのポートを指定

3線接続の場合
#include <LCD.h>
#include <LiquidCrystal_SR.h>

LiquidCrystal_SR lcd(2,3,4); // data, clock, enableのポートを指定

ただ、現時点(2012/10)段階では、まだこのライブラリは活発な開発が続いているのでいろいろ細かい問題もある。たとえば標準のCustomCharacterだとwriteの型についてのエラーが出る。Arduinoのコアで定義されているwrite(char*)とNewLiquidCrystalのwrite(uint8_t)が異なるのが問題らしいのだけど、ここは強引にwrite((unit8_t)0)みたいにuint8_tなどでキャストしてしまえばコンパイルは通る。ただコンパイルは通っても、なんかおかしい。
あと、NewLiquidCrystalライブラリの例にあるperformanceLCDでもエラーが出てコンパイルできない。これはArduino 1.0.1のバグなのでArduinoのライブラリにパッチを当てる。




0 件のコメント:

コメントを投稿