桜のはなびらどっとねっとロゴ

桜のはなびらどっとねっと

Arduino Unoでキャラクタ液晶制御

この記事は1年以上前に投稿された記事です。 この警告表示について

IMG_7116_20151218

IO関係は一通り制御出来たので次はキャラクタ液晶を制御してみたいと思います。(Raspberry Piで行ったとおりに行くなら次は1桁の7セグLEDですが、多分殆どあのコードママで動くので飛ばします。)

キャラクター液晶の説明とかそういうの

キャラクタ液晶(モジュール)とは、マイコンを内蔵していて文字コードをマイコンに転送することで文字(基本的には英数字とカナ)を表示することの出来る液晶のことで。マイコンを使って簡単に文字情報を表示することが出来ます。詳しくは前回Raspberry Piにて制御したものに書いてあるのでそれを見てください。

用意するもの

  • パラレル接続のキャラクタ液晶(コントローラがHD44780互換品・5V仕様)
    今回は秋月電子の定番品であるSC1602BSLBを使用。
  • 10kΩの可変抵抗器(液晶コントラスト調節用 若しくは5kΩ程度の抵抗)
    今回は手持ちの4.7kΩの抵抗器を液晶3番ピンとGNDの間に挟んで使用。
  • 100Ωの抵抗(バックライト点灯用 秋月で買ったらついてくる)

配線

秋月で買った液晶についてきたソケットを取り付けました。

IMG_7117_20151218

リード線を使って延長したり、液晶方向に取り付けるという手もありますが。
今後何かに組み込むことを考慮して裏側に取り付けました。

液晶の仕様書を確認して、以下の説明のように接続します。

液晶側Arduino側説明
名称ピン番号※ピン番号役割
Vcc(+)1+5V電源入力
Vss(-)2GNDGND
Vo3抵抗→GNDコントラスト調整
RS43レジスタ選択
R/W5GND入出力切り替え
E62イネーブル信号
DB07※使用しません
DB18
DB29
DB310
DB4114データ用信号
DB5125
DB6136
DB7147

コーディング

基本的には前回Raspberry Piでやったものとほとんど同じ方法で処理できると思います。

ピン番号と液晶の仕様を設定します。
今回は4bitモードで使用します。

変数のプロトタイプを記述します。今回作成する命令は上記の6つで実際に制御に使用するものはLcdCmd/LcdCmd4/LcdData/TextSend/LcdInitの5つです。

次に実際に液晶にデータを転送する関数を作ります。
プロトタイプを宣言しているので関数の位置が前後しても問題無いです。

前回Raspberry Piでの制御で一旦データビットを0にしないとどうもうまく制御できなかったことがあったため、今回も最初に一度データビットをゼロにします。その後に転送されてきたデータの上位ビットを抜き出して転送。下位ビットは破棄します。転送後パルスを発生させて終わり。

次にコマンド用命令を作ります。4bit初期化時につかう命令と通常コマンド用の8bit命令を作ります。

RSピンを0に設定して、4bit用命令の場合はそのまま渡されたデータを転送して終わりです。
8bitの場合は最初に4bitと同様に転送し、その後すぐに4bitシフトして転送します。

そして8bit命令の場合は画面クリアとカーソルホーム復帰の命令が処理時間が長いので追加で2000μ秒(2ms)待ちます。

次にデータ転送命令を作ります。

基本的には上のコマンド転送命令と同じです。RS信号を1にするだけです。

次にテキスト転送命令を作ります。

アドレス指定命令は0x80ですが、1行1文字目のアドレスが0x00、2行1文字目が0x40なので、それを利用して計算でアドレスを指定します。

その後に転送されたテキストデータを転送します。文字列(ASCIIZ)の末端はNULL(0x00)であることと、Whileの値が真の場合に処理を続ける。0は偽を表すという特性を利用したよくある手法を使って文字がなくなるまで繰り返してデータを転送します。はみ出し処理とか文字消しなどはしていないので転送時に適当に調整してください。

なお、今回のテキスト転送命令は、ArduinoIDEの文字コードがUTF-8固定なので使用できる文字は英数字のみとなっております。ただし、特に文字種の制限はしていませんので。文字コードを直接指定してあげればカタカナや用意されている記号を表示させること自体は可能です。

準備ができたので初期化命令を書きます。

IOピンを出力で初期化して、初期化コマンドを仕様書通りに転送するだけです。
今回は分けましたが、そこまで長いコードではないのでsetup関数の中に入れてしまってもいいかもしれません。

setup関数の中身

電源投入後100ミリ秒待ち、初期化命令を呼び出したあと文字列転送命令で文字を表示しています。
文字列転送命令の内容を変えることで表示する文字を変えることが出来ます。

なお、今回はloop関数は使用していません。
コレを利用して液晶に例えば温度センサーを使って温度を表示する時などには使用します。

動作例

電源を入れた直後

IMG_7131_20151220

上記のプログラムを走らせた状態

IMG_7133_20151220

プログラム全体

終わりに

というわけで今回はArduinoでキャラクタ液晶を制御してみました。
なお、Arduinoの開発環境では標準で同種のキャラクタ液晶を制御するためのライブラリが用意されていますが、今回は基本的な命令を使って処理をしました。

このブログの「自分でデバイスを動かす方法を学ぶ」という方針を闇に掲げていますので。余程処理が複雑だったり、メーカーからライブラリが提供されていないかぎりは最初は自力で制御するようにしています。

そのほうがデバイスがどういう原理でどう動いているのかがよく理解できると思います。
やはり折角動かすからにはそのものがどういう動作をしているのかはきちんと理解して動かしたいですよね。

キャラクタ液晶はマイコンをつかう上でいろいろと重宝すると思いますのでこのアイテムの制御は覚えておきたいテクニックですね。

文字コードを直接指定して転送する方法

IMG_7137_20151220
(文字化けしている例)

コーディングの項で触れたとおり、今回は文字コードの関係上ソースに半角カナを直接書いても文字化けしてしまい表示させることは出来ません。しかし、実際には英数字のみでは不足で、せめてカナは表示したいところですね。そこでエスケープ文字(¥)を使って文字コードを直接指定するという方法をでカナを表示してみたいと思います。

例えば半角カナの「ア」は「0xB1」であり、これを指定するには「\xB1」と書きます。
という事で以下のコードを書くと

以下のように表示されます。(1行目)

IMG_7135_20151220
(正常に表示されている)

この方法を使えば文字コード表に乗っている全ての文字が表示出来ます。
ただし、入力した文字を表示できるわけではないのでちょっと不便ですね。

HD44780互換液晶(日本仕様)の文字コード表

hd44780code2

ちなみに一番最後の0xFFの文字は「■」ではなく全塗りつぶしです。

コメントを残す

メールアドレスが公開されることはありません。