I2C接続AQMシリーズのキャラクタ表示LCDをArduinoで使う (1) AQM0802

Arduino Unoの電源電圧は5V

 搭載されているマイコンATMega328は3.3Vでも動作しますが、Arduino Unoは5Vで動くのが前提で設計されています。したがって、I/Oも5Vが基準になります。その後販売されているArduinoのモデルの多くは3.3V電源の製品が増えています。

 電子工作では表示部分にキャラクタ表示のLCDが使われてきました。この十年、パラレル接続の製品が多かったのですが、ArduinoのI/Oポートがそれほど多くないので、2本で接続できるI2C接続のキャラクタ表示LCDが望まれていました。キャラクタ表示のLCDの内部は、HD44780という相当古いコントローラ・コンパチブルのICで制御されているので、カーソルを移動することや文字を表示するコマンドは、どの製品もほぼ同じです。

 しかし、I2Cのインターフェースは独自の製品が多く、特に、スレーブ・アドレスは様々です。

 ArduinoにはI2C通信ができるWireライブラリがあります。パラレル接続のキャラクタ表示LCDの時代に、LCDのライブラリも作られました。今現在、開発ツールのArduino IDEには、数多くのI2Cで接続してキャラクタ表示LCDを制御できるライブラリがたくさん登録されています。登録されているもの以外にも検索するといくつも見つかります。

安価な秋月電子通商扱いのAQM0802の仕様

 AQM0802は、1行に8文字、2行表示のコンパクトなキャラクタ表示LCDです。マニュアルに電源電圧は3.3Vと書かれていますが、電源電圧の絶対最大定格は5.5Vなので、5V動作のArduino Unoで利用できます。

 スレーブ・アドレスは0x3eです。

 2017年7月現在、販売価格は320円ですが、接続ピンの間隔が狭いので、ブレッドボードで利用できるようにした変換基板付きの製品は600円です。変換基板の販売は当初なかったので、スイッチサイエンスで購入したものを使いました。こちらは885円です。現在、5V用が販売されていますが、ここでは3.3V用を使っています。リセット端子(XRST)は接続しません。

I2C-LCDのライブラリのインストール

 Arduino IDEは1.8.3を利用します。メニューから、

スケッチ > ライブラリをインクルード > ライブラリを管理

で、ライブラリマネージャが表示されます。検索の欄に、「LCD I2C」を入れると、たくさんのライブラリが表示されます。この中から、AQM0802そのものが名称に入った「FaBoLCDmini_AQM0802A」のMore Infoをクリックします。

 右側にインストール・ボタンが出てくるので、クリックしてライブラリを導入します。

 ソース・コードはMore Infoをクリックすると、GitHubのWebが表示されるので、確認できます。右下の閉じるをクリックしてライブラリマネージャを終了すると、このライブラリとサンプルは、ドキュメント\Arduino\libraries\FaBo_213_LCD_mini_AQM0802Aに収録されます。

 サンプル・スケッチを読み出します。

 メニューのファイルから、

スケッチ例 > FaBo_213_LCD_mini_AQM0802A > HelloWorld

 メニューのファイルから名前を付けて保存で、AQM-1aとしました。

 スケッチが見やすいように、コメント類を削除した状態です。

AQM0802とArduinoの接続

 I2Cは、SCLとSDAの二つの信号線と電源、合計4本だけの配線で通信できます。

Arduinoの端子 AQM0802の端子
5V VDD
GND GND
SCL SCL
SDA SDA

 ボード名とシリアル・ポートを確認します。

 スケッチをアップロードすると、画面に文字は表示されなく、黒くなりました。

スケッチの修正

  「AQMシリーズのI2C接続LCDキャラクタ・ディスプレイを使う(1)微妙なSCLクロック

を参照しながら、初期化をやり直しました。

 コマンドを送った後、少し時間をおかないと、LCD内部の動作が完了しなく正常な動作が望めないのですが、ここではぜんぶ取り去っても問題なく初期化は終わりました。動作が正常でない場合は、上記のページを参照して、delayを入れてください。

 実行すると、「hello!」が表示されました。

アナログのサンプル・スケッチを参考に

 動作テスト用に、void loop() 内に、次のスケッチを追加しました。

  sensorValue = analogRead(sensorPin);
lcd.print(sensorValue); lcd.print(" ");
lcd.print(sensorValue/1024.0*5.0); lcd.print("V"); 

 A0端子を3.3V端子へつなぎます。読み取ったデータと電圧を表示しました。

スケッチ

 ここで制作したスケッチを示します。初期化が失敗したように、ライブラリの書かれたデバイス名は同じですが、異なるハードウェアの可能性があります。パラレル接続のLCDライブラリのコマンドが、すべて正しく動くわけではないようです。

#include <Wire.h>
#include <FaBoLCDmini_AQM0802A.h>
FaBoLCDmini_AQM0802A lcd;
int sensorPin = A0;
int sensorValue = 0;

void setup() {
// set up the LCD:
// lcd.begin();
lcd.command(0x38);
lcd.command(0x39);
lcd.command(0x14);
lcd.command(0x73);
lcd.command(0x51);
lcd.command(0x6c);
lcd.command(0x38);
lcd.command(0x01);
lcd.command(0x0c);
// Print a message to the LCD.
lcd.print("hello!");
delay(10000);
}
void loop() {
lcd.clear();
sensorValue = analogRead(sensorPin);
lcd.print(sensorValue); lcd.print(" ");
lcd.print(sensorValue/1024.0*5.0); lcd.print("V");
delay(1000);
}