液晶モジュール (SC1602)の制御ソフトを作る

2012年03月18日


太陽電池やニッケル水素電池の状態を、キャラクタ液晶モジュール(SC1602)に表示するために、PICマイコン(PIC16F886)から液晶モジュールを制御するマイコン回路とプログラムを作ってみました。プルアップされているI/Oピンを、通信アイドル時にハイインピーダンスとすることで、無駄な消費電流を抑えられます。

SC1602の液晶画面
図:SC1602の表示例

1.太陽電池による充放電を「見える化」する

今回の工作では、太陽電池の電気をニッケル水素電池に充電したり、太陽電池やニッケル水素電池の電気を負荷に送ったりして、いつも電気を使えるシステムを作ろうとしています。

充放電が進む様子を液晶画面に表示すれば、蓄えられている電気の量などが分かり、楽しそうです。いわゆるエネルギーの「見える化」です。

今回の工作では、キャラクタ液晶モジュール(SC1602)に文字を表示します。

この液晶モジュールは、PICマイコンなどで簡単に制御できるので、趣味の工作向けに人気があります。

液晶モジュールSC1602には、こんな特徴があります。

それほど高価な物ではありません。「秋月電子通商」で、500円で買うことができました(購入当時)。

液晶モジュールの特性を理解して、なるべく省エネルギーで駆動するように、回路とソフトを作成します。

2.I/Oピンをつないで回路を製作

2.1.PICマイコンとのつなぎかた

液晶モジュールSC1602には、以下に示す14本の端子があります。これらの一部をPICマイコンとつなぎ、PICマイコンから表示内容を指示できるようにします。

表:液晶モジュールSC1602の端子
番号シンボル説明
1VDD電源(+5V)に接続
2VSSグラウンドに接続
3Voコントラスト調整端子
4RSレジスタ選択
5R/W読み出し(H)、書き込み(L)選択
6Eイネーブル
7DB0データ端子のbit0
8DB1データ端子のbit1
9DB2データ端子のbit2
10DB3データ端子のbit3
11DB4データ端子のbit4
12DB5データ端子のbit5
13DB6データ端子のbit6
14DB7データ端子のbit7

回路の考え方を説明します。

PICマイコン(PIC16F8886)との接続では、例えば以下の図のように回路を構成すればよいです。ただし図中では、SC1602のDB0~DB7を、D0~D7と表記しています。

PICマイコンのどのI/Oピンと、SC1602のどのピンをつなぐかは自由ですが、DB4からDB7までは、パラレルでデータを送るので、PICマイコンの側でもパラレル接続でデータを送りやすいピンを選んだほうが、プログラムを作りやすくなります。以下の回路では、PICマイコンのRB4~RB7を、SC1602のDB4~DB7につなぎ、4ビットのデータをまとめて送れるようにしています。

SC1602の回路
PIC16F886の回路
図:PICマイコンPIC16F886との回路接続例

2.2.電源の取り方

液晶モジュールSC1602の電源は、直流5Vです。

今回の工作でうは、PICマイコンも5Vで動作させ、同じ電源電圧を共有します。

ノイズや急激な電圧変動を吸収するため、0.1マイクロファラド程度のコンデンサを電源と並列につなぐと、安定性が高まります。

5Vの電圧は、ニッケル水素電池、太陽電池などを、リニアレギュレータで降圧して用います。

今回の工作全体の回路図を、以下に示します。「V5」と書かれた部分が、マイコンとSC1602が使う、5Vの電源です。



図:システム全体の回路図

マイコンと液晶モジュールが用いる電源「V5」では、以下の4種類の端子から、ショットキバリアダイオードを介して電気を集めています。4種類のうち、もっとも高い電圧の端子から、電流が流れることになります。

集めた電気は、電源IC(XC6202P502TB)で5Vに安定化しています。電源ICの入力が5Vよりも高ければ、ほぼ5Vが出力されます。入力が5Vよりも低いときは、この電源ICによる電圧はきわめて小さく、入力とほぼ同じ電圧が出力されます。

表:液晶モジュールとPICマイコンの電源の供給源
端子の記号説明
VP太陽電池(明るいときは8V程度)
VAニッケル水素電池のバンクA(電気が残っていれば5V程度)
VBニッケル水素電池のバンクB(電気が残っていれば5V程度)
VL負荷回路のスーパーキャパシタ(電気二重層コンデンサ)

3.文字と数字を表示する制御プログラムを作る

ハードができたら、次にPICマイコン(PIC16F886)のプログラムを書いて、文字や数字を自由に表示できるようにします。

液晶モジュールへの表示ルーチンを含む、PIC16F886用のアセンブラソースコードを以下のリンクに示します。

アセンブラのソースコード(120203a7.asm)

プログラムは、個人的な趣味に限りお使いいただけます。

このプログラムでは、充放電の制御を行うことはできませんが、液晶画面に、起動からの経過時間などを表示します。

