Raspberry PiでLCDディスプレイに文字を表示する:ハードウェア&ざっくり仕様
前回まででGPIOを使って幾つか実験をしてきました:
最初LチカでGPIOの使い方をざーっと体験し、次に物理ボタンの押し下げでLEDを明滅させて外部入力に対する反応も体験しました。
ボタンを押し下げたらLEDが光るというのは一つの信号ではありますが、欲を言うともう少し色々な情報を見たいわけです。「ラズパイはデスクトップがあるんだからそれで見たらいいんでない?」って思うかもしれません。でも例えばラズパイを何らかの機械に組み込んだ場合、液晶モニターなんて豪華な物を使うと値段が跳ね上がるわけですよ。「Hello!」って表示を見るためだけに何万円かのモニターを付属するとなったらクライアントさんに怒られます(^-^;
という事で情報を表示する別の手段が…となった時に一般的に良く使われるのがLCDディスプレイです:
こういう電光掲示板的なの家電製品とかに良く付いてますよね。今回はこのLCDディスプレイをラズパイに接続して上のような文字を表示してみましょう。
準備する物
LCDディスプレイ+I2Cインターフェイス
LCDディスプレイには幾つかタイプがあるのですが、今回は上の1602 LCDディスプレイとI2Cインターフェイスがセットになった物を購入してみました。1602とは「16文字×2行」というタイプのLCDです。
I2CインターフェイスはLCDディスプレイとラズパイとをつなぐ基板で「I2C」という情報をやり取りする一つの規格に沿ってLCDに命令を伝えてくれます。実はこれが無くても、LCD単体でも文字表示する事は出来るのですが、12本もしくは16本のコードを繋げるという事態になってしまいます。I2Cインターフェイスを使うとこれがたった4本のコードだけで済むんです!
ピンヘッダー(16ピン)
Amazonで購入したLCDディスプレイとI2Cインターフェイスはバラになってました。使うにはこれらをがっちりと接続しなければならないのですが、直接半田付けするのもなんだなぁと。そこで上のようなピンヘッダーをLCDディスプレイに半田付けして、I2Cインターフェイスを挿し込むスタイルにしてみました。
双方を直接ゴリっと半田付けしても別にいいという方は必要ありません。いずれにせよ半田付けは必須です。
LCDディスプレイにI2Cインターフェイスを接続
16ピンヘッダーを半田付け
最初にLCDディスプレイに16ピンヘッダーを半田付けします。やる事は単純で16ピンヘッダーを基板の回路側から挿して、裏を半田付けします。16か所頑張って半田付けしましょう:
I2CインターフェイスとLCDディスプレイを合体
16ピンがしっかり固定されていて、ピン間に半田がブリッヂしていないのを確認したら、I2Cインターフェイスを取り付けます。と言っても挿すだけですが(^-^;
かなりぎゅっと入ります。
I2Cインターフェイスが宙に浮く形になるので、衝撃を与えると根元から折れる危険があります。実用時にはスペーサーを入れたりフレームを作るなど工夫して下さい。
I2CインターフェイスとRaspberry PiのGPIOを接続
I2CインターフェイスとRaspberry PiとをI2Cの仕様に従って配線します。配線する時はラズパイの電源を落として下さい(ラズパイの回路を保護するため。またI2C機器は起動時に認識するため)。
I2Cインターフェイスの基板を拡大してみましょう:
右側に伸びている4本のピンの根元に名前があります。I2C対応機器にはVCC(電源:プラス側)GND(グラウンド:マイナス側)の他にSDA(シリアルデータ)とSCL(シリアルクロック)という端子があります。SDAはデータを送受信する専用線で、SCLは送受信のタイミングを計るクロックデータを通す線です。
これと同じものがRaspberry PiのGPIOにもあります。ラズパイの基板には記載されていないのでGPIOの配置データを見てみましょう:
ピン番号3番と5番に注目です。ここに「GPIO 2(SDA)」「GPIO 3(SCL)」とありますよね。この2つのピンがI2C用として用意されているんです。このピンと対応する同じ名前のピンを結線します。
VCCに与える電源ですが、今回用意したLCDディスプレイは5Vで駆動するので、ピン番号2番(5V power)から電力を貰う事にしましょう。GNDはもちろんGNDへ繋いで下さいね。
双方を配線しラズパイを起動するとこんな画面が表示されるはずです:
バックライトがぱぁっと光るのが嬉しい(^-^)
では次にこのLCDに接続しているI2Cインターフェイスをラズパイがちゃんと認識しているか確認してみましょう。
i2cdetectコマンドで認識を確認
I2C機器をラズパイが認識しているかはターミナルからi2cdetectコマンドを叩くとわかります:
-yオプションはYes確認の省略で、1はI2Cバスの番号です。ラズパイはI2Cバスが1つだけなので「1」を指定します。
コマンドを叩くと上のような一覧表が出てきます。真ん中に「27」とありますよね。これがLCDディスプレイに接続しているI2CインターフェイスのID(16進数の0x27)です!ちゃんと認識されているようです。
ここまで来たらハードウェアは準備完了、後はPythonでプログラムするだけ…ですが、そのためにはLCDとI2Cそれぞれの仕様を把握する必要があります。LCDやI2Cの仕様を知らない状態でプログラムを見ても、多分何しているかさっぱり分かりませんので、ここは急がば回れです。
LCDのざっくりな仕様
12bitで命令する
LCDに限らず組み込みのデジタル機器は特定の数値を送受信する事で動作します。デジタルな数値はbit列で表現され、その各bitをON/OFFする事でやりたい意思を機器に伝えるんですね。
今回のLCDディスプレイは下図の赤枠にある12か所のbitに同時に信号を与える(パラレル通信)事で1つの動作が起こります:
この有効ビットに電気を流したり流さなかったりすることで動作の種類を決めるんですね。この有効ビットの各端子は大きく3つのカテゴリーに分けられます。
○ 命令情報系
上表記のRS、RW、D0~D7の10bitはLCDに行わせたい命令を表すbitになります。それぞれどういうビットにするかはデータシートの命令表に指定があります。一部抜粋します:
「Clear Display(画面クリア)」をしたいならDB0(=D0)だけに電気を流して、後は流さないでおきなさい、っという事です。
○ 命令実行系(Enable信号)
端子の「E」はEnable Signal(Enable信号)と言って、LCDはこれがONになると初めて命令情報系に指定されている値を読み取って実行してくれます。逆に言えばEをOFFにしていると何も実行しません。
「ONのままにすると同じ命令が起き続けるのか?」というとNoです。実はEがOFFからONになった瞬間に1回だけ命令を実行してくれるんです。そのため、命令を1回実行したらその後すぐにOFFにしておかないと次の命令が実行されない事になります。
もう一つ知っておかなければならないのが確認の周期です。LCDはEnable信号を無限に短い時間で確認しているわけではありません。今回のLCDの場合は500ns、つまり0.5msほどを1周期とし、その内230ns(0.23ms)で「Enableになった?」と確認しています。よって何か命令を実行したい時、少なくとも270ns以上はEnable Signalの端子に電気を通し続けておかないといけないんです。下にその模式図を描いてみました:
1命令実行時にEnable Signaleに270ns以上電気を流し続けておけば、どこかの確認タイミング内でOFF→ONの瞬間が捉えられます。しかし270ns未満だと下側の命令のように270nsの確認空白時間に嵌ると実行されなくなります。これは即誤動作に繋がります。
実際は270nsジャストではなく0.5msくらい十分に長い時間Enable SignaleをONにし続けて、確実に命令されるようにします。
○ バックライトON/OFF系
最後残った「A」はバックライトのON/OFF用のbitです。これが無いLCDもあります。I2Cインターフェイスを介する場合、命令系のbitと一緒にバックライトのON/OFFのビットも送信されます。その為バックライトをONにするかOFFにするかは命令発行の度に送る事になります。この辺りはプログラム開発時にちょっと考慮が必要です。
8bitモードと4bitモード
極めて大切な事として、今回のLCDにはデータを送受信するモードに「8bitモード」と「4bitモード」があります。これはLCDを使う人が意識して指定する必要があります。下図をご覧ください:
8bitモードの場合、有効ビットのすべてに結線してLCDを使うのですが、4bitモードの場合は何とD0~D3までを使いません!
なんでこんな仕様があるかと言うと単純に配線数を減らすためです。回路は配線が少ないに越した事はありません。
ではD0~D3を使わない4bitモードでどうやって命令するのか?だって命令表ではD0~D7まで余す事無く使っている訳ですから。4bitモードの配線だとD0~D3が常にOFFになってしまうように見えます。
もちろんこれはちゃんと仕様が決まっていて「命令を2度実行する」方法を採用しています。D4~D7に電気を流した状態で1回目のEnable信号を発信すると、それがD4~D7(high bit)としてLCD内のメモリに一時保存されます。そして一旦Enable信号をOFFにし、2回目でD0~D3(low bit)に設定したい値をD4~D7に流してEnableするんです。この2回目のEnableの瞬間にD0~D7の値が揃い1命令が実行されます。
この仕様を見て「えーめんどくさー。じゃあ8bitモードでいいっす」と僕は最初思いました。8bitモードなら1送信で1命令、シンプルです。でもちょっと待って。LCDディスプレイの端子に直結しているのは僕でもラズパイでもなく「I2Cインターフェイス」です。そして、今回のI2Cインターフェイスは4bitモードのみサポートしています!てことは、この面倒くさい方式で情報を与えないといけないんです…。ぬぅ…
I2Cインターフェイスのざっくりな仕様
I2Cインターフェイスはラズパイから送信した命令を解釈して、LCDの各bitに信号を送ってくれる仲介者です。このインターフェイスがあるお陰で最大16配線が必要なLCDに対して、ラズパイ側は4本の線だけでLCDを操れます。これによりラズパイのGPIOをうんと節約できるんです。
今回のI2Cインターフェイスは1回で8bitの情報を送受信できます。ここで、先程のLCDのモード図にある4bitモードの配線数を数えてると8本ありますよね。そう、8bitあれば命令(の半分)、Enable信号、バックライトすべてを1送信で指定できます。だからI2Cインターフェイスは4bitモードを採用しているんです。
I2Cインターフェイスのビット位置とLCDの端子の関係は次のようになっているようです:
3bit目でバックライト、2bit目でEnable信号、残りで命令情報を扱っているのが分かりますね。このビットの対応、プログラムする上で極めて重要です。
終わりに
今回はLCDとI2Cインターフェイスのハードウェア準備とざっくりとした仕様を見てみました。この辺りまでの情報があればLCDをプログラムで動かせます!さっそくPythonでプログラムしてみましょう!…長くなったので次回でww
ではまた(^-^)/
この記事が気に入ったらサポートをしてみませんか?