はじめに
この記事では、「Longruner LCDディスプレイ LK51」をArduino UNOとArduino Mega 2560で接続する方法を紹介します。
LK51はPCF8574互換のICを載せており、4本のケーブルで接続可能な4行20文字のLCDディスプレイです。
製品には、本体とスペーサーと接続ケーブルのみでマニュアルが入っていませんので、少しでもお役に立てれば幸いです。
環境
- Longruner LCDディスプレイ LK51 - Arduino IDE 1.8.13 - Arduino UNO R3 - Arduino Mega 2560
ライブラリのダウンロードとインストール
PCF8574を扱えるライブラリはいくつかありますが、以下の2つを試しました。
LiquidCrystal_PCF8574
PCF8574に特化していて、ZIPファイルにサンプルも含まれてすぐに使えます。
Arduino IDEのメニューから「スケッチ」→「ライブラリをインクルード」→「ライブラリを管理」をクリックして「ライブラリマネージャ」を起動後、「LiquidCrystal_PCF8574」で検索してインストールします。
または、ライブラリ(ZIP形式)を以下からをダウンロードします。
ダウンロードしたZIPファイルを解凍して、そのディレクトリをArduino IDEをインストールしたディレクトリの下にある「libraries」にコピーします。
私はArduino IDEを「C:\Arduino」にインストールしているので「C:\Arduino\libraries」になります。
New-LiquidCrystal
ソースを見ると必要最低限の実装に見えます。
ライブラリ(ZIP形式)を以下からをダウンロードします。
ダウンロードしたZIPファイルを解凍して、そのディレクトリをArduino IDEをインストールしたディレクトリの下にある「libraries」にコピーします。
私はArduino IDEを「C:\Arduino」にインストールしているので「C:\Arduino\libraries」になります。
New-LiquidCrystalをダウンロードするときは下図のようにします。
配線
LK51の推奨電圧は5Vです。
ロジックレベル双方向変換モジュールを使用しなくても3.3Vで動作しましたが、背面のコントラスト調整用のボリュームで調整しないと暗いです。
また、納品時はコントラスト調整用ボリュームが最低になっていたので、電源を入れて調整する必要がありました。
Arduino UNO
LK51 Arduino UNO ---------------------- GND ----- GND VCC ----- 5V or 3.3V SDA ----- Analog 4 SCL ----- Analog 5
Arduino Mega 2560
LK51 Arduino Mega 2560 ---------------------------- GND ----- GND VCC ----- 5V or 3.3V SDA ----- SDA 20 SCL ----- SCL 21
I2Cアドレス
LK51のI2Cアドレスは「0x27」か「0x3F」のどちらかです。
搭載しているICは「PCF8574AT」でした。
このデータシートを見ると、下の写真の右下にあるA0、A1、A2のピンの組み合わせを変更することで0x20~0x27に変更できるようです。
データシートP.5の「7.1.1 Address maps」に載っています。
ソース
購入したLK51のI2Cアドレスは「0x3F」だったのでソースで指定します。
「LiquidCrystal_PCF8574」と「New-LiquidCrystal」の2つのライブラリを使ったそれぞれのサンプルは以下となります。
LiquidCrystal_PCF8574
ライブラリのZIPファイルに含まれているサンプルです。
I2Cアドレスを「0x3F」に変更しています。
Arduino UNOとArduino Mega 2560で同じスクリプトが使えます。
I2Cアドレスを変数i2cAddrで指定するように変更しています。
#include <LiquidCrystal_PCF8574.h> #include <Wire.h> // 0x27 or 0x3F int i2cAddr = 0x3F; // set the LCD address to 0x27 for a 16 chars and 2 line display LiquidCrystal_PCF8574 lcd(i2cAddr); int show = -1; void setup() { int error; Serial.begin(115200); Serial.println("LCD..."); // wait on Serial to be available on Leonardo while (!Serial) ; Serial.println("Dose: check for LCD"); // See http://playground.arduino.cc/Main/I2cScanner how to test for a I2C device. Wire.begin(); Wire.beginTransmission(i2cAddr); error = Wire.endTransmission(); Serial.print("Error: "); Serial.print(error); if (error == 0) { Serial.println(": LCD found."); show = 0; // 初期化 // LK51 4行20列 lcd.begin(20, 4); } else { Serial.println(": LCD not found."); } // if } // setup() void loop() { if (show == 0) { lcd.setBacklight(255); lcd.home(); lcd.clear(); lcd.print("Hello LCD"); delay(1000); lcd.setBacklight(0); delay(400); lcd.setBacklight(255); } else if (show == 1) { lcd.clear(); lcd.print("Cursor On"); lcd.cursor(); } else if (show == 2) { lcd.clear(); lcd.print("Cursor Blink"); lcd.blink(); } else if (show == 3) { lcd.clear(); lcd.print("Cursor OFF"); lcd.noBlink(); lcd.noCursor(); } else if (show == 4) { lcd.clear(); lcd.print("Display Off"); lcd.noDisplay(); } else if (show == 5) { lcd.clear(); lcd.print("Display On"); lcd.display(); } else if (show == 7) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("*** first line."); lcd.setCursor(0, 1); lcd.print("*** second line."); } else if (show == 8) { lcd.scrollDisplayLeft(); } else if (show == 9) { lcd.scrollDisplayLeft(); } else if (show == 10) { lcd.scrollDisplayLeft(); } else if (show == 11) { lcd.scrollDisplayRight(); } else if (show == 12) { lcd.clear(); lcd.print("write-"); } else if (show > 12) { lcd.print(show - 13); } // if delay(1400); show = (show + 1) % 16; } // loop()
New-LiquidCrystal
Arduino UNOとArduino Mega 2560で同じスクリプトを使えます。
#include <Wire.h> #include <LiquidCrystal_I2C.h> // Arduino UNO (Analog 4, Analog 5) // Arduino Mega 2560 (SDA 20, SCL 21) // 0x27 or 0x3F //LiquidCrystal_I2C lcd(0x27/0x3F, 2, 1, 0, Analog/SDA, Analog/SCL, 6, 7, 3, POSITIVE); LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); void setup(){ // 初期化 lcd.init(); // 20列、4行に設定 lcd.begin(20, 4); // 0列、1行目に移動 lcd.setCursor(0, 0); lcd.print("HELLO Demo!"); // 0列、2行目に移動 lcd.setCursor(0, 1); lcd.print("!@#$%^&*()_+"); // 0列、3行目に移動 lcd.setCursor(0, 2); lcd.print("This is a demo text."); // 0列、4行目に移動 lcd.setCursor(0, 3); lcd.print("{}|\-=<>?,./"); } void loop(){ }
Comments