このプログラムは、MPLAB IDEというソフトウェア(マイクロチップ・テクノロジー社のホームページから無償でダウンロードできます)を使いアセンブルすれば、PICマイコンに書き込むHEXファイルに変換できます。

HEXファイルは、PICマイコンの書込装置を使えば、PICマイコンのフラッシュメモリに書き込めます。以下の写真は、手持ちのPICマイコンの書き込み装置です。


図:PICマイコンの書込装置の例(PICSTART Plus)

3.1.液晶モジュールを操作するサブルーチンの作成

液晶モジュールの操作は、サブルーチンとして作ります。文字や数字を表示したいときは、表示に必要なサブルーチンを呼ぶことにします。

サブルーチンは、以下のものを作りました。

表:液晶モジュールSC1602を制御するサブルーチン一覧
サブルーチン名処理内容説明
lcdinit液晶モジュール初期化液晶モジュールを利用可能とするための初期化処理です。最初に1回だけ実行が必要です。実行すると、表示内容は全てクリアされます。
lcdrs0制御コマンド送信カーソルの移動などの、表示方法を制御するデータを液晶モジュールに送ります。(RSのピンを0とした上で、DB4~DB8のピンに1バイトのデータを送ります。)
lcdrs1文字コード送信1バイトの文字コードを送信して、液晶モジュールで表示します。(RSのピンを1とした上で、DB4~DB8のピンに1バイトのデータを送ります。)
lcdhex16進数表示1バイトのデータを、16進数2桁の数値として表示します。なお、内部でlcdrs1を呼び出します。

さらに、PICマイコンそのものに対して、SC1602と接続しているI/Oピンの設定を行う必要があります。この処理は、サブルーチンではなく、PICマイコンのプログラムのハードウェア初期化処理の中に書きました。

3.2.サブルーチンを使って情報を表示

PICマイコンは、サブルーチンを用いて文字や数値の表示を行います。

文字を表示する処理は、以下の流れになります。

ちなみに、ニッケル水素電池を使い切ってしまい、太陽も沈んでしまうと、V5の電圧は低下し、SC1602は動作しなくなります。後で日が昇り、電圧が回復ときに、液晶モジュールをリスタートさせる工夫が、プログラムとして必要となります。

PICマイコンも同様に、電源電圧が低下すると動作しなくなります。マイコンが内蔵するブラウンアウトディテクト(BOD)機能により、電源電圧が約2.1Vを下回ると、動作が止まります。マイコンは、電源電圧が回復すると自動的にリセットされ、電源投入時の動作に戻ります。

SC1602が動作する電源電圧は約4~5Vで、PICマイコン(約2.1~5Vで動作)よりも狭いです。従って、マイコンが動いていても、SC1602が動作できないときがあります。

16秒に1回の頻度で、SC1602の初期化サブルーチン(lcdinit)を実行することで、電源電圧が回復したものの、SC1602が正常な動作となっていないときに、正常な動作に復帰できるようにしました。

液晶モジュールの初期化ルーチンは、画面をいったんクリアするので、画面がちらついて見えるのが、少々気になります。これが、動いている証拠でもあります。

4.液晶モジュールの消費電流を減らす

液晶モジュールの消費電流は、PICマイコンのプログラム次第で減らすことができます。太陽電池を使った充放電システムでは、制御装置の省エネ化はきわめて大切なので、少しこだわってみました。

なお、この文章の1つ前の章で紹介したアセンブラのソースコードでは、既に省エネルギー化への対応を実施済みです。

4.1.I/Oピンのプルアップ抵抗を通じて電流が無駄になる

液晶モジュールのI/Oピンには、PICマイコンから一方的にデータを受け取るだけのものと、状況に応じてPICマイコンと双方向で通信できるものがあります。

今回の工作では、双方向で通信できるピンも、R/Wピンをグラウンドに直結することで、PICマイコンから一方的にデータを受け取る設定にしています。

従って、どのピンでも、データはPICマイコンから液晶モジュールへ向かう方向に、一方通行で流れます。

I/Oピンは、情報を送る側をローインピーダンス、情報を受ける側をハイインピーダンスとします。従って、液晶モジュールは常にハイインピーダンスとなります。PICマイコンは、常にローインピーダンスとするのが原則です。

液晶モジュールのI/Oピンには、プルアップ抵抗が内蔵されています。プルアップ抵抗は、I/Oピンと電源(5Vのほう)の間を結ぶ抵抗です。I/Oピンにつながれた相手がハイインピーダンスとなったときに、論理を1に固定する目的で挿入されています。

以下の図は、プルアップ抵抗を伴う液晶モジュールのI/Oピンと、PICマイコンのI/Oピンを接続した様子を模式的に示しています。

I/Oピンの等価回路模式図
図:I/Oピンの等価回路模式図(桃色の矢印は電流を示す)

