前回はステッピングモーターの制御について学びました。
今回はLCDディスプレイに文字を表示してみましょう。
I2C通信について
I2C (Inter-Integrated Circuit) は2線式のシリアル通信方式で、マイクロコントローラとその周辺機器の接続に使用されます。I2C通信を使用するデバイスは、シリアルデータ (SDA) 線とシリアルクロック (SCL) 線 (I2Cバスと呼ばれる) に接続されている必要があります。SDAとSCLは複数の機器で共有するため、各線に各デバイスを接続します。各デバイスは固有のアドレス(識別番号)を持ち、バスに接続されているデバイスと通信するために送信機または受信機として使用することができます。
LCD1602について
LCD1602液晶ディスプレイは、16文字×2行の文字を表示することができます。数字、英字、記号、ASCIIコードなどを表示することができます。
以下の図は、モノクロLCD1602ディスプレイと回路ピン配置を示しています。
I2C LCD1602ディスプレイは、I2Cインターフェースを内蔵しており、シリアル入力・パラレル出力モジュールをLCD1602ディスプレイに接続します。これにより、LCD1602を操作するために必要な線が4本のみになります。
このモジュールで使用されているシリアルからパラレルへのICチップはPCF8574T(またはPCF8574AT)で、デフォルトのI2Cアドレスは0x27(または0x3F)です。
従来のLCD1602との違い
従来のLCD1602ディスプレイは、8本のデータピン(D0-D7)、RSピン、RWピン、VCCピン、VSSピンが必要です。一方、I2C LCD1602ディスプレイは、これらのピンに加えて、SDAピンとSCLピンが必要です。
メリット
I2C LCD1602ディスプレイを使用するメリットは以下の通りです。
必要な線が減る: 従来のLCD1602ディスプレイに比べて、必要な線が4本減ります。
配線が簡単になる: 必要な線が減ることで、配線が簡単になります。
ノイズの影響を受けにくい: I2C通信は、ノイズの影響を受けにくい通信方式です。
デメリット
I2C LCD1602ディスプレイを使用するデメリットは以下の通りです。
従来のLCD1602ディスプレイより高価であることが多い。
I2Cバスを使用している他のデバイスと競合する可能性がある。
具体的な使用方法
I2C LCD1602ディスプレイを使用するには、まずマイクロコントローラと接続する必要があります。次に、I2Cライブラリを使用して、命令とデータを送信して、ディスプレイを制御する必要があります。詳細は、I2C LCD1602ディスプレイのデータシートを参照してください。
PCF8574について
PCF8574はI2Cバスの2本の信号線を使用して、8つのI/Oポートを拡張するICです。(8ビットのI2C I/Oエキスパンダ)
PCF8574のピンアサイン及びブロック図
PCF8574モジュールのピンとLCD1602のピンは、それぞれ対応しており、相互接続されています。
I2Cインターフェースを使用すると、16ピンのLCD1602ディスプレイを制御するために必要なピンは4本だけになります。
このプロジェクトでは、I2C LCD1602を使用して、静的文字と動的変数を表示します。
回路図
接続図
コード
コードをアップロードする前にライブラリをインストールしてください。
Arduino IDEから『Sketch』⇒『Include library』⇒『Add .zip Library….』と進みます。そこから以下のファイルを選択してください。
『Freenove_Ultimate_Starter_Kit_for_ESP32_S3\C\Libraries\LiquidCrystal_I2C.zip』
/**********************************************************************
Filename : Drive LiquidCrystal I2C to display characters
Description : I2C is used to control the display characters of LCD1602.
Auther : www.freenove.com
Modification: 2022/10/25
**********************************************************************/
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#define SDA 14 //Define SDA pins
#define SCL 13 //Define SCL pins
/*
* note:If lcd1602 uses PCF8574T, IIC's address is 0x27,
* or lcd1602 uses PCF8574AT, IIC's address is 0x3F.
*/
LiquidCrystal_I2C lcd(0x27,16,2);
void setup() {
Wire.begin(SDA, SCL); // attach the IIC pin
if (!i2CAddrTest(0x27)) {
lcd = LiquidCrystal_I2C(0x3F, 16, 2);
}
lcd.init(); // LCD driver initialization
lcd.backlight(); // Open the backlight
lcd.setCursor(0,0); // Move the cursor to row 0, column 0
lcd.print("hello, world!"); // The print content is displayed on the LCD
}
void loop() {
lcd.setCursor(0,1); // Move the cursor to row 1, column 0
lcd.print("Counter:"); // The count is displayed every second
lcd.print(millis() / 1000);
delay(1000);
}
bool i2CAddrTest(uint8_t addr) {
Wire.begin();
Wire.beginTransmission(addr);
if (Wire.endTransmission() == 0) {
return true;
}
return false;
}
LiquidCrystal_I2C()関数の第2、第3引数は、それぞれカラム数(横の文字数)と行数です。setup()関数内の20行目でI2Cアドレスのテストをしています。0x27で送信を試みて失敗したら0x3Fだろうと推定しています。
次回は超音波モジュールを使用して距離を測定してみましょう。
コメント