22 Arduino i2c小型LCD表示器を接続 2
前記事で秋月電子の 2x8文字 i2c小型キャラクタLCDモジュール [AQM0802A-RN-GBW]を「I2CLiquidCrystal」というライブラリを使い Arduino に接続しました。
「I2CLiquidCrystal」は大変便利でよく考えられたライブラリなので、今後も使っていきたいと思っています。
ただ、今まで、Arduino の基本を学ぶには、なるたけ外部ライブラリは使わずに、学習をしようと考えていたので、今回Webに何か適当なスケッチがないか探しました。
いろいろ探した結果、秋月電子のホームページに i2c小型キャラクタLCDモジュール [AQM1602XA-RN-GBW]用のサンプルプログラムが紹介されていました。
このモジュールは、文字の表示エリアが2倍になり、表示文字数が 16x2 となった以外は同じシリーズの製品です。
早速、前回のハードウエアはそのままで、スケッチを書き込み動作させたとこと下の写真のように文字が表示されて、下段のバーグラフも正常に増減をします。また、予想通り表示可能文字数が少ないので8文字を超える情報は表示されませんでした。
前回の記事と重複しますが、回路図は以下の様です。
スケッチの内容
このスケッチは Arduino IDE に標準で組み込まれている wire関数を使い、LCDモジュールの仕様書通りにプログラムがされており学習に最適でした。
// 秋月電子ホームページより転載(注釈加筆)
//
//Arduino UNO AQM1602XA-RN-GBW
// SCL=A5 --> LCDNo2 with pull up
// SDA=A4 --> LCDNo3 with pull up
// +V --> 5V
// GND --> GND
// 1行目に「AQM1602XA-RN-GBW」
// 2行目に、バーグラフを増減表示
#include <wire.h> // I2C標準ライブラリ
#define LCD_ADRS 0x3E // LCDモジュールアドレス
char moji[] ="AQM1602XA-RN-GBW"; // メッセージ
void setup() {
Wire.begin(); // マスタとしてバスに接続
init_LCD(); // LCD初期化
CGRAM(); // バーグラフフォント登録
}
void loop() {
writeCommand(0x02); // Retern Home
//タイトル文字描画
for(int i = 0; i < 16; i++) {
writeData(moji[i]);
}
//バーグラフ 増加を描画
for(int j = 0; j < 16; j++) {
for(int i = 0; i < 5; i++) {
writeCommand(0x40+0x80+j); // ADRESS SET
writeData(i+1);
delay(10);
}
}
//バーグラフ 減少を描画
for(int j = 0; j < 16; j++) {
for(int i = 0; i < 5; i++) {
writeCommand(0x40+0x80+15-j); // ADRESS SET
writeData(4-i);
delay(15);
}
}
}
//----main loop end----
//CGRAMにバーグラフフォントを登録
void CGRAM(){
int BAR[] = {0, 0x10, 0x18, 0x1c, 0x1e,0x1f};
writeCommand(0x40); // set CG RAM ADRESS
for(int j= 0; j < 6; j++) {
for(int i = 0; i < 8; i++) {
writeData(BAR[j]);
}
}
}
//データ書き込み
void writeData(byte t_data){
Wire.beginTransmission(LCD_ADRS);
Wire.write(0x40);
Wire.write(t_data);
Wire.endTransmission();
delay(1);
}
//コマンド書き込み
void writeCommand(byte t_command){
Wire.beginTransmission(LCD_ADRS);
Wire.write(0x00);
Wire.write(t_command);
Wire.endTransmission();
delay(10);
}
//液晶初期化
void init_LCD() {
delay(100);
writeCommand(0x38); // FUNCTION SET
delay(20); //
writeCommand(0x39); // IS=1
delay(20); //
writeCommand(0x14); // INT OSC FREQUENCY
delay(20); //
writeCommand(0x7A); // CONTRAST SET 0,1,2,3
delay(20); //
writeCommand(0x54); // CONTRAST SET 4,5
delay(20); //
writeCommand(0x6C); // F0LLOWER CONTROL
delay(20); //
writeCommand(0x38); // IS=0
delay(20); //
writeCommand(0x0C); // Display ON
delay(20); //
writeCommand(0x01); // Clear Display
delay(20); //
writeCommand(0x06); // Entry Mode
delay(20); //
}
使用している ライブラリ命令
使用している標準ライブラリの Wire(I2C)関数を示します。
- Wire.begin(address)
Wireライブラリを初期化し、I2Cバスにマスタかスレーブとして接続します。
address: 省略した場合は、マスタとしてバスに接続します。
- Wire.beginTransmission(address)
指定したアドレスのI2Cスレーブに対して送信処理を始めます。この関数の実行後、write()でデータをキューへ送り、endTransmission()で送信を実行します。
- Wire.write(value)
Arduinoがマスタの時、スレーブに送信するデータをキューに入れます。
- Wire.endTransmission()
スレーブデバイスに対する送信を実行します。
次回は、このスケッチに手を加えて少し実用的なものに変更します。