このように、PICマイコンのI/Oピンを出力モードにして、0を出力したときに、プルアップ抵抗に電流が流れてしまうことが分かりました。

4.3.データを送らないときは電流を無駄に流さない

今回の工作では、PICマイコンと液晶モジュールの通信は、常にPICマイコンが出力を行う一方通行です。

液晶モジュールのI/O端子にプルアップ抵抗が入っているので、PICマイコンが0を出力している場合に限り、プルアップ抵抗が電流を消費します。

伝送するデータに「0」が含まれる場合は、一時的に0を出力せざるを得ないので、電流の消費があります。

一方で、伝送が終わった後は、みだりに0を出力しないほうが得策です。

液晶モジュールの"E"(イネーブル)を上げ下げしてデータを送った後は、"E"以外につないでいるPICマイコンのI/Oピンを入力状態(ハイインピーダンス)にすると、液晶モジュールのプルアップ抵抗に電流が流れなくなり、消費電力を抑えられます。

なお、液晶モジュールの"E"(イネーブル)は、常にPICマイコンから出力を行う設定とし、通信を行わないときは0を出力しておきます。"E"のピンにはプルアップ抵抗は入っていません。

ちなみに、マイコンを出力状態にしたままH(高)レベルとしても、消費電力は減少します。

マイコンの入出力を切り替えられない環境であれば、このような操作でも省エネを実現できます。

4.4.実験で効果を確かめる

液晶モジュールの消費電流を、実際に計測してみました。

PICマイコンから液晶モジュールにデータを送っていないときに、PICマイコンのI/Oピンを出力状態のままとし、出力の状態を、直前に送ったレベルのまま変更しないでおくと、0.77mA程度消費します。

一方で、データを送っていないときは、液晶モジュールのDB7,DB6,DB5,DB4とRSにつながっているピンをハイインピーダンスとするようにしたプログラムでは、消費電流が約0.25mA小さくなりました。

ささいな改良ですが、効果は大きいようです。

消費電力を減らすために行う処理は、以下の2つです。

なお、これらのサブルーチンは、呼び出す直前に、STATUSレジスタが「バンク0」を指していることを前提としています。

また、"TRISB"は、PICマイコンの「ポートB」のI/Oピンの入出力状態を設定するレジスタ名です。

入力とするピンはビットを1、出力とするピンはビットを0とします。

この追加により、データ送信時以外は、液晶モジュールのD7,D6,D5,D4とRSのピンがハイインピーダンスとなります。

液晶モジュールのE(イネーブル)のピンは、通信していないときは0に保つ必要があるので、対応するPICマイコンのI/Oピンは出力のままにしておきます。

ちなみに、このキャラクタ液晶モジュールのデータシートによると、マイコン(PICマイコンなど)は、表示コマンドを送る前に、モジュールからデータを受信して、コマンドを送ってもよいか確かめる、状態の確認を行ったほうがよいとされています。

このような行儀のよい使い方をすれば、マイコン側は、自ら送信しないときは、I/O端子をハイインピーダンスにして待機するでしょうから、自然と省エネになります。

今回の工作では、PICマイコンのクロックが31kHz程度と遅いため、モジュールの状態を確認しなくても、制御の上では問題ありません。一方で、PICマイコンのI/Oピンを出力のままにしておくと、電流の無駄づかいになる可能性が起こりました。

なお、動作中に液晶モジュールを抜き差しすると、電圧のかかり具合によっては、一瞬だけ液晶モジュール側が出力状態(ローインピーダンス)になる可能性も否定できなかったりします。PICマイコンが送信中の場合は、両方ともローインピーダンスとなり、回路が短絡する可能性があります。入出力兼用のピンを持つデバイスは、動作中の抜き差しはやめたほうがよさそうです。

入出力の両方に使う可能性があるピンは、可能な限り入力状態としたほうが、問題が起こりにくいのかもしれません。

5.まとめ

今回の工作では、液晶モジュールSC1602を、PICマイコンのI/Oピンとつないで使います。

PICマイコンから液晶モジュールを使うために、初期化、制御コード送信、文字コード送信、数値表示のサブルーチンを用意しました。

液晶モジュールが電圧低下により一時的に使えなくなった場合に備え、起動後も16秒に1回の頻度で、液晶モジュールの初期化処理を行うことにしました。

液晶モジュールにつなぐPICマイコンのI/Oピンは、可能な限り入力状態に設定することで、消費電流を節約するようにしました。


次の記事:電圧と電流を測る--PICマイコン内蔵のADコンバータを使用

手前の記事:太陽電池からの電流を制御する回路の製作--ダイオードに要注意


トップページちょっとだけ電子工作(もくじ)→液晶モジュール (SC1602)の制御ソフトを作る
著者のメールアドレス・Twitterアカウントは、トップページからご覧ください。

製作・著作:杉原 俊雄(すぎはら としお)
(c)2012 Toshio Sugihara. All rights reserved.