NOBのArduino日記!

NOBのArduino日記!

趣味は車・バイク・自転車・ラジコン・電子工作です。

LCDの使い方(AE-AQM1602A)動作確認 前編

イメージ 1
I2C接続小型キャラクLCDモジュール(AE-AQM1602A)
 
 前回の記事秋月電子通商さんのピッチ変換基盤(1.27mm 9ピンから2.54mm 4ピンに変換)を取り付けました。
 このLCD(AE-AQM1602A)を使って、今回は実際に文字を表示してみました!

1. 実験!

 AE-AQM1602Aは16文字×2行の計32文字表示出来ます。
 今回の実験では乱数を1秒毎に発生しLCD上に表示してみたいと思います。

 1.1 接続
 Arduino UNOを使用してLCD(AE-AQM1602A)に文字を表示します。
 ピッチ変換基盤のお陰で接続は僅か4本と超お手軽です!
 接続はI2C※1通信を使います。Arduino UNOをマスター※2として5V(3.3Vでも可、若干プログラムの修正が必要)・A5・A4・GND」と、LCDモジュール(AE-AQM1602A)をスレーブ※2として「+V・SCL※2・SDA※2・GND」をそれぞれ接続すれば完了です。
 ブレッドボードを使用した上記内容の回路図をFritzingを使って図1の様に書いてみました。 また図1の通り実際に繋げた状態を図2に示します。
イメージ 3
図1:ブレッドボード回路図

イメージ 2
図2:実際に作ったもの

以下補足です

※1:I2C
 I2C(Inter-Integrated Circuit、アイ・スクエアド・シー)はフィリップス社で開発されたシリアルバスです。
 
※2:マスター・スレーブ・SDA・SCL
 I2Cインターフェースは1対n(1以上)の同期式シリアル通信で、1がマスターでnがスレーブとなっています。※伝送距離は装置内程度と非常に短い。
 I2Cは通信する相手のアドレスをデータとして送りスレーブとの通信(送受信)を確立します、つまりI2Cはマスターからアクションを起こさないとスレーブとは送受信が出来ません。
 送受信に使う配線が1本(SDA)、マスターと同期を取る為に送信するクロック信号が1本(SCL)の計2本と、配線が少なくて済むのがI2C通信による最大のメリットです


 1.2 プログラム
 下記プログラムはランダムに生成した-10~+10の値を1秒毎にLCD上段に表示して、下段に「NOBArduinoDiary!」と16文字表示するプログラムです!
//NOBのArduino日記!_AE-AQM1602Aの使い方_(20170307)
//+V=5V,SCL=A5,SDA=A4,GND=GND
#include <Wire.h>
#define LCD_ADRS 0x3E  //Slave address of LCD(Arduino ver.)
String LCD_STRING;
char s[16];
double SET;

void writeCommand(byte t_command) { //コマンド書き込み
  Wire.beginTransmission(LCD_ADRS);
  Wire.write(0x00);
  Wire.write(t_command);
  Wire.endTransmission();
  delay(10);
}

void writeData(byte t_data) {  //データ書き込み
  Wire.beginTransmission(LCD_ADRS);
  Wire.write(0x40);
  Wire.write(t_data);
  Wire.endTransmission();
  delay(1);
}

void LCD_DISP_16_1(void) {     //上段の行にデータ書き込み
  for (int i = 0; i < 16; i++) {
    writeData(LCD_STRING[i]);
  }
}

void LCD_DISP_16_2(void) {     //下段の行にデータ書き込み
  writeCommand(0x40 + 0x80);    //確認する
  for (int i = 0; i < 16; i++) {
    writeData(LCD_STRING[i]);
  }
}

void setup() {
  Wire.begin();
  delay(100); //液晶初期化
  writeCommand(0x38); delay(20); // FUNCTION SET
  writeCommand(0x39); delay(20); // IS=1
  writeCommand(0x14); delay(20); // INT OSC FREQUENCY
  writeCommand(0x7A); delay(20); //7faONTRAST SET0,1,2,3(3.3V=0x73,5V=0x7A)
  writeCommand(0x54); delay(20); // 54CONTRAST SET 4,5 (3.3V=0x56, 5V= 0x54)
  writeCommand(0x6C); delay(20); // F0LLOWER CONTROL
  writeCommand(0x38); delay(20); // IS=0
  writeCommand(0x0C); delay(20); // Display ON
  writeCommand(0x01); delay(20); // Clear Display
  writeCommand(0x06); delay(20);
} // Entry Mode

void loop() {
  dtostrf(random(-10, 10), 5, 1, s);
  LCD_STRING = String(s);
  LCD_STRING = String("random:" + LCD_STRING + "");
  writeCommand(0x01); // Clear Display
  LCD_DISP_16_1();
  LCD_STRING = "NobArduinoDiary!";
  LCD_DISP_16_2();
  delay(1000);
}
イメージ 1
図1:プログラム例
1.3 実験!
 図2の回路で上記プログラムをArduino UNOに書き込み実行した所、図3の様に上段「random: ○○.○」・下段「NOBArduinoDiary!」とLCD文字が表示されました!
イメージ 4
図3:LCDに文字を表示! 

2. まとめ

 図3を見てお気づきかもしれませんが二行目が少しチカチカしてしまってます
 原因は下の4行だと思うのですが、赤行で一旦画面を消して、次の緑行で行うLCD一行目の表示はすぐに行うので気付かないレベルになるのですが、青行の次の黄行は画面が消えて暫くしてからの書き込みになってしまいます。
 結果として二行目は画面が消えている時間が長い為チカチカが目立ってしまったと思われます
writeCommand(0x01); // Clear Display  
LCD_DISP_16_1();
LCD_STRING = "NobArduinoDiary!";
LCD_DISP_16_2();
 全部一気に画面を消すのではなく部分的に文字を消すか上書きするか出来れば良いのですが、なかなかLCDコマンドの使い方が難解ですのでもう少し調べてみます 
 
イメージ 1 イメージ 3
励みになりますのでよければクリック下さい(^o^)/

↩【LCDの使い方】目次に戻る