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);
}