LCDの表示

更新日2021-10-04 (月) 12:07:50
作成日 2021年9月20日

HD44780 1602 LCD ディスプレイモジュール 16×2キャラクタとKKHMF 1602 LCDシリアル インタフェース ボード モジュールで画面表示(I2C)

接続

<LCD> <Arduino UNO>
 GND ----- GND
 VCC ----- 5V
 SDA ----- A4 or SDA
 SCL ----- A5 or SCL

LCD ディスプレイモジュールの裏に、KKHMF 1602 LCDシリアル インタフェース ボード モジュールを半田付け。

KKHMF 1602 LCDのPWB上のJumperはバックライトのON/OFF ショートでバックライトON、ポテンショメータは画面の輝度。調整する必要がある。

プログラム

必要なライブラリのダウンロード

  • LiquidCrystal_I2C ライブラリ

Zipで DL

  • zipでのDownloadの仕方

GitHub_Zip_DL.png

アドレス

KKHMF 1602 LCDシリアル インタフェース ボード モジュールのI2Cアドレス

PWB上にA0からA2のアドレスを設定するパッドある。片側がGNDになっていて、オープンでHigh、ショートでLowになる。

  • すべてオープン(購入時):0x27
  • すべてショート:0x20
  • PCF8574Tのアドレス

また実装チップPCF8574の品名PCF8574とPCF8574Tではアドレスが異なる

  • PCF8574回路図

プログラム例

#include <LiquidCrystal_I2C.h>

//Adress All Open 0x27
//Adress All Gnd  0x20
LiquidCrystal_I2C lcd(0x20,16,2);

void setup() {
  // put your setup code here, to run once:
  
  lcd.init(); 
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0); // (m,l) m:0 1文字目, m:1 2文字目..., l:0 1行目 1:2 2 行目
  lcd.print("CQ CQ CQ DE ");
  //2行目
  lcd.setCursor(0,1);
  lcd.print("JE2ISM!");
}

void loop() {
  // put your main code here, to run repeatedly:

}
  • 実行結果

表示.jpg

I2Cの信号モニタ

アドレス部のデータは上位7bitで、8bit目はR/Wのなる。R/W=0の時はマスタが送信、R/W=1の時はスレーブが送信する。

9Bit目はACK信号

I2C信号.png

Adress.png

データ部は上位8Bitがデータで、9bit目はACK信号

以下のページによると、マスターはデータを送りたいとき、スレーブアドレスとR/W=0を送信し、次にデータを送る。

マスターがデータを受け取りたいときは、スレーブアドレスとR/W=1を送信すると、スレーブがデータを送信する。

ACKを返すときのクロックはACKを送信する側が出すと思われるが、クロックがどちらが出しているか、モニタだけでは不明。

トラブル

簡単に動作すると思っていたが、表示しなかった。原因はディスプレイモジュールとシリアル インタフェース ボード モジュールの半田付けが甘かった。年で目が見えないのも要因の一つだが、ルーペで確認しても見た目は大丈夫のようだった。それでももう一度こてを入れ直して半田をすべてのPINにあてることで表示するようになった。

注意点

シリアル インタフェース ボード モジュールのPCF8574Tのアドレスは最後の文字(今回はT)、によって変わる。また、シリアル インタフェース ボード モジュールに抵抗を取り付ける箇所がある。これによっても異なる。参考のURL参照のこと。

ちなみに、PCF8574Tは

  • すべてOPEN(プルアップになる): 0x27
  • すべてショート:0x20

以下のI2C Scannerで確認することができる。

I2C Scanner

  • 参考

https://novicengineering.com/i2c%E9%80%9A%E4%BF%A1%E3%81%AE%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/

I2Cのアドレスを表示

#include <Wire.h>

void setup()
{
  Wire.begin();

  Serial.begin(9600);
  while (!Serial);             // Leonardo: wait for serial monitor
  Serial.println("\nI2C Scanner");
}

void loop()
{
  byte error, address;
  int nDevices;

  Serial.println("Scanning...");

  nDevices = 0;
  for(address = 1; address < 127; address++ ) 
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");

      nDevices++;
    }
    else if (error==4) 
    {
      Serial.print("Unknown error at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");

  delay(5000);           // wait 5 seconds for next scan
}
  • 実行結果(シリアルモニタ)
I2C Scanner
Scanning...
I2C device found at address 0x27  !
done

Scanning...
I2C device found at address 0x27  !
done

Scanning...
I2C device found at address 0x27  !
done

参考

  • 購入物

Ren He DC 5V HD44780 1602 LCD ディスプレイモジュール 16×2キャラクタ LCDモジュール

KKHMF 1602 LCD ブラック IIC/ I2C / TWI/SPI シリアル インタフェース ボード モジュール

I2C フォーマット


添付ファイル: fileGitHub_Zip_DL.png 3件 [詳細] file表示.jpg 9件 [詳細] fileI2C信号.png 10件 [詳細] fileAdress.png 8件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-10-04 (月) 12:07:50 (12d)