2012年03月18日
太陽電池やニッケル水素電池の状態を、キャラクタ液晶モジュール(SC1602)に表示するために、PICマイコン(PIC16F886)から液晶モジュールを制御するマイコン回路とプログラムを作ってみました。プルアップされているI/Oピンを、通信アイドル時にハイインピーダンスとすることで、無駄な消費電流を抑えられます。
図:SC1602の表示例
今回の工作では、太陽電池の電気をニッケル水素電池に充電したり、太陽電池やニッケル水素電池の電気を負荷に送ったりして、いつも電気を使えるシステムを作ろうとしています。
充放電が進む様子を液晶画面に表示すれば、蓄えられている電気の量などが分かり、楽しそうです。いわゆるエネルギーの「見える化」です。
今回の工作では、キャラクタ液晶モジュール(SC1602)に文字を表示します。
この液晶モジュールは、PICマイコンなどで簡単に制御できるので、趣味の工作向けに人気があります。
液晶モジュールSC1602には、こんな特徴があります。
アルファベット・数字・カタカナなどを、横に16文字、縦に2行表示できます。
文字の大きさは5×7ドット程度です。
モノクロ表示です。
調整端子の電圧を変えることで、コントラストを調整できます。
それほど高価な物ではありません。「秋月電子通商」で、500円で買うことができました(購入当時)。
液晶モジュールの特性を理解して、なるべく省エネルギーで駆動するように、回路とソフトを作成します。
液晶モジュールSC1602には、以下に示す14本の端子があります。これらの一部をPICマイコンとつなぎ、PICマイコンから表示内容を指示できるようにします。
番号 | シンボル | 説明 |
---|---|---|
1 | VDD | 電源(+5V)に接続 |
2 | VSS | グラウンドに接続 |
3 | Vo | コントラスト調整端子 |
4 | RS | レジスタ選択 |
5 | R/W | 読み出し(H)、書き込み(L)選択 |
6 | E | イネーブル |
7 | DB0 | データ端子のbit0 |
8 | DB1 | データ端子のbit1 |
9 | DB2 | データ端子のbit2 |
10 | DB3 | データ端子のbit3 |
11 | DB4 | データ端子のbit4 |
12 | DB5 | データ端子のbit5 |
13 | DB6 | データ端子のbit6 |
14 | DB7 | データ端子のbit7 |
回路の考え方を説明します。
VDDとVSSは、電源端子です。VDDは+5V、とVSSはグラウンドにつなぎます。2つの端子と並列に0.1マイクロファラド程度のコンデンサを付けると、電圧が安定します。
Voは、コントラスト調整用の端子で、10キロオーム程度の可変抵抗器を介してグラウンドにつなぎます。抵抗値を変えると、コントラストを調整できます。
RSは、PICマイコンからSC1602に送るデータの種類を決めるピンです。PICマイコンと接続します。文字コードを送るときは1(5V)、制御コマンドを送るときは0(0V)をセットします。
Eは、PICマイコンからSC1602に接続した各ピンにセットしたデータを、SC1602に認識させるためのピンです。PICマイコンと接続します。0とした状態でデータをセットし、いったん1に上げ、220ナノ秒以上たってから0に戻すと、データがSC1602に認識されます。
DB0からDB7までは、文字コードや制御コマンドなどのデータを、PICマイコンとSC1602との間で相互に送り合うためのデータ端子です。パラレル通信になっています。
8本の端子全てを使うモード(8bitモード)と、DB4~DB7だけを使うモード(4bitモード)があります。
この工作では、4bitモードを使うので、DB4~DB7までをPICマイコンのI/O端子に接続します。DB0~DB3には、何もつなぎません。
R/Wは、データ端子を入出力どちらの方向にするかを決めます。液晶モジュールにデータを書き込むときは0(GND)、液晶モジュールからデータを読み取るときは1(5V)につなぎます。この工作では、直接GNDにつなぎ、液晶モジュールへの書き込みだけを行えるようにします。
伝送の方向を固定したため、液晶モジュールから情報を受信する手段がありませんが、PICマイコンの動作速度が十分に遅ければ、制御上の問題はありません。
PICマイコン(PIC16F8886)との接続では、例えば以下の図のように回路を構成すればよいです。ただし図中では、SC1602のDB0~DB7を、D0~D7と表記しています。
PICマイコンのどのI/Oピンと、SC1602のどのピンをつなぐかは自由ですが、DB4からDB7までは、パラレルでデータを送るので、PICマイコンの側でもパラレル接続でデータを送りやすいピンを選んだほうが、プログラムを作りやすくなります。以下の回路では、PICマイコンのRB4~RB7を、SC1602のDB4~DB7につなぎ、4ビットのデータをまとめて送れるようにしています。
図:PICマイコンPIC16F886との回路接続例
液晶モジュールSC1602の電源は、直流5Vです。
今回の工作でうは、PICマイコンも5Vで動作させ、同じ電源電圧を共有します。
ノイズや急激な電圧変動を吸収するため、0.1マイクロファラド程度のコンデンサを電源と並列につなぐと、安定性が高まります。
5Vの電圧は、ニッケル水素電池、太陽電池などを、リニアレギュレータで降圧して用います。
今回の工作全体の回路図を、以下に示します。「V5」と書かれた部分が、マイコンとSC1602が使う、5Vの電源です。
図:システム全体の回路図
マイコンと液晶モジュールが用いる電源「V5」では、以下の4種類の端子から、ショットキバリアダイオードを介して電気を集めています。4種類のうち、もっとも高い電圧の端子から、電流が流れることになります。
集めた電気は、電源IC(XC6202P502TB)で5Vに安定化しています。電源ICの入力が5Vよりも高ければ、ほぼ5Vが出力されます。入力が5Vよりも低いときは、この電源ICによる電圧はきわめて小さく、入力とほぼ同じ電圧が出力されます。
端子の記号 | 説明 |
---|---|
VP | 太陽電池(明るいときは8V程度) |
VA | ニッケル水素電池のバンクA(電気が残っていれば5V程度) |
VB | ニッケル水素電池のバンクB(電気が残っていれば5V程度) |
VL | 負荷回路のスーパーキャパシタ(電気二重層コンデンサ) |
ハードができたら、次にPICマイコン(PIC16F886)のプログラムを書いて、文字や数字を自由に表示できるようにします。
液晶モジュールへの表示ルーチンを含む、PIC16F886用のアセンブラソースコードを以下のリンクに示します。
プログラムは、個人的な趣味に限りお使いいただけます。
このプログラムでは、充放電の制御を行うことはできませんが、液晶画面に、起動からの経過時間などを表示します。
このプログラムは、MPLAB IDEというソフトウェア(マイクロチップ・テクノロジー社のホームページから無償でダウンロードできます)を使いアセンブルすれば、PICマイコンに書き込むHEXファイルに変換できます。
HEXファイルは、PICマイコンの書込装置を使えば、PICマイコンのフラッシュメモリに書き込めます。以下の写真は、手持ちのPICマイコンの書き込み装置です。
図:PICマイコンの書込装置の例(PICSTART Plus)
液晶モジュールの操作は、サブルーチンとして作ります。文字や数字を表示したいときは、表示に必要なサブルーチンを呼ぶことにします。
サブルーチンは、以下のものを作りました。
サブルーチン名 | 処理内容 | 説明 |
---|---|---|
lcdinit | 液晶モジュール初期化 | 液晶モジュールを利用可能とするための初期化処理です。最初に1回だけ実行が必要です。実行すると、表示内容は全てクリアされます。 |
lcdrs0 | 制御コマンド送信 | カーソルの移動などの、表示方法を制御するデータを液晶モジュールに送ります。(RSのピンを0とした上で、DB4~DB8のピンに1バイトのデータを送ります。) |
lcdrs1 | 文字コード送信 | 1バイトの文字コードを送信して、液晶モジュールで表示します。(RSのピンを1とした上で、DB4~DB8のピンに1バイトのデータを送ります。) |
lcdhex | 16進数表示 | 1バイトのデータを、16進数2桁の数値として表示します。なお、内部でlcdrs1を呼び出します。 |
さらに、PICマイコンそのものに対して、SC1602と接続しているI/Oピンの設定を行う必要があります。この処理は、サブルーチンではなく、PICマイコンのプログラムのハードウェア初期化処理の中に書きました。
PICマイコンは、サブルーチンを用いて文字や数値の表示を行います。
文字を表示する処理は、以下の流れになります。
まず、PICマイコンが起動した時点で、PICマイコンのI/Oピンを、液晶モジュールにデータを送信できるように設定します。PICマイコンそのものの、ハードウェア初期化処理として実装します。
液晶モジュールを初期化するために、lcdinitサブルーチンを実行します。
表示したい位置に、lcdrs0を使ってカーソルを移動します。
B'10000000'を送ると1行めの先頭、B'10101000'を送ると2行めの先頭に移動します。
上記の値に1ずつ加算していくと、1文字ずつ右の位置になります。
文字を1文字表示するには、その文字コードをlcdrs1で送ります。
文字コードは、半角の英数字であれば、パソコンの文字コードと同じようですが、詳しくは液晶モジュールに付属する文字コード一覧を見たほうがよいです。
データを文字としてではなく、数値として表示したい場合は、lcdhexを呼ぶことで、16進数2桁として表示できます。
ちなみに、ニッケル水素電池を使い切ってしまい、太陽も沈んでしまうと、V5の電圧は低下し、SC1602は動作しなくなります。後で日が昇り、電圧が回復ときに、液晶モジュールをリスタートさせる工夫が、プログラムとして必要となります。
PICマイコンも同様に、電源電圧が低下すると動作しなくなります。マイコンが内蔵するブラウンアウトディテクト(BOD)機能により、電源電圧が約2.1Vを下回ると、動作が止まります。マイコンは、電源電圧が回復すると自動的にリセットされ、電源投入時の動作に戻ります。
SC1602が動作する電源電圧は約4~5Vで、PICマイコン(約2.1~5Vで動作)よりも狭いです。従って、マイコンが動いていても、SC1602が動作できないときがあります。
16秒に1回の頻度で、SC1602の初期化サブルーチン(lcdinit)を実行することで、電源電圧が回復したものの、SC1602が正常な動作となっていないときに、正常な動作に復帰できるようにしました。
液晶モジュールの初期化ルーチンは、画面をいったんクリアするので、画面がちらついて見えるのが、少々気になります。これが、動いている証拠でもあります。
液晶モジュールの消費電流は、PICマイコンのプログラム次第で減らすことができます。太陽電池を使った充放電システムでは、制御装置の省エネ化はきわめて大切なので、少しこだわってみました。
なお、この文章の1つ前の章で紹介したアセンブラのソースコードでは、既に省エネルギー化への対応を実施済みです。
液晶モジュールの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ピンの等価回路模式図(桃色の矢印は電流を示す)
PICマイコンの入出力設定は、SW1により決まります。オンのとき出力(ローインピーダンス)、オフのとき入力(ハイインピーダンス)となります。
PICマイコンのI/Oピンを、ハイインピーダンス状態(入力状態)にセットすると、等価回路内のスイッチ(SW1)が、I/Oピンを、GNDとVddのどちらにも接続しない状態となり、電流をほとんど消費しなくなります。
PICマイコンが出力のとき、出力のレベルは、SW2の状態により決まります。
PICマイコンが1(高レベル)を出力しているときは、プルアップ抵抗には電流はほとんど流れません。
PICマイコンが0(低レベル)を出力しているときは、液晶モジュールのプルアップ抵抗に電流が流れ、PICマイコンのI/Oピンに流れ込みます。図示した桃色の矢印は、この電流を示しています。
電流の大きさは、データシートによると、ピン1本あたり125マイクロアンペア程度のようです。
図:SC1602のデータシートの一部
このように、PICマイコンのI/Oピンを出力モードにして、0を出力したときに、プルアップ抵抗に電流が流れてしまうことが分かりました。
今回の工作では、PICマイコンと液晶モジュールの通信は、常にPICマイコンが出力を行う一方通行です。
液晶モジュールのI/O端子にプルアップ抵抗が入っているので、PICマイコンが0を出力している場合に限り、プルアップ抵抗が電流を消費します。
伝送するデータに「0」が含まれる場合は、一時的に0を出力せざるを得ないので、電流の消費があります。
一方で、伝送が終わった後は、みだりに0を出力しないほうが得策です。
液晶モジュールの"E"(イネーブル)を上げ下げしてデータを送った後は、"E"以外につないでいるPICマイコンのI/Oピンを入力状態(ハイインピーダンス)にすると、液晶モジュールのプルアップ抵抗に電流が流れなくなり、消費電力を抑えられます。
なお、液晶モジュールの"E"(イネーブル)は、常にPICマイコンから出力を行う設定とし、通信を行わないときは0を出力しておきます。"E"のピンにはプルアップ抵抗は入っていません。
ちなみに、マイコンを出力状態にしたままH(高)レベルとしても、消費電力は減少します。
マイコンの入出力を切り替えられない環境であれば、このような操作でも省エネを実現できます。
液晶モジュールの消費電流を、実際に計測してみました。
PICマイコンから液晶モジュールにデータを送っていないときに、PICマイコンのI/Oピンを出力状態のままとし、出力の状態を、直前に送ったレベルのまま変更しないでおくと、0.77mA程度消費します。
一方で、データを送っていないときは、液晶モジュールのDB7,DB6,DB5,DB4とRSにつながっているピンをハイインピーダンスとするようにしたプログラムでは、消費電流が約0.25mA小さくなりました。
ささいな改良ですが、効果は大きいようです。
消費電力を減らすために行う処理は、以下の2つです。
液晶モジュールにデータを送る直前に、液晶モジュールにつながるI/Oピンを、出力(ローインピーダンス)に切り替えます。
以下のサブルーチンは、液晶モジュールにつながるI/Oピンを出力(ローインピーダンス)にします。
lcdpout bsf STATUS,RP0 ; バンク1を選択 movf TRISB,W andlw H'0b' movwf TRISB bcf STATUS,RP0 ; バンク0を選択 return
液晶モジュールにデータを送り終えた直後に、液晶モジュールにつながるI/Oピンを、入力(ハイインピーダンス)に切り替えます。
以下のサブルーチンは、液晶モジュールにつながるI/Oピンを入力(ハイインピーダンス)にします。
lcdpin bsf STATUS,RP0 ; バンク1を選択 movf TRISB,W iorlw H'f4' movwf TRISB bcf STATUS,RP0 ; バンク0を選択 return
なお、これらのサブルーチンは、呼び出す直前に、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マイコンが送信中の場合は、両方ともローインピーダンスとなり、回路が短絡する可能性があります。入出力兼用のピンを持つデバイスは、動作中の抜き差しはやめたほうがよさそうです。
入出力の両方に使う可能性があるピンは、可能な限り入力状態としたほうが、問題が起こりにくいのかもしれません。
今回の工作では、液晶モジュールSC1602を、PICマイコンのI/Oピンとつないで使います。
PICマイコンから液晶モジュールを使うために、初期化、制御コード送信、文字コード送信、数値表示のサブルーチンを用意しました。
液晶モジュールが電圧低下により一時的に使えなくなった場合に備え、起動後も16秒に1回の頻度で、液晶モジュールの初期化処理を行うことにしました。
液晶モジュールにつなぐPICマイコンのI/Oピンは、可能な限り入力状態に設定することで、消費電流を節約するようにしました。
次の記事:電圧と電流を測る--PICマイコン内蔵のADコンバータを使用
手前の記事:太陽電池からの電流を制御する回路の製作--ダイオードに要注意
トップページ→ちょっとだけ電子工作(もくじ)→液晶モジュール (SC1602)の制御ソフトを作る
著者のメールアドレスは、トップページからご覧ください。
製作・著作:杉原 俊雄(すぎはら としお)
(c)2012 Toshio Sugihara. All rights reserved.